Shibboleth IdPの属性配信同意情報をデータベースに格納する

伊藤です。
今回は、Shibboleth IdPの属性配信同意情報をデータベースに格納する方法を紹介します。

端末に属性配信同意情報を保存した場合は、異なる端末でログインする際に再度同意が必要になりますが、属性配信同意情報をサーバに保存することで、異なる端末でログインした場合でも同意が不要になります。

Shibboleth IdPの構築

学認(以下のサイト)が提供する手順にしたがいShibboleth IdPを構築します。構築の詳細については、割愛します。

https://meatwiki.nii.ac.jp/confluence/display/GakuNinShibInstall/Home

データベースのインストール

データベース(MariaDB)のインストール・起動と設定を実施します。

# dnf install mariadb mariadb-server
# systemctl enable mariadb
# systemctl start mariadb
# mysql_secure_installation

<略>

Enter current password for root (enter for none): ← そのままEnterを入力
OK, successfully used password, moving on...
 
<略>
 
Change the root password? [Y/n] ← Yを入力
New password: rootpassword ← rootパスワードを設定
Re-enter new password: rootpassword
Password updated successfully!
Reloading privilege tables..
 ... Success!
 
<略>
 
Remove anonymous users? [Y/n] ← そのままEnterを入力
... Success!
 
<略>
 
Disallow root login remotely? [Y/n] ← そのままEnterを入力
 ... Success!
 
<略>
 
Remove test database and access to it? [Y/n] ← そのままEnterを入力
 - Dropping test database... 
 ... Success!
- Removing privileges on test database...
... Success!
 
<略>
 
Reload privilege tables now? [Y/n] ← そのままEnterを入力
 ... Success!
 
<略>
 
Thanks for using MariaDB!

データベースにテーブルを作成

MariaDB上にデータベース shibboleth を作成し、テーブル StorageRecords を追加します。

# mysql -u root -p
Enter password: rootpassword ← 設定したrootパスワードを入力

MariaDB [(none)]> CREATE DATABASE shibboleth;
MariaDB [(none)]> CONNECT shibboleth
MariaDB [shibboleth]> CREATE TABLE StorageRecords (
  context varchar(255) NOT NULL,
  id varchar(255) NOT NULL,
  expires bigint DEFAULT NULL,
  value text NOT NULL,
  version bigint NOT NULL,
  PRIMARY KEY (context, id)
);

※ここで、context列と id列は、大文字と小文字を区別して処理および比較されていることを確認する必要があります。今回は照合順序にutf8mb4_binを設定します。

MariaDB [(none)]> ALTER TABLE StorageRecords COLLATE 'utf8mb4_bin';

テーブルにアクセスするためのデータベースユーザ(shibbolethuser)を新規作成します。パスワードをdatabasepasswordの部分に設定します。ユーザとパスワードは、後述のデータベース接続設定で使用します。

MariaDB [shibboleth]> CREATE USER 'shibbolethuser'@'localhost' IDENTIFIED BY 'databasepassword';
MariaDB [shibboleth]> GRANT INSERT, SELECT, UPDATE, DELETE ON shibboleth.* TO 'shibbolethuser'@'localhost';
MariaDB [shibboleth]> FLUSH PRIVILEGES;
MariaDB [shibboleth]> quit

JDBCプラグインのインストール

JDBCプラグインをインストールします。

# /opt/shibboleth-idp/bin/plugin.sh -I net.shibboleth.plugin.storage.jdbc

JDBCドライバーをインストール

JDBCドライバー(mysql-connector-javaパッケージ)をインストールします。
ダウンロードページは以下です。今回はmysql-connector-j-9.0.0をインストールします。
https://dev.mysql.com/downloads/connector/j/

 

# curl -O https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-9.0.0.tar.gz
# tar zxv -C /usr/share/java/ -f mysql-connector-j-9.0.0.tar.gz

以降はJARファイルが /usr/share/java/mysql-connector-j-9.0.0/mysql-connector-java.jar にインストールされていることを想定します。
edit-webapp/WEB-INF/lib/ にシンボリックリンクを作成したあとビルドスクリプトを実行しidp.warを再生成します。

# ln -s /usr/share/java/mysql-connector-j-9.0.0/mysql-connector-java.jar /opt/shibboleth-idp/edit-webapp/WEB-INF/lib/
# /opt/shibboleth-idp/bin/build.sh
Installation Directory: [/opt/shibboleth-idp]
[Enter] ←入力なし
Rebuilding /opt/shibboleth-idp/war/idp.war ...
...done

BUILD SUCCESSFUL
Total time: 3 seconds 

※JDBCドライバーは以下のコマンドでインストールを実施し、シンボリックリンクを作成することも可能です。

# dnf install mariadb-java-client
# ln -s /usr/lib/java/mariadb-java-client.jar /opt/shibboleth-idp/edit-webapp/WEB-INF/lib/

データベース接続設定

/opt/shibboleth-idp/conf/global.xml を設定します。

<bean id="mydataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" lazy-init="true"
       p:driverClassName="com.mysql.cj.jdbc.Driver"
       p:url="jdbc:mysql://localhost:3306/shibboleth"
       p:username="shibbolethuser"
       p:retryableErrors="4001, 4002"
       p:password="databasepassword"
   />

<bean id="JDBCStorageService" parent="shibboleth.JDBCStorageService"
          p:dataSource-ref="mydataSource"
          p:transactionIsolation="4"
          p:retryableErrors="40001"
     />

※driverClassNameはJDBCドライバのバージョンが8以降の場合はcom.mysql.cj.jdbc.Driver、以前のバージョンの場合はcom.mysql.jdbc.Driverを指定します。また、接続プールを提供するデータソースであるCommons DBCP 2 ライブラリはデフォルトで IdP に含まれています。

IdPの設定

idp.propertiesのStorageServiceで、データベース接続設定のbean idを指定します。

idp.session.StorageService = JDBCStorageService

jettyを再起動します。

# systemctl restart jetty

まとめ

Shibboleth IdPの属性配信同意情報をデータベースに格納する方法をまとめました。何か少しでも参考になれば幸いです。

参考

https://meatwiki.nii.ac.jp/confluence/display/GakuNinShibInstall/Home

https://shibboleth.atlassian.net/wiki/spaces/IDPPLUGINS/pages/2989096970/JDBCStorageService

 

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

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

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

コメントを残す

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