Grafana の設定でシークレットを管理する
環境変数、ファイル、暗号化されたマニフェストを使って、パスワードとトークンを Git の外に置きます。
コードとしての設定は、リポジトリを共有できる場合にのみ機能し、パスワードを含むリポジトリは共有できません。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 のシークレットをスキャンしていること。
人気のガイド
-
Grafana をコードとして運用する:全体像 ファイルに置けるもの、API が必要なもの、そしてそれらがどう組み合わさるか。 -
grafana.ini と環境変数で Grafana サーバーを設定する 設定ファイルの場所、上書きの順序、設定を Git に保つ方法を理解します。 -
JSON ファイルからダッシュボードをプロビジョニングする ディスクからダッシュボードを読み込み、ディレクトリからフォルダーを対応付け、変更を失わずに作成します。 -
アラートルール、コンタクトポイント、通知ポリシーをプロビジョニングする アラートのパイプライン全体を YAML で定義し、コードのようにレビューしてバージョン管理します。 -
Helm とプロビジョニングの values で Grafana を Kubernetes にデプロイする データソース、ダッシュボード、設定のすべてが values ファイルから来る、Helm チャートで Grafana を実行します。 -
コマンドラインからプロビジョニングを再読み込み、確認、トラブルシューティングする Grafana が何を読み込んだかを調べ、再起動せずに再読み込みし、よくあるプロビジョニングのエラーを修正します。