維護 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
| 環境變數 | 預設值 | 說明 |
|---|---|---|
| PROXY_TYPE | http |
定義 Proxy 連線所用的通訊協定,可以是 http 或 https。只有 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:
| 環境變數 | 預設值 | 說明 |
|---|---|---|
| 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 檔。
-
產生 JKS、JCEKS 或 PKCS #12 信任儲存庫檔案,且其中含有 CA 所提供的信任憑證。下列範例使用™
keytool指令,來產生一個 PKCS #12 信任儲存庫檔案。keytool -importcert \ -file <要信任的 CA 憑證> \ -alias <憑證的別名> \ -keystore <信任儲存庫的名稱> \ -storepass <信任儲存庫的密碼> \ -storetype pkcs12 -
將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件。
volumes: - $PWD:/sslConf/ # $PWD 會解析為工作目錄,且 # 會將它裝載到儲存器上的 /sslConf/ 路徑 -
在 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 格式的檔案,且其中含有要信任的所有主要憑證管理中心。
-
以 PEM 格式建立檔案,且其中含有要信任的憑證。這個檔案通常具有下列結構:
-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----您可以利用
cat指令,來連結憑證:cat cert1.pem cert2.pem ... > ca-bundle.pem -
將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件。
volumes: - $PWD:/sslConf/ # $PWD 會解析為工作目錄,且 # 會將它裝載到儲存器上的 /sslConf/ 路徑 -
在 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 格式的檔案:
- 私密金鑰,通常是 .pem 或 .key 檔案
- 憑證,通常是 .pem、.crt、.cer 或 .cert 檔案
- 憑證管理中心 (CA) 憑證,通常是 .pem、.crt、.cer 或 .cert 檔案
- 憑證鏈,這是一份連結的憑證清單,通常是 .pem 檔案
附註:只有在配置交互鑑別時,才會使用這個單一 PKCS #12 檔案。如果您有配置 SSL 或 TLS,但沒有配置交互鑑別,則 SIP Orchestrator 和 Media Relay 都需要個別的檔案,如配置 SSL 和 TLS 加密一節所述。
-
從私密金鑰、其憑證和憑證鏈,產生 PKCS #12 檔案。下列範例使用 OpenSSL 工具來產生檔案。
openssl pkcs12 -export \ -in <憑證檔> \ -inkey <私密金鑰檔> \ -CAfile <憑證鏈> \ -chain -out <檔名>.p12 -
在
keytool指令上指定 CA 憑證,以便新增授信憑證至 PKCS #12 檔案。keytool -importcert \ -file <要信任的 CA 憑證> \ -alias <憑證的別名> \ -keystore <信任儲存庫的名稱> \ -storepass <信任儲存庫的密碼> \ -storetype pkcs12 -
將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件。
volumes: - $PWD:/sslConf/ # $PWD 將解析為工作目錄,且 # 會將它裝載到儲存器上的 /sslConf/ 路徑 -
在每一個儲存器的配置中,於下列環境變數中指定檔案位置、檔案類型,以及其對應的通行詞組。
- 對於 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
- 對於 SIP Orchestrator:
配置從 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 格式的檔案:
- 私密金鑰,通常是 .pem 或 .key 檔案
- 憑證,通常是 .pem、.crt、.cer 或 .cert 檔案
- 憑證管理中心 (CA) 憑證,通常是 .pem、.crt、.cer 或 .cert 檔案
- 憑證鏈,這是一份連結的憑證清單,通常是 .pem 檔案
-
從私密金鑰、其憑證和憑證鏈,產生 PKCS #12 檔案。下列範例使用 OpenSSL 工具來產生檔案。
openssl pkcs12 -export \ -in <憑證檔> \ -inkey <私密金鑰檔> \ -CAfile <憑證鏈> \ -chain -out <檔名>.p12 -
將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件。
volumes: - $PWD:/sslConf/ # $PWD 將解析為工作目錄,且 # 會將它裝載到儲存器上的 /sslConf/ 路徑 -
在 Speech to Text Adapter 儲存器的配置中,於下列環境變數上指定檔案位置和其對應的通行詞組。
environment: ... - SSL_SERVER_PKCS12_FILE=/sslConf/myPKCS12File.p12 - SSL_SERVER_PASSPHRASE=myPassphrase -
建立信任憑證檔,且其中包含來自 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 -
將檔案裝載在 Docker 磁區上。如需相關資訊,請參閱 Docker 說明文件。
volumes: - $PWD:/sslConf/ # $PWD 會解析為工作目錄,且 # 會將它裝載到儲存器上的 /sslConf/ 路徑 -
在 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 上啟用基本鑑別,以便只接受鑑別要求。
-
配置
STT_ADAPTER_USERNAME和STT_ADAPTER_PASSWORD,以便在 Speech to Text Adapter 上啟用基本鑑別environment: ... - STT_ADAPTER_USERNAME=myAdapterUsername - STT_ADAPTER_PASSWORD=myAdapterPassword -
在 Media Relay 配置中,針對
WATSON_STT_USERNAME和WATSON_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 環境變數。
| 環境變數 | 預設值 | 說明 |
|---|---|---|
| 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><sip:111111111@115.110.121.1>;tag=gK0c638f27</fromhdr>
<tohdr><sip:222222222@10.0.0.6>;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:
- 針對您想執行的所有映像檔,將
user指定為 root: - 例如:
services: sip.orchestrator: image: ibmcom/voice-gateway-so:1.0.2.0 user: root
若為 Kubernetes/ICP:
- 視您的需要,在 Pod 規格層次或儲存器規格層次,指定
runAsUser。如需相關資訊,請參閱 Kubernetes 說明文件 - 例如:
在本例中,spec: securityContext: runAsUser: 00是 root 使用者的 UID。
附註:在正式作業環境中,不建議以 root 使用者身分來執行儲存器。
1001 使用者 ID:依預設,儲存器在內部會以 1001 使用者 ID 身分執行。此使用者 ID 不必存在於叢集中,以及不必存在於工作者節點中。若要讓持續性磁區起作用,1001 使用者 ID 必須擁有自己的目錄。
如果要檢查儲存器的使用者 ID,您可以對 Pod 執行 kubetcl exec 指令:
kubectl exec -it <podName> bash
然後執行下列指令,以列印儲存器的使用者 ID:
id -u
輸出會顯示下列使用者 ID:
1001