フォトシンス エンジニアブログ

株式会社Photosynth のテックブログです

30分で shibboleth サーバを立てて GakuNin 連携の準備をする

この記事は Akerun - Qiita Advent Calendar 2024 - Qiita の 8 日目の記事です。

どうも daikw - Qiita です。

最近、学術認証フェデレーション(学認, GakuNin)を調べる機会があり、 Shibboleth を前提とした記述が多かったので、試しに Shibboleth サーバを建ててテストフェデレーション申請まで一通りやってみました。

以下の記事・仕様を参考にしました。

シボレス

シボレス - Wikipedia によると、

なお「シボレス」とは、ヘブライ語聖書の逸話に由来し、自国の特殊な発音を要するフレーズを読み上げさせる事で、相手が敵国人のスパイかどうかを判別するのに用いられた中世ヨーロッパの防諜技法の一種である。

SAMLフェデレーション環境下で、 Shibboleth は組織間の「信頼の合言葉」とも言える規約・メタデータを媒体に、互いのユーザーが正統なアクセス権を持つことを保証する役割を果たすので、良い命名ですね。

踏み絵と構造が似ているなと思いましたが、『識別対象が「言語的習慣」なのか「宗教的内面」なのかという点』で明確に違いますね。Fumie はサービス名にはできなそう。

構成

GCE インスタンス一つで完結するようにしました。

GIP を割り当て、ドメイン名を設定し、サーバ内で shibboleth サービスを動かします。 OS には Rocky Linux 8 を利用しました。

curl -O 'https://shibboleth.net/cgi-bin/sp_repo.cgi?platform=CentOS_7'
sudo cp sp_repo.cgi\?platform=* /etc/yum.repos.d/shibboleth.repo
sudo dnf install shibboleth httpd epel-release certbot python3-certbot-apache

# サービス起動
sudo systemctl start shibd
sudo systemctl enable shibd
sudo systemctl start httpd
sudo systemctl enable httpd

# よしなに編集して certbot で証明書発行
sudo vim /etc/httpd/conf.d/ssl.conf
sudo certbot --apache --email your-email@example.com

# shibboleth の設定を変更しリスタート
sudo vim /etc/shibboleth/shibboleth2.xml
sudo systemctl restart shibd

トラブルシュート

2つほど迷う挙動に見舞われました。 なお、 shibboleth サービスが起動していれば、ローカルからアクセスできるいくつかの管理用エンドポイントが利用できます。これでトラブルシュートができます。

# サーバの状態を確認
curl -k -s https://localhost/Shibboleth.sso/Status

# メタデータを確認
curl -k -s https://localhost/Shibboleth.sso/Metadata

# 有効なセッションを確認
curl -k -s https://localhost/Shibboleth.sso/Session

SELinux が弾いている

とりあえず shibboleth サービスの起動までは一息で行けましたが、何かで弾かれているようです。

[daikiwatanabe@shibboleth-sp ~]$ curl -k -s https://localhost/Shibboleth.sso/Status
<StatusHandler time='2024-11-11T04:36:16Z'><Version Xerces-C='3.3.0' XML-Tooling-C='3.3.0' Shibboleth='3.5.0'/><NonWindows sysname='Linux' nodename='shibboleth-sp' release='4.18.0-553.16.1.el8_10.cloud.0.1.x86_64' version='#1 SMP Thu Sep 12 13:56:18 UTC 2024' machine='x86_64'/><Status><Exception type='shibsp::ListenerException'>Cannot connect to shibd process, a site administrator should be notified that this web server has malfunctioned.</Exception></Status></StatusHandler>[daikiwatanabe@shibboleth-sp ~]$

よく調べてみると、 SELinuxshibd.sock へのアクセスを弾いていました。

[daikiwatanabe@shibboleth-sp ~]$ getenforce
Enforcing
[daikiwatanabe@shibboleth-sp ~]$ sudo ausearch -m avc | head
----
time->Mon Nov 11 01:25:30 2024
type=PROCTITLE msg=audit(1731288330.723:6915): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44
type=SYSCALL msg=audit(1731288330.723:6915): arch=c000003e syscall=42 success=no exit=-13 a0=14 a1=7f1f31ff5ff0 a2=6e a3=39 items=0 ppid=86642 pid=87819 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1731288330.723:6915): avc:  denied  { write } for  pid=87819 comm="httpd" name="shibd.sock" dev="tmpfs" ino=103453 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file permissive=0
----
time->Mon Nov 11 01:25:32 2024
type=PROCTITLE msg=audit(1731288332.724:6916): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44
type=SYSCALL msg=audit(1731288332.724:6916): arch=c000003e syscall=42 success=no exit=-13 a0=14 a1=7f1f31ff5ff0 a2=6e a3=39 items=0 ppid=86642 pid=87819 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1731288332.724:6916): avc:  denied  { write } for  pid=87819 comm="httpd" name="shibd.sock" dev="tmpfs" ino=103453 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file permissive=0

