構成とシークレットの管理
コンフィギュレーションとシークレットの管理
1)なぜそれを必要とします
構成と秘密は、生産プラットフォームの「血」です。設定のエラーがp95に落ちます。漏洩した秘密はP1インシデントです。目標はconfig/secretを作ることです:- 予測可能(スキーム、検証、バージョン)。
- 安全(暗号化、最小権限、回転)。
- 管理(GitOps、監査、ロールバック)。
- それが正当化される動的な場所(特徴フラグ、限界のパラメータ化)。
2)アーティファクトの分類
パブリックコンフィギュレーション:フィーチャー、しきい値、タイムアウト、フィーチャーフラグ(シークレットなし)。
機密コンフィギュレーション:クリティカルパスの動作を変更するパラメータ(支払制限など)。
秘密:パスワード/キー/トークン/証明書/暗号化資料。
信頼アーティファクト:ルート/中間証明書、PKIポリシー、KMSキー。
独立した保管と権利の原則:公共≠機密≠秘密。
3)構成階層
レイヤーの「ピラミッド」を構築する:1.グローバルデフォルト(組織全体)
2.環境('prod/stage/dev')。
3.地域('eu-central-1'、 'us-east-1')。
4.テナント/ブランド(マルチテナント)
5.サービス(特定のマイクロサービス)。
6.Override (runtime)-一時的なスイッチ。
合併規則:「以下の勝利」、競合-MR/承認を通じてのみ。
例(YAML)
yaml defaults:
http:
timeout_ms: 800 retry: 2 prod:
http:
timeout_ms: 1200 service: payments-api overrides:
eu-central-1:
http:
timeout_ms: 1500
4)スキームと検証
各設定はスキーム(CIのJSON スキーマ/OPA/バリデータ)を持つコントラクトです。
タイプ、範囲、必須フィールド、デフォルト値。
「ガードルール」('retry> 5'、 'p95_target <50ms'には設定できません)。
自動チェックインCIと適用されたとき(入場webhook/KRM)。
JSONスキーマフラグメント
json
{
"type":"object",
"properties":{
"http":{"type":"object","properties":{"timeout_ms":{"type":"integer","minimum":100,"maximum":10000},"retry":{"type":"integer","minimum":0,"maximum":5}},"required":["timeout_ms"]},
"feature_flags":{"type":"object","additionalProperties":{"type":"boolean"}}
},
"required":["http"]
}
5)設定デリバリーモデル
静的(画像焼き):信頼性がありますが、再起動が必要です。
Push/Watch :/sidecarエージェントはアップデート(ストリーム/ポーリング)を受信し、アプリケーションにシグナルを送信します。
起動時にスナップショットを取得します(ホットパスを簡素化)。
地理分散負荷のエッジキャッシュ/プロキシ。
主なもの:スナップショットの原子性とバージョン管理、互換性制御と高速ロールバック。
6)ツールと役割
Config stores: Git (source of truth)+GitOps (Argo/Flux)、 Parameter Store/Config Service。
シークレットリポジトリ:Vault、 AWS Secrets Manager/SSM、 GCP Secrets、 Azure KV。
暗号化:KMS/HSM、 SOPS (age/GPG/KMS)、シールされた秘密、トランジット暗号化(Vault)。
Delivery: CSI Secrets Store、 Vault Agent Injector/Sidecar、 init-containers。
フラグ/ダイナミクス:フィーチャー・フラグ・プラットフォーム(緊急キルスイッチを含む)。
7)暗号化: モデルとプラクティス
残りで:プロジェクト/環境のKMSキー、エンベロープ暗号化。
トランジット中:相互認証を持つTLS/mTLS。
使用時:プロセスメモリ/サイドカーで(ディスクに書き込むことなく)できるだけ遅く復号します。
キー階層:ルート(HSM)→KMS CMK→データキー(DEK)。
ローテーション:カレンダー(90/180日)+イベント別(従業員の妥協/出発)。
8)秘密管理: パターン
8.1 GitOps+SOPS(静的スナップショット)
Gitは暗号文のみを格納します。
CI/CDまたはクラスタ(KMS/age)での復号化。
コントローラ経由のアプリケーション(Flux/Argo)→Kubernetes Secret。
yaml apiVersion: v1 kind: Secret metadata: { name: psp-keys, namespace: payments }
type: Opaque data:
apiKey: ENC[AES256_GCM,data:...,sops]
8.2ボールトエージェントインジェクタ
サービスアカウント(JWT/SA)はVaultで認証されます。
Sidecarはtmpfsにクレジットを入れ、TTLに更新します。
ダイナミッククレジット(DB、クラウド-分離および短期)のサポート。
yaml annotations:
vault. hashicorp. com/agent-inject: "true"
vault. hashicorp. com/role: "payments-api"
vault. hashicorp. com/agent-inject-secret-db: "database/creds/payments"
8.3 CSIシークレットストア
シークレットをボリュームとしてマウントし、回転は透明です。
PKIの場合-証明書/キーの自動更新。
9) Kubernetes: 実用性
ConfigMap-公開/無感覚データのみ。
秘密-機密性(base64-暗号化なし;enable encryption at Rest for etcd)。
チェックサム注釈:configを変更するときにDeploymentを再起動します。
入場管理:「ホワイトリスト」からではない秘密をマウントすることの禁止、マニフェストでの「明白な」パスワードの禁止。
NetworkPolicy:秘密プロバイダ(Vault/CSI)へのアクセスを制限します。
チェックサム例(ヘルム)
yaml annotations:
checksum/config: {{ include (print $.Template. BasePath "/configmap. yaml"). sha256sum }}
10)アクセスポリシー(RBAC/ABAC)
少なくとも特権:サービスはその秘密を見るだけです。namespace/label/prefixでアクセスします。
分割作業:コンテンツを読む≠に秘密を作成する。あらゆる読書を監査して下さい。
一時的なクレジット:TTLと自動回転で動的ログイン(DB、クラウド)。
セグメンテーション:prod/stage in different projects/accounts/KMS keys。
11)監査、記録、観察可能性
読み取り/発行秘密のログ:who/when/what/where;リリースやインシデントとの相関。
メトリクス:呼び出しの頻度、期限切れの秘密、期限切れの証明書、ダイナミッククレジットの共有。
セキュリティイベント-クォータを超え、IP/時間異常、複数の認証に失敗しました。
12)秘密と証明書の回転
用語を標準化:APIキー-90日、DBパスワード-30日、TLS serts-60-90日。
回転輪郭:generation→test→double publication (grace)→switching→revocation of old→verification。
信頼性:configs/secretsのダブルエントリ、クライアント互換性(new+oldを受け入れます)。
PKI:独自のCAまたは外部との統合。CSI/Vaultを通じてmTLSコンテンツを自動的に更新します。
13)動的構成および特徴の旗
config service/flagプラットフォームから「hot」パラメータ(制限、タイムアウト)を取得します。
ローカルキャッシュと粘着性(ハッシュによるバリアントの計算)、短いTTL。
SLOは、機密パラメータを変更するためにガードします(自動ロールバックとキルスイッチ)。
14) CI/CDおよびGitOpsとの統合
プリコミット/CI:サーキットリンタ、SOPSチェック、「裸の」秘密の禁止(スキャナ:gitleaks/trufflehog)。
ポリシーゲート:OPA/Conftest-スキーマなし/オーナーアノテーションなし/環境ラベルなしの構成を禁止します。
プログレッシブデリバリ:アーティファクト(semver)としてのconfigsのプロモーション、パラメータを変更するためのカナリア。
リリースアノテーション:who/what config/secret changed;p95/5xxとの速い相関。
15)例
15.1 OPAポリシー:ConfigでのOpen SGの禁止
rego package policy. config
deny[msg] {
input. kind == "SecurityGroupRule"
input. cidr == "0. 0. 0. 0/0"
input. port = = 5432 msg: = "Postgres open internet banned"
}
15.2設定スナップショットの例(バージョン管理済み)
yaml version: 1. 12. 0 owner: payments-team appliesTo: [ "payments-api@prod" ]
http:
timeout_ms: 1200 retry: 2 withdraw:
limits:
per_txn_eur: 5000 per_day_eur: 20000 flags:
new_withdrawal_flow: false
15.3 Vault-動的データベースクレジット
hcl path "database/creds/payments" {
capabilities = ["read"]
}
role issues user/password with TTL = 1h and auto-rollover
16)アンチパターン
clear text/in Helm/Ansible変数で暗号化なしのGitの秘密。
すべてのサービス/環境のための単一の「メガシークレット」。
TTL/回転なしの長寿命トークン。「不滅の」証明書。
スキーム/検証なし、および監査変更なしの動的構成。
etcd/KMSおよびmTLS以外のネットワークのRestでの暗号化はありません。
製品内の構成の手動編集(GitOpsをバイパス)。
開発者への「念のために」営業秘密へのアクセス。
17)実装チェックリスト(0-60日)
0-15日
コンフィギュレーション用のダイアグラム/バリデータを含める。repo 「configs」とGitOpsストリームを起動します。
KMSと暗号化を上げる:SOPS/Sealed Secrets/Encryption at Rest in etcd。
CI(スキャナー)で平文の秘密を禁止し、所有者/承認を入力します。
16-30日
ボルトを分割する:パブリックコンフィギュレーションと機密コンフィギュレーションとシークレット。
Vault/Secrets Managerを実装し、配信パス(Agent/CSI/SOPS)を選択します。
TLS/DB/PSPクレジットの回転を設定します。ダッシュボード「寿命/期限切れ」。
31-60日
SLOゲートと自動ロールバックを使用したダイナミックコンフィギュレーションとフラグ。
OPA/Conftestポリシー;zero-trust(名前空間/label-scopedアクセス)
ゲームの日:秘密の漏出および力の回転のシミュレーション。
18)成熟度の指標
暗号化下での秘密の%とGitからの直接アクセスなし=100%。
構成/検証カバレッジ≥ 95%です。
重要な秘密を回転させる平均時間(ターゲット:時間、日数ではありません)。
ダイナミッククレジット(DB/クラウド)のシェア≥ 80%です。
「明白な秘密「/期限切れの証明書による0件のインシデント。
MTTR on config error with rollback <5分。
19)コマンドロールとプロセス
構成所有者:ドメイン/スキーマ/ポリシー所有者。
セキュリティ:ポリシー、キー階層、アクセス監査。
プラットフォーム/SRE: GitOps、供給/注入、テレメトリー。
アプリチーム:config/secretの消費、互換性テスト。
20)結論
コンフィギュレーションとシークレットの信頼性の高い輪郭は+GitOps+encryption+rotation+policyスキームです。公開と秘密を分離し、すべてを暗号化し、構成を原子的およびバージョン的に適用し、クレジットの権利と寿命を最小限に抑え、回転と監査を自動化します。その後、変更は迅速かつ安全になり、漏れや転倒のリスクは最小限に抑えられます。