Closed5

External Secrets OperatorをEKSに入れるメモ

not75743not75743

irsaでの導入

この辺
https://external-secrets.io/main/provider/aws-secrets-manager/#eks-service-account-credentials

helmでの導入

helm repo add external-secrets https://charts.external-secrets.io/
helm repo update external-secrets
helm upgrade external-secrets external-secrets/external-secrets \
    --install --version 0.9.19 \
    --namespace kube-system \
    --set serviceAccount.create=false

ServiceAccountは予め用意しておく

apiVersion: v1
kind: ServiceAccount
metadata:
  name: external-secret
  # namespace: kube-system
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<account id>:role/<作ったロール>
not75743not75743

secrets連携

あらかじめtest-secretというシークレットをsecrets managerに作成しておく

SecretStoreデプロイ

利用する秘匿情報管理サービスやアクセス方法を定義するリソース

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: secretstore-sample
  namespace: kube-system
spec:
  provider:
    aws:
      service: SecretsManager
      region: ap-northeast-1
      auth:
        jwt:
          serviceAccountRef:
            name: external-secret # サービスアカウントを指定

正常にデプロイできた際のログ

$ k logs external-secretsxxxx
{"level":"info","ts":1720318513.2562268,"logger":"provider.aws","msg":"using aws session","region":"ap-northeast-1","external id":"","credentials":{}}
{"level":"info","ts":1720318515.0315566,"logger":"provider.aws","msg":"using aws session","region":"ap-northeast-1","external id":"","credentials":{}}

externalsecretのデプロイ

取得する対象のデータや生成するSecretなどを定義するリソース

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: example
  namespace: kube-system
spec:
  refreshInterval: 5m
  secretStoreRef:
    name: secretstore-sample
    kind: SecretStore
  target:
    name: test-secret
    creationPolicy: Owner
  data:
  - secretKey: secret-sample
    remoteRef:
      key: test-secret
      property: password

ログ

{"level":"info","ts":1720318641.2267754,"logger":"provider.aws.secretsmanager","msg":"fetching secret value","key":"test-secret","version":"AWSCURRENT","value":"SECRET"}

secret確認

❯ k get secret test-secret -n kube-system
NAME          TYPE     DATA   AGE
test-secret   Opaque   1      101s
not75743not75743

cluster単位のClusterSecretStore

上記の例ではkube-systemnamespaceですべて完結したが、
それ以外のnamespaceではserviceaccountがデプロイされていないため、secretsmanagerへアクセス出来ない。

ClusterSecretStoreを利用すると全namespaceからsecretsmanagerへアクセスできる
https://external-secrets.io/latest/api/clustersecretstore/

apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
  name: cluster-secretstore-sample
spec:
  provider:
    aws:
      service: SecretsManager
      region: ap-northeast-1
      auth:
        jwt:
          serviceAccountRef:
            name: external-secret
            namespace: kube-system # サービスアカウントのnamespaceを指定
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: example
  namespace: default # サービスアカウントの存在しないnamespace
spec:
  refreshInterval: 5m
  secretStoreRef:
    name: cluster-secretstore-sample
    kind: ClusterSecretStore ###
  target:
    name: test-secret
    creationPolicy: Owner
  data:
  - secretKey: secret-sample
    remoteRef:
      key: test-secret
      property: password

クラスター単位のexternalsecretもある
https://external-secrets.io/latest/api/clusterexternalsecret/

not75743not75743

メモ

  • namespace周りに気をつければ特に難しい点はない
  • 基本的にはClusterSecretStoreで単一のSAでSecretsManagerへアクセス出来るようにしておいて、各namespaceのexternalsecretで指定してもらうのが権限的にはよい?
    • 各namespaceでSA作るのは手間、ClusterExternalSecretだと不必要なsecretsにアクセスできてしまう
      • クラスタ全体/namespace単位で必要なリソースを考える
  • cluster単位のリソースClusterSecretStore/ClusterExternalSecretは便利だが、権限周りの考慮が必要
    • 問題に出くわしたら再度戻ってくる
このスクラップは5ヶ月前にクローズされました