Ubuntu22.04での Shibboleth IdP V5 構築手順
はじめに
こんにちは、株式会社SHIFT ITソリューション部の田平です。
Shibboleth V5が2023年9月にリリースされましたが、2023年12月時点で構築に関する情報が少ないので構築手順をまとめてみました。
今回はShibbolethのインストールまでで、各種設定については別の機会とさせていただきます。
概要
Shibboleth:オープンソースのシングルサインオン(SSO)ソフトウェア。学術認証フェデレーション「学認(GakuNin)」で利用されているため、大学などで利用されることが多い。 また、以下のように利用者数も世界的に多いソフトウェアです。
Amazon Corretto:Amazonが提供している無料の Open Java Development Kit (OpenJDK) ディストリビューション。
Jetty:100%Javaで開発されたJava Servletコンテナ/Webサーバ。Shibbolethの動作環境として推奨されている。
検証環境
今回は以下の環境で構築を行います。
最新システム要件は公式ページのWikiで確認してください。
環境準備
1. Corretto 17 のインストール
Correttoリポジトリを追加し、Corretto 17をインストールします。
$ wget -O - https://apt.corretto.aws/corretto.key | sudo gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg && \
echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" | sudo tee /etc/apt/sources.list.d/corretto.list
$ sudo apt-get update; sudo apt-get install -y java-17-amazon-corretto-jdk
インストールされたことを確認します。
$ java -version
以下のような表示が行われればOKです。
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment Corretto-17.0.9.8.1 (build 17.0.9+8-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.9.8.1 (build 17.0.9+8-LTS, mixed mode, sharing)
2. Jetty 11のインストール
Eclipse Foundationから最新版のパッケージ(.tgz)をダウンロードしてインストールします。
下記コマンドで利用しているURL等はインストール時のバージョンに合わせて修正してください。
$ wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-home/11.0.18/jetty-home-11.0.18.tar.gz
$ sudo tar zxv -C /opt -f jetty-home-11.0.18.tar.gz
$ sudo ln -s /opt/jetty-home-11.0.18 /opt/jetty
Jettyユーザーを作成します。
$ sudo useradd -d /opt/jetty-base -s /sbin/nologin jetty
3. jetty-baseの設定
jetty-baseを配置します。
$ git clone https://git.shibboleth.net/git/java-idp-jetty-base
$ cd java-idp-jetty-base
$ git checkout 11
$ sudo cp -r src/main/resources/jetty-base /opt/
$ sudo chown jetty:jetty /opt/jetty-base/tmp
$ sudo chown jetty:jetty /opt/jetty-base/logs
/opt/jetty-base/start.d/start.ini を以下の内容で新規に作成します。
# Any other required Jetty modules...
# Allows setting Java system properties (-Dname=value)
# and JVM flags (-X, -XX) in this file
# NOTE: spawns child Java process --exec
# Uncomment if IdP is installed somewhere other than /opt/shibboleth-idp
#-Didp.home=/path/to/shibboleth-idp
# Maximum amount of memory that Jetty may use, at least 1.5G is recommended
# for handling larger (> 25M) metadata files but you will need to test on
# your particular metadata configuration. If MDQ metadata on demand is used,
# requirements may be much lower.
-Xmx1500m
# Prevent blocking for entropy.
-Djava.security.egd=file:/dev/urandom
# Set Java tmp location
-Djava.io.tmpdir=tmp
/opt/jetty-base/start.d/idp.ini を以下の内容で修正します。
--module=idpの後ろに以下の2行を追加します。
--module=http
--module=http-forwarded
末尾にあるjetty.http.portのポート番号を変更します。
# Allows use of default IdP command line tools.
jetty.http.host=127.0.0.1
jetty.http.port=8080
修正後のidp.ini
#---------------------------------------
# Module: idp
# Shibboleth IdP
# ---------------------------------------
--module=logging-logback
--module=idp
--module=http
--module=http-forwarded
## Keystore file path (relative to $jetty.base)
jetty.sslContext.keyStorePath=credentials/idp-userfacing.p12
## Truststore file path (relative to $jetty.base)
jetty.sslContext.trustStorePath=credentials/idp-userfacing.p12
## Keystore type
jetty.sslContext.keyStoreType=PKCS12
## Truststore type and provider
jetty.sslContext.trustStoreType=PKCS12
## Keystore password
jetty.sslContext.keyStorePassword=changeit
## Truststore password
jetty.sslContext.trustStorePassword=changeit
## KeyManager password
jetty.sslContext.keyManagerPassword=changeit
## Deny SSL renegotiation
jetty.sslContext.renegotiationAllowed=false
## Connector host/address to bind to
# jetty.ssl.host=0.0.0.0
## Connector port to listen on
jetty.ssl.port=443
## Route request logging through standard logging API
etc/jetty-requestlog.xml
# Allows use of default IdP command line tools.
jetty.http.host=127.0.0.1
jetty.http.port=8080
以下のコマンドを実行し、logging-logbackモジュールを追加します。
$ cd /opt/jetty-base/
$ sudo java -jar /opt/jetty/start.jar --add-module=logging-logback
/opt/jetty-base/modules/idp.modからhttpsとsslをコメントアウトします。
[description]
Shibboleth IdP
[depend]
annotations
deploy
http #https
jsp
jstl
plus
resources
server
servlets #ssl
[files]
tmp/
Jetty起動用の設定を行います。
$ sudo ln -s /opt/jetty/bin/jetty.sh /etc/init.d/jetty
$ sudo cp -ip /opt/jetty/bin/jetty.service /etc/systemd/system/
/etc/systemd/system/jetty.serviceのPIDFileを以下のように修正します。
[Unit]
Description=Jetty Web Application Server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/opt/jetty-base/tmp/jetty.pid
ExecStart=/etc/init.d/jetty start
ExecStop=/etc/init.d/jetty stop
ExecReload=/etc/init.d/jetty restart
User=jetty
Group=jetty
[Install]
WantedBy=multi-user.target
/etc/default/jettyを以下の内容で新規に作成します。
JETTY_HOME=/opt/jetty
JETTY_BASE=/opt/jetty-base
JETTY_RUN=/opt/jetty-base/tmp
JETTY_STATE=/opt/jetty-base/tmp/jetty.state
設定を反映させます。
$ sudo systemctl daemon-reload
$ sudo systemctl enable jetty
4. Apache の設定
Apacheをインストールし、必要なモジュールを有効化します。
$ sudo apt install apache2
$ sudo a2enmod proxy_http proxy ssl headers
デフォルトサイトを無効にします。
$ sudo a2dissite 000-default
/etc/apache2/conf-enabled/security.confでServerTokensとServerSignatureを修正します。
※Apacheのセキュリティ対策は他にも設定がありますが必要に応じて設定してください。
ServerTokens Prod
ServerSignature Off
VirutalHostを追加し、IdPにアクセスできるようにします。
環境により色々設定の仕方があると思いますので以下は参考までに。
※localhost:80はstatusコマンド等で利用されますので、設定しておいてください。
<VirtualHost localhost:80>
ProxyPass /idp/ http://localhost:8080/idp/ connectiontimeout=5 timeout=15
</VirtualHost>
<VirtualHost *:443>
ServerName idp.example.internal
ServerAdmin admin@example.internal
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
SSLEngine on
SSLProxyEngine On
SSLCertificateFile /etc/apache2/ssl/idp.crt
SSLCertificateKeyFile /etc/apache2/ssl/idp.key
ProxyRequests Off
ProxyPreserveHost On
RequestHeader set X-Forwarded-Port 443
RequestHeader set X-Forwarded-Proto https
RequestHeader unset Forwarded
RequestHeader unset X-Forwarded-For
ProxyPass /idp/ http://localhost:8080/idp/ connectiontimeout=5 timeout=15
<Location /idp>
Order allow,deny
Allow from all
</Location>
</VirtualHost>
VirtualHostを有効化し、Apacheを起動します。
$ sudo a2ensite <作成したVirtualhost設定>
$ sudo systemctl enable --now apache2
Shibboleth IdPのインストール
Shibbolethのサイトからダウンロードして、インストールします。
$ cd ~
$ wget https://shibboleth.net/downloads/identity-provider/latest/shibboleth-identity-provider-5.0.0.tar.gz
$ sudo tar xzvf shibboleth-identity-provider-5.0.0.tar.gz
$ cd shibboleth-identity-provider-5.0.0
$ sudo ./bin/install.sh
画面の指示に従い必要事項を入力しながら進めてください。
確認される項目はInstallation Directory、Host Name、SAML EntityID、Attribute Scopeです。 表示内容に問題なければそのままEnterで進め、修正する場合は修正内容を入力してください。
$ sudo ./bin/install.sh
Installation Directory: [/opt/shibboleth-idp] ?
INFO - New Install. Version: 5.0.0
Host Name: [172.21.175.80] ?
idp.example.internal
INFO - Creating idp-signing, CN = idp.example.internal URI = https://idp.example.internal/idp/shibboleth, keySize=3072
INFO - Creating idp-encryption, CN = idp.example.internal URI = https://idp.example.internal/idp/shibboleth, keySize=3072
INFO - Creating backchannel keystore, CN = idp.example.internal URI = https://idp.example.internal/idp/shibboleth, keySize=3072
INFO - Creating Sealer KeyStore
INFO - No existing versioning property, initializing...
SAML EntityID: [https://idp.example.internal/idp/shibboleth] ?
Attribute Scope: [example.internal] ?
INFO - Initializing OpenSAML using the Java Services API
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2001/04/xmlenc#ripemd160
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2001/04/xmldsig-more#hmac-ripemd160
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2001/04/xmldsig-more#rsa-ripemd160
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha1-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha224-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha384-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha3-224-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha3-256-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha3-384-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha3-512-rsa-MGF1
INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2007/05/xmldsig-more#sha512-rsa-MGF1
INFO - Creating Metadata to /opt/shibboleth-idp/metadata/idp-metadata.xml
INFO - Rebuilding /opt/shibboleth-idp/war/idp.war, Version 5.0.0
INFO - Initial populate from /opt/shibboleth-idp/dist/webapp to /opt/shibboleth-idp/webpapp.tmp
INFO - Overlay from /opt/shibboleth-idp/edit-webapp to /opt/shibboleth-idp/webpapp.tmp
INFO - Creating war file /opt/shibboleth-idp/war/idp.war
jettyを起動します。
$ sudo systemctl start jetty
Shibbolethの状態を確認します。
$ /opt/shibboleth-idp/bin/status.sh
正常に起動しましたらShibbolethの各種設定を環境に合わせて実施してください。
参考情報
お問合せはお気軽に
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
PHOTO:UnsphashのMohammad Rahmani