Application GatewayのSSLオフロードでShibboleth認証

こんにちは。サイオステクノロジーの小川です。

今回は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の設定については省略します。)

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です