tech.hukurouo.com

Rails+AzureADでSAML認証のSSOを実装する
2021-10-12
# knowledge

検索しても詳しいやり方が出てこなかったので、備忘録を兼ねて。

前提

Railsアプリの前準備

gem のインストール

SAMLのライブラリとしてruby-saml を、認証情報を扱うのでdotenv-railsを使用する。

Gemfile

gem 'ruby-saml'
gem 'dotenv-rails'

認証周りのコードを書く

ruby-samlはRails用のサンプルコードが用意されているので、それをそのままコピペする。

https://github.com/hukurouo/rails-sso/commit/0eb215529873b4fc7cc4a52dae00b726fb3a9318

Azure ADでSAMLの設定

https://portal.azure.com/#home

「Azure Active Directory」->「エンタープライズアプリケーション」->「新しいアプリケーション」->「独自のアプリケーションの作成」と辿る。

任意のアプリ名を入力、ラジオボタンは一番下を選択して作成する。

アプリケーションが作成されたら、「シングルサインオンの設定」->「SAML」を選択し、SAMLによるシングルサインオンのセットアップに入ります。

基本的なSAML構成

ここでは以下の2点を入力する必要がある。

  • 識別子(エンティティIID)
  • 応答URL(Assertion Consumer Service URL)

これらの値はRails側でも設定しており、識別子がsettings.issuer、応答URLがsettings.assertion_consumer_service_urlに対応している。

app/models/account.rb

#SP section
    settings.issuer                         = url_base + "/saml/metadata"
    settings.assertion_consumer_service_url = url_base + "/saml/acs"

今回はlocalhostから確認できればよいので、以下のように入力しておく。

  • 識別子 (エンティティ ID)
    • http://localhost:3000/saml/metadata
  • 応答 URL (Assertion Consumer Service URL)
    • http://localhost:3000/saml/acs

ユーザー属性とクレーム

とりあえず最小限に、メールアドレスと名前のみを要求する。

一意のユーザー識別子はuser.mailと設定。その横に書いてあるnameid-format:emailAddressみたいな文章も確認しておく。(Railsアプリ側にも登録しておく必要があるため)

app/models/account.rb

settings.name_identifier_format = ENV['NAME_ID_FORMAT']

上記の例だと、このようなコードになる。(最後のほうを合わせてあげれば多分大丈夫)

NAME_ID_FORMAT=urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

SAML署名証明書

ここでBase64証明書をダウンロードして、Railsアプリのconfig下に保存する。

app/models/account.rb

settings.idp_cert = File.read(Rails.root.join('config', 'rails-sso.cer'))

証明書の有効期限が切れたら作り直す必要があるので留意しておきましょう。

(任意のアプリ名)のセットアップ

AzureAD識別子、ログインURL、ログアウトURLが表示されているので、Railsアプリに登録する。SSOがシングルサインオン、SLOがシングルログアウトの略。

app/models/account.rb

# IdP section
    settings.idp_entity_id = ENV['IDP_ENTITY_ID']
    settings.idp_sso_target_url = ENV['IDP_SSO_URL']
    settings.idp_slo_target_url = ENV['IDP_SLO_URL']

最後に「ユーザーとグループ」で自分のアカウントを割り当てて、Azure ADでの設定は完了。

RailsでSSO

http://localhost:3000を開くとLoginリンクが表示される。上手くいっていたらSAML認証のSSOが実行されるはず。

リポジトリ

https://github.com/hukurouo/rails-sso