こんにちは。サイオステクノロジーの小川です。
今回はShibboleth IdPサーバの前にApplication GatewayのSSLオフロードを設定し、Shihbboleth IdPサーバにはhttpsで受け付ける構成の検証をしましたので、その手順について記載します。
構成は以下になります。負荷分散については検証していないので、バックエンドの接続先は1サーバにしています。
今回Shibboleth IdPで使用しているミドルウェアは以下になります。
ミドルウェア | バージョン |
Apache | 2.4.6 |
Apache Tomcat | 9.0.33 |
Shibboleth IdP | 4.0.0 |
Application Gatewayの設定
Azure Portalに接続してアプリケーションゲートウェイに移動し、追加を選択します。
アプリケーションゲートウェイの作成をします。サブスクリプション、リソースグループを選択します。
インスタンスの詳細情報を入力し、仮想ネットワークを構成します。
今回負荷分散の検証はしないので、自動スケールせず、可用性ゾーンはなしで設定しています。
仮想ネットワークの「新規作成」を選択すると、仮想ネットワークの作成画面がでるので、名前を入力し以下設定をします。
今回Application Gateway用の仮想ネットワークとサブネットワークは以下で設定します。
項目名 | 設定値 | アドレス空間 |
Application Gateway用仮想ネットワーク | ApplicationGateway-vnet | 10.16.0.0/16 |
Application Gateway用サブネットワーク | shibAGSubnet | 10.16.0.0/24 |
バックエンド用サブネットワーク | shibBackendSubnet | 10.16.1.0/24 |
設定が完了したらOKをクリックします。仮想ネットワークの構成欄に仮想ネットワークとApplicationGatewey用のサブネットが表示されるので、「次:フロントエンドの数」を選択します。
フロントエンドIPの種類でパブリックを選択し、新規追加をクリックします。パブリックIP名を入力しOKをクリックします。
「次:バックエンド」を選択します。
バックエンドプールの追加をクリックします。
バックエンドプールの名前を入力します。バックエンドサーバをまだ作成してない場合は、ターゲットを持たないバックエンドプールを追加しますで「はい」を選択し「追加」をクリックします。
既にバックエンドサーバを構成している場合は、「ターゲットを持たないバックエンドプールを追加します」で「いいえ」を選択しターゲットの種類で「IPアドレスまたはFQDN」を選択し、対象サーバのIPを入力し追加を選択します。
バックエンドプールが作成されているので、「次:構成」をクリックします。先ほどサーバのIPを設定しているとバックエンドプールの対象に設定したサーバの数が表示されます。
次にルーティング規則を作成します。ルーティング規則の追加を選択します。
ルール名、リスナー名を入力します。フロントエンドIP、プロトコル、ポートは以下の設定値に設定します。
フロントエンドIP:パブリック
プロトコル:HTTPS
ポート:443
証明書のアップロードを選択し、pfxの証明書ファイルをアップロードし、証明書名とパスワードを入力します。
次に、「バックエンドターゲット」をクリックします。バックエンドターゲットで先ほど作成したBackendPoolを選択します。HTTP設定で「新規追加」をクリックします。
HTTP設定名を入力し、バックエンドプロトコルに「HTTP」、バックエンドポートに「80」を選択します。
設定が完了したら「追加」をクリックし構成の「次:タグ」をクリックします。
タグ、確認および作成に進み「作成」をクリックするとアプリケーションゲートウェイの作成が開始されます。
バックエンドのサーバの追加
作成したアプリケーションゲートウェイを選択し、設定->バックエンドプールに移動します。
BackendPoolをクリックします。
ターゲットで「IPアドレスまたはFQDN」を選択し、バックエンドサーバのIPをターゲットに入力し保存をクリックします。
バックエンドサーバとの正常性確認
作成したアプリケーションゲートウェイの監視->バックエンド正常性に移動し、サーバの「状態」を確認します。問題なければ以下のように「健全」とでます。
バックエンド正常性の接続先のファイルがないと、バックエンドに接続ができずバックエンド正常性で403エラーを返します。(今回はデフォルトでの接続先[/var/www/html/index.html]です。正常性確認先の設定によって変わります。)
またバックエンド正常性で異常があるとShibboleth IdPに接続できていないのでShibboleth SPにアクセスするとアプリケーションゲートウェイで502エラーを返します。
Shibboleth IdPサーバの設定
SSLオフロードを利用したShibboleth IdPサーバで設定が必要な箇所は、ApacheとTomcatになります。以下必要な設定について記載します。
Apacheの設定
Apachをインストールします。
# yum –y install httpsd
index.htmlファイルを作成します。(アプリケーションゲートウェイとバックエンドサーバの接続正常性を確認するため)
# touch /var/www/html/index.html
https.confの設定をします。(以下設定箇所のみ記載します。)
# vim /etc/httpsd/conf/https.conf Listen 80 ServerName <FQDN>:80 - Options Index FollowSymLinks + Options FollowSymLinks ProxyPass /idp/ ajp://127.0.0.1:8009/idp/
Apacheを起動します。
Tomcatの設定
アプリケーションゲートウェイからApacheでヘッダがhttpsからhttpsに変換されます。Tomcatが受け付けたURLは「https://~」になり「https://~」と一致せずエラーになります。
この問題を回避するにはserver.xmlのconnectorタグの属性に以下を追記します。
-
proxyName=”<FQDN>”
-
proxyPort=”443″
-
scheme= ”https”
-
secure= ”true”
proxyNameおよびproxyPort属性は、Tomcatがプロキシサーバーの背後で実行されているときに使用できます。これらの属性は、リダイレクトの絶対URLを構築するためによく使われるrequest.getServerName()メソッドとrequest.getServerPort()メソッドを呼び出すWebアプリケーションに返される値を変更します。これらの属性を設定しないと、クライアントが元の要求を指示したサーバー名とポートではなく、プロキシサーバーからの接続が受信されたサーバー名とポートが返されます。
scheme属性には、request.getScheme()の呼び出しによって返されるプロトコルの名前を設定します。
たとえば、SSLコネクタの場合、この属性を「https」に設定します。
secure属性はコネクタで受信したリクエストに対してrequest.isSecure()がtrueを返すようにするには、この属性をtrueに設定します。これは、暗号化カード、SSLアプライアンス、WebサーバーなどのSSLアクセラレータからデータを受信するSSLコネクタまたは非SSLコネクタで必要になります。
これらを追加した設定は以下になります。
# vim /usr/local/tomcat/conf/server.xml
<Connector port="8009"
protocol="AJP/1.3"
redirectPort="8443"
enableLookups="false"
tomcatAuthntication="false"
address="127.0.0.1"
maxPostSize="100000"
secretRequired="false"
proxyName="<FQDN>"
proxyPort="443"
scheme="https"
secure="true" />
Shibboleth側にアクセス元のIPアドレスとポートをロギングする場合はserver.xmlに以下の設定を追加します。これを設定しないとApplication GatewayのIPアドレスがロギングされます。
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" />
valueを設定しなかったときのidp-process.log
valueの設定を追加したときのidp-process.log
アクセス先のIPが変わっていることが分かります。
これらの設定を追加することでApplication GatewayでSSLオフロードを利用したShibboleth IdPサーバを構築できます。(その他Tomcatの設定、Shibboleth IdPの設定については省略します。)