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

こんにちは、サイオステクノロジー技術部 武井です。今回は、オープンソースな学術系シングルサインオンシステム「Shibboleth IdP」のバージョン4(2020年3月15日時点で最新)をDockerコンテナ化するための諸々の設定ファイルを作成してみました。SPも含めてすぐに動作検証できる環境が出来上がりますので便利だと思います。以下のGitHubに上げていますので、是非使ってみて下さい。

https://github.com/noriyukitakei/dockerized-shibboleth-idp4-with-sp

これはなに?

これを使うと、Shibboleth IdPバージョン4の稼働に必要なアプリケーションサーバー(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-idp4-with-sp
$ cd dockerized-shibboleth-idp4-with-sp/idp
$ docker run -it -v $(pwd):/ext-mount --rm noriyukitakei/dockerized-shibboleth-idp4 gen-idp-conf.sh
$ cd ..
$ docker-compose up -d

ホント、これだけですヮ(゚д゚)ォ!

作った目的

Shibbolethの環境作成は意外に厄介です。Shibboleth本体のみならずLDAPやSPも必要となりますが、このスクリプトを使えば、それらのDockerコンテナが瞬時に出来上がり、Shibboleth Idp4を検証する環境があっという間にできあがりますヮ(゚д゚)ォ!しかも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-idp4

■ 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-idp4-with-sp

2.Shibboleth IdPの設定ファイルを生成

まずidpディレクトリにて、Shibboleth IdPの設定ファイル(/opt/shibboleth-idp配下のファイル)を作成します。このコンテナはShibboleth IdPの設定ファイルを生成するための一時的なものです。以下のコマンドを実行します。 実行が終わると、コマンドを実行したのと同じディレクトリにshibboleth-idpというディレクトリが作成されます。これがShibboleth IdPの設定ファイル群です。

$ cd dockerized-shibboleth-idp4-with-sp/idp
$ docker run -it -v $(pwd):/ext-mount --rm noriyukitakei/dockerized-shibboleth-idp4 gen-idp-conf.sh
Generating Shibboleth IdP Configuration... This may take some time.
shibboleth-identity-provider-4.0.1.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のバージョンを指定します。 4.0.1
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 -Djetty.sslContext.keyStorePassword=storepwd -Djetty.sslContext.keyStorePath=etc/keystore

 

例えば最大ヒープサイズを指定したい場合は、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 -Djetty.sslContext.keyStorePassword=storepwd -Djetty.sslContext.keyStorePath=etc/keystore -Xmx1024m"
  sp:
    container_name: sp
    build:
      context: sp
    depends_on:
      - idp
    ports:
      - 10443:443

まとめ

どれだけニーズがあるのかわからないのですが、ワタシ的には非常に便利なツールです。これを使って、みなさまも少しでもShibbolethの環境構築が楽になっていただければ幸いですm(_ _)m

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

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

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

コメントを残す

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