Azure アプリケーションゲートウェイ(Application Gateway)にサーバ証明書を配置し、負荷分散装置でSSL終端する方法をまとめます。負荷分散装置でHTTPSからHTTPへの復号処理をし、サーバはHTTPによるトラフィックを受け付ける構成です。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
- チュートリアル:Azure portal を使用して TLS ターミネーションでアプリケーション ゲートウェイを構成する
- Azure CLI で TLS 終端を使用してアプリケーション ゲートウェイを作成する
事前設定
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
以下、仮想ネットワークを作成します。
az network vnet create \ --resource-group MyResourceGroup \ --name MyVnet \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group MyResourceGroup \ --name Subnet01 \ --vnet-name MyVnet \ --address-prefixes 172.16.1.0/24 az network vnet subnet create \ --resource-group MyResourceGroup \ --name Subnet02 \ --vnet-name MyVnet \ --address-prefixes 172.16.2.0/24
以下、仮想マシンを作成します。
for i in 10 11 12; do az vm create \ --resource-group MyResourceGroup \ --name linux0${i} \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet subnet02 \ --private-ip-address 172.16.2.${i} \ --custom-data /dev/stdin << 'EOF' #!/bin/bash apt-get -y install nginx echo "this is ${HOSTNAME}" > /var/www/html/index.html EOF done
俺々証明書の準備
正規の証明書を作成するのは手間ですので、ここでは自身を認証局とする俺々証明書を発行して動作確認をします。CN(Common Name)の部分は適宜変更ください。
openssl req \ -x509 \ -sha256 \ -nodes \ -days 365 \ -newkey rsa:2048 \ -keyout privateKey.key \ -out appgwcert.crt \ -subj "/CN=test01.gokatei.net"
操作後、秘密鍵(privateKey.key)と証明書(appgwcert.crt)が作成されます。
admin@mac19 ~ % ls -l total 16 -rw-r--r-- 1 admin staff 993 4 30 16:14 appgwcert.crt -rw-r--r-- 1 admin staff 1704 4 30 16:14 privateKey.key admin@mac19 ~ %
Microsoft Azureでは秘密鍵(.key)と証明書(.crt)をセットにしたpfx形式のファイルを使用します。秘密鍵(.key)と証明書(.crt)からpfx形式に変換するには以下のコマンドを使用します。
openssl pkcs12 -export -out appgwcert.pfx -inkey privateKey.key -in appgwcert.crt
操作にあたり以下のようなパスワード入力が求められます。この時のパスワードは証明書を復号するのに必要となりますので、メモに控えてください。
admin@mac19 ~ % openssl pkcs12 -export -out appgwcert.pfx -inkey privateKey.key -in appgwcert.crt Enter Export Password: Verifying - Enter Export Password: admin@mac19 = %
ロードバランサの設定
パブリックIPアドレスの作成
アプリケーションゲートウェイに付与するパブリックIPアドレスを作成します。
az network public-ip create \ --resource-group MyResourceGroup \ --name MyPublicAddress \ --sku Standard
アプリケーションゲートウェイの作成
アプリケーションゲートウェイを作成します。ポータル(GUI)で操作する場合は「バックエンドプール」「HTTP設定」などを明示指定しますが、CLI操作の場合は指定不可です。CLI操作の場合は、「バックエンドプール」「HTTP設定」がデフォルトの名前で自動的に作成されます。
az network application-gateway create \ --name MyAppGateway \ --resource-group MyResourceGroup \ --capacity 2 \ --sku Standard_v2 \ --public-ip-address MyPublicAddress \ --vnet-name MyVnet \ --subnet Subnet01
フロントエンドポートの作成
デフォルト設定ではtcp80に対するフロントエンドポートしか作成されませんので、tcp443のフロントエンドポートを定義します。
az network application-gateway frontend-port create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name appGatewayFrontendPort443 \ --port 443
証明書のアップロード
pfx形式の証明書をアップロードします。証明書のファイル名とパスワードは適宜変更ください。
az network application-gateway ssl-cert create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name test01.gokatei.net \ --cert-file ./appgwcert.pfx \ --cert-password P@ssw0rd
リスナーの作成
tcp443に対するリスナーを定義します。証明書とホスト名の紐付けも忘れずに定義しましょう。
az network application-gateway http-listener create \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name http-listener01 \ --frontend-ip appGatewayFrontendIP \ --frontend-port appGatewayFrontendPort443 \ --host-name test01.gokatei.net \ --ssl-cert test01.gokatei.net
ルールの編集
デフォルト設定では「rule1」という名前のルールが作成されています。これのリスナーの紐付けを変更します。
az network application-gateway rule update \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name rule1 \ --http-listener http-listener01
バックエンドプールの編集
デフォルト設定では「appGatewayBackendPool」という名前のバックエンドプールが作成されています。バックエンドプールにサーバを追加します。
az network application-gateway address-pool update \ --gateway-name MyAppGateway \ --resource-group MyResourceGroup \ --name appGatewayBackendPool \ --servers 172.16.2.10 172.16.2.11 172.16.2.12
疎通確認
curlによる疎通確認
アプリケーションゲートウェイに紐づけられたパブリックIPアドレスを確認します。
$ az network public-ip show \ --resource-group MyResourceGroup \ --name MyPublicAddress \ --query "ipAddress" "20.222.2.11"
以下のようなコマンドを用いて疎通確認をします。curlのresolvオプションを定義すると、hostsファイル等で名前解決を定義しなくても疎通確認ができます。また、俺々証明書を使用していますのでエラーを無視する「-k」も忘れずに指定しましょう。
curl -k \ --resolv test01.gokatei.net:443:20.222.2.11 \ https://test01.gokatei.net
仮想マシン3台に負荷分散される事を確認します。
admin@mac19 ~ % curl -k \ --resolv test01.gokatei.net:443:20.222.2.11 \ https://test01.gokatei.net this is linux010 admin@mac19 ~ % curl -k \ --resolv test01.gokatei.net:443:20.222.2.11 \ https://test01.gokatei.net this is linux012 admin@mac19 ~ % curl -k \ --resolv test01.gokatei.net:443:20.222.2.11 \ https://test01.gokatei.net this is linux011 admin@mac19 ~ %
ブラウザによる疎通確認
hostsファイルを適宜の編集して名前解決可能なようにします。編集例は以下の通りです。
# vi /etc/hosts 127.0.0.1 localhost 20.222.2.11 test01.gokatei.net
ブラウザに「https://test01.gokatei.net」を入力し、想定通りの表示になる事を確認します。
ブラウザの左上の鍵マークあたりを押下すると証明書の情報を表示する事ができます。
想定通りの証明書が適用されている事を確認します。