Grafana Grafana

Grafana の設定でシークレットを管理する

環境変数、ファイル、暗号化されたマニフェストを使って、パスワードとトークンを Git の外に置きます。

10 min learn.level.中級

コードとしての設定は、リポジトリを共有できる場合にのみ機能し、パスワードを含むリポジトリは共有できません。Grafana には、すべてを宣言的に定義しながら、シークレットをファイルの外に保つ方法がいくつか用意されています。このガイドでは、シークレットが現れる場所、注入する方法、そして Grafana 自身が保存するシークレットについてどうするかを説明します。

シークレットが現れる場所

  • サーバーの設定: admin のパスワード、データベースのパスワード、SMTP の認証情報、OAuth の client secret、secret_key。
  • データソース: secureJsonData のパスワード、トークン、TLS の鍵。
  • コンタクトポイント: settings の webhook URL、API キー、ルーティングキー。
  • 他のツール向けのプロビジョニング: Terraform、Operator、Git Sync はそれぞれ、API トークンまたは Git の認証情報が必要です。

方法 1:環境変数

最もシンプルな選択肢です。プロビジョニングの YAML は、値の中で $VAR と ${VAR} をサポートし、grafana.ini は ${VAR} と $__env{VAR} をサポートします。

# provisioning/datasources/postgres.yaml
datasources:
  - name: Postgres
    uid: postgres-main
    type: postgres
    url: $POSTGRES_HOST:5432
    secureJsonData:
      password: $POSTGRES_PASSWORD
# grafana.ini
[security]
admin_password = ${GF_ADMIN_PASSWORD}

覚えておくべきルール:

  • 補間は、キーではなく値のみで機能します。
  • リテラルのドル記号が必要なときは $$ を使います(たとえば {{ $$labels }} のようなテンプレートで)。
  • ダッシュボードの JSON の中では機能せず、アラートの一部のフィールドでは適用されません。ルールのアノテーション、クエリのモデル、relativeTimeRange、ミュートタイミングの名前と間隔、通知テンプレートです。

Docker Compose では、バージョン管理されていない .env ファイルや、CI のシークレットストアから変数を読み取ります。Kubernetes では、Secret をコンテナにマップします(下記参照)。

方法 2:ファイルとしてのシークレット

Grafana は、$__file{} でファイルの内容を設定に読み込み、周囲の空白を取り除きます。

[database]
password = $__file{/run/secrets/grafana_db_password}

[security]
secret_key = $__file{/run/secrets/grafana_secret_key}

これは Docker のシークレットや、ファイルとしてマウントされた Kubernetes の Secret に適しており、docker inspect やプロセスの環境による値の漏洩を避けられます。公式の Docker イメージは、GF_* の変数名の __FILE サフィックスも受け付けます。

services:
  grafana:
    image: grafana/grafana:13.1.0
    environment:
      GF_SECURITY_ADMIN_PASSWORD__FILE: /run/secrets/grafana_admin_password
    secrets:
      - grafana_admin_password

secrets:
  grafana_admin_password:
    file: ./secrets/grafana_admin_password.txt

方法 3:Kubernetes の Secret

認証情報を Secret に保存し、環境変数として公開します。

apiVersion: v1
kind: Secret
metadata:
  name: grafana-secrets
  namespace: monitoring
type: Opaque
stringData:
  admin-password: change-me
  slack-webhook-url: https://hooks.slack.com/services/XXX/YYY/ZZZ
  postgres-password: change-me-too
env:
  - name: SLACK_WEBHOOK_URL
    valueFrom:
      secretKeyRef:
        name: grafana-secrets
        key: slack-webhook-url

Grafana の Helm チャートは、admin ユーザーに既存の Secret を使い、他のものを環境変数としてマウントできます。これは Kubernetes のガイドで説明します。その Secret を、プレーンな YAML として commit しないでください。暗号化するか、シークレットマネージャーから生成します。

  • SOPS と Flux または Argo CD:grafana-secrets.yaml を暗号化したまま commit し、GitOps コントローラーにクラスター内で復号させます。この Flux のシリーズには、SOPS のガイドがあります。
  • External Secrets Operator または CSI ドライバー:Vault、AWS Secrets Manager、その他のストアからシークレットを同期し、参照だけを commit します。

secret_key と保存されたシークレット

Grafana は、secret_key の設定で、データベースに保存するシークレット(データソースのパスワードなど)を暗号化します。2 つの結果があります。

  • 明示的に設定し、再起動、レプリカ、再構築をまたいで同じ値に保ちます。デフォルト値は公開されているため、未設定のままにすると、その暗号化が弱くなります。
  • 軽々しく変更しない。 変更すると、既存の暗号化された値が復号できなくなります。データソースはファイルからプロビジョニングされるため、新しいキーで再プロビジョニングすれば復元されますが、UI でのみ入力されたシークレットは失われます。

admin パスワードの注意点

admin_password は、Grafana が最初にデータベースを作成するときにだけ効果があります。後で変更するには、コンテナ内の CLI や API でリセットするか、データベースを再作成します。

grafana cli admin reset-admin-password 'new-password'

さらに良いのは、人々を SSO に移行させ、ローカルの admin アカウントは緊急用のログインだけにして、そのパスワードをシークレットマネージャーに保管することです。

Grafana を取り巻くツールのトークン

  • Terraform と Operator は、サービスアカウントのトークンで認証します。最小限のロールでサービスアカウントを作成し、トークンを CI またはクラスターのシークレットストアに保存し、スケジュールに従ってローテーションします。
  • Git Sync には、Git プロバイダーの認証情報が必要です。personal access token、または GitHub App や OAuth app の接続です。トークンは Repository リソースの secure ブロックで渡し、spec ではなく、シークレットとして保存されるようにします。
  • 管理用のプロビジョニング API は、API トークンではなく、admin ユーザーでの Basic 認証のみを受け付けるため、それらのエンドポイントに到達できる人を制限してください。

チェックリスト

  • Git の履歴に、プレーンテキストのシークレットがないこと。紛れ込んだ場合は、commit を削除するだけでなく、ローテーションしてください。
  • secret_key が明示的に設定され、シークレットマネージャーに保管されていること。
  • 各環境が、独自のデータベースパスワード、admin パスワード、API トークンを持っていること。
  • .env とシークレットのフォルダーが .gitignore にあり、CI が commit のシークレットをスキャンしていること。

人気のガイド