セキュリティを強化するため、Datadog Operator は Secrets を使用して Datadog の認証情報 (API キーとアプリケーション キー) を取得できます。
Secret の設定
Secret を設定するには、次のいずれかの方法を選択します:
DatadogAgent リソースに平文の認証情報を設定する
この方法はテスト用途にのみ推奨されます。
DatadogAgent の spec に API キーとアプリケーション キーを追加します:
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
# ...
ここで指定した認証情報は、Operator によって作成される Secret に保存されます。DatadogAgent CRD に対する RBAC を適切に設定することで、これらの認証情報を閲覧できるユーザーを制限できます。
Secret 参照を使用する
Secret を作成します:
apiVersion: v1
kind: Secret
metadata:
name: datadog-api-secret
data:
api_key: <DATADOG_API_KEY>
---
apiVersion: v1
kind: Secret
metadata:
name: datadog-app-secret
data:
app_key: <DATADOG_APP_KEY>
DatadogAgent リソースで、これらの Secret の名前を指定します:
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiSecret:
secretName: datadog-api-secret
keyName: api-key
appSecret:
secretName: datadog-app-secret
keyName: app-key
# ...
注: 同じ Secret を使用して両方の認証情報を保存することもできます:
---
apiVersion: v1
kind: Secret
metadata:
name: datadog-secret
data:
api_key: <DATADOG_API_KEY>
app_key: <DATADOG_APP_KEY>
次に、DatadogAgent リソースで:
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiSecret:
secretName: datadog-secret
keyName: api-key
appSecret:
secretName: datadog-secret
keyName: app-key
# ...
secret backend を使用する
Datadog Operator は secret backend と互換性があります。
secret backend を使用して Datadog Operator をデプロイする
secret backend のコマンドを含む Datadog Operator のコンテナ イメージを作成します。
独自に作成する場合は、次の Dockerfile の例では、latest イメージをベース イメージとして使用し、my-secret-backend.sh スクリプト ファイルをコピーします:
FROM gcr.io/datadoghq/operator:latest
COPY ./my-secret-backend.sh /my-secret-backend.sh
RUN chmod 755 /my-secret-backend.sh
次に、以下を実行します。
docker build -t datadog-operator-with-secret-backend:latest .
.Values.secretBackend.command パラメーターにコンテナ内の secret backend コマンドのパスを設定した状態で、Datadog Operator のデプロイメントをインストールまたは更新します。カスタム イメージを使用している場合は、そのイメージを更新します。
$ helm [install|upgrade] dd-operator --set "secretBackend.command=/my-secret-backend.sh" --set "image.repository=datadog-operator-with-secret-backend" ./chart/datadog-operator
Secret ヘルパーの使用
注: Datadog Operator v0.5.0+ が必要です。
Kubernetes は、Secrets を pod 内のファイルとして公開することをサポートしています。Datadog は、Datadog Operator イメージ内に、ファイルから Secrets を読み取るためのヘルパー スクリプトを提供しています。
Operator コンテナに Secret をマウントします。例えば、/etc/secret-volume にマウントできます。
.Values.secretBackend.command パラメーターを /readsecret.sh に、.Values.secretBackend.arguments パラメーターを /etc/secret-volume に設定して、Datadog Operator デプロイメントをインストールまたは更新します:
helm [install|upgrade] dd-operator --set "secretBackend.command=/readsecret.sh" --set "secretBackend.arguments=/etc/secret-volume" ./chart/datadog-operator
DatadogAgent で secret backend 機能を使用して Agent コンポーネントをデプロイする
注: Datadog Operator v1.11+ が必要です。
カスタム スクリプトを使用する場合
カスタム スクリプトを使用している場合は、Datadog Agent (または Cluster Agent) のイメージを作成し、ENC[<placeholder>] を用いて認証情報を指定し、spec.global.secretBackend.command に secret backend コマンドを指定します:
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiKey: ENC[<api-key-secret-id>]
appKey: ENC[<app-key-secret-id>]
secretBackend:
command: "/my-secret-backend.sh"
# ...
この構成で設定される環境変数 DD_SECRET_BACKEND_COMMAND は、デプロイされるすべてのコンポーネントに自動的に適用されます: node Agent、Cluster Agent、Cluster Checks Runners。すべてのコンポーネントで使用するイメージに、指定したコマンドが含まれていることを確認してください。
ヘルパー関数を使用する場合
利便性のため、Datadog Agent および Cluster Agent のイメージには、ファイルおよび Kubernetes Secrets の両方から読み取るために使用できる readsecret_multiple_providers.sh ヘルパー関数 が含まれています。Secret を作成したら、spec.global.secretBackend.command を "/readsecret_multiple_providers.sh" に設定します。
例えば、Agent と Cluster Agent で secret backend を使用するには、“test-secret” という名前の Secret を作成します:
kubectl create secret generic test-secret --from-literal=api_key='<api-key>' --from-literal=app_key='<app-key>'
その後、DatadogAgent の spec を設定します:
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
secretBackend:
command: "/readsecret_multiple_providers.sh"
credentials:
apiKey: ENC[k8s_secret@default/test-secret/api_key]
appKey: ENC[k8s_secret@default/test-secret/app_key]
補足
ServiceAccount の権限
"/readsecret_multiple_providers.sh" ヘルパーにより、Agent は自身の Namespace と他の Namespace の両方にわたる Kubernetes Secrets を直接読み取ることができます。関連する ServiceAccount に適切な Roles と RoleBindings を割り当て、必要な権限が付与されていることを確認してください。これらは手動で設定するか、次のオプションを使用できます:
global.secretBackend.enableGlobalPermissions: Agents が Kubernetes Secrets を すべて 読み取れるようにする ClusterRole を作成するかどうかを決定します。
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
secretBackend:
command: "/readsecret_multiple_providers.sh"
enableGlobalPermissions: true
# ...
global.secretBackend.roles: enableGlobalPermissions を置き換え、Agents がアクセスできる namespace/secret の一覧を詳細に指定します。
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
secretBackend:
command: "/readsecret_multiple_providers.sh"
roles:
- namespace: rabbitmq-system
secrets:
- "rabbitmqcluster-sample-default-user"
# ...
この例では、rabbitmq-system Namespace の Secret rabbitmqcluster-sample-default-user への読み取りアクセスを付与する Role が作成されます。
注: roles リスト内の各 Namespace は、Datadog Operator デプロイメントの環境変数 WATCH_NAMESPACE または DD_AGENT_WATCH_NAMESPACE にも設定する必要があります。
secret backend の構成オプション
Agent と Cluster Agent に対しては、secret backend コマンドに関するその他の構成オプションがあります:
global.secretBackend.args: Agent が secret backend コマンドを実行する際にコマンドへ渡される引数です。global.secretBackend.timeout: secret backend の実行タイムアウトを秒数で指定します。デフォルト値は 30 秒です。
Operator 1.11 より前のバージョンでは、spec.global.secretBackend は使用できません。代わりに これらの手順 に従ってください。