Mackerel で SAML を實裝してゐます #mackerelio - c4se記:さっちゃんですよ☆

c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Cosense で公表中です。

Programming は GitHub で開發中です。

Mackerel で SAML を實裝してゐます #mackerelio

qiita.comの 12/18 (月) です。

Mackerel では今 SAML を實裝してゐます。提供時期や價格等はここには書けないのですが、實裝してゐる機能の內側を御覽に入れます。

想定讀者 :

  • Mackerel の SAML を導入する事を檢討する IdP 管理者
    • この記事は 2023/12 に實裝中の機能 (實裝豫定の機能を含みます) を紹介するものです。提供時にこの通りの仕樣である事を保證しません
      • 公式 document を意圖するものではありません
    • 將來提供されるであらう利用 guide では讀み取りづらい詳細を、檢討する役に立てば幸ひです
  • SP (service provider) を實裝するエンジニア
    • どちらかと言ふとこちらの讀者向きの文書です…
    • 既存の認證・認可 model と整合せせた一例として參考になれば幸ひです
    • SP を實裝するのに以下の本が大いに參考になりました

想定する讀者が讀者ですから、SAML の仕樣書に載る一般的な知識は解說しません。Mackerel ではどうしようとしてゐるかを紹介します。また Mackerel を一通り利用した事があるものとします。

現狀の認可 model

Mackerel と云ふ service は、SAML 規格では SP (service provider) に當たります。SAML は認證を提供する規格ですが、access 可否等結果的に認可にも影響します。

Mackerel の現狀の認可 model は以下の樣になってゐます。

(※以下全ての ER 圖は DB 上の實裝を表さず、槪念上の關係のみを表します。カラムの型も、Mermaid 記法の都合で省略できない爲に書いたもので、適當です。)

erDiagram

