【実務・中級編】Grafana IAMと細粒度アクセス制御(Fine-grained Access Control):マルチテナント環境のセキュアな構築法 – 運用監視・オブザーバビリティ活用バイブル

運用の深淵へ:Grafanaで実現する「鉄壁」のマルチテナント・アーキテクチャ

「Grafanaをただのグラフ表示ツールだと思っていませんか?」

もしあなたがそう考えているなら、それはフェラーリを近所のコンビニの買い物にしか使っていないのと同じだ。我々のようなオブザーバビリティのエンジニアにとって、Grafanaは単なる可視化の窓ではない。「組織の権限境界を制御し、データガバナンスを強制する統制の要」である。

今日は、マルチテナント環境において、開発スピードを落とさずに「セキュリティの堅牢性」を極限まで高めるための、現場で血を流しながら得た知見を共有する。

—

1. 組織設計のアンチパターンを捨てる

多くのチームが陥る罠が、「Organization(Org)を分けすぎて管理が崩壊する」ことだ。
GrafanaのOrgは、データソースの設定やユーザー管理を完全に切り離すが、その分、ダッシュボードの共有や「横断的なSREのダッシュボード」を作るのが極端に困難になる。

結論:Orgは「事業部」レベルでしか切るな。
それ以下のチーム単位の隔離は、「フォルダ権限(RBAC)」で行うのが現代の正解だ。

フォルダ単位のアクセス制御の極意

  • Editor権限を全社員に与えるな: 権限は「Viewer」がデフォルト。特定のフォルダに対して「Editor」以上の権限をチームのグループ単位で付与する。
  • Team Syncの活用: Grafana単体でユーザー管理をしてはいけない。OktaやAuth0などのIdPとSAML/OIDCで連携し、グループIDをGrafanaのTeamにマッピングする。これだけで入退職時の権限漏れが消える。

—

2. 行レベルセキュリティ(Row-level Security)の「裏技」

「マルチテナントなのに、全員が他部署のデータを見えてしまう」という事態は絶対に避けなければならない。データソース側(Prometheus/Loki/SQL)でフィルタリングするのが王道だが、Grafana側でこれを強制させる強力な手法がある。

それは、「カスタム変数(`__user.login`など)をクエリに注入する」テクニックだ。

実践:ダッシュボードクエリへの動的フィルタ

データソースに渡すプロンプトに、ログインユーザーのIDやチーム名を自動挿入させる。

— PostgreSQLデータソースの例
SELECT time, value
FROM metrics
WHERE tenant_id = ‘$__user.login’ — ログインユーザーのIDで強制フィルタ
AND service = ‘$service_name’

  • ポイント: ここで `Constant` 変数や `Custom` 変数を使い、隠し変数としてユーザーの所属部門タグを持たせる。これにより、URLを直接叩かれても、そのユーザーに許可されたデータ以外は絶対に表示されない。

—

3. 開発スピードを劇的に上げる「プロの作法」

隠れたキーボードショートカット

  • `d + h`: ダッシュボードの履歴を表示(壊した時に命を救う)。
  • `d + s`: ダッシュボード設定へジャンプ。
  • `d + k`: ダッシュボードのキーボードショートカット一覧(これを見ないエンジニアは損をしている)。

絶対入れるべき「神プラグイン」

1. [Dynamic Text](https://grafana.com/grafana/plugins/marcusolsson-dynamictext-panel/): JSONレスポンスをMarkdownで整形して表示する。障害時の手順書(Runbook)をダッシュボードの横に直接埋め込める。
2. [Plotly](https://grafana.com/grafana/plugins/corp-plots-plotly-panel/): 標準のグラフでは表現できない複雑な統計処理や散布図が必要な時、これがないと手詰まりになる。

—

4. 設定ファイルのベストプラクティス(IaC化)

ダッシュボードをUIでポチポチ作るのは「今日で卒業」だ。Grafanaは`Provisioning`機能を使って、YAMLで構成管理すべきである。

`provisioning/dashboards/main.yaml` の構成例

apiVersion: 1

providers:

  • name: ‘Production-Dashboards’

orgId: 1
folder: ‘SRE-Core’
type: file
disableDeletion: true # UIから消されないように保護
editable: true
options:
path: /var/lib/grafana/dashboards/production

チーム開発のルール:
1. ダッシュボードはJSONでエクスポートし、Git管理する。
2. `uid` は必ず固定する(これをしないとGitの差分が爆発する)。
3. ダッシュボード内のデータソース参照は `datasource: ${DS_PROMETHEUS}` のように変数化し、環境ごとに柔軟に切り替えられるようにしておく。

—

5. 最後に:エンジニアへのメッセージ

オブザーバビリティとは、単なる「監視」ではない。「システムが何をしているか、なぜそうなったかを誰もが理解できる状態にすること」だ。

Grafanaの権限管理を疎かにすることは、庭の鍵を開けっ放しにして「泥棒に入られないことを祈る」のと同じだ。今回伝えた「フォルダ権限の徹底」「変数によるデータ隔離」「IaCによる構成管理」は、明日からのあなたの運用を劇的に変えるはずだ。

「面倒くさい」を自動化し、「分からない」を可視化する。
そのための最強の武器を、今日から正しく使いこなしてほしい。

さあ、ダッシュボードをコードに変え、運用をアートへと昇華させよう。

タイトルとURLをコピーしました