Shibboleth IdP3をDockerコンテナ化するスクリプトをGitHubで公開しました

こんにちは、サイオステクノロジー技術部 武井です。今回は、オープンソースな学術系シングルサインオンシステム「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

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

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

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

2 COMMENTS

anonymouse

これはもう公開されていないのでしょうか?
コマンドを流してみたのですがShibbleth3、4ともにエラーになってしまいました。

返信する
アバター画像 武井宜行

こんにちは!!ご利用いただきありがとうございます!!
ご質問にご回答させて頂きます。

まずShibboleth3の方ですが、こちらはもうメンテしてないので、多分動かないかもしれません。すみません。

そしてShibboleth4の方ですが、一部不具合がありまして、先程修正して新しいDockerイメージをPushしました。
こちらで試していただければと思います。

返信する

コメントを残す

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