[OpenShift Container Platform][IBM Cloud Pak for Integration][Linux]

範例: 配置 TLS

此範例使用 IBM® MQ Operator將佇列管理程式部署至 OpenShift® Container Platform 。 在範例用戶端與佇列管理程式之間配置單向 TLS 通訊。 此範例透過放置及取得訊息來示範成功的配置。

開始之前

若要完成此範例,您必須先完成下列必要條件:

  • 安裝 IBM MQ client,並將 samp/binbin 新增至 PATH。 您需要 runmqakmamqsputcamqsgetc 應用程式,它們可以安裝成 IBM MQ client 的一部分,如下所示:
  • 安裝適用於您作業系統的 OpenSSL 工具。
  • 針對此範例建立 OpenShift Container Platform (OCP) 專案/名稱空間。
  • 在指令行上,登入 OCP 叢集,並切換至上述名稱空間。
  • 請確定上述名稱空間中已安裝 IBM MQ Operator 且可供使用。

關於此作業

此範例提供自訂資源 YAML ,定義要部署至 OpenShift Container Platform的佇列管理程式。 它也會詳細說明在啟用 TLS 的情況下部署佇列管理程式所需的其他步驟。 完成時,放置及取得訊息會驗證佇列管理程式是否已配置 TLS。

IBM MQ 伺服器建立 TLS 私密金鑰和憑證

下列程式碼範例顯示如何建立佇列管理程式的自簽憑證,以及如何將憑證新增至金鑰資料庫,以充當用戶端的信任儲存庫。 如果您已有私密金鑰和憑證,則可以改用那些憑證。

請注意,自簽憑證只能用於開發目的。

在現行目錄中建立自簽私密金鑰及公用憑證
請執行下列指令:
openssl req -newkey rsa:2048 -nodes -keyout tls.key -subj "/CN=localhost" -x509 -days 3650 -out tls.crt
將伺服器公開金鑰新增至用戶端金鑰資料庫
金鑰資料庫用作用戶端應用程式的信任儲存庫。
建立用戶端金鑰資料庫:
runmqakm -keydb -create -db clientkey.kdb -pw password -type cms -stash
將先前產生的公開金鑰新增至用戶端金鑰資料庫:
runmqakm -cert -add -db clientkey.kdb -label mqservercert -file tls.crt -format ascii -stashed
配置用於佇列管理程式部署的 TLS 憑證
為了讓您的佇列管理程式可以參照及套用金鑰和憑證,請建立 Kubernetes TLS 密鑰,並參照上面建立的檔案。 當您這麼做時,請確定您在開始此作業之前所建立的名稱空間中。
oc create secret tls example-tls-secret --key="tls.key" --cert="tls.crt"
建立包含 MQSC 指令的配置對映
建立包含 MQSC 指令的 Kubernetes 配置對映,以建立新的佇列及「SVRCONN 通道」,以及新增通道鑑別記錄,只封鎖那些稱為 nobody的使用者來容許存取通道。

請注意,此方法應該僅用於開發目的。

請確定您位於先前建立的名稱空間中 (請參閱 開始之前) ,然後在 OCP 使用者介面中輸入下列 YAML ,或使用指令行。
apiVersion: v1
kind: ConfigMap
metadata:
  name: example-tls-configmap
data:
  tls.mqsc: |
    DEFINE QLOCAL('EXAMPLE.QUEUE') REPLACE 
    DEFINE CHANNEL(SECUREQMCHL) CHLTYPE(SVRCONN) TRPTYPE(TCP) SSLCAUTH(OPTIONAL) SSLCIPH('ANY_TLS12_OR_HIGHER')
    SET CHLAUTH(SECUREQMCHL) TYPE(BLOCKUSER) USERLIST('nobody') ACTION(ADD)
建立必要的 OCP 路徑
請確定您在開始此作業之前所建立的名稱空間中,然後在 OCP 使用者介面中輸入下列 YAML ,或使用指令行。
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: example-tls-route
spec:
  host: secureqmchl.chl.mq.ibm.com
  to:
    kind: Service
    name: secureqm-ibm-mq
  port:
    targetPort: 1414
  tls:
    termination: passthrough

請注意, Red Hat® OpenShift Container Platform Router 會使用 SNI 將要求遞送至 IBM MQ 佇列管理程式。 如果您在先前建立的配置對映中變更 MQSC 中指定的通道名稱,則也需要在這裡及稍後建立的 CCDT 檔案中變更主機欄位。 如需相關資訊,請參閱 配置路徑以從 Red Hat OpenShift 叢集外部連接至佇列管理程式