audit2allow を使ってポリシーを自動作成し、 semodule で適用します。

[daikiwatanabe@shibboleth-sp ~]$ sudo dnf -y install policycoreutils-python-utils
...
[daikiwatanabe@shibboleth-sp ~]$ sudo ausearch -c 'httpd' --raw | audit2allow -M httpd_shibd_policy
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i httpd_shibd_policy.pp

[daikiwatanabe@shibboleth-sp ~]$ sudo semodule -i httpd_shibd_policy.pp

動作するようになりました。

[daikiwatanabe@shibboleth-sp ~]$ curl -k -s https://localhost/Shibboleth.sso/Status
<StatusHandler time='2024-11-11T04:44:50Z'><Version Xerces-C='3.3.0' XML-Tooling-C='3.3.0' XML-Security-C='3.0.0' OpenSAML-C='3.3.0' Shibboleth='3.5.0'/><NonWindows sysname='Linux' nodename='shibboleth-sp' release='4.18.0-553.16.1.el8_10.cloud.0.1.x86_64'
...
</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:KeyDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" use="encryption"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:KeyName>shibboleth-sp</ds:KeyName><ds:X509Data><ds:X509SubjectName>CN=shibboleth-sp</ds:X509SubjectName><ds:X509Certificate>
...
</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><Status><OK/></Status></StatusHandler>

証明書の準備

証明書の設定に少し手こずりました。フェデレーション申請には証明書を添付する必要があります。

先ほど certbotHTTPS 用のサーバ証明書を発行しました。 また、shibboleth はインストール時に自己署名証明書を2つ生成します。

[daikiwatanabe@shibboleth-sp shibboleth]$ find /etc/shibboleth -regex '.*.pem'
/etc/shibboleth/sp-signing-key.pem
/etc/shibboleth/sp-signing-cert.pem
/etc/shibboleth/sp-encrypt-key.pem
/etc/shibboleth/sp-encrypt-cert.pem

が、フェデレーションの申請書には証明書の登録場所が一つだけ存在しています。どちらを登録するべきかマニュアル上は明確には分かりませんでした。以下の事実からも確定できず、とりあえず sigining でいいだろうと判断しました。どちらでもいいのかもしれません。

  • 生成される証明書の用途 ( use 要素) は encryption / sigining の2つがある
  • マニュアル 上は、「SAML 署名及び暗号化に使用する証明書」と記述がある

また、 Let’s Encrypt (certbot) のフルチェーン証明書を試しに入力すると、これも自己署名証明書と同様と判定されました。

自己署名証明書を含むメタデータを申請する場合、それをサーバ上で公開する必要があります。 IdP/SPで「パブリックでない証明書」(自己署名証明書)を利用する場合 - GakuNinShibInstall - meatwiki

/var/www/html ディレクトリを使って、 Apache のデフォルトの設定を利用して証明書を露出させます。

sudo mkdir -p /var/www/html/cert
sudo cp /etc/shibboleth/sp-signing-cert.pem /var/www/html/cert

こうすると https://shibsp.your.domain/cert/sp-signing-cert.pem で確認できるので、これを申請書に記載します。

なお、サービスで利用する証明書は TLS 証明書と分離しておくのが良いと考えます。なぜなら、TLS証明書のローテートとフェデレーションメタデータのローテートを同時に行うのは難しいからです。

その他、気がついたことがいくつかありました。

  • 生成したメタデータの中身を修正してフェデレーションに提出するのかと思いきや、申請書フォーマットがメタデータに対応していました。 shibboleth を利用している場合は二度手間になります。
  • shibboleth 以外の SAML 実装向けに、「テンプレート外メタデータ」という項目がありました。 shibboleth にこだわっているわけではないようです。

テストフェデレーション申請

準備したサーバの情報を使って申請したら、

申請画面

1日で承認されました。迅速!事務局の方ありがとうございました。

まとめ

  • タイトル通り 30 分で用意するのは結構大変ですが、1時間もあれば用意できると思います
  • 学生時代に触っていた GakuNin のログイン画面を運用している仕組みがさわれてよかったです

株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 hrmos.co

Akerun Pro の購入はこちらから akerun.com