Gitにシークレットを保存するのはもうやめよう:Kubernetesにおける1Password Connect活用ガイド

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Base64の先へ:シークレット管理戦略をアップグレードすべき理由

ほとんどのKubernetesの学習は、標準のSecretリソースから始まります。しかし、使いやすい一方で、ネイティブのシークレットは単にBase64エンコードされた文字列に過ぎず、暗号化されたデータではありません。追加の設定なしにこれらに頼ることは、家の鍵を透明な玄関マットの下に置くようなものです。私は、機密性の高いAPIキーがGitの履歴に漏洩したりCI/CDパイプラインにハードコードされたりする「シークレットの散乱(Secret Sprawl)」に苦しむチームを多く見てきました。

管理モデルを中央集約型に移行する場合、一般的に3つの選択肢があります。

  • KubernetesネイティブのSecret: シンプルですが、監査ログが不足しています。SealedSecretsのようなツールを使っても、Gitに保存すると開発者が現在のデプロイ状況を簡単に確認できないという、扱いにくいワークフローが生じます。
  • HashiCorp Vault: 高いセキュリティが求められる環境における強力なツールです。しかし、運用コストが高いのが難点です。アンシールキーの管理、ストレージバックエンドの運用、複雑なHCLポリシーの作成などのために専任のチームが必要になります。
  • 1Password Connect: ユーザーフレンドリーなパスワードマネージャーと自動化されたインフラの間の同期レイヤーとして機能します。DevOpsチームは使い慣れた1PasswordのUIを使用しながら、プログラムを介してそれらのシークレットをKubernetesにプッシュできます。

私は、小規模なスタートアップから中規模企業まで、さまざまな本番環境でこの構成をデプロイしてきました。これは、開発者の生産性と厳格なセキュリティ要件の間の「スイートスポット」を確実に見事に捉えています。

現実的なトレードオフ

あらゆるシナリオに完璧なツールはありません。1Password Connectは、Vaultクラスター全体を運用するオーバーヘッドを避けつつセキュリティを確保したいチームにとって、しばしば「ちょうど良い(Goldilocks)」解決策となります。

メリット

  • 人間に優しいUI: セキュリティ監査担当者は、クリーンなWebインターフェースでアクセス権を確認できます。kubectlを覚えたり、ターミナルで文字列をデコードしたりする必要はありません。
  • 即時の反映: 開発者が1Passwordアプリでデータベースのパスワードを更新すると、その変更は約10秒でKubernetesクラスターに反映されます。
  • 分離: 統合を特定の「Vault(保管庫)」に制限できます。これにより、本番クラスターが個人用や管理者用の資格情報を参照することはありません。

デメリット

  • 外部依存関係: 1PasswordのグローバルAPIがオフラインになった場合、新しいシークレットの同期はできません。ただし、既存のシークレットはクラスター内にキャッシュされているため、アプリケーションがクラッシュすることはありません。
  • リソースフットプリント: 2つの小さなコンテナを実行する必要があります。私の経験では、これらは合計で150MB未満のRAMしか消費せず、ほとんどのクラスターにとって無視できる程度です。

本番環境対応のアーキテクチャ

このシステムは、1Passwordが提供する2つの主要コンポーネントに依存しています。

  1. Connect Server: connect-apiconnect-syncコンテナを含むデプロイメントです。クラスターと1Passwordサーバーの間の安全なゲートウェイとして機能します。
  2. 1Password Operator: OnePasswordItemというカスタムリソース定義(CRD)を監視するKubernetesコントローラーです。1Passwordのデータに基づいて、ネイティブのKubernetes Secretを自動生成します。

これらは専用の1password-system名前空間にデプロイすることをお勧めします。厳格なRBACポリシーを使用して、許可されたサービスアカウントのみがConnect APIと通信できるようにします。

ステップ・バイ・ステップ:1Password Connectのデプロイ