部署佇列管理程式
重要事項: 在此範例中,為了進行測試,我們使用 MQSNOAUT 變數來停用佇列管理程式中的安全檢查。 這可讓我們聚焦在使用 TLS 連接用戶端所需的步驟。 不過,將 MQSNOAUT 設為 yes 不適用於 IBM MQ的正式作業部署,因為它會導致任何連接的應用程式具有完整管理權力,且沒有降低個別應用程式許可權的機制。 請參閱 防止 AIX®, Linux, and Windows 系統上的安全存取檢查

使用下列自訂資源 YAML 建立新的佇列管理程式。 請注意,它會參照先前建立的配置對映和密鑰,以及 MQSNOAUT 變數。
請確保您在開始此作業之前建立的名稱空間中,然後使用指令行或使用 IBM Cloud Pak® for Integration Platform UI (previously the Platform Navigator)在 OCP 使用者介面中輸入下列 YAML。 請檢查是否指定正確的授權,並將 false 變更為 true以接受授權。
apiVersion: mq.ibm.com/v1beta1
kind: QueueManager
metadata:
  name: secureqm
spec:
  license:
    accept: false
    license: L-YBXJ-ADJNSM
    use: Production
  queueManager:
    name: SECUREQM
    mqsc:
    - configMap:
        name: example-tls-configmap
        items:
        - tls.mqsc
    storage:
      queueManager:
        type: ephemeral
  template:
    pod:
      containers:
        - env:
            - name: MQSNOAUT
              value: 'yes'
          name: qmgr
  version: 9.3.3.2-r2
  web:
    enabled: true
  pki:
    keys:
      - name: example
        secret:
          secretName: example-tls-secret
          items: 
          - tls.key
          - tls.crt
確認佇列管理程式正在執行中
現在正在部署佇列管理程式。 請先確認它處於 Running 狀態,然後再繼續。 例如:
oc get qmgr secureqm
測試佇列管理程式的連線
若要確認佇列管理程式已配置單向 TLS 通訊,請使用 amqsputcamqsgetc 範例應用程式:
尋找佇列管理程式主機名稱
使用下列指令來尋找路徑 secureqm-ibm-mq-qm的佇列管理程式完整主機名稱:
oc get routes secureqm-ibm-mq-qm
指定佇列管理程式詳細資料
建立 CCDT.JSON 檔案,以指定佇列管理程式詳細資料。 將主機值取代為前一個步驟中的主機名稱。
{
    "channel":
    [
        {
            "name": "SECUREQMCHL",
            "clientConnection":
            {
                "connection":
                [
                    {
                        "host": "<hostname from previous step>",
                        "port": 443
                    }
                ],
                "queueManager": "SECUREQM"
            },
            "transmissionSecurity":
            {
              "cipherSpecification": "ECDHE_RSA_AES_128_CBC_SHA256"
            },
            "type": "clientConnection"
        }
   ]
}
匯出環境變數
以適合您作業系統的方式匯出下列環境變數。 amqsputcamqsgetc將會讀取這些變數。
附註: 如果在 arm64 Apple Mac上執行, MQSSLKEYR 應該指向 pem 檔案,而不是金鑰資料庫。 在這個範例中,只需要 QM 公用憑證,它應該指向 tls.crt 檔。
更新系統上檔案的路徑:
export MQCCDTURL='<full path to file>/CCDT.JSON'
export MQSSLKEYR='<full path to file>/clientkey'
將訊息放入佇列
請執行下列指令:
amqsputc EXAMPLE.QUEUE SECUREQM
如果佇列管理程式連線成功,則會輸出下列回應:
target queue is EXAMPLE.QUEUE
透過輸入一些文字,然後每次按 Enter 鍵,將數個訊息放入佇列。
若要完成,請按 Enter 鍵兩次。
從佇列擷取訊息
請執行下列指令:
amqsgetc EXAMPLE.QUEUE SECUREQM
您在前一個步驟中新增的訊息已耗用且為輸出。
在幾秒鐘之後,指令結束。

恭喜,您已順利部署已啟用 TLS 的佇列管理程式,並顯示您可以從用戶端安全地放置訊息並取得訊息至佇列管理程式。