Overview
Atlas API サービス アカウントは、Atlas Kubernetes Operator を Atlas Administration API で認証するための、プログラムによる API キーに対するトークンベースのセキュアな代替手段を提供します。サービス アカウントは、clientId と clientSecret のペアから引き出された有効期間の短いアクセス トークンを使用するため、有効期間の長い認証情報の漏洩リスクを低減します。
MongoDB は、新しい配置にはプログラムによる API キーよりもサービスアカウントを推奨します。サービスアカウントには、次のような利点があります。
演算子によってマネージドされる自動トークン更新を伴うトークンベース認証。
組織レベルとプロジェクトレベルの両方のスコープのサポート。
Atlas Kubernetes Operator ワークロードの監査可能な個別の身元。
重要
サービス アカウント シークレットの有効期限
API キーとは異なり、サービス アカウントのシークレットは有効期限があります。TTL は最大 1 年まで設定できます。サービス アカウントのシークレットは、アクセスを中断させないように有効期限が切れる前にローテーションする必要があります。Atlas は、有効期限が近づくにつれて、自動的に「サービス アカウントのシークレットの有効期限が近づいています」というアラートを発生させます。ローテーションの予定を適切に計画してください。
これは組織レベルとプロジェクトレベルの両方のサービスアカウントに適用されます。
前提条件
開始する前に、次のものをお持ちであることを確認してください。
組織レベルのサービスアカウントの場合は Organization Owner ロール、プロジェクトレベルのサービスアカウントの場合は Project Owner ロールを持つ Atlas アカウント。
Atlas Kubernetes Operator がインストールされた実行中の Kubernetes クラスター。
kubectlAtlas Kubernetes Operator が実行されている Kubernetes クラスターへのアクセス。
手順
Atlas でサービス アカウントを作成する
Atlas UI または Atlas Administration API を使用して Atlas でサービス アカウントを作成します。組織レベルのサービス アカウントを作成する方法については、「組織でサービス アカウントを作成する」を参照してください。プロジェクトレベルのサービス アカウントを作成する方法については、「プロジェクト内でサービス アカウントを作成する」を参照してください。
clientIdとclientSecretをコピーします。clientSecretは作成後に再度検索できないため、安全に保存してください。
Kubernetes 接続シークレットを作成する
orgId、clientId、clientSecretを含む Kubernetes secretを作成します。
globalAtlas Kubernetes Operator シークレット については、次のコマンドを実行します。注意
globalAtlas Kubernetes Operator シークレットの名前は、事前定義された形式に準拠している必要があります。Atlas Kubernetes Operator 配置のデフォルト名はmongodb-atlas-operatorです。したがって、シークレット の名前はmongodb-atlas-operator-service-accountにする必要があります。kubectl create secret generic mongodb-atlas-operator-service-account \ --from-literal="orgId=<the_atlas_organization_id>" \ --from-literal="clientId=<the_service_account_client_id>" \ --from-literal="clientSecret=<the_service_account_client_secret>" \ -n <operator_namespace> kubectl label secret mongodb-atlas-operator-service-account \ atlas.mongodb.com/type=credentials \ -n mongodb-atlas-system projectAtlas Kubernetes Operator シークレット については、次のコマンドを実行します。kubectl create secret generic my-project-connection \ --from-literal="orgId=<the_atlas_organization_id>" \ --from-literal="clientId=<the_service_account_client_id>" \ --from-literal="clientSecret=<the_service_account_client_secret>" \ -n <atlas_project_namespace> kubectl label secret my-project-connection \ atlas.mongodb.com/type=credentials \ -n <atlas_project_namespace>
シークレットの参照元 AtlasProject
AtlasProjectspec.connectionSecretRef.name を使用して、 カスタム リソースから シークレット を参照します。
global シークレットを作成した場合、すべてのプロジェクトでデフォルトで使用されるため、追加の構成は必要ありません。
project シークレットを作成した場合は、connectionSecretRef を AtlasProject カスタム リソースに追加します。
apiVersion: atlas.mongodb.com/v1 kind: AtlasProject metadata: name: my-project spec: name: "My Project" connectionSecretRef: name: my-project-connection
演算子がサービス アカウントを使用していることを確認する
シークレットを構成した後、Atlas Kubernetes Operator が正常に認証されることを確認します。
kubectl get atlasproject my-project -o jsonpath='{.status.conditions}'
Ready 条件が True であることを確認します。Atlas Kubernetes Operator がサービス アカウントの認証情報で認証できない場合、条件には問題を説明するエラーが表示されます。
YAML 例
次の例は、サービスアカウントに構成された接続シークレットを示しています。
apiVersion: v1 kind: Secret metadata: name: my-project-connection namespace: atlas-operator labels: atlas.mongodb.com/type: credentials type: Opaque stringData: orgId: "5d39f0719ccf646554345678" clientId: "mdb_sa_id_67890abcdef1234567890abc" clientSecret: "mdb_sa_sk_abcdef1234567890abcdef12"
Considerations
Token マネジメント
Atlas Kubernetes Operatorはアクセス トークンを自動的にマネージします。Atlas Kubernetes Operatorがサービスアカウント接続シークレットを検出すると、Atlas Administration APIからアクセストークンを取得し、別のkubernetes secretに保存します。アクセス トークン シークレットを手動で編集または削除しないでください。Atlas Kubernetes Operatorは必要に応じてトークンを更新します。
認証情報のローテーション
Atlas でサービスアカウントのシークレットをローテートする場合:
Kubernetes 接続シークレットを新しい
clientSecretで更新します。Atlas Kubernetes Operator は変更を検出し、次の調整サイクルで新しいアクセス トークンを取得します。再起動は必要ありません。
重要
サービス アカウントのシークレットの最大 TTL は 1 年です。Atlas で「サービス アカウントのシークレットの有効期限が切れようとしています」アラートをモニターし、認証の失敗を避けるため、有効期限が切れる前にシークレットをローテートしてください。これは、組織レベルとプロジェクトレベルの両方のサービス アカウントに適用されます。
IP アクセス リスト
サービス アカウントの API アクセス リストには、 プログラムによる API キー と同様に、Atlas Kubernetes Operator ポッドで使用されるイーグレス IP アドレスまたは CIDR ブロックを含める必要があります。演算子ポッドのイーグレス IP がサービス アカウントのアクセス リストにない場合、API リクエストは失敗します。