この記事は Akerun - Qiita Advent Calendar 2024 - Qiita の 8 日目の記事です。
どうも daikw - Qiita です。
最近、学術認証フェデレーション(学認, GakuNin)を調べる機会があり、 Shibboleth を前提とした記述が多かったので、試しに Shibboleth サーバを建ててテストフェデレーション申請まで一通りやってみました。
以下の記事・仕様を参考にしました。
- 学認技術運用基準 | 学術認証フェデレーション 学認 GakuNin
- 学認申請システム利用マニュアル(テストfed)_3
- SPセッティング - GakuNinShibInstall - meatwiki
シボレス
シボレス - 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 ~]$
よく調べてみると、 SELinux が shibd.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>
証明書の準備
証明書の設定に少し手こずりました。フェデレーション申請には証明書を添付する必要があります。
先ほど certbot で HTTPS 用のサーバ証明書を発行しました。 また、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つがある- この要素の値の候補は
FileCredentialResolver
に記載がある
- この要素の値の候補は
- マニュアル 上は、「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