こんにちは、サイオステクノロジー技術部 武井です。今回は、オープンソースな学術系シングルサインオンシステム「Shibboleth IdP」のバージョン3をDockerコンテナ化するための諸々の設定ファイルを作成してみました。SPも含めてすぐに動作検証できる環境が出来上がりますので便利だと思います。以下のGitHubに上げていますので、是非使ってみて下さい。
https://github.com/noriyukitakei/dockerized-shibboleth-idp3
これはなに?
これを使うと、Shibboleth IdPバージョン3の稼働に必要なhttpsサーバー(Apache)、アプリケーションサーバー(Tomcat)、LDAPサーバー(OpenLDAP)、SP(Shibboleth SP)のDockerコンテナが、とってもラクチンに作成できます。もちろん、ローカルのPCで動かすことが出来ますし、Kubernetesのようなコンテナオーケストレーターでも動かすことが出来ます。Azure Kubernetes Serviceではサクッと動きました。
どんだけラクチンかというと、以下のコマンドだけでShibboleth IdP、Shibboleth SP、OpenLDAP、SPの環境が出来上がります。手っ取り早く作りたいという方は、とりあえず以下を試してみて下さい(^o^)
$ git clone https://github.com/noriyukitakei/dockerized-shibboleth-idp3 $ cd dockerized-shibboleth-idp3/shibboleth $ docker build -t shibboleth . $ docker run -it -v $(pwd)/../idp-tomcat:/ext-mount --rm shibboleth init-idp.sh $ cd .. $ docker-compose build;docker-compose up -d
ホント、これだけですヮ(゚д゚)ォ!
作った目的
Shibbolethの環境作成は意外に厄介です。Shibboleth本体のみならずLDAPやSPも必要となりますが、このスクリプトを使えば、それらのDockerコンテナが瞬時に出来上がり、Shibboleth Idp3を検証する環境があっという間にできあがりますヮ(゚д゚)ォ!しかもDockerコンテナですので、ローカル環境で動かせるという手軽さもあります。超めんどくさいShibbolethの環境構築を超ラクチン化、そしてベルサッサしてハナキンのアフターファイブを満喫できるようにこのスクリプトを作成しました。
システム構成
システム構成は以下のようになります。このスクリプトを動かすと、Shibboleth Idpを動作させるためのApache、Tomcat、OpenLDAPのコンテナが起動します。そして、Shibboleth SPを動作させるためのShibboleth SPモジュールのコンテナも起動します。IdP、SPはそれぞれidp.example.org、sp.example.orgをいうホスト名を持っており、hostsファイルで127.0.0.1にアクセスさせるようにします。ポートフォワードで443、10443宛のアクセスをそれぞれIdP、SPに転送します。IdPのEntityIDはhttps://idp.example.org/idp/shibboleth、SPのEntityIDはhttps://sp.example.org/shibbolethです。
ファイル構成
ファイル構成は以下のとおりです。トップにdocker-compose.ymlがあり、そのファイルを元にdocker-compose biuldすると必要なコンテンが全て生成されます。各ディレクトリは生成されるコンテナごとの設定ファイルが格納されています。
GitリポジトリのTop ├── README.md ├── docker-compose.yml ├── idp-httpsd │ ├── Dockerfile │ ├── bin │ │ └── gencert.sh │ ├── certs │ └── conf │ └── httpsd-shib.conf ├── idp-tomcat │ ├── Dockerfile │ └── bin │ └── build.sh ├── openldap │ ├── Dockerfile │ └── data │ └── init.ldif ├── shibboleth │ ├── Dockerfile │ ├── bin │ │ └── init-idp.sh │ └── patch │ ├── attribute-filter.xml.patch │ ├── attribute-resolver.xml.patch │ ├── ldap.properties.patch │ └── relying-party.xml.patch └── sp ├── Dockerfile ├── app │ └── testsp.php ├── bin │ ├── httpsd-shibd-foreground │ └── init-sp.sh ├── certs └── patch ├── attribute-map.xml.patch └── shibboleth2.xml.patch
各ファイルやディレクトリの詳細を以下に記載します。
shibbolethディレクトリ
Shibbolethの設定ファイル(/opt/shibboleth-idp配下のファイル)を生成するために必要なコンテナの設定ファイルを格納するディレクトリです。
shibboleth ├── 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
Shibboletの設定ファイルを初期化するためのスクリプトです。後述するパッチを実行したりIdPのメタデータのValidUntilを修正したりしてます(過去日付になってSP側で取得できないため)。
■ patch以下のファイル
Shibboletの設定ファイルを変更するためのパッチです。LDAPへの接続を定義したり、SPへの接続設定を定義したりしてます。このディレクトリに入れたパッチはbin/init-idp.shによって全て自動的に実行されるようになっています。もし新しいパッチが必要になった場合は、/opt/shibboleth-idpディレクトリを起点にしてパッチを作成して下さい。
idp-httpsdディレクトリ
Apacheのコンテナを作成するための設定ファイルを格納しています。ApacheとShibbolethはAJPプロトコルで連携しています。
idp-httpsd ├── Dockerfile ├── bin │ └── gencert.sh ├── certs └── conf └── httpsd-shib.conf
■ Dockerfile
Apacheのコンテナを生成するためのDockerfileです。
■ bin/gencert.sh
ApacheのSSL証明書を自動生成するためのスクリプトです。
■ certs
自分で用意したHTTPSのSSL証明書を使いたい場合、このフォルダに格納します。証明書はserver.crt、鍵はserver.keyという名称にして下さい。
■ conf/httpsd-shib.conf
ApacheとShibboleth(Tomcat)をAJPプロトコルで連携させるための設定ファイルです。
idp-tomcatディレクトリ
Tomcatのコンテナを作成するための設定ファイルを格納しています。ShibbolethはこのTomcat上で動作します。
idp-tomcat/ ├── Dockerfile └── bin └── build.sh
■ Dockerfile
Tomcatのコンテナを生成するためのDockerfileです。
■ bin/build.sh
Shibbolethをインストールするときに対話的に聞かれる項目(Shibbolethのインストールディレクトリなど)を自動入力するためのスクリプトです。
openldapディレクトリ
OpenLDAPのコンテナを作成するための設定ファイルを格納しています。
openldap ├── Dockerfile └── data └── init.ldif
■ Dockerfile
OpenLDAPのコンテナを生成するためのDockerfileです。
■ data/init.ldif
コンテナ生成時にOpenLDAPに登録する初期データを定義しています。
spディレクトリ
Shibboleth SPのコンテナを作成するための設定ファイルを格納しています。
sp ├── Dockerfile ├── app │ └── testsp.php ├── bin │ ├── httpsd-shibd-foreground │ └── init-sp.sh ├── certs └── patch ├── attribute-map.xml.patch └── shibboleth2.xml.patch
■ 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ディレクトリを起点にしてパッチを作成して下さい。
使い方
いよいよこのスクリプトの使い方の説明に入ります。
コンテナ化するための手順
1.GitHubから必要なファイルを取得
以下のGitHubをCloneして下さい。
https://github.com/noriyukitakei/dockerized-shibboleth-idp3
2.Shibbolethの設定ファイルを生成
まずshibbolethディレクトリにて、指定したバージョンのShibbolethの設定ファイル(/opt/shibboleth-idp配下のファイル)を作成します。このコンテナはShibbolethの設定ファイルを生成するための一時的なものです。以下のコマンドを実行します。 実行が終わると、idp-tomcatディレクトリにcustomized-shibboleth-idpというディレクトリが作成されます。これがShibbolethの設定ファイル群です。Docketfile内のidp_versionという環境変数を変更することでShibbolethのバージョンを変更出来ます。以下の2つのコマンドを実行します。
$ docker build -t shibboleth . $ docker run -it -v $(pwd)/../idp-tomcat:/ext-mount --rm shibboleth init-idp.sh Please complete the following for your IdP environment: Hostname: [45cb9f5b75c7.localdomain] idp.example.org SAML EntityID: [https://idp.example.org/idp/shibboleth] Attribute Scope: [localdomain] example.org Backchannel PKCS12 Password: Re-enter password: Cookie Encryption Key Password: Re-enter password: Warning: /opt/shibboleth-idp-tmp/bin does not exist. Warning: /opt/shibboleth-idp-tmp/edit-webapp does not exist. Warning: /opt/shibboleth-idp-tmp/dist does not exist. Warning: /opt/shibboleth-idp-tmp/doc does not exist. Warning: /opt/shibboleth-idp-tmp/system does not exist. Generating Signing Key, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth ... ...done Creating Encryption Key, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth ... ...done Creating Backchannel keystore, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth ... ...done Creating cookie encryption key files... ...done Rebuilding /opt/shibboleth-idp-tmp/war/idp.war ... ...done BUILD SUCCESSFUL Total time: 36 seconds patching file conf/relying-party.xml patching file conf/attribute-resolver.xml patching file conf/ldap.properties patching file conf/attribute-filter.xml
ここで重要なのは、本スクリプトにはShibboleth SPも含まれるのですが、Shibboleth SPまで含めた動作を行いたい場合、Host Name、SAML EntityIDは以下のように設定して下さい(上の図のとおりにやればOKです)。
- Host Name: idp.example.org
- SAML EntityID: https://idp.example.org/idp/shibboleth
このEntityIDを前提としてShibboleth IdPやShibboleth SPに設定がなされているためです。
3.【必要に応じて】Shibboleth設定ファイルの編集
idp-tomcatディレクトリに移動します。そこにあるDockerfileのFROMで取得してくるイメージを適宜変えることで、Shibbolethを稼働するTomcatやJavaのバージョンを変えることが出来るかもしれません(動作未確認)。また1で作成したcustomized-shibboleth-idpの中の設定ファイルを環境に合わせて適宜編集して下さい。この設定ファイルがidp-tomcatのコンテナにコピーされShibbolethが起動します。
4.【必要に応じて】LDAP初期データの変更
openldapディレクリに移動します。ここにあるdata/init.ldifはOpenLDAPに投入する初期データをldif形式で書きます。デフォルトでは以下のエントリを生成します。
■ BindDN
- DN: cn=admin,dc=example,dc=org
- パスワード: password
■ テスト用ユーザー
- DN: uid=test001,ou=people,dc=example,dc=org
- パスワード: password
5.【必要に応じて】テスト用SPアプリの変更
sp/app/testsp.phpはテスト用SPのPHPスクリプトです。デフォルトでは、以下のようにログインしたユーザーIDを表示される単純なものですが、適宜必要に応じて変更してください。ちなみにSPに渡される属性はuidのみです。
<?php echo getenv('REMOTE_USER'); ?>
6.Dockerコンテナの起動
リポジトリトップのディレクトリに移動して以下のコマンドを実行して下さい。コンテナの生成、起動が開始します。
$ docker-compose build $ docker-compose up -d
テスト方法
(1) OSのhostsファイルに以下のように設定して下さい。
127.0.0.1 idp.example.org 127.0.0.1 sp.example.org
(2) 以下のURLにアクセスして下さい。
https://sp.example.org:10443/secure/testsp.php
(3) Shibbolethのログイン画面が表示されるので、以下のユーザー名とパスワードを入力して下さい。
- ユーザー名: test001
- パスワード: password
(4) 画面にユーザーIDが表示されれば成功です。
運用
設定ファイルの変更方法など、コンテナ作成後の運用方法について記載致します。
Shibbolethの設定ファイル変更
Shibbolethの設定ファイルを変更したい場合は、idp-tomcat/customized-shibboleth-idp内のファイルを変更して、以下のコマンドを実行して下さい。
$ docker-compose build idp-tomcat;docker-compose up -d
Tomcat、LDAPへの接続先変更
httpsdからのajpプロトコルによるTomcatへの接続先、及びShibbolethからLDAPへの接続先は、それぞれdocker-compose.yml内の環境変数にて変更出来ます。Desktop Dockerなどで起動する場合はデフォルトのままでいいかもしれませんが、Kubernetesなどで起動するときは変更する必要があります。変更対象は以下に記載のTOMCAT_HOST及びLDAP_HOSTです。
version: '3' services: ldap: container_name: ldap build: context: openldap ports: - '389:389' environment: LDAP_DOMAIN: "example.org" LDAP_ADMIN_PASSWORD: "password" idp-tomcat: container_name: idp-tomcat build: context: idp-tomcat depends_on: - ldap ports: - 8009:8009 environment: # この環境変数でShibbolethからLDAPへの接続先を定義します LDAP_HOST: "ldap" TOMCAT_AJP_PORT_NUMBER: "8009" idp-httpsd: container_name: idp-httpsd build: context: idp-httpsd ports: - 443:443 environment: # この環境変数でhttpsdからのajpプロトコルによるTomcatへの接続先を定義します TOMCAT_HOST: "idp-tomcat" sp: container_name: sp build: context: sp depends_on: - idp-httpsd - idp-tomcat ports: - 10443:443
まとめ
どれだけニーズがあるのかわからないのですが、ワタシ的には非常に便利なツールです。これを使って、みなさまも少しでもShibbolethの環境構築が楽になっていただければ幸いですm(_ _)m
これはもう公開されていないのでしょうか?
コマンドを流してみたのですがShibbleth3、4ともにエラーになってしまいました。
こんにちは!!ご利用いただきありがとうございます!!
ご質問にご回答させて頂きます。
まずShibboleth3の方ですが、こちらはもうメンテしてないので、多分動かないかもしれません。すみません。
そしてShibboleth4の方ですが、一部不具合がありまして、先程修正して新しいDockerイメージをPushしました。
こちらで試していただければと思います。