はじめに
社内のプロジェクト情報を管理するためにRedmineを構築することになり、せっかくなのでSSO(Single Sign On)も導入することにしました。しかし、すんなり導入できなかったため備忘録として記載しておきます。どなたかの助けになれば幸いです。
使用するソフトウェア、サービス等
- Redmine 5.0.5
- SAML用プラグイン(davintoo/redmine_omniauth_saml)
- Azure AD
IdP(Azure AD)の準備
今回はSSOのIdPとしてMicrosoftのAzure ADを利用しています。IdPはSSOを導入する方によって選択肢がいくつかありますので、適宜置き換えてください。
アプリケーションの登録
参考:クイックスタート: エンタープライズ アプリケーションを追加する
シングルサインオンを有効にする
後ほど使用するため、下記の項目をメモしておく。
拇印 >> idp_cert_fingerprint
ログインURL >> idp_sso_target_url
ログアウトURL >> idp_slo_target_url
参考:エンタープライズ アプリケーションのシングル サインオンを有効にする
ユーザの割り当て
参考:クイックスタート: ユーザー アカウントを作成して割り当てる
RedmineへSAML認証用プラグインを導入
プラグイン(davintoo/redmine_omniauth_saml)はRedmine4以前で利用されていたプラグインをフォークしたものです。Redmine5でSAML認証できるよう修正されていますが、今回使用した際に一部修正する必要があったため下記に記載します。
プラグインをGitからダウンロード
プラグインのREADMEを参照し、インストールを行う
[${REDMINE}/config/initializers/saml.rb]の修正
冒頭に下記を追加する。
require Rails.root.join('plugins/redmine_omniauth_saml/lib/redmine_omniauth_saml')
参考:Redmine 5.0.2 で SAML 認証プラグインの読み込み時に NameError
AzureAD用にlogin、mail、firstname、lastnameの設定を変更する。
※上記でメモした内容も併せて設定
RedmineOmniauthSaml::Base.configure do |config|
config.saml = {
:assertion_consumer_service_url => "https://${サーバのホスト名}/redmine/auth/saml/callback", # OmniAuth callback URL
:issuer => "https://${サーバのホスト名}/redmine/auth/saml/metadata", # The issuer name / entity ID. Must be an URI as per SAML 2.0 spec.
:single_logout_service_url => "https://${サーバのホスト名}/redmine/auth/saml/sls", # The SLS (logout) callback URL
:idp_sso_target_url => "${AzuleADから取得したログインURL}", # SSO login endpoint
:idp_cert_fingerprint => "${AzuleADから取得した拇印}", # SSO ssl certificate fingerprint
# Alternatively, specify the full certifiate:
#:idp_cert => "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
:name_identifier_format => "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
:signout_url => "https://${サーバのホスト名}/redmine/auth/saml/sls", # Optional signout URL, not supported by all identity providers
:idp_slo_target_url => "${AzuleADから取得したログアウトURL}",
:name_identifier_value => "mail", # Which redmine field is used as name_identifier_value for SAML logout
:attribute_mapping => {
# How will we map attributes from SSO to redmine attributes
:login => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name',
:mail => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name',
:firstname => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname',
:lastname => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname'
}
}
config.on_login do |omniauth_hash, user|
# Implement any hook you want here
end
end
[${REDMINE}/plugins/redmine_omniauth_saml/lib/redmine_omniauth_saml.rb]の修正
下記のように文字列を分割している箇所を修正する。
h[symbol] = key.split('.')
h[symbol] = key.split(' ')
Redmineを再起動し、プラグインが動作していることを確認する
動作確認
メタデータの取得
下記のURLにアクセスし、Redmineからmetadataをxml形式で取得できること確認する。
https://${Redmineのホスト名}/redmine/auth/saml/metadata
ログイン
Redmineのログイン画面にSAML認証用のボタンが追加されているので、実際にログインしてみる。
最後に
最後まで読んでいただいてありがとうございます。
この記事を作成した段階ではRedmine5でSAML認証を実施するにはプラグインの修正が必要でしたが、今後は別のプラグインを作成する方がいるかもしれませんので注意してください。
それではまた。