維護 Voice Gateway 的安全

藉由維護 IBM® Voice Gateway 的安全,可以降低遭到阻斷式服務攻擊等漏洞情況。如果您將 Voice Gateway 部署到公用雲端,則配置安全就更加地重要,因為任何人都可以使用 SIP 電話來存取它。

透過轉遞 Proxy 伺服器連接

若要取得額外的安全,您的組織可將 Voice Gateway 部署在一個需要透過轉遞 Proxy 伺服器來傳遞 HTTP 要求的環境中。在這個環境中,您必須將 Voice Gateway 配置成透過 Proxy 伺服器來連接至 Watson™ 服務。

限制:只有 Media Relay 儲存器才支援 HTTPS 通訊協定。若為 SIP Orchestrator 儲存器,您只能指定經由 HTTP 連接至 Proxy 伺服器。

在 SIP Orchestrator 和 Media Relay 配置檔中,指定您的轉遞 Proxy 伺服器詳細資料,如下列範例所示:

# Proxy configuration
- PROXY_TYPE=http #Can be omitted because it's the default
- PROXY_HOST=app.proxy.com
- PROXY_PORT=8080

# Basic authentication credentials
- PROXY_USERNAME=johndoe
- PROXY_PASSWORD=password1
表 1. 用於配置 Proxy 伺服器的環境變數
環境變數 預設值 說明
PROXY_TYPE http 定義 Proxy 連線所用的通訊協定,可以是 httphttps。只有 Media Relay 才支援此項。
PROXY_HOST 轉遞 Proxy 伺服器的主機。
PROXY_PORT 轉遞 Proxy 伺服器的埠。
PROXY_USERNAME Proxy 鑑別用的使用者名稱。
PROXY_PASSWORD Proxy 鑑別用的密碼。

在 1.0.0.1a 版以及更新版本中,當您配置 Proxy 時,會針對 Watson Speech To Text 和 Text to Speech 服務啟用 Proxy,但是不會針對您在 API 上所定義的任何等候音樂 (MOH) 或一次性音訊 URL 啟用 Proxy。您可以設定下列環境變數,針對這每一個項目啟用或停用 Proxy:

表 2. 用來啟用 Proxy 的環境變數
環境變數 預設值 說明
WATSON_STT_ENABLE_PROXY true 指出是否經由所配置的 Proxy 來遞送指向 Watson Speech to Text 服務的連線。1.0.0.1a 版及更新版本。
WATSON_TTS_ENABLE_PROXY true 指出是否經由所配置的 Proxy 來遞送指向 Watson Text to Speech 服務的連線。1.0.0.1a 版及更新版本。
MUSIC_ON_HOLD_ENABLE_PROXY false 指出是否經由所配置的 Proxy 來連接至任何等候音樂或一次性音訊 URL。1.0.0.1a 版及更新版本。

配置 SSL 和 TLS 加密

依預設,如果連線是直接的或是會透過轉遞 Proxy 伺服器,則會使用 TLS 加密來維護 Watson 服務連線的安全,因此不需要進一步配置。對於其他連線以及透過媒介伺服器(例如服務編排引擎、SMS Gateway 或反向 Proxy)指向 Watson 服務的連線,會需要您配置 SSL 和 TLS 加密,來維護這些連線的安全。

為 Voice Gateway 配置 SSL 和 TLS 加密時,需要 PEM 和 PKCS #12 檔案,這些檔案要裝載在 Docker 資料磁區,以供每一個儲存器中的配置參照。

產生 PKCS #12 檔案時所需要的檔案必須是 PEM 格式。如果您憑證管理中心所提供的檔案不是 PEM 格式,您可以使用 OpenSSL 等之類的工具,將檔案轉換為所需的 PEM 格式。OpenSSL 也可以用來從列出的憑證和私密金鑰,來產生 PKCS #12 檔案。

在 Docker 上配置金鑰和信任儲存庫檔案

依預設,Voice Gateway 使用自簽憑證來保護顯露的 REST API。如果您想變更預設金鑰儲存庫和信任儲存庫,請使用下列指示。在 SIP Orchestrator 配置中,將檔案裝載在 Docker 磁區上。如需磁區的相關資訊,請參閱 Docker 說明文件。在下列範例中,$PWD 會解析為現行工作目錄,並將它裝載至儲存器上的 /sslConf/ 路徑。

    volumes:
      - $PWD:/sslConf/
      # $PWD resolves to the working directory and
      # mounts it to the /sslConf/ path on the container

