こんにちは、サイオステクノロジー技術部 武井です。今回は、オープンソースな学術系シングルサインオンシステム「Shibboleth IdP」のバージョン5(2023年9月22日時点で最新)をDockerコンテナ化するための諸々の設定ファイルを作成してみました。SPも含めてすぐに動作検証できる環境が出来上がりますので便利だと思います。以下のGitHubに上げていますので、是非使ってみて下さい。
https://github.com/noriyukitakei/dockerized-shibboleth-idp5-with-sp
これはなに?
これを使うと、Shibboleth IdPバージョン5の稼働に必要なアプリケーションサーバー(Jetty)、LDAPサーバー(OpenLDAP)、SP(Shibboleth SP)のDockerコンテナが、とってもラクチンに作成できます。もちろん、ローカルのPCで動かすことが出来ますし、Kubernetesのようなコンテナオーケストレーターでも動かすことが出来ます。Azureのコンテナオーケストレーター(Azure Kubernetes ServiceとWeb App for Containers)ではサクッと動きました。
どんだけラクチンかというと、以下のコマンドだけでShibboleth IdP、Shibboleth SP、OpenLDAPの環境が出来上がります。手っ取り早く作りたいという方は、とりあえず以下を試してみて下さい(^o^)
$ git clone https://github.com/noriyukitakei/dockerized-shibboleth-idp5-with-sp $ cd dockerized-shibboleth-idp5-with-sp/idp $ docker run -it -v $(pwd):/ext-mount --rm noriyukitakei/dockerized-shibboleth-idp5 gen-idp-conf.sh $ cd .. $ docker-compose up -d
ホント、これだけですヮ(゚д゚)ォ!
作った目的
Shibbolethの環境作成は意外に厄介です。Shibboleth本体のみならずLDAPやSPも必要となりますが、このスクリプトを使えば、それらのDockerコンテナが瞬時に出来上がり、Shibboleth Idp5を検証する環境があっという間にできあがりますヮ(゚д゚)ォ!しかもDockerコンテナですので、ローカル環境で動かせるという手軽さもあります。超めんどくさいShibbolethの環境構築を超ラクチン化、そしてベルサッサしてハナキンのアフターファイブを満喫できるようにこのスクリプトを作成しました。
システム構成
このリポジトリのDockerfileをもとにコンテナを作成した場合、そのシステム構成は以下のようになります。Shibboleth Idpを動作させるためのJetty、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です。
コンテナができるまでの仕組み
このリポジトリのDockerfileによってコンテナができるまでの仕組みについて説明致します。
■ Shibboleth IdP
まずShibboleth IdPですが、私がDocker Hubに公開しているShibboleth IdPのコンテナを作成するためのDockerイメージによって色々動きます。
このDockerイメージをpullして、コンテナを作成し、そのコンテナの中のgen-idp-conf.shを実行すると、Shibboleth IdPの設定ファイルがホストPC上に出来上がります。通常/opt/shibboleth-idp配下に作成されるファイルと同等です。
次にShibboleth IdPの設定ファイルをDockfileでコンテナにADDし、Jettyを起動します。Jettyの起動コマンドはShibboleth IdPのDockerイメージの中にCMDで定義されています。
このDockerイメージは以下のURLでDocker Hubに公開しております。
https://hub.docker.com/r/noriyukitakei/dockerized-shibboleth-idp5
■ OpenLDAP
Docker HubにあるOpenLDAPのDockerイメージからサクッと作っております。
■ Shibboleth SP
CentOSのDockerイメージをベースにShibboleth SPモジュールをインスコしたりして作ってます。
ファイル構成
ファイル構成は以下のとおりです。トップにdocker-compose.ymlがあり、そのファイルを元にdocker-compose biuldすると必要なコンテンが全て生成されます。各ディレクトリは生成されるコンテナごとの設定ファイルが格納されています。
GitリポジトリのTop ├── README.md ├── docker-compose.yml ├── idp │ ├── Dockerfile │ ├── bin │ │ └── mod-idp-conf.sh │ │ └── init.sh │ └── patch │ ├── attribute-filter.xml.patch │ ├── attribute-resolver.xml.patch │ ├── ldap.properties.patch │ ├── relying-party.xml.patch │ └── secrets.properties.patch ├── ldap │ ├── Dockerfile │ └── data │ └── init.ldif └── sp ├── Dockerfile ├── app │ └── testsp.php ├── bin │ ├── init.sh │ └── mod-conf.sh ├── certs ├── conf │ ├── attribute-map.xml │ └── shibboleth2.xml └── repo └── shibboleth.repo
各ファイルやディレクトリの詳細を以下に記載します。
idpディレクトリ
Shibboleth IdPの設定ファイル(/opt/shibboleth-idp配下のファイル)の生成、およびShibboleth IdPを実行するために必要なコンテナの設定ファイルを格納するディレクトリです。
idp ├── Dockerfile ├── bin │ └── mod-idp-conf.sh │ └── init.sh └── patch ├── attribute-filter.xml.patch ├── attribute-resolver.xml.patch ├── ldap.properties.patch ├── relying-party.xml.patch └── secrets.properties.patch
■ Dockerfile
Shibboleth IdPを稼働させるためのコンテナを生成するDockerfileです。
■ bin/mod-idp-conf.sh
Shibbolethの設定ファイルにパッチを当てるためのスクリプトです。後述するパッチを実行したりIdPのメタデータのValidUntilを修正したりしてます(過去日付になってSP側で取得できないため)。
■ bin/init.sh
jettyやsshdなど必要なプロセスを起動するためのスクリプトです。
■ patch以下のファイル
Shibboleth IdPの設定ファイルを変更するためのパッチです。LDAPへの接続を定義したり、SPへの接続設定を定義したりしてます。このディレクトリに入れたパッチはbin/mod-idp-conf.shによって全て自動的に実行されるようになっています。もし新しいパッチが必要になった場合は、/opt/shibboleth-idpディレクトリを起点にしてパッチを作成して下さい。
ldapディレクトリ
OpenLDAPのコンテナを作成するための設定ファイルを格納しています。
openldap ├── Dockerfile └── data └── init.ldif
■ Dockerfile
OpenLDAPのコンテナを生成するためのDockerfileです。
■ data/init.ldif
コンテナ生成時にOpenLDAPに登録する初期データを定義しています。
spディレクトリ
Shibboleth SPのコンテナを作成するための設定ファイルを格納しています。
sp ├── Dockerfile ├── app │ └── testsp.php ├── bin │ ├── mod-conf.sh │ └── init.sh ├── certs └── conf ├── attribute-map.xml └── shibboleth2.xml
■ Dockerfile
Shibboleth SPのコンテナを生成するためのDockerfileです。
■ app/testsp.php
Shibboleth SPモジュール配下で動作するSPのアプリケーションです。ログインしたユーザーのIDでを表示するPHPです。
■ bin/init
ApacheやShibboleth SPモジュール、sshdなどを起動するためのスクリプトです。コンテナ起動時にこのスクリプトが起動します。
■ bin/mod-conf.sh
Shibboleth SPの設定ファイルです。ビルド時にコンテナにこれらの設定ファイルをコピーします。
■ certs
自分で用意したHTTPSのSSL証明書を使いたい場合、このフォルダに格納します。証明書はserver.crt、鍵はserver.keyという名称にして下さい。
■ patch以下のファイル
Shibboleth SPモジュールの設定ファイルを変更するためのパッチです。このディレクトリに入れたパッチは全て自動的に実行されるようになっています。もし新しいパッチが必要になった場合は、/etc/shibbolethディレクトリを起点にしてパッチを作成して下さい。
使い方
いよいよこのスクリプトの使い方の説明に入ります。
コンテナ化するための手順
1.GitHubから必要なファイルを取得
以下のGitHubをCloneして下さい。
https://github.com/noriyukitakei/dockerized-shibboleth-idp5-with-sp
2.Shibboleth IdPの設定ファイルを生成
まずidpディレクトリにて、Shibboleth IdPの設定ファイル(/opt/shibboleth-idp配下のファイル)を作成します。このコンテナはShibboleth IdPの設定ファイルを生成するための一時的なものです。以下のコマンドを実行します。 実行が終わると、コマンドを実行したのと同じディレクトリにshibboleth-idpというディレクトリが作成されます。これがShibboleth IdPの設定ファイル群です。
$ cd dockerized-shibboleth-idp5-with-sp/idp $ docker run -it -v $(pwd):/ext-mount --rm noriyukitakei/dockerized-shibboleth-idp5 gen-idp-conf.sh Generating Shibboleth IdP Configuration... This may take some time. shibboleth-identity-provider-5.0.0.tar.gz: OK ... omit ... INFO [net.shibboleth.idp.installer.BuildWar:99] - Creating war file /opt/shibboleth-idp/war/idp.war BUILD SUCCESSFUL Total time: 4 seconds Finished generating Shibboleth IdP Configuration!!
ここで重要なのは上記のgen-idp-conf.sh実行時に環境変数を与えると、生成されるShibboleth IdPの設定ファイルをカスタマイズできます。指定できる環境変数とその内容は以下のとおりです。もし指定しないと以下の初期値が設定されます。
環境変数名 | 内容 | 初期値 |
IDP_VERSION | Shibboleth IdPのバージョンを指定します。 | 5.0.0 |
IDP_HASH | Shibboleth IdPのダウンロードファイル(tar.gz)のハッシュ値を指定します。必ずIDP_VERSIONとセットで指定します。 | 超長いので省略(´・ω・`) |
IDP_ENTITY_ID | Shibboleth IdPのEntity IDを指定する。 | https://idp.example.org/idp/shibboleth |
IDP_HOST_NAME | Shibboleth IdPのホスト名を指定する。 | idp.example.org |
IDP_SCOPE | Shibboleth IdPのスコープを指定する。 | example.org |
IDP_KEYSTORE_PASSWORD | Shibboleth IdPが作成するキーストアのパスワードを指定する。 | password |
IDP_SEALER_PASSWORD | Shibboleth IdPの認証情報などを暗号化するための鍵を保存するキーストアのパスワードを指定する。 | password |
上記の環境変数を指定するときは、以下のよう実行します。
$ docker run -it -v $(pwd):/ext-mount \ -e IDP_ENTITY_ID=https://idp.example.org/idp/shibboleth \ -e IDP_HOST_NAME=idp.example.org \ --rm shibboleth gen-idp-conf.sh
ここで重要なのは、本スクリプトにはShibboleth SPも含まれるのですが、Shibboleth SPまで含めた動作を行いたい場合、Host Name、SAML EntityIDは以下のように設定して下さい。つまり、先の環境変数に何も指定しなければ以下と同じ値である初期値が設定されます。
- Host Name: idp.example.org
- SAML EntityID: https://idp.example.org/idp/shibboleth
このEntityIDを前提としてShibboleth IdPやShibboleth SPに設定がなされているためです。
3.【必要に応じて】Shibboleth IdP設定ファイルの編集
idpディレクトリに作成されたShibboleth IdPの設定ファイルを必要に応じて編集します。例えばSPの設定の追加等ですね。
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コンテナの起動
リポジトリトップのディレクトリに移動して以下のコマンドを実行して下さい。コンテナの生成、起動が開始します。
$ cd .. $ 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 IdPの設定ファイル変更
Shibboleth IdPの設定ファイルを変更したい場合は、idp/shibboleth-idp内のファイルを変更して、以下のコマンドを実行して下さい。
$ docker-compose build idp;docker-compose up -d
ログ
idp-process.logは標準出力にリダイレクトされます。
Jettyの起動引数
idpのコンテナにJETTY_JAVA_ARGSという環境変数を設定することで、Jettyの起動引数を自由に変えられることができます。環境変数の詳細については以下のとおりです。
環境変数名 | 内容 | 初期値 |
JETTY_JAVA_ARGS | JettyでShibboleth IdPを起動するときのJavaの追加オプション(例えばヒープサイズなど)を指定する。 | jetty.home=/opt/jetty-home jetty.base=/opt/jetty-base |
例えば最大ヒープサイズを指定したい場合は、docker-compose.ymlに以下のように記述します。
version: '3' services: ldap: container_name: ldap build: context: ldap ports: - '389:389' environment: LDAP_DOMAIN: "example.org" LDAP_ADMIN_PASSWORD: "password" idp: container_name: idp build: context: idp depends_on: - ldap ports: - 443:8443 - 80:8080 environment: LDAP_HOST: "ldap" JETTY_JAVA_ARGS: "jetty.home=/opt/jetty-home jetty.base=/opt/jetty-base -Xmx1024m" sp: container_name: sp build: context: sp depends_on: - idp ports: - 10443:443
まとめ
どれだけニーズがあるのかわからないのですが、ワタシ的には非常に便利なツールです。これを使って、みなさまも少しでもShibbolethの環境構築が楽になっていただければ幸いですm(_ _)m