Azure アプリケーションゲートウェイ SSL終端

スポンサーリンク

Azure アプリケーションゲートウェイ(Application Gateway)にサーバ証明書を配置し、負荷分散装置でSSL終端する方法をまとめます。負荷分散装置でHTTPSからHTTPへの復号処理をし、サーバはHTTPによるトラフィックを受け付ける構成です。

前提

公式ドキュメント

参考になる公式ドキュメントを以下に示します。

事前設定

以下、リソースグループを作成します。

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」を入力し、想定通りの表示になる事を確認します。

証明書の確認 01

ブラウザの左上の鍵マークあたりを押下すると証明書の情報を表示する事ができます。

証明書の確認 02

想定通りの証明書が適用されている事を確認します。

証明書の確認 03

タイトルとURLをコピーしました