RedmineをG SuiteでSAML SSOしてみた

RedmineをG SuiteでSAML SSOしてみた

saml.rbの書き方に苦労したのでメモ

# 環境
- redmine プラグイン

https://github.com/chrodriguez/redmine_omniauth_saml

```
Latest commit 4c8f0b5  on 24 Oct 2017
```

- redmine

私の場合、redmineのHOMEは、/var/lib/redmine/plugins/

```
Environment:
  Redmine version                3.3.0.stable.15581
  Ruby version                   2.3.1-p112 (2016-04-26) [x86_64-linux]
  Rails version                  4.2.6
  Environment                    production
  Database adapter               Mysql2
SCM:
  Subversion                     1.9.7
  Filesystem                     
Redmine plugins:
  redmine_omniauth_saml          0.0.1
  redmine_slack                  0.2
  redmine_work_time              0.3.4
```

- G Suite

SAMLアプリ

# 手順
## 1.プラグインをインストール

```
# プラグインディレクトリへ移動
$ cd /var/lib/redmine/plugins/

# プラグインをclone
$ git clone https://github.com/chrodriguez/redmine_omniauth_saml.git

# redmineのHOMEへ移動
$ cd /var/lib/redmine

# プラグインに必要なライブラリをインストール
$ bundle install

# プラグインを適用
$ RAILS_ENV=production bundle exec rake redmine:plugins
```

## 2.G SuiteでSAMLアプリを作成
- ステップ 1　SAML アプリケーションで SSO を有効にする
「カスタムアプリをセットアップ」

- ステップ 2/5 Google IdP 情報
オプション 1
SSO の URL ：　これが、saml.rbのidp_sso_target_urlに設定するURL
https://accounts.google.com/o/saml2/idp?idpid=XXXXXXXXX
エンティティ ID
https://accounts.google.com/o/saml2?idpid=XXXXXXXXX
証明書
Google_YYYY-MM-DD-00000_SAML2.0
証明書をダウンロードしておく

- ステップ 3/5 カスタムアプリの基本情報
アプリケーション名 *
redmine
説明
redmineのSSO

- ステップ 4/5 サービス プロバイダの詳細
ACS の URL * これが、saml.rbのassertion_consumer_service_urlに設定するURL
https://redmineのドメイン名/auth/saml/callback
エンティティ ID *　これが、saml.rbのissuerに設定するURL
https://redmineのドメイン名
開始 URL
https://redmineのドメイン名
署名付き応答
チェックなし
名前 ID
基本情報　メインのメールアドレス
名前 ID の書式
EMAIL

- ステップ 5/5
属性のマッピング
emailAddress 基本情報　メインのメールアドレス
first_name 基本情報　姓
last_name　基本情報　名

- 最後に、サービスのステータスをオンにするのをお忘れなく

## 3.フィンガープリント
ダウンロードした証明書をテキストエディタで開いて

https://www.samltool.com/fingerprint.php
ここのサイトのX.509 cert欄に貼り付け
アルゴリズムには、sha1を選択し「Calculate Fingerprint」ボタンを押すと
Formatted FingerPrintに、フィンガープリントが表示される

「Formatted FingerPrint」欄の方をsaml.rbのidp_cert_fingerprintに設定する

## 4.プラグイン設定

```
# プラグインのinitializerサンプルをコピー
$ cp /var/lib/redmine/plugins/redmine_omniauth_saml/sample-saml-initializers.rb /var/lib/redmine/config/initializers/saml.rb
```

saml.rbを編集

```/var/lib/redmine/config/initializers/saml.rb
Redmine::OmniAuthSAML::Base.configure do |config|
  config.saml = {
    :assertion_consumer_service_url => "https://redmineのドメイン名/auth/saml/callback", # The redmine application hostname
#   :issuer                         => "https://redmineのドメイン名/saml/metadata",                 # The issuer name
    :issuer                         => "https://redmineのドメイン名",                 # The issuer name
    :single_logout_service_url      => "https://redmineのドメイン名/auth/saml/sls",      # The SLS (logout) callback URL
    :idp_sso_target_url             => "https://accounts.google.com/o/saml2/idp?idpid=XXXXXXXXX", # SSO login endpoint
    :idp_cert_fingerprint           => "フィンガープリント", # SSO ssl certificate fingerprint
    :name_identifier_format         => "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
    :signout_url                    => "https://redmineのドメイン名/auth/saml/sls",
    :idp_slo_target_url             => "https://redmineのドメイン名/auth/saml/sls",
    :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.emailAddress',
      :firstname  => 'extra.raw_info.first_name',
      :lastname   => 'extra.raw_info.last_name',
      :mail       => 'extra.raw_info.emailAddress'
    }
  }

  config.on_login do |omniauth_hash, user|
    # Implement any hook you want here
  end
end
```

## 5. redmineの管理画面で、Redmine Omniauth SAML pluginの設定
Enable SAML authentication　チェックON
Login page text
「G Suite」
Replace Redmine login page　　チェックOFF
（これONにしてしまうと、通常ログインできなくなるので注意）
Create users automatically?　チェックOFF
（自動で、ユーザーを作成するか？　だが、私の場合は、既存のユーザーがあったので、DBを直接更新した、usersのloginカラムをgoogleアカウントのメールアドレスに、そして、created_by_omniauth_samlカラムを1にしたら、引き継げた）

# 備考

signout_urlやidp_slo_target_urlなど、本来ならプロバイダのログアウトのURLを設定するが、G Suiteには無い？みたいです。/auth/saml/slsを設定しておけば、redmineからはログアウトできました。

redmine_omniauth_samlのsaml.rbのサンプルには、issuerに、/saml/metadataを指定する様になっていましたが、`https://redmineのドメイン名`までにしています。今の所、挙動には問題ない様です。
変える場合は、SAMLアプリのエンティティ IDも合わせる必要があるのかもしれないですが確認してません。