針對信任儲存庫和金鑰儲存庫兩者,指定檔案位置、檔案類型,以及其在下列環境變數的對應通行詞組。如果您將金鑰儲存庫和信任儲存庫產生到單一檔案,請在這兩組環境變數中,指定相同的檔案。

    services:
      sip.orchestrator:
        ...
    environment:
      ...
 # Trust store
 - SSL_KEY_TRUST_STORE_FILE=/sslConf/myTrustJKSFile.jks
 - SSL_FILE_TYPE=JKS
 - SSL_PASSPHRASE=myPassphrase

 # Key store
  - SSL_KEY_STORE_FILE=/sslConf/myKeyJKSFile.jks
  - SSL_KEY_FILE_TYPE=JKS
  - SSL_KEY_PASSPHRASE=myPassphrase

重新部署 Voice Gateway,以便讓變更生效。

新增授信憑證管理中心憑證和自簽憑證

若要進行加密連線,您可以定義一組授信憑證管理中心 (CA) 憑證和自簽憑證,以用來驗證連線涉及方的身分。

每一個儲存器對於這些授信憑證的定義方式不同:SIP Orchestrator 需要 JKS、JCEKS 或 PKCS #12 檔案,但是 Media Relay 可以使用 PEM 格式的任何檔案。

新增 SIP Orchestrator 的授信憑證

新增 SIP Orchestrator 的授信憑證,可維護 Watson Assistant 服務連線的安全。如果要為 SIP Orchestrator 定義授信憑證,請產生一個含有信任憑證的信任儲存庫檔案。如果要產生信任儲存庫檔案,您需要憑證管理中心 (CA) 憑證,這通常是 .pem、.crt、.cer 或 .cert 檔。

  1. 產生 JKS、JCEKS 或 PKCS #12 信任儲存庫檔案,且其中含有 CA 所提供的信任憑證。下列範例使用™ keytool 指令,來產生一個 PKCS #12 信任儲存庫檔案。

    keytool -importcert \
     -file <要信任的 CA 憑證> \
     -alias <憑證的別名> \
     -keystore <信任儲存庫的名稱> \
     -storepass <信任儲存庫的密碼> \
     -storetype pkcs12
    
  2. 將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件

    volumes:
       - $PWD:/sslConf/
       # $PWD 會解析為工作目錄,且
       # 會將它裝載到儲存器上的 /sslConf/ 路徑
    
  3. 在 SIP Orchestrator 配置的下列環境變數中,指定檔案位置、檔案類型,以及其對應的通行詞組。

    environment:
       ...
       - SSL_KEY_TRUST_STORE_FILE=/sslConf/myPKCS12File.p12
       - SSL_FILE_TYPE=PKCS12
       - SSL_PASSPHRASE=myPassphrase
    

新增 Media Relay 的授信憑證

新增 Media Relay 的授信憑證,可維護 Watson Speech to Text 服務和 Text to Speech 服務的連線安全。如果要為 Media Relay 定義授信憑證,請提供一個 PEM 格式的檔案,且其中含有要信任的所有主要憑證管理中心。

  1. 以 PEM 格式建立檔案,且其中含有要信任的憑證。這個檔案通常具有下列結構:

     -----BEGIN CERTIFICATE-----
       ...
     -----END CERTIFICATE-----
     -----BEGIN CERTIFICATE-----
       ...
     -----END CERTIFICATE-----
    

    您可以利用 cat 指令,來連結憑證:

     cat cert1.pem cert2.pem ... > ca-bundle.pem
    
  2. 將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件

    volumes:
       - $PWD:/sslConf/
       # $PWD 會解析為工作目錄,且
       # 會將它裝載到儲存器上的 /sslConf/ 路徑
    
  3. 在 Media Relay 配置的 SSL_CLIENT_CA_CERTIFICATE_FILE 環境變數中,指定 PEM 檔案位置。

     environment:
       ...
       # 假設含有憑證的檔案稱為 ca-bundle.pem
       - SSL_CLIENT_CA_CERTIFICATE_FILE=/sslConf/ca-bundle.pem
    

配置交互鑑別

如果您是透過需要交互鑑別的閘道伺服器,來連接至 Watson 服務,您需要在 Voice Gateway 中配置交互鑑別。

配置交互鑑別最簡單的方式是產生單一 PKCS #12 檔案,且這個檔案之後可同時用於 SIP Orchestrator 和 Media Relay。檔案必須包含私密金鑰和其憑證,以及要信任的憑證管理中心。

如果要產生 PKCS #12 檔案,您需要下列 PEM 格式的檔案:

