2.7.3. 외부 시크릿 저장소에서 CSI 볼륨으로 보안 마운트
Secrets Store CSI Driver Operator를 설치한 후 다음 외부 보안 저장소 중 하나에서 CSI 볼륨에 시크릿을 마운트할 수 있습니다.
2.7.3.1. AWS Secrets Manager에서 보안 마운트 링크 복사링크가 클립보드에 복사되었습니다!
Secrets Store CSI Driver Operator를 사용하여 AWS Secrets Manager의 시크릿을 OpenShift Container Platform의 CSI 볼륨에 마운트할 수 있습니다. AWS Secrets Manager의 시크릿을 마운트하려면 AWS에 클러스터를 설치하고 AWS STS(보안 토큰 서비스)를 사용해야 합니다.
사전 요구 사항
- 클러스터가 AWS에 설치되어 있으며 AWS STS(보안 토큰 서비스)를 사용합니다.
- Secrets Store CSI Driver Operator가 설치되어 있습니다. 자세한 내용은 Secrets Store CSI 드라이버 설치를 참조하십시오.
- 필요한 보안을 저장하도록 AWS Secrets Manager를 구성했습니다.
-
ccoctl바이너리를 추출하여 준비했습니다. -
jqCLI 툴을 설치했습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
AWS Secrets Manager 공급자를 설치합니다.
공급자 리소스에 대한 다음 구성을 사용하여 YAML 파일을 생성합니다.
중요Secrets Store CSI 드라이버의 AWS Secrets Manager 공급자는 업스트림 공급자입니다.
이 구성은 OpenShift Container Platform과 제대로 작동하도록 업스트림 AWS 설명서에 제공된 구성에서 수정됩니다. 이 구성을 변경하면 기능에 영향을 미칠 수 있습니다.
aws-provider.yaml파일의 예apiVersion: v1 kind: ServiceAccount metadata: name: csi-secrets-store-provider-aws namespace: openshift-cluster-csi-drivers --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: csi-secrets-store-provider-aws-cluster-role rules: - apiGroups: [""] resources: ["serviceaccounts/token"] verbs: ["create"] - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get"] - apiGroups: [""] resources: ["pods"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: csi-secrets-store-provider-aws-cluster-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: csi-secrets-store-provider-aws-cluster-role subjects: - kind: ServiceAccount name: csi-secrets-store-provider-aws namespace: openshift-cluster-csi-drivers --- apiVersion: apps/v1 kind: DaemonSet metadata: namespace: openshift-cluster-csi-drivers name: csi-secrets-store-provider-aws labels: app: csi-secrets-store-provider-aws spec: updateStrategy: type: RollingUpdate selector: matchLabels: app: csi-secrets-store-provider-aws template: metadata: labels: app: csi-secrets-store-provider-aws spec: serviceAccountName: csi-secrets-store-provider-aws hostNetwork: false containers: - name: provider-aws-installer image: public.ecr.aws/aws-secrets-manager/secrets-store-csi-driver-provider-aws:1.0.r2-50-g5b4aca1-2023.06.09.21.19 imagePullPolicy: Always args: - --provider-volume=/etc/kubernetes/secrets-store-csi-providers resources: requests: cpu: 50m memory: 100Mi limits: cpu: 50m memory: 100Mi securityContext: privileged: true volumeMounts: - mountPath: "/etc/kubernetes/secrets-store-csi-providers" name: providervol - name: mountpoint-dir mountPath: /var/lib/kubelet/pods mountPropagation: HostToContainer tolerations: - operator: Exists volumes: - name: providervol hostPath: path: "/etc/kubernetes/secrets-store-csi-providers" - name: mountpoint-dir hostPath: path: /var/lib/kubelet/pods type: DirectoryOrCreate nodeSelector: kubernetes.io/os: linux다음 명령을 실행하여
csi-secrets-store-provider-aws서비스 계정에 대한 권한 권한을 부여합니다.$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers다음 명령을 실행하여 공급자 리소스를 생성합니다.
$ oc apply -f aws-provider.yaml
서비스 계정에서 AWS 시크릿 오브젝트를 읽을 수 있는 권한을 부여합니다.
다음 명령을 실행하여 인증 정보 요청을 포함할 디렉터리를 생성합니다.
$ mkdir credentialsrequest-dir-aws인증 정보 요청에 대해 다음 구성을 사용하여 YAML 파일을 생성합니다.
credentialsrequest.yaml파일 예apiVersion: cloudcredential.openshift.io/v1 kind: CredentialsRequest metadata: name: aws-provider-test namespace: openshift-cloud-credential-operator spec: providerSpec: apiVersion: cloudcredential.openshift.io/v1 kind: AWSProviderSpec statementEntries: - action: - "secretsmanager:GetSecretValue" - "secretsmanager:DescribeSecret" effect: Allow resource: "arn:*:secretsmanager:*:*:secret:testSecret-??????" secretRef: name: aws-creds namespace: my-namespace serviceAccountNames: - aws-provider다음 명령을 실행하여 OIDC 공급자를 검색합니다.
$ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'출력 예
https://<oidc_provider_name>다음 단계에서 사용할 출력에서 OIDC
공급자 이름 <oidc_provider_name>을 복사합니다.ccoctl툴을 사용하여 다음 명령을 실행하여 인증 정보 요청을 처리합니다.$ ccoctl aws create-iam-roles \ --name my-role --region=<aws_region> \ --credentials-requests-dir=credentialsrequest-dir-aws \ --identity-provider-arn arn:aws:iam::<aws_account>:oidc-provider/<oidc_provider_name> --output-dir=credrequests-ccoctl-output출력 예
2023/05/15 18:10:34 Role arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds created 2023/05/15 18:10:34 Saved credentials configuration to: credrequests-ccoctl-output/manifests/my-namespace-aws-creds-credentials.yaml 2023/05/15 18:10:35 Updated Role policy for Role my-role-my-namespace-aws-creds다음 단계에서 사용할 출력에서 <
aws_role_arn>을 복사합니다. 예를 들어arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds.다음 명령을 실행하여 서비스 계정을 ARN 역할과 바인딩합니다.
$ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
시크릿 공급자 클래스를 생성하여 시크릿 저장소 공급자를 정의합니다.
SecretProviderClass오브젝트를 정의하는 YAML 파일을 생성합니다.secret-provider-class-aws.yaml의 예apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-aws-provider1 namespace: my-namespace2 spec: provider: aws3 parameters:4 objects: | - objectName: "testSecret" objectType: "secretsmanager"다음 명령을 실행하여
SecretProviderClass오브젝트를 생성합니다.$ oc create -f secret-provider-class-aws.yaml
이 시크릿 공급자 클래스를 사용할 배포를 생성합니다.
Deployment오브젝트를 정의하는 YAML 파일을 생성합니다.deployment.yaml의 예apiVersion: apps/v1 kind: Deployment metadata: name: my-aws-deployment1 namespace: my-namespace2 spec: replicas: 1 selector: matchLabels: app: my-storage template: metadata: labels: app: my-storage spec: containers: - name: busybox image: k8s.gcr.io/e2e-test-images/busybox:1.29 command: - "/bin/sleep" - "10000" volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "my-aws-provider"3 다음 명령을 실행하여
Deployment오브젝트를 생성합니다.$ oc create -f deployment.yaml
검증
Pod 볼륨 마운트의 AWS Secrets Manager에서 시크릿에 액세스할 수 있는지 확인합니다.
Pod 마운트의 보안을 나열합니다.
$ oc exec busybox-<hash> -n my-namespace -- ls /mnt/secrets-store/출력 예
testSecretPod 마운트에서 보안을 확인합니다.
$ oc exec busybox-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret출력 예
<secret_value>