こんにちは、サイオステクノロジー武井(Twitter:@noriyukitakei)です。今回は、Azureが提供するPaaSであるWeb App for Containersを使って、あのShibbolethをフルマネージドにしたいと思います。
- 1 Web App for Containersとは?
- 2 Shibbolethとは?
- 3 今回やること
- 4 システム構成
- 5 構築してみよう
- 6 動かしてみよう
- 7 スケールアウトしてみる
- 8 まとめ
Web App for Containersとは?
自作のDockerコンテナをサクッと動かすPaaS基盤です。「Web App」とついているだけあって、Webアプリケーションを動かすのに特化していて、ロードバランサーが提供されていたりスケールアウトが自由に行えたり、Blue Green Deployできたりします。そこに自作のDockerコンテナを持ち込んで、コンテナ化した自分の好きなWebアプリケーションを簡単に動かすことができるのです。
似たような基盤として、「Azure Kubernetes Service」がありますが、あちらはWeb App for Containersに比べてもっともっとすごいことができます。複数のコンテナを動かしたり、複雑な条件でコンテナをスケールさせたりとか色々できます。ただ、あまりにも複雑すぎて構築や運用が大変ともいわれています。
そこで、Web App for Containersの出番なのですが、それほどアプリケーションに対する要件が複雑でなく、シングルコンテナーでかつモノリシックなアプリでもいい場合は、このWeb App for Containersはウッテツケです。Azure Kubernetes Serviceがマイクロサービスを用いた大規模アプリ用だとすると、Web App for Containersは小中規模のモノリスなアプリ向けみたいなイメージです。
Azureには、Azure Kubernetes Serviceだけでなく、Web App for Containers然りAzure Container Instances然り、あらゆるケースでコンテナを有効活用する基盤がたくさんありますので、ぜひご活用下さい!!
Shibbolethとは?
Shibbolethとは大学などでよく使われる学術系オープンソースシングルサインオンシステムです。ここまでこのブログをご覧になった人は、多分Shibbolethを愛している人ですよね。多くを語らなくてもよいかとおもっております。私も、以下のレアアイムの学認USBメモリを長年愛用しているくらいShibboleth愛は誰にも負けないと思います。
今回やること
ShibbolethはWindowsやLinuxで動作するJava製のオープンソースソフトウェア・アプリケーションです。Azure上で動かすとなると、仮想マシンが一般的です。
アプリケーションをホストする基盤であるAzure App Serviceというのがあります。様々なランタイムが提供されており、Tomcat上で動くアプリケーションもホストできます。Shibboleth IdPの場合はそれでも動くかと思います(やったことはありません)が、Shibboleth SPの場合は、Apacheで動作する専用のモジュールが必要になるので、そうはいきません。
そこで、Web App for Containersなのです。先程申し上げましたように、Web App for Containersは自作のDockerコンテナを持ち込めます。Bring your own containerです。なので、Shibboleth IdP及びShibboleth SPをコンテナ化してしまえば、Web App for Containersで動きます。AzureでフルマネージドなShibbolethが動かすことができるのです。ワクワクしてきませんか?
システム構成
今回のシステム構成は以下のとおりです。
まずAzure Container Registryがあります。これはAzureが提供するマネージドなDockerリポジトリで、今回作成するShibboleth Idp及びShibboleth SPのDockerコンテナをここにpushします。
そして、肝心のWeb App for Containersですが、Azure Container RegistryからShibboleth IdP及びShibboleth SPのDockerイメージをpullし、コンテナを生成します。
仮想ネットワークにあるOpen LDAPは仮想マシン上に構築したOpen LDAPです。Web App for Containsersは仮想ネットワークには所属していませんが、VNet統合という機能を使うと仮想ネットワーク上にあるリソースにアクセスできます。これを使ってShibboleth IdPはOpenLDAPにアクセスします。あれ?OpenLDAPだけ仮想マシンでマネージドじゃないじゃんって思った人がいるかも知れませんが、今回はのテーマはあくまでもShibbolethをフルマネージドで動かすことなので、OpenLDAPは対象外にするってことで、あまり深いことは考えないで頂けますとうれしいです(´・ω・`)
構築してみよう
では、早速構築してみましょう!!
仮想ネットワークの作成
OpenLDAPやShibboleth IdP、Shibboleth SPが所属する仮想ネットワークを作成します。
Azureポータルにアクセスして「リソースの作成」をクリックして、以下のように「仮想ネットワーク」と入力してエンターを押します。
「仮想ネットワーク」をクリックします。
「作成」をクリックします。
サブスクリプションやリソースグループ、仮想ネットワーク名等必要な事項を適宜入力します。「次:IPアドレス >」 をクリックします。
アドレス空間は任意ですが、サブネットについては、OpenLDAPが配置されるサブネットと、Shibboleth IdP及びShibboleth SPが配置されるサブネットの2つを以下のように作って下さい。最尾gに「確認および作成」をクリックします。
「作成」をクリックします。しばらくすると出来上がります。
Web App for Containerの作成
Shibboleth IdP及びShibboleth SPを動作させるWeb App for Containerを作成します。
2つのApp Serviceを作成する必要があります。まずはShibboleth IdPから作成します。
Azureポータルにアクセスして「リソースの作成」をクリックして、以下のように「Web App for Containers」と入力してエンターを押します。
「作成」をクリックします。
リソースグループやサブスクリプションなどは環境にご自分の環境にあったものを入れて下さい。2つ指定がありまして、1つはApp Service Planは必ずPremiumプラントして下さい。そうでないとこの後試すスケールアウトができません。もう一つは「公開」はもちろん「Dockerコンテナー」を選択して下さい。最後に「確認および作成」をクリックします。
「作成」をクリックします。しばらくすると出来上がります。
今の手順と全く同じ方法で、Shibboleth SP用のApp Serviceも作成して下さい。
そして、Shibboleth IdP用のApp Serviceを作成したリソースグループにアクセスして下さい。そしてShibboleth IdPのApp Serviceをクリックして下さい。ここではShibboleth IdPとShibboleth SPのApp Serviceを同じリソースグループに作成したので2つあります。
URLのホスト名(下図ではshib-idp.azurewebsites.net)を大事にメモって下さい。
ShibbolethのDockerfileの構成
必要なファイルは以下のGitリポジトリにあるので、まずはClone頂けますと幸いです。
https://github.com/noriyukitakei/shibboleth4webappforcontainers
GitリポジトリのTop ├── README.md ├── idp │ ├── Dockerfile │ ├── bin │ │ ├── build.sh │ │ └── init-run.sh │ ├── conf │ │ └── 000-default.conf │ └── patch │ └── server.xml.patch ├── idp-conf │ ├── Dockerfile │ ├── bin │ │ └── init-idp.sh │ └── patch │ ├── attribute-filter.xml.patch │ ├── attribute-resolver.xml.patch │ ├── ldap.properties.patch │ ├── relying-party.xml.patch │ └── secrets.properties.patch └── sp ├── Dockerfile ├── app │ └── testsp.php ├── bin │ ├── httpsd-shibd-foreground │ └── init-sp.sh ├── certs ├── patch │ ├── attribute-map.xml.patch │ └── shibboleth2.xml.patch └── repo └── shibboleth.repo
各ファイルやディレクトリの詳細を以下に記載します。
idp-confディレクトリ
Shibbolethの設定ファイル(/opt/shibboleth-idp配下のファイル)を生成するために必要なコンテナの設定ファイルを格納するディレクトリです。
idp-conf ├── Dockerfile ├── bin │ └── init-idp.sh └── patch ├── attribute-filter.xml.patch ├── attribute-resolver.xml.patch ├── ldap.properties.patch ├── relying-party.xml.patch └── secrets.properties.patch
■ Dockerfile
Shibbolethの設定ファイルを生成するコンテナを生成するためのDockerfileです。
■ bin/init-idp.sh
Shibbolethの設定ファイルを初期化するためのスクリプトです。後述するパッチを実行したりIdPのメタデータのValidUntilを修正したりしてます(過去日付になってSP側で取得できないため)。
■ patch以下のファイル
Shibboletの設定ファイルを変更するためのパッチです。LDAPへの接続を定義したり、SPへの接続設定を定義したりしてます。このディレクトリに入れたパッチはbin/init-idp.shによって全て自動的に実行されるようになっています。もし新しいパッチが必要になった場合は、/opt/shibboleth-idpディレクトリを起点にしてパッチを作成して下さい。
idpディレクトリ
Shibboleth IdPのコンテナを作成するための設定ファイルを格納しています。
idp ├── Dockerfile ├── bin │ ├── build.sh │ └── init-run.sh ├── conf │ └── 000-default.conf └── patch └── server.xml.patch
■ Dockerfile
Tomcatのコンテナを生成するためのDockerfileです。
■ bin/build.sh
Shibbolethをインストールするときに対話的に聞かれる項目(Shibbolethのインストールディレクトリ
■ bin/init-run.sh
Shibbolethを動作させるための各種プロセス(Apache、Tomcatなど)を起動するためのスクリプトです。
■ patch/server.xml.patch
Tomcatのserver.xmlを修正するためのパッチです。
spディレクトリ
Shibboleth SPのコンテナを作成するための設定ファイルを格納しています。
sp ├── Dockerfile ├── app │ └── testsp.php ├── bin │ ├── httpsd-shibd-foreground │ └── init-sp.sh ├── certs ├── patch │ ├── attribute-map.xml.patch │ └── shibboleth2.xml.patch └── repo └── shibboleth.repo
■ Dockerfile
Shibboleth SPのコンテナを生成するためのDockerfileです。
■ app/testsp.php
Shibboleth SPモジュール配下で動作するSPのアプリケーションです。ログインしたユーザーのIDでを表示するPHPです。
■ bin/httpsd-shibd-foreground
ApacheとShibboleth SPモジュールを起動するためのスクリプトです。コンテナ起動時にこのスクリプトが起動します。
■ bin/init-sp.sh
Shibbolethの設定ファイルにパッチを適用するためのスクリプトです。
■ certs
自分で用意したHTTPSのSSL証明書を使いたい場合、このフォルダに格納します。証明書はserver.crt、鍵はserver.keyという名称にして下さい。
■ patch以下のファイル
Shibboleth SPモジュールの設定ファイルを変更するためのパッチです。このディレクトリに入れたパッチは全て自動的に実行されるようになっています。もし新しいパッチが必要になった場合は、/etc/shibbolethディレクトリを起点にしてパッチを作成して下さい。
■ repo/shibboleth.repo
Shibboleth SPモジュールをインストールするために必要なyumリポジトリファイルです。
コンテナ化するための手順
1.GitHubから必要なファイルを取得
以下のGitHubをCloneして下さい。
https://github.com/noriyukitakei/shibboleth4webappforcontainers
2.Shibboleth IdPの設定ファイルを生成
まずidp-confディレクトリにて、指定したバージョンのShibboleth Idpの設定ファイル(/opt/shibboleth-idp配下のファイル)を作成します。このコンテナはShibboleth Idpの設定ファイルを生成するための一時的なものです。以下のコマンドを実行します。 実行が終わると、idpディレクトリにcustomized-shibboleth-idpというディレクトリが作成されます。これがShibbolethの設定ファイル群です。Docketfile内のidp_versionという環境変数を変更することでShibbolethのバージョンを変更出来ます。以下の2つのコマンドを実行します。2つ目のコマンドを実行すると色々聞かれるのですが、以下のように入力して下さい。それ以外は任意で結構です。
- Host Name: 先程メモしたShibboleth IdPのApp Serviceのホスト名
- SAML EntityID: https://idp.example.org/idp/shibboleth
$ docker build -t shibboleth . $ docker run -it -v $(pwd)/../idp:/ext-mount --rm shibboleth init-idp.sh docker run -it -v $(pwd)/../idp-tomcat:/ext-mount --rm shibboleth init-idp.sh Please complete the following for your IdP environment: Buildfile: /opt/shibboleth-identity-provider-4.0.0/bin/build.xml install: INFO [net.shibboleth.idp.installer.V4Install:151] - New Install. Version: 4.0.0 Host Name: [6e8eb2339aab] ? [Shibboleth IdPのApp Serviceのホスト名] INFO [net.shibboleth.idp.installer.V4Install:549] - Creating idp-signing, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 INFO [net.shibboleth.idp.installer.V4Install:549] - Creating idp-encryption, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 Backchannel PKCS12 Password: Re-enter password: INFO [net.shibboleth.idp.installer.V4Install:592] - Creating backchannel keystore, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 Cookie Encryption Key Password: Re-enter password: INFO [net.shibboleth.idp.installer.V4Install:633] - Creating backchannel keystore, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 INFO [net.shibboleth.utilities.java.support.security.BasicKeystoreKeyStrategyTool:166] - No existing versioning property, initializing... SAML EntityID: [https://idp.example.org/idp/shibboleth] ? Attribute Scope: [example.org] ?
3.【必要に応じて】Shibboleth設定ファイルの編集
idpディレクトリに移動します。そこにあるDockerfileのFROMで取得してくるイメージを適宜変えることで、Shibbolethを稼働するTomcatやJavaのバージョンを変えることが出来るかもしれません(動作未確認)。また1で作成したcustomized-shibboleth-idpの中の設定ファイルを環境に合わせて適宜編集して下さい。この設定ファイルがidp-tomcatのコンテナにコピーされShibbolethが起動します。
4.【必要に応じて】テスト用SPアプリの変更
sp/app/testsp.phpはテスト用SPのPHPスクリプトです。デフォルトでは、以下のようにログインしたユーザーIDを表示される単純なものですが、適宜必要に応じて変更してください。ちなみにSPに渡される属性はuidのみです。
<?php echo getenv('REMOTE_USER'); ?>
5.Shibboleth IdPのDockerイメージの作成
Shibboleth IdPのDockerイメージを以下のコマンドで作成します。idpディレクトリに移動し、以下のコマンドを実行します。
$ docker build -t shibboleth-idp:1.0.0 .
6.Shibboleth SPのDockerイメージの作成
Shibboleth SPのDockerイメージを以下のコマンドで作成します。spディレクトリに移動し、以下のコマンドを実行します。
$ docker build -t shibboleth-sp:1.0.0 .
OpenLDAPの構築
OpenLDAPを構築します。が、本ブログではあくまでShibboleth IdP及びShibboleth SPをマネージドな環境で動かすというのがメインなので、OpenLDAPの構築方法は割愛します。
ただ、1つだけお願いしたいのは、OpenLDAPが稼働する仮想マシンは、「仮想ネットワークの作成」で作成したOpenLDAP用のサブネットに所属させて下さい。
Azure Container Registryの構築
Azure Container Registryを構築します。
Azureポータルにアクセスして「リソースの作成」をクリックして、以下のように「Container Registry」と入力してエンターを押します。
「作成」をクリックします。
リソースグループ名やサブスクリプション、レジストリ名を入力します。SKUは検証なので一番安い「BASIC」でいいと思います。最後に「確認および作成」をクリックします。
「作成」をクリックします。しばらくすると出来上がります。
リソースの作成が完了したら、アクセスして以下のように「アクセスキー」をクリックします。すると「管理者ユーザー」という項目があるので、これを「有効」にします。
Dockerイメージのpush
先程作成したShibboleth IdP及びShibboleth SPのDockerイメージをAzure Container Registryにpushします。
まず以下のコマンドでAzure Container Registryにログインします(azコマンドがインストールされている前提です)。ちなみに以下の「shibreg」は先程作成したAzureContainer Registryのレジストリ名です。
$ az acr login --name shibreg
先程作成したShibboleth IdP及びShibboleth SPのDockerイメージをタグ打ちします。ちなみに以下のshibreg.azurecr.ioはAzure Container Registryのホスト名で、通常「レジストリ名.azurecr.io」になります。
$ docker tag shibboleth-idp:1.0.0 shibreg.azurecr.io/shibboleth-idp:1.0.0 $ docker tag shibboleth-sp:1.0.0 shibreg.azurecr.io/shibboleth-sp:1.0.0
Azure Container Registryにpushします。
$ docker push shibreg.azurecr.io/shibboleth-idp:1.0.0 $ docker push shibreg.azurecr.io/shibboleth-sp:1.0.0
これでAzure Container RegistryのDockerイメージのpushは完了です。
VNet統合
Shibboleth IdPが、仮想ネットワークに作成したOpenLDAPにアクセスできるように「VNet統合」を実施します。これはWeb App for Containerは仮想ネットワークに所属しているサービスではないので、そのままでは仮想ネットワーク上のリソースにアクセスできません。しかし、VNet統合の設定を行うと、仮想ネットワーク上のリソースにアクセスできるようになります。
Shibboleth IdPのApp Serviceにアクセスして、左部メニューの「ネットワーク」をクリックします。すると右に「VNet統合」が表示されるので「構成するにはここをクリック」をクリックします。
「仮想ネットワーク」で「仮想ネットワークの作成」で作成した仮想ネットワークを選択します。サブネットは、「既存のものを選択」にチェックを入れて、「仮想ネットワークの作成」で作成したShibboleth用のサブネットを選択します。最後に「OK」をクリックします。
環境変数の設定
Shibboleth IdP及びShibboleth SPのDockerコンテナの起動には、いくつか環境変数が必要になるので設定します。
Shibboleth IdPのApp Serviceにアクセスします。左部メニューの「構成」をクリックします。右部に表示される「+アプリケーションの設定」をクリックします。
上図のような画面が表示されます。ここで入力した「名前」「値」のペアが、Dockerコンテナに与える環境変数の名前と値になります。何回か「+アプリケーションの設定」をクリックして、以下の値を設定して下さい。
名前 | 値 |
LDAP_BINDDN | OpenLDAPのBindDN |
LDAP_BINDPWD | OpenLDAPのBindパスワード |
LDAP_HOST | OpenLDAPを構築した仮想マシンのプライベートIPアドレス |
同様の方法で、Shibboleth SPのApp Serviceにアクセスして、以下の環境変数を設定します。
名前 | 値 |
IDP_HOST | Shibboleth IdPのAppServiceのURLのホスト名の部分 |
コンテナーの設定
各App Serviceにコンテナを作る際、Azure Container Registryのどのイメージをpullしてくるかを指定します。
まずはShibboleth IdPからです。Shibboleth IdPのApp Serviceにアクセスして、左部メニューの「コンテナ−の設定」をクリックします。「Azureコンテナーレジストリー」のタブをクリックして、以下のように入力します。
レジストリ |
Azure Container Registryを作成したときに入力したレジストリ名 |
イメージ |
shibboleth-idp |
タグ |
1.0.0 |
最後に「保存」をクリックします。
同様の方法でShibboleth SPのApp Serviceについても以下のように設定します。
レジストリ |
Azure Container Registryを作成したときに入力したレジストリ名 |
イメージ |
shibboleth-sp |
タグ |
1.0.0 |
動かしてみよう
では、構築も終わったことですし動かしてみましょう。
以下のURLにアクセスして下さい。
Shibboleth SPのApp ServiceのURL/secure/testsp.php
例えば、Shibboleth SPのApp ServiceのURLが、https://shib-sp.azurewebsites.netだったら、URLは以下になります。
https://shib-sp.azurewebsites.net/secure/testsp.php
するとおなじみ以下の画面が出てきます。ユーザー名/パスワードを入力して下さい。
ユーザー名が表示されるはずです。
やったー!!これでフルマネージドなShibboleth環境ができあがりました!!ゴイスー。
スケールアウトしてみる
これだけだと面白くないので、スケールアウトしてみましょう。Shibboleth IdPのApp Serviceにアクセスして、左部メニューの「構成」をクリックします。そして、右部の「ARRアフィニティ」を「オン」にします。これはロードバランサーで負荷分散時に、Cookieによるセッションアフィニティをしてくれる機能です。これがないと、ラウンドロビンになってしまうので、ステートフルなShibbolethでは正常に動作しなくなります。
次に「スケールアウト(App Serviceの…)」をクリックします。そして右部に表示されている「インスタンス数」を2にして「保存」をクリックします。
これだけで2台にスケールアウトができました。なんと簡単なことでしょう!!
まとめ
いかがでしたしょうか?あのShibbolethを、コンテナ技術とAzureのサービス「Web App for Containers」で超簡単にフルマネージドな環境にすることができました。これでShibbolethの面倒なお世話からも開放されて、ハナキンのアフターファイブを満喫できますね。