1. 認証情報の生成

まず、1Passwordの開発者ダッシュボードにアクセスします。新しい「Connect」インテグレーションを作成し、共有したい特定のVaultを選択します。1password-credentials.jsonファイルとアクセス・トークンが発行されます。これらはルートパスワードのように扱ってください。これらが漏洩すると、シークレットストア全体が危険にさらされます。

2. Connect Serverのデプロイ

Helmを使用するのが最も早い方法です。まず、名前空間とインテグレーションファイルを保持するシークレットを作成します。

kubectl create namespace 1password-system

# 認証情報ファイルを安全にアップロード
kubectl create secret generic op-credentials \
  --from-file=1password-credentials.json=./1password-credentials.json \
  -n 1password-system

# 公式リポジトリを追加
helm repo add 1password https://1password.github.io/connect-helm-charts/
helm repo update

次に、Connectサーバーをインストールします。プレースホルダーを実際のアクセス・トークンに置き換えてください。

helm install connect 1password/connect \
  --namespace 1password-system \
  --set-file connect.credentials=1password-credentials.json \
  --set connect.token.value="ここにトークンを入力"

3. 1Password Operatorのインストール

Operatorは、1Passwordの項目をKubernetes Secretに変換するロジックを処理します。これを個別にインストールすることで、管理ロジックをクリーンに保つことができます。

helm install operator 1password/onepassword-operator \
  --namespace 1password-system \
  --set connect.url="http://connect.1password-system.svc.cluster.local:8080" \
  --set connect.token="ここにトークンを入力"

4. 最初のシークレットの同期

手動でYAMLのSecretを定義する代わりにOnePasswordItemを定義します。このマニフェストは、Operatorに対してVault内の正確な項目を指定します。

apiVersion: onepassword.com/v1
kind: OnePasswordItem
metadata:
  name: db-credentials
  namespace: default
spec:
  itemPath: "vaults/Production/items/Database"
  outputs:
    - name: password
      path: "fields/password"
    - name: username
      path: "fields/username"

このYAMLを適用します。数秒以内に、Operatorはdb-credentialsという名前の標準的なKubernetes Secretを作成します。アプリケーションは、1Passwordの存在を意識することなく、これを環境変数やボリュームとしてマウントできます。

現場で得た教訓

本番環境での運用を通じて、信頼性とセキュリティに関するいくつかの重要な教訓を学びました。

Vaultを細分化する

「一般(General)」VaultをKubernetesに接続してはいけません。K8S-StagingK8S-Prodのように、環境固有のVaultを作成してください。これにより、万が一クラスターが侵害された場合の「影響範囲(ブラストライジアス)」を制限できます。

同期の状態を監視する

トークンの期限が切れたり、ネットワークが瞬断したりすると、シークレットの更新は音もなく失敗します。op_connect_sync_errors_totalメトリクスに対してPrometheusアラートを設定することをお勧めします。この値が5分以上ゼロを超えている場合は、調査が必要です。

バージョン履歴を活用する

1Passwordはすべての変更の完全な履歴を保持しています。データベースのマイグレーションが失敗した場合は、1PasswordのUIで項目を以前のバージョンに戻すことができます。Operatorは15秒以内に以前の値をクラスターに同期し、長時間のダウンタイムを防げる可能性があります。

RBACを固める

OnePasswordItemリソースを作成できるユーザーを制限してください。悪意のあるユーザーが名前空間でこれらを作成できる場合、そのConnectインスタンスにリンクされているVaultから理論上あらゆるシークレットをプルできてしまいます。

最後に

シークレットの管理は手動の作業であるべきではありません。1Password Connectを使用することで、開発者に馴染みのあるツールを提供しつつ、高いセキュリティ基準を維持できます。これにより、Gitにシークレットを保存する必要が完全になくなり、スタック内のすべての資格情報に対して明確で検索可能な監査証跡が提供されます。

Share: