Azure App Service で配備した Grafana でAD(Active Directory)認証を行う手順を記載する。
尚、認証以外の部分は、Azure App Service に Grafana をデプロイ をベースにしている為、詳細はそちらを参照。
シークレットの作成は App Service アプリを登録してから、そのアプリのシークレットとして登録しても良いが、
認証のベースとなるアプリ 及び シークレット は、以下の理由で別アプリとして先に作成しておく。
[Active Directory] を選択
[アプリの登録] を選択
[新規登録] を選択
アプリケーション名を入力して登録
クライアントID 及び テナントID を確認しておく
[証明書とシークレット] → [新しいクライアントシークレット] を選択
説明を入力して [追加]
登録したクライアントシークレットを確認しておく。(追加直後しか確認できないので注意)
[認証] → [プラットフォームの追加]
リダイレクトURI 等を登録する。
項目 | 設定値 |
リダイレクトURI | https://Grafanaアプリケーション名.azurewebsites.net/login/azuread |
〃(2つ目) | https://Grafanaアプリケーション名.azurewebsites.net/.auth/login |
暗黙的な許可フロー | シークレットを 他の Service App と共用する場合は2つともチェックを入れておく |
※ Grafanaアプリケーション名は 後述の 0_env.sh の $webappName と同じもの。
左側メニューの [マニフェスト] から、登録したアプリケーションのマニフェストを以下の通り更新する(アプリケーションロールの追加)
※ユニークIDは uuidgen 等を使用して3つ生成しておく。
※ https://grafana.com/docs/grafana/latest/auth/azuread/
: "appRoles": [ { "allowedMemberTypes": [ "User" ], "description": "Grafana Editor Users", "displayName": "Grafana Editor", "id": "ユニークなID", "isEnabled": true, "lang": null, "origin": "Application", "value": "Editor" }, { "allowedMemberTypes": [ "User" ], "description": "Grafana read only Users", "displayName": "Grafana Viewer", "id": "ユニークなID", "isEnabled": true, "lang": null, "origin": "Application", "value": "Viewer" }, { "allowedMemberTypes": [ "User" ], "description": "Grafana admin Users", "displayName": "Grafana Admin", "id": "ユニークなID", "isEnabled": true, "lang": null, "origin": "Application", "value": "Admin" } ], : "groupMembershipClaims": "ApplicationGroup", :
[Azure Active Directory] → [ユーザ] から下図の通りユーザを登録。
[Azure Active Directory] → [エンタープライズ アプリケーション] から対象のアプリを選択後に [ユーザーとグループ] を選択して、ユーザにアプリケーションロールを割り当てる。
※デフォルトで Viewer権限 になるので、割り当てるのは Admin と Editor に該当するユーザだけでOK。
シェルの内容は Azure App Service に Grafana をデプロイ の内容をベースにしている為、以下には変更点のみ記載する。
以下を追加
: : # OAuth用 adClientId="クライアントID" adClientSecret="クライアントシークレット" tenantId="テナントID"
環境変数を追加(GF_AUTH_AZUREAD_XXXXX)
: : # App Service 環境変数設定 echo "az webapp config appsettings ( $webappName )" az webapp config appsettings set \ -g $resourceGroup -n $webappName \ --settings "GF_SERVER_ROOT_URL=https://${webappName}.azurewebsites.net" \ "GF_SECURITY_ADMIN_PASSWORD=admin" "GF_DATABASE_TYPE=mysql" "GF_DATABASE_HOST=${vmIpAddress}:3306" \ "GF_DATABASE_NAME=grafana" "GF_DATABASE_USER=grafana" "GF_DATABASE_PASSWORD=grafana" \ "WEBSITES_PORT=3000" \ "GF_AUTH_AZUREAD_NAME=Azure AD" \ "GF_AUTH_AZUREAD_ENABLED=true" \ "GF_AUTH_AZUREAD_CLIENT_ID=${adClientId}" \ "GF_AUTH_AZUREAD_CLIENT_SECRET=${adClientSecret}" \ "GF_AUTH_AZUREAD_AUTH_URL=https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/authorize" \ "GF_AUTH_AZUREAD_TOKEN_URL=https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token" \ "GF_AUTH_DISABLE_LOGIN_FORM=true" "GF_AUTH_OAUTH_AUTO_LOGIN=true" \ "GF_AUTH_SIGNOUT_REDIRECT_URL=https://${webappName}.azurewebsites.net/.auth/logout"
VMなど
./1_resources.sh --create
App Service(Grafana)
./3_app_resources.sh --create
App Service 側もADアプリ側の 認証設定 と同じ設定をしておく。
[App Service] から対象の App Servce アプリを
選択後、「認証/承認」 を選択。
・「オン」、「Active Directory でのログイン」 を選択。
・認証プロバイダーの Active Directory の選択。
Active Directory の設定を下図の通り入力して [OK]
※クライアントID、シークレットは先に登録したADアプリのものを入力。
詳細設定を下図の通り設定して、最後に [保存] を押下・
許可される外部リダイレクト URLは以下の2つを入力しておく。(ADアプリ側に登録したものと同じもの)
項目 | 設定値 |
リダイレクトURI | https://Grafanaアプリケーション名.azurewebsites.net/login/azuread |
〃(2つ目) | https://Grafanaアプリケーション名.azurewebsites.net/.auth/login |
ブラウザから https://Grafanaアプリケーション名.azurewebsites.net にアクセスしてAdminロールを割り当てたユーザでログインしてみる。
※GF_AUTH_DISABLE_LOGIN_FORM 及び GF_AUTH_OAUTH_AUTO_LOGIN を true にしている為、Grafana のログインフォームは表示されず、最初からOAuth認証が始まる。
Admin 権限でログインされている事を確認。
プロキシを噛ませてHTTPヘッダで認証できないかやってみたが、 Grafana の Auth Proxy は ロールマッピングには対応していない模様。
https://grafana.com/docs/grafana/latest/auth/overview/
Active Directory プランによっては、ADグループ単位でのロール割り当ては出来ない。
※AZURE AD PREMIUM P2 などが必要。