RedMica 2.1(Redmine 5.0互換)と Azure AD で SAML認証 をする方法


こんにちは。習慣として日曜は晩酌をしてたのですが、月曜の朝「出社したくないでござる(リモートが良いでござる)」病の一因であることに気づき始めたので、しばらく日曜の晩酌はやめようと思っています。
先月から週5日勤務に変更した吉岡です。

今回は RedMica stable-2.1(Redmine 5.0互換)で SAML認証をしてみたので、その方法について紹介したいと思います。

環境・事前準備

※ RedMicaのインストール方法については特に触れません。
※ Azureアカウント, Active Directorry はすでに設定済みであることが前提です。作成方法等については特に触れません。

設定手順

AzureAD(Idp)の設定

1. エンタープライズアプリケーションの登録

  1. 独自アプリケーションの作成
  2. 「アプリ名」の入力(任意)
  3. 「ギャラリーに見つからないその他のアプリケーションを統合します (ギャラリー以外)」を選択
  4. 作成

参考:クイックスタート: エンタープライズ アプリケーションを追加する
https://docs.microsoft.com/ja-jp/azure/active-directory/manage-apps/add-application-portal

2. シングルサインオン

  1. シングルサインオン方式の選択で「SAML」を選択
  2. 「基本的な SAML 構成」を編集する
  3. 識別子を入力する( http://localhost:3000/auth/saml/metadata を入力する。)
  4. 応答URLを入力する( http://localhost:3000/auth/saml/callback を入力する。以下の設定ファイル config/initializers/saml.rbの assertion_consumer_service_url と合わせる必要がある。)

参考:クイックスタート: エンタープライズ アプリケーションのシングル サインオンを有効にする
https://docs.microsoft.com/ja-jp/azure/active-directory/manage-apps/add-application-portal-setup-sso

3. ユーザー作成、アプリケーション割り当て

  1. ユーザーを作成する(作成後、プロパティ > 連絡先情報 > メール に利用するメールアドレスを登録。)
  2. ユーザーとグループにアカウントを登録する

参考:クイックスタート: ユーザー アカウントを作成して割り当てる
https://docs.microsoft.com/ja-jp/azure/active-directory/manage-apps/add-application-portal-assign-users

利用準備

ADの準備ができましたら事前にログインしておきます。
また、後ほどプラグインの設定時に以下の値を使用しますので、メモしておきます。

  1. 「拇印」-> idp_cert_fingerprint に使用します。
  2. 「ログイン URL」-> idp_sso_target_url に使用します。
  3. 「ログアウト URL」-> idp_slo_target_url に使用します。

Azure AD シングルサインオン設定画面

RedMica(SP)の設定

Plugin インストール

$ git clone https://github.com/yoshiokaCB/redmine_omniauth_saml.git plugin/redmine_omniauth_saml
$ bundle install
$ rake redmine:plugins

設定ファイル config/initializers/saml.rb を以下を参考に作成します。

sample: config/initializers/saml.rb

Redmine::OmniAuthSAML::Base.configure do |config|
  config.saml = {
    :assertion_consumer_service_url => "http://localhost:3000/auth/saml/callback", # ※1
    :issuer                         => "http://localhost:3000/auth/saml/metadata", # ※1
    :single_logout_service_url      => "http://localhost:3000/auth/saml/sls",      # ※1
    :signout_url                    => "http://localhost:3000/auth/saml/sls",      # ※1
    :idp_sso_target_url             => "https://login.microsoftonline.com/*****/saml2", # Azure AD の「ログイン URL」を使用
    :idp_cert_fingerprint           => "******************",                            # Azure AD の「拇印」を使用
    :name_identifier_format         => "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
    :idp_slo_target_url             => "https://login.microsoftonline.com/*****/saml2", # Azure AD の「ログアウト URL」を使用
    :name_identifier_value          => "mail",
      :login => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name',          # ※2
      :mail => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name',           # ※2
      :firstname => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname', # ※2
      :lastname => 'extra raw_info http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname'     # ※2
    }
  }

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

※1 ドメイン部分(ポート含む)はIdpのアプリケーション登録に合わせて適宜変更してください。
※2 Idpの環境によって適宜変更してください。

ここまで終われば準備完了です。

動作確認

  1. サーバー起動
    $ rails server
    
  2. http://localhost:3000/ にアクセスしまずは初期設定の管理者でログインします。
  3. ログイン後、管理 > プラグイン > 設定 を順にクリックし、の Redmine OmniAuth SAML の設定画面を表示します。
  4. 1,2がチェックされていることを確認します。
    チェックがついてない場合はチェックをつけて適用します。

    プラグイン設定画面
  5. 設定確認が終わりましたらログアウトし、再度ログイン画面に移動します。
  6. 表示後、「Login with SAML」ボタンをクリックします。

    ログイン画面
  7. 自動でログインされれば成功です。
    ログイン中のユーザーが新規に登録されたAzure ADの「ユーザー プリンシパル名」であることを確認してください。

ログイン後の画面(画面右上にログインIDが表示される)

補足

参考までにログイン時の認証方法についてプラグインの仕様を紹介したいと思います。
以下の順に認証をするようになっています。

  1. Azure ADにログインしているユーザーの「ユーザー プリンシパル名」がすでにRedmineのログインIDとして登録されている場合は、そのアカウントでログインされます。
  2. Azure ADにログインしているユーザーのメールアドレスとRedmineに登録されているアカウントのメールアドレスが一致する場合は、そのアカウントでログインします。
  3. 上記1,2でアカウントが存在しない場合、「ユーザー プリンシパル名」をRedmineのログインIDに使用してアカウント作成され、そのアカウントでログインします。

まとめ

以上、今回は、RedMica 2.1(Redmine 5.0互換)と Azure AD で SAML認証 をする方法をご紹介させていただきました。 このようにSAMLを使うことでセキュアで、より便利にRedmineにアクセスすることができそうです。

ただ、今回の検証したプラグインでは、以下のような気になる点があることもわかりました。

認証先(Idp)設定情報の保持方法

認証先(Idp)設定情報を Rails.application.config.middleware.use を利用して設定・保持しているため、認証先の情報を変更する場合、都度アプリケーションの再起動が必要になりそう。
特に問題のないように感じるかもしれませんが、弊社のようにSaaSで提供している場合、設定変更で都度アプリケーションの再起動が実行されるとあまり都合の良くないケースが多く、可能であれば接続情報はDBに保持して、動的に反映できると嬉しい。もちろんセキュリティの面をしっかりと考慮する必要はある。

仕様(機能)の整理

例えば、Idpのログアウト用らしきコードが書かれているのですが、ログアウト用のリンクは実装されてなさそう(見落としてたらごめんなさい)。実際にRedmineで利用するのかどうか含めて検討が必要そう。
また、現状ですと一度Idp経由でRedmineのアカウントを作成した後、Idpのアプリケーション側でユーザーの割り当てを解除しても、設定によってはパスワード認証でログインできた。(かなりのレアケースですが、修正した方が良いかも)

使用しているGemの選定

利用しているライブラリー(Gem)で ruby-saml と omniauth-saml が共存している。どちらも同じく Ruby で SAML認証を行うのに利用するGemですが、両方利用する必要がなるのか要確認する。(なるべく余分なものは入れたくない。管理物は減らしたい。)
ruby-saml のみでSAML認証が簡単にできるため、そちらをベースに一からプラグインを作成するのが良さそう。

最後に

と言うことで現在、RedmineでSAML認証できるプラグインを絶賛開発中です。 乞うご期待ください!

My Redmine

こちらの記事もオススメです!
Redmine 5.0で古いプラグインを動作させる方法(Zeitwerk対応)
Redmine 5.0ではZeitwerkが採用され、プラグインがZeitwerkに対応していないとRedmine 5.0は起動しません。
APPS JAPAN 2022にブースを出展しました
2年ぶりに「APPS JAPAN 2022」にブースを出展しました。
Rails7.0にアプリケーションをアップデートしています
社内で開発中のRuby on Rails(以下、Rails)アプリケーションをVer6.1系からVer7.0系にアップデートした手順の一部をご紹介します。
AWS マネジメントコンソールへのログイン通知(2022年版)
証跡をマルチリージョン対応し他のサービスを連携して比較的簡単に対応ができました。
Redmineに関するオンラインセミナーを始めて1年経ったふりかえり
セミナーの開催にあたり準備したことや良かったことをふりかえります。
ファーエンドテクノロジーからのお知らせ(2022/08/17更新)
My Redmine 無料個別相談会in東京(9月9日)を開催します(3組限定)
My Redmine 無料個別相談会を9月9日(金)に東京で開催します。3組限定。お客様の疑問・課題を講師が一緒に解決します。
「FAR END NEWS」2022年第3号 発行
広報紙「FAR END NEWS」2022年第1号を発行しました。弊社サービスの運用・サポートに携わっているスタッフや弊社の取り組みをご紹介します。
【My Redmine導入事例】製造業の株式会社イシダテックにおける活用事例を公開 業務状況の可視化により社内リソースの有効活用が可能に
My Redmineの導入と業務改善の推進で案件の情報共有に成功。鮮度・解像度が低かったプロジェクトの全体像が明確に。製造業の企業が取り組んだ工夫は、導入推進のための体制づくりや社内へのサポート。
プロジェクト管理ツール「RedMica」バージョン 2.1.0をリリース Redmine互換のオープンソースソフトウェア
今日使える明日のRedmine「RedMica」の最新バージョン2.1.0をリリースしました。次期バージョン Redmine 5.1の新機能を先行利用できます。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け