2.4. AWS Secrets Manager에서 시크릿을 마운트하도록 SSCSI 드라이버 구성
보안을 안전하게 저장하고 관리하려면 GitOps 워크플로우를 사용하고 Secrets Store Container Storage Interface (SSCSI) Driver Operator를 구성하여 AWS Secrets Manager의 시크릿을 OpenShift Container Platform의 CSI 볼륨에 마운트합니다. 예를 들어 /environments/dev/
디렉터리에 있는 dev
네임스페이스 아래의 배포 Pod에 시크릿을 마운트하려고 합니다.
사전 요구 사항
- AWS Secrets Manager 리소스가 GitOps 리포지토리에 저장되어 있습니다.
프로세스
다음 명령을 실행하여
csi-secrets-store-provider-aws
서비스 계정에 대한 권한 권한을 부여합니다.$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
출력 예
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "csi-secrets-store-provider-aws"
서비스 계정에서 AWS 시크릿 오브젝트를 읽을 수 있는 권한을 부여합니다.
인증 정보 요청이 네임스페이스 범위이므로 GitOps 리포지토리의 네임스페이스 범위 디렉터리에
credentialsrequest-dir-aws
폴더를 생성합니다. 예를 들어 다음 명령을 실행하여/environments/dev/
디렉터리에 있는dev
네임스페이스에credentialsrequest-dir-aws
폴더를 생성합니다.$ mkdir credentialsrequest-dir-aws
/environments/dev/credentialsrequest-dir-aws/
경로에서 인증 정보 요청에 대한 다음 구성으로 YAML 파일을 생성하여dev
네임스페이스의 배포 Pod에 보안을 마운트합니다.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: "<aws_secret_arn>" 1 secretRef: name: aws-creds namespace: dev 2 serviceAccountNames: - default
작은 정보클러스터 리전을 찾으려면 다음 명령을 실행합니다.
$ oc get infrastructure cluster -o jsonpath='{.status.platformStatus.aws.region}'
출력 예
us-west-2
다음 명령을 실행하여 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
.AWS의 역할 정책을 확인하여 역할 정책의 <
aws_region
>의 <aws_region>이 클러스터 리전과 일치하는지 확인합니다.역할 정책 예
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ], "Resource": "arn:aws:secretsmanager:<aws_region>:<aws_account_id>:secret:my-secret-xxxxxx" } ] }
다음 명령을 실행하여 서비스 계정을 ARN 역할과 바인딩합니다.
$ oc annotate -n <namespace> sa/<app_service_account> eks.amazonaws.com/role-arn="<aws_role_arn>"
명령 예
$ oc annotate -n dev sa/default eks.amazonaws.com/role-arn="<aws_role_arn>"
출력 예
serviceaccount/default annotated
네임스페이스 범위의
SecretProviderClass
리소스를 생성하여 시크릿 저장소 공급자를 정의합니다. 예를 들어 GitOps 리포지토리의/environments/dev/apps/app-taxi/services/taxi/base/config
디렉터리에SecretProviderClass
리소스를 생성합니다.대상 배포가 GitOps 리포지토리에 있는 동일한 디렉터리에
secret-provider-class-aws.yaml
파일을 생성합니다.secret-provider-class-aws.yaml
의 예apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-aws-provider 1 namespace: dev 2 spec: provider: aws 3 parameters: 4 objects: | - objectName: "testSecret" 5 objectType: "secretsmanager"
이 YAML 파일을 GitOps 리포지토리로 내보낸 후 Argo CD UI의 대상 애플리케이션 페이지에 네임스페이스 범위의
SecretProviderClass
리소스가 채워져 있는지 확인합니다.참고애플리케이션의 동기화 정책이
Auto
로 설정되지 않은 경우 Argo CD UI에서 동기화를 클릭하여SecretProviderClass
리소스를 수동으로 동기화 할 수 있습니다.