附註:只有在配置交互鑑別時,才會使用這個單一 PKCS #12 檔案。如果您有配置 SSL 或 TLS,但沒有配置交互鑑別,則 SIP Orchestrator 和 Media Relay 都需要個別的檔案,如配置 SSL 和 TLS 加密一節所述。

  1. 從私密金鑰、其憑證和憑證鏈,產生 PKCS #12 檔案。下列範例使用 OpenSSL 工具來產生檔案。

    openssl pkcs12 -export \
     -in <憑證檔> \
     -inkey <私密金鑰檔> \
     -CAfile <憑證鏈> \
     -chain -out <檔名>.p12
    
  2. keytool 指令上指定 CA 憑證,以便新增授信憑證至 PKCS #12 檔案。

    keytool -importcert \
     -file <要信任的 CA 憑證> \
     -alias <憑證的別名> \
     -keystore <信任儲存庫的名稱> \
     -storepass <信任儲存庫的密碼> \
     -storetype pkcs12
    
  3. 將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件

    volumes:
       - $PWD:/sslConf/
       # $PWD 將解析為工作目錄,且
       # 會將它裝載到儲存器上的 /sslConf/ 路徑
    
  4. 在每一個儲存器的配置中,於下列環境變數中指定檔案位置、檔案類型,以及其對應的通行詞組。

    • 對於 SIP Orchestrator:
      environment:
       ...
      - SSL_KEY_TRUST_STORE_FILE=/sslConf/myPKCS12File.p12
      - SSL_FILE_TYPE=PKCS12
      - SSL_PASSPHRASE=myPassphrase
      
    • 對於 Media Relay:
      environment:
       ...
      - SSL_CLIENT_PKCS12_FILE=/sslConf/myPKCS12File.p12
      - SSL_CLIENT_PASSPHRASE=myPassphrase
      

配置從 Media Relay 至 Speech to Text Adapter 的 SSL 和 TLS 加密

如果您經由公用網際網路從 Media Relay 連接至 Speech to Text Adapter,建議您在微服務之間建立安全連線。如果要維護連線安全,請針對 Speech to Text Adapter 產生 PKCS #12 檔案,然後新增憑證至 Media Relay 信任儲存庫。

如果要產生 PKCS #12 檔案,您需要下列 PEM 格式的檔案:

  1. 從私密金鑰、其憑證和憑證鏈,產生 PKCS #12 檔案。下列範例使用 OpenSSL 工具來產生檔案。

    openssl pkcs12 -export \
     -in <憑證檔> \
     -inkey <私密金鑰檔> \
     -CAfile <憑證鏈> \
     -chain -out <檔名>.p12
    
  2. 將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件

    volumes:
       - $PWD:/sslConf/
       # $PWD 將解析為工作目錄,且
       # 會將它裝載到儲存器上的 /sslConf/ 路徑
    
  3. 在 Speech to Text Adapter 儲存器的配置中,於下列環境變數上指定檔案位置和其對應的通行詞組。

    environment:
       ...
      - SSL_SERVER_PKCS12_FILE=/sslConf/myPKCS12File.p12
      - SSL_SERVER_PASSPHRASE=myPassphrase
    
  4. 建立信任憑證檔,且其中包含來自 Speech to Text Adapter 和 Text to Speech 服務的 CA 憑證(PEM 格式)。您可以使用 OpenSSL 等之類的工具,來擷取 Text to Speech 服務的憑證。

    如果要將憑證串連成 PEM 格式的單一檔案,請執行 cat 指令,其語法如下:

     cat <stt-adapter ca certificate> <text-to-speech certificate> > <trusted certificates>
    

    例如:

     cat stt-adapter-ca.pem DigiCertGlobalRootCa.pem > ca-bundle.pem
    
  5. 將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件

    volumes:
       - $PWD:/sslConf/
       # $PWD 會解析為工作目錄,且
       # 會將它裝載到儲存器上的 /sslConf/ 路徑
    
  6. 在 Media Relay 配置的 SSL_CLIENT_CA_CERTIFICATE_FILE 環境變數中,指定 PEM 檔案位置。在下列範例中,PEM 檔名為 ca-bundle.pem

     environment:
       ...
       - SSL_CLIENT_CA_CERTIFICATE_FILE=/sslConf/ca-bundle.pem
    

為 Speech to Text Adapter 配置基本鑑別

