はじめに

Amazon Managed GrafanaでAD FSをIdPとしてSAML認証する際、GrafanaのTeamsとADグループを関連づける方法について、
あまり関連したドキュメントもないため、手順化して残そうと思い寄稿しました。

アーキテクチャ

以下のリンクの通り、弊社鈴木さんが提案したDirectory Service(AWS Managed Microsoft AD)をセットアップし、
AD FSサーバを構築しIdPとして、Amazon Managed GrafanaをSPとするSAML認証基盤を構築します。

Amazon Managed Grafanaへのログイン手段を考える 〜IAM Identity Center以外のSAML認証の選択肢〜

https://iret.media/wp-content/uploads/2024/11/1820b7cbf4e30e157947b6c18bdefb4c.png

どのようにADグループをGrafana Teamsに関連づけるのか

サービスプロバイダー(SP)側が、アイデンティティプロバイダー(IdP)側から送信されるSAMLアサーション内の属性の中に、GrafanaのTeamsに関する属性を受け取れるようにすればADグループとGrafanaのTeamsを紐付けることができます。
各プロバイダー側で実施される内容は以下のとおりです。

  • IdP側 … ADユーザーに関する属性情報(名前、メールアドレス、ADグループなど)をSAMLアサーションに含めてSPに送信。
  • SP側 … IdP側で送信されたSAMLアサーションの属性情報の中で、どの属性がグループに関する情報なのかを「アサーション属性グループ」で定義。Grafana Teamsで、External group syncを設定してADグループ名と関連づける。

設定

上記を基に、以下のようにADグループとGrafana Teamsを関連付けます。

ADグループ名 Grafana Teams名 用途
Grafana-Editor hoge-editor Grafanaダッシュボードに対するEditor権限を付与する
Grafana-ReadOnly hoge-ro Grafanaダッシュボードに対するRead権限を付与する

幾つか設定する内容があるので以下のような手順で設定。

1. Windows Server ADグループの作成

Active Directory Users and Computers を開き、GrafanaへのEditorとReadOnly用のADグループを作成し、各ユーザーに所属させます。

2. Windows Server 要求規則の追加

ADグループのグループ名情報を、SAMLアサーションに含めるためのカスタム規則を追加します。
今回グループ用に追加するルールは ①「Get AD Group」②「Group Name」の2つになります。

「Get AD Group」は以下のように定義します。内容としては、http://temp/variableにADグループ名を定義します。

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => add(store = "Active Directory", types = ("http://temp/variable"), query = ";tokenGroups;{0}", param = c.Value);

「Group Name」は以下のように定義します。内容としては、http://temp/variableから、正規表現により先頭「Grafana-」から始まるADグループを「groupnm」属性としてSAMLアサーションに含めます。
これのメリットとしては、正規表現にマッチしないADグループはSAMLアサーションとしてSP側に送信しないため、Grafana以外のSPもADグループで問題なく定義することができます。

c:[Type == "http://temp/variable", Value =~ "(?i)^Grafana-"]
 => issue(Type = "groupnm", Value = c.Value);

これでWindows Server側の設定は完了です。

3. Amazon Managed Grafana側でグループに対しての属性を定義

Grafanaコンソールにアクセスして、 アサーション属性グループ に対して属性groupnmを追加することで、IdP側からのSAMLアサーションから、該当する属性をグループとしてマッピングされます。

Grafanaコンソール

Grafana管理ユーザーでログインし、Administration > Teams と遷移し、External group sync タブで同期させる外部グループ名を記載します。先ほど設定したアサーショングループ属性groupnmで出力されるADグループ名を選択します。
External group syncに関する詳細な手順はこちらを参照するようにお願いします。

ReadOnlyのグループに対しても同じように設定します。

設定内容は以上になります。

動作確認

各ブラウザの開発者ツール上でSAMLレスポンスの中身を確認することができるので、SAMLレスポンスを確認します。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/troubleshoot_saml_view-saml-response.html

acsファイルの中にSAMLResponseのデータが確認できるので、SAMLデコードしてXMLファイルの中身を確認して属性groupnmとADグループ名が連携されていることが確認できれば成功です。

    :
<Attribute Name="groupnm">
    <AttributeValue>Grafana-ReadOnly</AttributeValue>
</Attribute>
    :

Grafanaコンソール上でもADグループで「Grafana-ReadOnly」に所属するユーザーが、Grafana Teamsの「hoge-ro」に所属していることが確認できれば成功です。