Atlas Kubernetes Operator が管理するコンポーネントの機密情報を保存する場所は選択できますが、Atlas Kubernetes Operator は、期待されるKubernetes シークレット を見つける必要があります。Atlas Kubernetes Operator のシークレットは、次の方法を含むさまざまな方法で保存できます。
機密情報を Kubernetes シークレット に直接格納します 。Atlas Kubernetes Operator ドキュメントのすべてのチュートリアルでは、デフォルトで Kubernetes シークレット を使用します。Kubernetes シークレットを使用するには、チュートリアルの手順に従います。
GitOps フローに従って機密情報をGithubリポジトリに配置します。機密データを Git に安全に保存するには、対象のターゲット クラスターのシークレットを暗号化する シークレット などのツールを使用できます。
HashiCorp Vault や ハイパースケールのネイティブ シークレット管理ソリューション などの外部のシークレットストレージツールに機密情報を格納します。中間シークレットプロビジョニングツールは、外部シークレットストレージツールから機密情報を取得し、機密情報からKubernetes シークレットを作成します。シークレットプロビジョニングツールの詳細については、考慮事項を参照してください。
このチュートリアルでは、Atlas Kubernetes Operator で使用するための外部シークレット ストレージ ツールを設定します。 このチュートリアルでは、Atlas Kubernetes Operator が Kubernetes クラスターにシークレットをプロビジョニングするためのシークレットを作成して保存する必要がない「シークレットレス」設定に焦点を当てます。
Considerations
次のチュートリアルでは、次のツールとオプションをインストールまたは構成します。
シークレットプロビジョニングツール。シークレットプロビジョニングツールは、1 つ以上の認証メカニズムを使用して、シークレット管理サービスから認証情報を検索し、Atlas Kubernetes Operator が使用できるシークレットを作成します。このチュートリアルでは、オープンソースのシークレットプロビジョニングツールである 外部シークレット 演算子 をインストールします。
シークレット にアクセスするための認証。OIDC JSONウェブ トークン認証を使用して、どのサービス アカウントと名前空間がHashiCorp Vaultのシークレットにアクセスできるかを認証できます。詳しくは、 JSON web token/OIDC認証 を参照してください。
あるいは、クラウドプロバイダーのKMSがネイティブIAMシステムを使用してこの認証を提供することもできますが、これについてはチュートリアルでは説明されていません。 認証用にクラウドプロバイダーのKMSを構成する方法については、 外部シークレット演算子 のドキュメントの次のリソースを参照してください。
前提条件
このチュートリアルを完了する前に、次のツールと構成が必要です。
Kubernetes、Atlas Kubernetes Operator、および Atlas のサービス アカウントの実行と、それらを構成するのに十分な特権。
x86-64、AMD64、または ARM64 アーキテクチャーを持つプロセッサを実行しているノードを含む実行中の Kubernetes クラスターが必要です。 このチュートリアルでは、Kubernetes クラスターは
https://kube01.internal.io
でデフォルトのポート(443)でリッスンしています。のAtlas Kubernetes Operator プロジェクトにアクセスできます。Github
Atlas Kubernetes Operatorを使用してAtlas CLI をインストールするには、次のコマンドを実行します。
atlas kubernetes operator install [options] コマンド構文とパラメータの詳細については、Atlas CLI Atlas Kubernetes Operatorのインストール の ドキュメントを参照してください。
Atlas Kubernetes Operator を配置するには、次のコマンドを実行します。
<version>
を最新のリリース番号に置き換えます。kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-atlas-kubernetes/<version>/deploy/all-in-one.yaml Atlas アカウントの登録については、「 Atlas アカウントの作成 」を参照してください。
API キー。 API キーを作成し、 API Access Listを構成する必要があります。
Atlas Kubernetes Operator から Atlas へのアクセスを構成するには、次の公開 API キー、プライベート API キー、および組織 ID 情報が必要です。
Atlas Kubernetes Operator で新しい Atlasプロジェクトを作成する場合は、 組織へのプログラムによるアクセスの付与 。組織で Atlas Administration APIのIP アクセス リストが必要な場合は、 APIアクセス リストも設定する必要があります。
重要
API キーには、 Organization Project Creator組織ロール以上を割り当てる必要があります。
既存の Atlasプロジェクトを操作する場合は、 プロジェクトからプロジェクト アクセスを追加 します。組織で Atlas Administration APIのIP アクセス リストが必要な場合は、 APIアクセス リストも設定する必要があります。
重要
Project Ownerプロジェクト ロールに API キーを割り当てる必要があります。
シークレットストレージヴォールト 。このチュートリアルでは、 で実行中シークレットストレージ用のサードパーティ サービスである HashiCorp Vault
https://vault.internal.io
を使用します。では、必要に応じて、 、 、Google の Cloud など、他のシークレット ストレージAtlas Kubernetes OperatorKMS Amazon Web Servicesヴォールトを使用できます。Azure
内部アクセスのみ。 パブリック インターネット経由で機密情報の露出を防ぐため、シークレット ストレージ ソリューションの次のコンポーネントは内部アクセスのみを許可します。
HashiCorp Vault または KMS サービス。
Kubernetes Cluster APIs サービス。
内部ネットワークです。 このチュートリアルでは、
internal.io
を使用します。
以前のコンポーネントでは内部アクセスのみが許可されていますが、相互へのアクセスが許可されており、チームまたは組織内の誰にもアクセス可能です。 これはセキュリティ上のベストプラクティスです。
公開認証局(CA) 。 パブリック CA を使用すると、カスタム CA ルート証明書の管理と配布を回避できます。
次のいずれかのツールを使用して、CA 証明書の管理と更新を自動化できます。
このチュートリアルでは、次の操作を行います。
すべての
internal.io
HTTPs サービスは内部アドレスですが、HTTPS サイトには公開 CA によって署名された自動更新証明書が保持されます。サーバー側の HTTPS 検証のみを実行するため、この統合には相互 TLS(mTLS)は必要ありません。
クライアントは、追加の証明書プロビジョニングなしでこれらのサービス証明書を信頼できます。
手順
Atlas Kubernetes Operator のシークレット ストレージを構成するには、次の手順に従います。
ターゲット クラスターにシークレット プロビジョニング ツールをインストールします。
外部シークレット演算子 をシークレットプロビジョニングツールとして使用するには、次の手順に従います。
次のコマンドを実行して、 Helm Charts で 外部シークレット演算子 をインストールし、サービスを開始します。
helm repo add external-secrets https://charts.external-secrets.io helm upgrade -i --atomic \ -n external-secrets --create-namespace --set extraArgs.loglevel=debug \ external-secrets external-secrets/external-secrets` 外部シークレットが正常に実行されることを確認します。
kubectl get pod -n external-secrets -l app.kubernetes.io/name=external-secrets NAME READY STATUS RESTARTS AGE external-secrets-5779d5d6f6-2lhgd 1/1 Running 0 70s
シークレットにアクセスするための認証を設定します。
OIDC JSON web tokenとKubernetes認証を設定するには次の手順に従います。
次のコマンドを実行して、マウント パスのOIDC JSON web token認証を有効にします。 複数のKubernetesクラスターを設定する場合は、各クラスターのマウント パスに対してOIDC JSON web token認証を有効にする必要があります。
vault auth enable -path=jwt-kube01 jwt 次のコマンドを実行して、
kube01.internal.io
クラスター上のOIDC検出 URL への非認証アクセスを許可します。$ kubectl create clusterrolebinding oidc-reviewer \ --clusterrole=system:service-account-issuer-discovery \ --group=system:unauthenticated 次のコマンドを実行して、HashiCorp Vault にクラスターを信頼するように指示します。
https://kube01.internal.io/
のクラスターの発行者は、.well-known/openid-configuration
の OIDC 検出ドキュメント内のURLと一致する必要があります。curl https://kube01.internal.io/.well-known/openid-configuration | jq .issuer https://kube01.internal.io/ vault write auth/jwt-kube01/config jwks_url="https://kube01.internal.io/openid/v1/jwks" クラスターに公開するシークレットへのアクセスを許可するポリシーを作成します。
次の例では、後の手順で指定する
external-secrets
ポリシーを作成します。echo external-secrets-policy.hcl path "secret/data/kube01/external-secrets/*" { capabilities = ["read"] } コマンドを実行してHashiCorp Vaultロールを作成し、Kubernetesサービス アカウントをそのロールにバインドします。これにより、HashiCorp Vault内でのサービス アカウントのアクセスが制限されます。
次のコマンドを実行すると、
vault
オーディエンスのJSON web token(OIDC)タイプのjwt-kube01-system
ロールが作成されます。このコマンドでは、バインドされたサブジェクトとして、sub
ユーザー クレームとmongodb-atlas-system
名前空間内のdefault
Kubernetesサービス アカウントを指定します。このコマンドは、HashiCorp Vault 内のexternal-secrets
ポリシーセットの権限のロールを関連付けます。vault write auth/jwt-kube01/role/jwt-kube01-system role_type="jwt" bound_audiences=vault \ user_claim="sub" bound_subject="system:serviceaccount:mongodb-atlas-system:default" \ policies="external-secrets" コマンドを実行して、外部シークレット演算子が
default
名前空間にアクセスするための別のロールを作成します。次のコマンドを実行すると、
vault
オーディエンスのJSON web token(OIDC)タイプのjwt-kube01-default
ロールが作成されます。このコマンドは、sub
ユーザー クレームと、default
名前空間内のdefault
Kubernetesサービス アカウントを バインドされたサブジェクト として指定します。このコマンドは、HashiCorp Vault 内のexternal-secrets
ポリシーセットの権限のロールを関連付けます。vault write auth/jwt-kube01/role/jwt-kube01-default role_type="jwt" bound_audiences=vault \ user_claim="sub" bound_subject="system:serviceaccount:default:default" \ policies="external-secrets" システム サービス アカウントに対してOIDC認証が正常に実行されることを確認します。
export TEST_JWT_TOKEN=$(kubectl -n mongodb-atlas-system create token default --audience "vault") vault write auth/jwt-kube01/login role=jwt-kube01-system jwt=$(TEST_JWT_TOKEN) Atlas Kubernetes Operatorは、システム サービス アカウントのOIDC JSON web token認証情報を返します。
デフォルトのサービス アカウントに対してOIDC認証が正常に実行されることを確認します。
export TEST_JWT_TOKEN=$(kubectl -n default create token default --audience "vault") vault write auth/jwt-kube01/login role=jwt-kube01-default jwt=$(TEST_JWT_TOKEN) Atlas Kubernetes Operatorは、デフォルトのサービス アカウントのOIDC JSON web token認証情報を返します。
自動シークレットプロビジョニングを設定します。
外部シークレット演算子を使用してシークレットをプロビジョニングするには、
mongodb-atlas-system
名前空間にdefault
サービス アカウントのSecretStore
カスタム リソースを配置します。$ cat external-secrets/vault-system.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-store namespace: mongodb-atlas-system spec: provider: vault: server: "https://vault.internal.io" path: "secret" version: "v2" auth: jwt: path: "jwt-kube01" role: "jwt-kube01-system" kubernetesServiceAccountToken: expirationSeconds: 600 serviceAccountRef: name: "default" audiences: - vault $ kubectl apply -f external-secrets/vault-system.yaml default
名前空間にdefault
サービス アカウントのSecretStore
カスタム リソースを配置します。$ cat external-secrets/vault-default.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-store namespace: default spec: provider: vault: server: "https://vault.internal.io" path: "secret" version: "v2" auth: jwt: path: "jwt-kube01" role: "jwt-role" kubernetesServiceAccountToken: expirationSeconds: 600 serviceAccountRef: name: "default" audiences: - vault $ kubectl apply -f external-secrets/vault-default.yaml API キーを含むシークレットを参照する
ExternalSecret
カスタム リソースを配置します。 外部シークレット演算子が作成するシークレットを見つけるには、Atlas Kubernetes Operator の値credentials
を使用してspec.target.template.metadata.labels
をatlas.mongodb.com/type
に設定する必要があります。次のコマンドを実行する前に、HashiCorp Vault に次のプロパティを持つ Kv V2 パス
secret/data/kube01/external-secrets/atlas-account
にシークレットが入力されていることを確認してください。orgId
publicApiKey
privateApiKey
$ cat external-secrets/atlas.yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: atlas namespace: mongodb-atlas-system spec: refreshInterval: "15s" secretStoreRef: name: vault-store kind: SecretStore target: name: mongodb-atlas-operator-api-key template: metadata: labels: atlas.mongodb.com/type: credentials data: - secretKey: orgId remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: orgId - secretKey: publicApiKey remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: publicApiKey - secretKey: privateApiKey remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: privateApiKey $ kubectl apply -f external-secrets/atlas.yaml このコマンドは、 名前空間にKubernetesシークレット
mongodb-atlas-operator-api-key
mongodb-atlas-system
を作成します。データベースユーザーの認証情報を含むシークレットを参照する
ExternalSecret
カスタム リソースを配置します。 外部シークレット演算子が作成するシークレットを見つけるには、Atlas Kubernetes Operator の値credentials
を使用してspec.target.template.metadata.labels
をatlas.mongodb.com/type
に設定する必要があります。次のコマンドを実行する前に、HashiCorp Vault に
password
プロパティを持つ Kv V2 パスsecret/data/kube01/external-secrets/db-user
にシークレットが入力されていることを確認してください。$ cat external-secrets/dbuser.yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: dbuser namespace: default spec: refreshInterval: "15s" secretStoreRef: name: vault-store kind: SecretStore target: name: dbuser-password template: metadata: labels: atlas.mongodb.com/type: credentials data: - secretKey: password remoteRef: key: secret/data/kube01/external-secrets/db-user property: password $ kubectl apply -f external-secrets/atlas.yaml 次のコマンドを実行すると、シークレットが期待どおりに返されることを確認します。
$ kubectl get -n mongodb-atlas-system secrets/mongodb-atlas-operator-api-key $ kubectl get -n default secrets/dbuser-password
Atlas Kubernetes Operator カスタム リソースを配置します。
Atlas Kubernetes Operator カスタム リソースを配置できるようになりました。Atlas Kubernetes Operator は、 HashiCorp Vault を参照Kubernetesシークレットを使用して認証します。配置に必要に応じて timeout
の値を調整します。
kubectl apply -f ako/project.yaml kubectl apply -f ako/deployment.yaml kubectl apply -f ako/user.yaml kubectl wait --for=condition=ready atlasdeployment/serverless-deployment --timeout=10m kubectl wait --for=condition=ready atlasdatabaseuser/user --timeout=10m
これらのカスタム リソースの詳細については、「カスタム リソース 」を参照してください。
Atlas Kubernetes Operator 配置をテストします。
Atlas Kubernetes Operator の配置をテストするには、次のコマンドを実行します。
export ATLAS_DEPLOYMENT_CONN_STR=$(kubectl get secrets/test-atlas-operator-project-test-serverless-deployment-dbuser -o jsonpath='{.data.connectionStringStandardSrv}' |base64 -d) mongosh $(ATLAS_DEPLOYMENT_CONN_STR) --apiVersion 1 --eval "show dbs"
Atlas Kubernetes Operator は、データベース配置のリストを返します。