當 Speech to Text Adapter 不是位於 Voice Gateway 的相同網路時,您可以在 Speech to Text Adapter 上啟用基本鑑別,以便只接受鑑別要求。

  1. 配置 STT_ADAPTER_USERNAMESTT_ADAPTER_PASSWORD,以便在 Speech to Text Adapter 上啟用基本鑑別

    environment:
       ...
         - STT_ADAPTER_USERNAME=myAdapterUsername
         - STT_ADAPTER_PASSWORD=myAdapterPassword
    
  2. 在 Media Relay 配置中,針對 WATSON_STT_USERNAMEWATSON_STT_PASSWORD,指定使用者名稱與密碼。

    environment:
       ...
         - WATSON_STT_USERNAME=myAdapterUsername
         - WATSON_STT_PASSWORD=myAdapterPassword
    

白名單發話端和受話端

您可以將特定位址撥進或撥出的通話列入白名單中,也就是說,Voice Gateway 只接受所定義之位址撥進或撥出的通話。一旦配置白名單,就不會讓來自任何未明確容許之來源的通話及其他通訊通過。您可以為 SIP Orchestrator 定義配置環境變數,依 SIP URI 或 IP 位址將通話列入白名單。

附註:多租戶配置中,只有與所配置租戶的通話才能連接,因此能有效地將與所配置租戶的通話列入白名單中。

依 SIP URI 列入白名單

當發話端嘗試呼叫到 Voice Gateway 時,會傳遞發話端的 SIP URI,其中含有電話號碼與主機等之類的相關資訊,且格式如下:

sip:number_or_username@host_domain_or_IP[:port]

範例:sip:12345556789@myhost.com

若要將特定 SIP URI 撥進或撥出的通話列入白名單,請定義下列的 SIP Orchestrator 環境變數。

表 3. 用來配置白名單的環境變數
環境變數 預設值 說明
WHITELIST_FROM_URI 若有定義此項,Voice Gateway 只接受含有 SIP From URI 內之指定字串(例如:電話號碼)的通話。您可以用逗點區隔清單來定義多個字串。
WHITELIST_TO_URI 若有定義此項,Voice Gateway 只接受含有 SIP To URI 內之指定字串(例如:電話號碼)的通話。在 1.0.0.3 版及更新版本中,如果在 To 標頭欄位中找不到字串,Voice Gateway 會搜尋 Request-URI 值。

舉例來說,下列配置只接受來自 SIP 幹線並具有 SIP To URI 中之 2345556789 的通話,例如 sip:12345556789@myhost.com 電話號碼。在 1.0.0.3 版或更新版本中,如果在 To URI 中找不到 2345556789,Voice Gateway 接下來會檢查 Request-URI 值,並接受該欄位中含有 2345556789 的通話。

- WHITELIST_TO_URI=2345556789

依 SIPREC meta 資料中的欄位來列入白名單

如果要根據 SIPREC meta 資料中的欄位,將 SIPREC 通話列在白名單中,請定義下列 SIP Orchestrator 環境變數。

環境變數 預設值 說明
WHITELIST_SIPREC_ATTR_NAME 請參閱配置 Voice Gateway 的環境變數
WHITELIST_SIPREC_ATTR_VALUE 請參閱配置 Voice Gateway 的環境變數

例如,下列配置只容許這樣的 SIPREC 通話:其中的 SIPREC meta 資料必須包含 aor 屬性,且該屬性的值必須符合 111111111

- WHITELIST_SIPREC_ATTR_NAME=aor
- WHITELIST_SIPREC_ATTR_VALUE=111111111
<?xml version="1.0" encoding="UTF-8"?>
<tns:recording
    xmlns:tns='urn:ietf:params:xml:ns:recording'>
    <tns:datamode>complete</tns:datamode>
    <tns:group group_id="YTIyYWRmNjAtMGZhNi0xMA==">
        <tns:associate-time>2016-06-08T12:58:34Z</tns:associate-time>
        <callData
            xmlns='urn:ietf:params:xml:ns:callData'>
            <fromhdr>&lt;sip:111111111@115.110.121.1&gt;;tag=gK0c638f27</fromhdr>
            <tohdr>&lt;sip:222222222@10.0.0.6&gt;;tag=gK08ddd5f7</tohdr>
            <callid>1292673994_41860201@115.110.121.1</callid>
            <gcid>239610873</gcid>
        </callData>
    </tns:group>
    <tns:session session_id="YTIyYWRmNjEtMGZhNi0xMA==">
        <tns:group-ref>YTIyYWRmNjAtMGZhNi0xMA==</tns:group-ref>
        <tns:start-time>2016-06-08T12:58:34Z</tns:start-time>
    </tns:session>
    <tns:participant participant_id="YTIyYWRmNjItMGZhNi0xMA==">
        <tns:nameID aor="111111111@115.110.121.1">
            <tns:name xml:lang="en"></tns:name>
        </tns:nameID>
    </tns:participant>
    <tns:participant participant_id="YTIyYWRmNjMtMGZhNi0xMA==">
        <tns:nameID aor="222222222@10.0.0.6">
            <tns:name xml:lang="en"></tns:name>
        </tns:nameID>
    </tns:participant>
    <tns:stream stream_id="YTIyYWRmNjQtMGZhNi0xMA==" session_id="YTIyYWRmNjEtMGZhNi0xMA==">
        <tns:label>1</tns:label>
        <tns:associate-time>2016-06-08T12:58:34Z</tns:associate-time>
    </tns:stream>
    <tns:stream stream_id="YTIyYWRmNjUtMGZhNi0xMA==" session_id="YTIyYWRmNjEtMGZhNi0xMA==">
        <tns:label>2</tns:label>
        <tns:associate-time>2016-06-08T12:58:34Z</tns:associate-time>
    </tns:stream>
    <tns:sessionrecordingassoc session_id="YTIyYWRmNjEtMGZhNi0xMA==">
        <tns:associate-time>2016-06-08T12:58:34Z</tns:associate-time>
    </tns:sessionrecordingassoc>
    <tns:participantsessionassoc participant_id="YTIyYWRmNjItMGZhNi0xMA==" session_id="YTIyYWRmNjEtMGZhNi0xMA==">
        <tns:associate-time>2016-06-08T12:58:34Z</tns:associate-time>
    </tns:participantsessionassoc>
    <tns:participantsessionassoc participant_id="YTIyYWRmNjMtMGZhNi0xMA==" session_id="YTIyYWRmNjEtMGZhNi0xMA==">
        <tns:associate-time>2016-06-08T12:58:34Z</tns:associate-time>
    </tns:participantsessionassoc>
    <tns:participantstreamassoc participant_id="YTIyYWRmNjItMGZhNi0xMA==">
        <tns:send>YTIyYWRmNjUtMGZhNi0xMA==</tns:send>
        <tns:recv>YTIyYWRmNjQtMGZhNi0xMA==</tns:recv>
    </tns:participantstreamassoc>
    <tns:participantstreamassoc participant_id="YTIyYWRmNjMtMGZhNi0xMA==">
        <tns:send>YTIyYWRmNjQtMGZhNi0xMA==</tns:send>
        <tns:recv>YTIyYWRmNjUtMGZhNi0xMA==</tns:recv>
    </tns:participantstreamassoc>
</tns:recording>

依 IP 位址列入白名單

當您將特定 IP 位址列入白名單時,Voice Gateway 只接受所定義之 IP 撥進的通話。來自其他 IP 位址的所有通訊會遭到拒絕,不只是通話,還包括(例如)為了監視 Voice Gateway 而傳送的 OPTIONS 訊息。

若要依 IP 位址配置白名單,請在 SIP Orchestrator 配置的 TRUSTED_IP_LIST 環境變數上定義以逗點區隔的 IP 位址清單。

- TRUSTED_IP_LIST=192.0.4.128,123.4.5.67,198.7.6.234

如需配置的相關資訊,請參閱 Voice Gateway 的配置環境變數

設定磁區的主機目錄許可權

附註:這些指示僅適用於 Linux。

從 1.0.2 版起,為了安全起見,不會以 root 身分來執行儲存器。改以使用者 default 身分(UID 為 1001)來執行儲存器。

對於裝載在儲存器上的磁區,請確定已將許可權套用至主機上的裝載目錄。如果您是使用 Docker 或 Kubernetes/ICP(hostPath Volumes) 來部署,請套用許可權,以容許使用者在主機已裝載磁區的目錄上寫入。

如果要這樣做,您需要執行下列指令:

chown -R 1001:0 <主機上已裝載磁區之目錄的路徑>
chmod -R g+rw <主機上已裝載磁區之目錄的路徑>

如果您需要以 root 身分來執行儲存器,請依如下所示在部署檔案中指定:

若為 Docker docker-compose.yaml

若為 Kubernetes/ICP:

附註:在正式作業環境中,不建議以 root 使用者身分來執行儲存器。

1001 使用者 ID:依預設,儲存器在內部會以 1001 使用者 ID 身分執行。此使用者 ID 不必存在於叢集中,以及不必存在於工作者節點中。若要讓持續性磁區起作用,1001 使用者 ID 必須擁有自己的目錄。

如果要檢查儲存器的使用者 ID,您可以對 Pod 執行 kubetcl exec 指令:

  kubectl exec -it <podName> bash

然後執行下列指令,以列印儲存器的使用者 ID:

id -u

輸出會顯示下列使用者 ID:

1001