[Cloud][SNS] MastodonインスタンスをSAML対応に

丁度SAMLを勉強中す。

お仕事の関係で現在Azure ADをDeepdiveしまくってる状況でして、その課程でSAMLが面白いなーと思い始めて一人でズブズブ沼に潜ってます。今回実装までこぎ着けたのがいくつか出てきたのでそれをかこうかなと思いまして。その内一つがMastodonです。

Mastodonって?

もうすっかり表舞台から消えてしまったんじゃないか?と言う不安も感じたので簡単に言うと、

見た目ちょいと昔のTwitterっぽいかんじの連合SNS

です。

見た目はこんな感じ。

このSNS、自分でサーバを立てたりするケースが多く、メッセージの通信プロトコルとしてActivity Pubと言うものを使ってるんですが、この同じプロトコルを使用しているSNSサーバと連携して、複数サーバのタイムラインなんかが組めたりします。自前で立てたサーバが世界中のActivity Pub SNSサーバと連携できると言うことで、生きたトラフィックを自前サーバに流して遊べるという所が魅力でして、技術的な意味で暫くかなりどハマりしました。

今でもこんな構成で稼働中です。

我が家のMastodonサーバの構成

SAMLとは

シングルサインオンと言うものがあります。
これは、認証情報を一元管理する仕組みの一つで、1つのアカウントで複数のサービスを横断するが如くアクセスできるようになるものを指しています。

サービスから見ると、自前で一生懸命多要素認証とか構成しなくても信頼の出来るよその認証サービスにその認証処理を委託することによって、セキュリティにツヨツヨな認証をさせることが可能になり、セキュリティレベルの向上、サインイン操作の省力化ができたりするので、最近だーいぶ流行ってきております。

SAMLにおける認証シーケンスとしては以下の図のような感じです。

SAMLは上図のような流れで認証を行う動きをする。

今回、上図にあるとおりMicrosoft Azure Active Directory (AzureAD)をIdentity Provider(IdP), MastodonをService Providerとして構成してAzure ADを通じて認証を行えるように設定変更を行いました。

Azure ADでやること

Azure ADでやるのは、以下のようなことです。

エンタープライズアプリケーションの作成
Azure Portalへアクセスする
Azure Active Directoryメニューへ移動する
エンタープライズアプリケーションをクリックする
「新しいアプリケーション」をクリックして、アプリケーションの新規作成を行う
「独自のアプリケーション」をクリックする
アプリケーション名を入力して(私はMastodonと書いた)、「ギャラリーに見つからないその他のアプリケーションを統合します」を選択して、「作成」ボタンをクリックする
シングルサインオン設定でSAMLを選ぶ
Mastodonアプリケーション設定画面へ遷移したら、「シングルサインオン」をクリックする
どのプロトコルを使用するかの選択画面が表示されるので「SAML」をクリック
①基本的な SAML 構成 の設定
ここでは、SPの設定をしていきます。今回、以下の設定を実装します(同値設定をMastodonに対しても行います。後ほど)
-----------
識別子 (エンティティ ID)
https://interact.bluecore.net

応答 URL (Assertion Consumer Service URL)
https://interact.bluecore.net/auth/auth/saml/callback

設定を終えたら保存します。
②ユーザー属性とクレーム
ここは、一度丸々設定を削除して新しく作り直します。
今回私は以下のクレームルールを作成しました。
[email属性]
 名前:email
 名前空間:(設定しない)
 ソース:属性
 属性:user.mail

[一意のユーザID]->全部削除したところで勝手に現れます・・
 名前:nameidentifier
 名前空間:http://schemas.xmlsoap.org/ws/2005/05/identity/claims
 名前識別子の形式:メールアドレス
 ソース:属性
 属性:user.userprincipalname

設定完了したら保存します。
③SAML 署名証明書
Base64形式のファイルをダウンロードリンクをクリックしてダウンロードします。
ダウンロードした証明書データをテキストエディタで開き、改行を全て削除してください。1行につなげた状態でMastodonには実装します。
④アプリのセットアップ(パラメータの入手)
ログインURLに書かれているURLをコピーしてテキストエディタへ貼り付けるなどしてください。
ユーザの割り当て
エンタープライズアプリケーション画面に戻り、「ユーザの割り当て」へ移動します。そこで自分のアカウントを試したければそのユーザを割り当ててください。
Mastodonサーバの .env.production のパラメータを追加します。
Mastodonにある環境変数の追加を行います。
----------
SAML_ENABLED=true
SAML_ACS_URL=<①で設定した応答URL>
SAML_ISSUER=<①で設定した識別ID>
SAML_IDP_SSO_TARGET_URL=<④で取得したシングルサインオンURL>
SAML_IDP_CERT=<④でダウンロードして取得した証明書を1行につなげたもの>
SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
SAML_SECURITY_WANT_ASSERTION_SIGNED=true
SAML_SECURITY_ASSUME_EMAIL_IS_VERIFIED=true
SAML_ATTRIBUTES_STATEMENTS_UID=email
SAML_ATTRIBUTES_STATEMENTS_EMAIL=email
Mastodonのアプリケーションを再起動
多分サービス再起動すれば良いとは思うんですが、今回色々面倒だったのでサーバを再起動しました。
SAMLボタンが登場
特に何もユーザ名・パスワードを入れずにSAMLボタンをクリックします。
もし、まだAzure ADにログインしてない場合は、MicrosoftのAzureADへのログオンプロンプトが表示されますので、そこで認証を行います。
既にAzure ADにログオンしている環境ではSAMLボタンをクリックしたらすぐにMastodonのおなじみの画面が表示され、アクセスできるようになります。

認証の処理は完全にAzure ADへ委任している

この構成を取ってSAMLボタンをクリックすると、認証処理は完全にAzure ADへ委任した状態となり、サインインをすることによってそのユーザ情報がMastodonへ引き渡されます。その引き渡し情報は②にて設定したクレームルールという設定に従っています。

今回の設定では、基本的にメールアドレスの連携しか行っていません。私の場合、メールアドレスがユーザアカウントに設定しているメールアドレスと一致したため、従来使用している私のアカウント賭してログオンすることが出来ました。

このときMastodonはMicrosoftから私のブラウザを通じて提示されたSAML Responseと言うデータを受領しており、「認証が成功したと言うこと」「私のEmailアドレスは○○と言うこと」「正式にMSから払い出された情報であることを示す証明書と署名情報」がそこには記載されています。

証明書の照合を行い確かに認証したことをMastodonは確認し、引き渡されたメールアドレス情報を素に、要素が合致する私のアカウントと紐つけて無事ログインできた・・・ということになります。

これにより、SPであるMasotdonは自身のサーバにパスワード情報をやり取りする必要なく、その情報のやり取りをよりセキュリティのしっかりしたIdPに限定させることでよりセキュリティが向上するというわけでして。

ちゃんと技術を理解すると視野が広がる

今回これを久々に体感することが出来ましたヤタ───ヽ(・∀・)ノ───!!
没頭できるから楽しいし、OASISのドキュメントをDeeplで翻訳しながらではありますが読んでいくと仕様を読むことの面白さをすこしだけ思いだしたような気がします。

仕事で拾ったキーワードとかちょっと心に留め置き、こうしてチャレンジしてみるのも面白いのではないかな?とか。色々便利に扱える機能だというのが良く分かったので、もう少し深く掘り下げていこうと思っております。

localYouser

www.bluecore.net

九州在住のITインフラエンジニアです。 若干病気等に苦しめられながらも、小さな幸せをじっくり噛み締めながらお仕事頑張ってます。