"オーガニゼーション" }o--|| "ユーザー" : "オーナー"
"オーガニゼーション" ||--o{ "メンバー" : ""
"ユーザー" ||--o{ "メンバー" : ""

"メンバー" {
    int authority_type "權限"
}
  • オーガニゼーションには複數のユーザーが所屬する
  • ユーザーは複數のオーガニゼーションに所屬する
    • オーガニゼーションは全ユーザーが自由に作れる
    • オーガニゼーションの管理者の意志で自由にユーザーを招待できる
    • 仕事のオーガニゼーションと個人活動のオーガニゼーション等、複數の組織のオーガニゼーションにユーザーは所屬できる。業務委託等でもこれは起こりうる
  • オーガニゼーション\timesユーザー毎に權限を管理する

ここに SAML を作用させます。

オーガニゼーショングループを導入する

オーガニゼーションは自由に作れる爲、一つの組織が多くのオーガニゼーションを使ってゐる事があります。或る IdP で認可されるオーガニゼーションを、一纏めにする槪念が必要です。

erDiagram
"オーガニゼーショングループ" |o--o{ "オーガニゼーション" : ""
"オーガニゼーショングループ" }o--|{ "ユーザー" : "オーガニゼーショングループ管理者"

"オーガニゼーショングループ" {
    varchar idp_entity_id "IdP の entityID"
    int idp_info "IdP の metadata 諸々"
}
  • オーガニゼーションはオーガニゼーショングループに屬する、または屬さない
  • オーガニゼーショングループには複數のオーガニゼーションが屬する
    • オーガニゼーショングループ は IdP の entityID と一對一對應する
    • オーガニゼーショングループには IdP の metadata を登錄する
    • オーガニゼーショングループに屬するオーガニゼーションへのユーザーの認可は、
      • オーガニゼーショングループによる認可を要求するか否か設定できる
      • 屬性マッピングを有效にするか否か設定できる
  • オーガニゼーショングループとオーガニゼーションの兩者の管理權限を持つユーザーは、オーガニゼーションをオーガニゼーショングループに屬させられる
    • 他人のオーガニゼーションを誤ってオーガニゼーショングループに屬させてしまふのを防ぐ爲

オーガニゼーショングループによって、SAML Response を檢證する口が IdP 毎に一つに纏まります。SAML を利用しないオーガニゼーションは、どのオーガニゼーショングループに屬さないかもしれません。

ユーザーはメンバーを介してオーガニゼーションに所屬すると云ふ點は變へてゐません。ユーザーはオーガニゼーショングループを跨いで、またはオーガニゼーショングループに屬さないオーガニゼーションにも參加できます。

SAML セッションはオーガニゼーショングループ毎に作成され、同時に複數持てる

Mackerel にサインインすると、勿論セッションが發行されます。しかし Mackerel に認證されてゐるからといって、オーガニゼーショングループに屬するオーガニゼーションを閲覽・操作できるとは限りません。オーガニゼーショングループに屬するオーガニゼーションに認可するか否かは、IdP を介して判斷しなければなりません。そこで IdP からサインインしたユーザーには、Mackerel のセッションに追加して、IdP 毎の SAML セッションを發行します。

erDiagram
"ユーザー" ||--o{ "SAML セッション" : ""
"オーガニゼーショングループ" ||--o{ "SAML セッション" : ""

"SAML セッション" {
    timestamp expired_at "有效期限"
}
  • 複數の IdP に同時にサインイン可能
  • ユーザーが見えるオーガニゼーションは、
    • 該當ユーザーがメンバーにゐるオーガニゼーションの內、
      • オーガニゼーショングループに屬してゐないオーガニゼーション
      • オーガニゼーショングループに屬してゐ、該當オーガニゼーショングループに關する SAML セッションを持ってゐるオーガニゼーション
        • 但しオーガニゼーションに例外承認 (下記) されてゐれば、對應する SAML セッションを持ってゐなくても見られる

ユーザーが複數の組織に屬する可能性を前提し、複數の IdP に對應する SAML セッションを同時に持てるのが、この實裝の特徴かと思ひます。GitHub 等が似た構造を持ってゐると推察してゐます。IdP に對應する有效な SAML セッションを持ってゐないと、IdP に對應するオーガニゼーショングループに屬するオーガニゼーションには認可されません。

屬性マッピング

屬性マッピングに對應するべく、IdP で設定した、SAML Response に含まれるユーザーの屬性を保存します。

erDiagram
"ユーザー" ||--o{ "IdP で設定したユーザーの屬性" : ""
"オーガニゼーショングループ" ||--o{ "IdP で設定したユーザーの屬性" : ""
  • 屬性マッピングを有效か無效か切り替へられる
  • IdP でユーザーに設定した屬性に從って、オーガニゼーション\times (參加不參加 + 權限) を強制できる
  • 屬性マッピングが適用されるのは以下の時

SAML でオーガニゼーションへの閲覽・操作を認可したとしても、オーガニゼーション毎に權限を管理するのは通常はオーガニゼーション管理者の役目です。しかし屬性マッピングを設定すれば、各オーガニゼーションへの參加不参加・權限も IdP で一元的に管理できます。

ユーザーを例外的に承認してオーガニゼーションへ認可する

業務委託や何らかの理由で、IdP には登錄しないが、しかしオーガニゼーションには認可したいユーザーが現れます。これらのユーザーを例外的に承認する必要があります。

erDiagram
"オーガニゼーション" }o--o{ "ユーザー" : "例外承認メンバー"
  • IdP に登錄せず、よって SAML ではサインインできないが、しかしオーガニゼーショングループに屬するオーガニゼーションの一部には認可したいユーザー
  • オーガニゼーショングループで別途指定する

IdP サインイン時の擧動

IdP からサインインし、ACS URL へ SAML Response を持ってユーザーが來た時の擧動は以下になります。

  1. SAML Response を檢證
  2. 對應するユーザーがゐなければ、JIT provisioning する
    • NameIDPolicy は emailAddress
  3. セッションが無ければ、セッションを發行する (Mackerel にも認證する)
  4. 對應するオーガニゼーショングループに屬するオーガニゼーション毎に、メンバーを調整する
    • オーガニゼーショングループによる認可を要求されてゐなければ、
      • オーガニゼーショングループに屬するオーガニゼーションに、
        • メンバーであればそのまま
        • メンバーでなければ、閲覽者權限で參加する
    • オーガニゼーショングループによる認可を要求されてゐれば、
      • 屬性マッピングが無效であれば、
        • オーガニゼーショングループに屬するオーガニゼーションに、
          • メンバーであればそのまま
          • メンバーでなければ、閲覽者權限で參加する
      • 屬性マッピングが有效であれば、
  5. SAML セッションを發行する
  6. 認可されれば (下記)、オーガニゼーションにアクセスできる

ユーザーが認可される範圍

或るオーガニゼーションを閲覽・操作できるユーザーは、以下の通りです。

  • オーガニゼーショングループに屬してゐなければ、
    • オーガニゼーションのメンバーにゐるユーザー
  • オーガニゼーショングループに屬してゐれば、
    • オーガニゼーショングループでの認可を要求してゐなければ、
      • オーガニゼーションのメンバーにゐるユーザー
    • オーガニゼーショングループでの認可を要求してゐれば、
      • オーガニゼーションのメンバーにゐるユーザーの內、
        • 對應する SAML セッションを持ってゐるユーザー
        • 例外承認されてゐるユーザー

オーガニゼーショングループでの認可を要求する樣にした時と、屬性マッピングを有效にした時には、認可の範圍が調整されます。

  • 對應する IdP で設定したユーザーの屬性を持ってゐないユーザーは、
    • 認可されなくなる
    • メンバー情報は維持される
    • 二要素認證を必須にした時の擧動に似る
  • 對應する IdP で設定したユーザーの屬性を持ってゐるユーザーは、
    • メンバー情報を適切に變更する
      • IdP サインイン時の擧動と同じ
      • 認可される樣になったり、認可されなくなったりする
  • 例外承認されたユーザーは、
    • 影響を受けない

以上となります。各方面に何か參考になれば幸ひです。それではよき SAMLai ライフを (?)

明日 Meetup を開催します。是非ゐらしてください。今からでも閒に合ふ! mackerelio.connpass.com