2.7. 외부 비밀 저장소를 사용하여 포드에 민감한 데이터 제공


일부 애플리케이션에는 개발자에게 제공하길 원하지 않는 민감한 정보(암호 및 사용자 이름 등)가 필요합니다.

Kubernetes Secret 객체를 사용하여 민감한 정보를 제공하는 대신, 외부 비밀 저장소를 사용하여 민감한 정보를 저장할 수 있습니다. Secrets Store CSI Driver Operator를 사용하면 외부 비밀 저장소와 통합하고 비밀 콘텐츠를 Pod 볼륨으로 마운트할 수 있습니다.

2.7.1. 비밀 저장소 CSI 드라이버 운영자에 관하여

Kubernetes 비밀은 Base64 인코딩으로 저장됩니다. etcd는 이러한 비밀에 대해 저장 시에는 암호화를 제공하지만, 비밀을 검색하면 암호가 해독되어 사용자에게 제공됩니다. 클러스터에서 역할 기반 액세스 제어가 제대로 구성되지 않으면 API 또는 etcd 액세스 권한이 있는 모든 사람이 비밀을 검색하거나 수정할 수 있습니다. 또한, 네임스페이스에 포드를 생성할 권한이 있는 사람은 누구나 해당 액세스 권한을 사용하여 해당 네임스페이스의 모든 비밀을 읽을 수 있습니다.

비밀을 안전하게 저장하고 관리하려면 공급자 플러그인을 사용하여 Azure Key Vault와 같은 외부 비밀 관리 시스템에서 비밀을 마운트하도록 OpenShift Container Platform Secrets Store Container Storage Interface(CSI) 드라이버 운영자를 구성할 수 있습니다. 그러면 애플리케이션은 비밀을 사용할 수 있지만 애플리케이션 포드가 파괴된 후에는 비밀이 시스템에 유지되지 않습니다.

Secrets Store CSI 드라이버 오퍼레이터인 secrets-store.csi.k8s.io 를 사용하면 OpenShift Container Platform에서 엔터프라이즈급 외부 비밀 저장소에 저장된 여러 개의 비밀, 키 및 인증서를 볼륨으로 포드에 마운트할 수 있습니다. Secrets Store CSI 드라이버 운영자는 gRPC를 사용하여 공급자와 통신하여 지정된 외부 비밀 저장소에서 마운트 콘텐츠를 가져옵니다. 볼륨이 연결된 후, 볼륨 안의 데이터는 컨테이너의 파일 시스템에 마운트됩니다. 비밀 저장소 볼륨은 인라인으로 마운트됩니다.

2.7.1.1. 비밀 저장소 제공업체

Secrets Store CSI Driver Operator는 다음 Secrets Store 공급업체에서 테스트되었습니다.

  • AWS 시크릿 관리자
  • AWS Systems Manager 매개변수 저장소
  • Azure Key Vault
  • Google 시크릿 관리자
  • HashiCorp Vault
참고

Red Hat은 타사 비밀 저장소 공급자 기능과 관련된 모든 요소를 테스트하지 않습니다. 타사 지원에 대한 자세한 내용은 Red Hat 타사 지원 정책을 참조하세요.

2.7.1.2. 자동 회전

Secrets Store CSI 드라이버는 마운트된 볼륨의 콘텐츠를 외부 비밀 저장소의 콘텐츠로 주기적으로 회전합니다. 외부 비밀 저장소에서 비밀이 업데이트되면 해당 비밀은 마운트된 볼륨에서 업데이트됩니다. Secrets Store CSI 운전자 운영자는 2분마다 업데이트를 확인합니다.

마운트된 콘텐츠의 동기화를 Kubernetes 비밀로 활성화한 경우 Kubernetes 비밀도 순환됩니다.

비밀 데이터를 사용하는 애플리케이션은 비밀에 대한 업데이트를 감시해야 합니다.

2.7.2. Secrets Store CSI 드라이버 설치

사전 요구 사항

  • OpenShift Container Platform 웹 콘솔에 액세스합니다.
  • 클러스터에 대한 관리자 액세스.

프로세스

Secrets Store CSI 드라이버를 설치하려면:

  1. Secrets Store CSI 드라이버 운영자를 설치하세요:

    1. 웹 콘솔에 로그인합니다.
    2. Operators OperatorHub를 클릭합니다.
    3. 필터 상자에 "Secrets Store CSI"를 입력하여 Secrets Store CSI 드라이버 운영자를 찾으세요.
    4. Secrets Store CSI Driver Operator 버튼을 클릭하세요.
    5. Secrets Store CSI Driver Operator 페이지에서 설치를 클릭합니다.
    6. Operator 설치 페이지에서 다음을 확인합니다.

      • 클러스터의 모든 네임스페이스(기본값)가 선택됩니다.
      • 설치된 네임스페이스openshift-cluster-csi-drivers로 설정됩니다.
    7. 설치를 클릭합니다.

      설치가 완료되면 Secrets Store CSI Driver Operator가 웹 콘솔의 설치된 운영자 섹션에 나열됩니다.

  2. 드라이버에 대한 ClusterCSIDriver 인스턴스를 생성합니다( secret-store.csi.k8s.io).

    1. 관리 CustomResourceDefinitions ClusterCSIDriver를 클릭합니다.
    2. Instances 탭에서 Create ClusterCSIDriver를 클릭합니다.

      다음 YAML 파일을 사용합니다.

      apiVersion: operator.openshift.io/v1
      kind: ClusterCSIDriver
      metadata:
          name: secrets-store.csi.k8s.io
      spec:
        managementState: Managed
      Copy to Clipboard Toggle word wrap
    3. 생성을 클릭합니다.

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(Container Storage Interface) 볼륨으로 비밀을 마운트할 수 있습니다. AWS Secrets Manager에서 비밀을 마운트하려면 클러스터를 AWS에 설치하고 AWS 보안 토큰 서비스(STS)를 사용해야 합니다.

사전 요구 사항

  • 귀하의 클러스터는 AWS에 설치되어 있으며 AWS 보안 토큰 서비스(STS)를 사용합니다.
  • Secrets Store CSI Driver Operator를 설치했습니다. 자세한 내용은 Secrets Store CSI 드라이버 설치를 참조하세요.
  • AWS Secrets Manager를 구성하여 필요한 비밀을 저장했습니다.
  • ccoctl 바이너리를 추출하고 준비했습니다.
  • jq CLI 도구를 설치했습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. AWS Secrets Manager 공급자를 설치하세요.

    1. 공급자 리소스에 대한 다음 구성을 사용하여 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
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 csi-secrets-store-provider-aws 서비스 계정에 대한 특권 액세스 권한을 부여합니다.

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 공급자 리소스를 만듭니다.

      $ oc apply -f aws-provider.yaml
      Copy to Clipboard Toggle word wrap
  2. 서비스 계정이 AWS 비밀 객체를 읽을 수 있도록 권한을 부여합니다.

    1. 다음 명령을 실행하여 자격 증명 요청을 포함할 디렉토리를 만듭니다.

      $ mkdir credentialsrequest-dir-aws
      Copy to Clipboard Toggle word wrap
    2. 자격 증명 요청에 대한 다음 구성을 사용하여 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
      Copy to Clipboard Toggle word wrap

    3. 다음 명령을 실행하여 OIDC 공급자를 검색합니다.

      $ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
      Copy to Clipboard Toggle word wrap

      출력 예

      https://<oidc_provider_name>
      Copy to Clipboard Toggle word wrap

      다음 단계에서 사용할 OIDC 공급자 이름 <oidc_provider_name> 을 출력에서 복사합니다.

    4. 다음 명령을 실행하여 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
      Copy to Clipboard Toggle word wrap

      출력 예

      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
      Copy to Clipboard Toggle word wrap

      다음 단계에서 사용할 수 있도록 출력에서 <aws_role_arn>을 복사합니다. 예를 들어, arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds .

    5. 다음 명령을 실행하여 ARN 역할에 서비스 계정을 바인딩합니다.

      $ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
      Copy to Clipboard Toggle word wrap
  3. 비밀 저장소 공급자를 정의하려면 비밀 공급자 클래스를 만듭니다.

    1. SecretProviderClass 객체를 정의하는 YAML 파일을 만듭니다.

      Example secret-provider-class-aws.yaml

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-aws-provider                   
      1
      
        namespace: my-namespace                 
      2
      
      spec:
        provider: aws                           
      3
      
        parameters:                             
      4
      
          objects: |
            - objectName: "testSecret"
              objectType: "secretsmanager"
      Copy to Clipboard Toggle word wrap

      1
      비밀 공급자 클래스의 이름을 지정합니다.
      2
      비밀 공급자 클래스에 대한 네임스페이스를 지정합니다.
      3
      공급자를 aws 로 지정합니다.
      4
      공급자별 구성 매개변수를 지정합니다.
    2. 다음 명령을 실행하여 SecretProviderClass 객체를 만듭니다.

      $ oc create -f secret-provider-class-aws.yaml
      Copy to Clipboard Toggle word wrap
  4. 이 비밀 공급자 클래스를 사용하기 위해 배포를 만듭니다.

    1. 배포 객체를 정의하는 YAML 파일을 만듭니다.

      deployment.yaml의 예

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-aws-deployment                              
      1
      
        namespace: my-namespace                              
      2
      
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-storage
        template:
          metadata:
            labels:
              app: my-storage
          spec:
            serviceAccountName: aws-provider
            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
      Copy to Clipboard Toggle word wrap

      1
      배포에 대한 이름을 지정합니다.
      2
      배포에 대한 네임스페이스를 지정합니다. 이는 비밀 공급자 클래스와 동일한 네임스페이스여야 합니다.
      3
      비밀 공급자 클래스의 이름을 지정합니다.
    2. 다음 명령을 실행하여 배포 객체를 만듭니다.

      $ oc create -f deployment.yaml
      Copy to Clipboard Toggle word wrap

검증

  • 포드 볼륨 마운트에서 AWS Secrets Manager의 비밀에 액세스할 수 있는지 확인하세요.

    1. 다음 명령을 실행하여 Pod 마운트의 비밀을 나열합니다.

      $ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
      Copy to Clipboard Toggle word wrap

      출력 예

      testSecret
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 포드 마운트에서 비밀을 확인하세요.

      $ oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
      Copy to Clipboard Toggle word wrap

      출력 예

      <secret_value>
      Copy to Clipboard Toggle word wrap

2.7.3.2. AWS Systems Manager Parameter Store에서 비밀 마운트

Secrets Store CSI Driver Operator를 사용하면 AWS Systems Manager Parameter Store의 비밀을 OpenShift Container Platform의 CSI(Container Storage Interface) 볼륨에 마운트할 수 있습니다. AWS Systems Manager Parameter Store에서 비밀을 마운트하려면 클러스터를 AWS에 설치하고 AWS Security Token Service(STS)를 사용해야 합니다.

사전 요구 사항

  • 귀하의 클러스터는 AWS에 설치되어 있으며 AWS 보안 토큰 서비스(STS)를 사용합니다.
  • Secrets Store CSI Driver Operator를 설치했습니다. 자세한 내용은 Secrets Store CSI 드라이버 설치를 참조하세요.
  • 필요한 비밀을 저장하도록 AWS Systems Manager Parameter Store를 구성했습니다.
  • ccoctl 바이너리를 추출하고 준비했습니다.
  • jq CLI 도구를 설치했습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. AWS Systems Manager Parameter Store 공급자를 설치합니다.

    1. 공급자 리소스에 대한 다음 구성을 사용하여 YAML 파일을 만듭니다.

      중요

      Secrets Store CSI 드라이버용 AWS Systems Manager Parameter Store 공급자는 업스트림 공급자입니다.

      이 구성은 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
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 csi-secrets-store-provider-aws 서비스 계정에 대한 특권 액세스 권한을 부여합니다.

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 공급자 리소스를 만듭니다.

      $ oc apply -f aws-provider.yaml
      Copy to Clipboard Toggle word wrap
  2. 서비스 계정이 AWS 비밀 객체를 읽을 수 있도록 권한을 부여합니다.

    1. 다음 명령을 실행하여 자격 증명 요청을 포함할 디렉토리를 만듭니다.

      $ mkdir credentialsrequest-dir-aws
      Copy to Clipboard Toggle word wrap
    2. 자격 증명 요청에 대한 다음 구성을 사용하여 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:
            - "ssm:GetParameter"
            - "ssm:GetParameters"
            effect: Allow
            resource: "arn:*:ssm:*:*:parameter/testParameter*"
        secretRef:
          name: aws-creds
          namespace: my-namespace
        serviceAccountNames:
        - aws-provider
      Copy to Clipboard Toggle word wrap

    3. 다음 명령을 실행하여 OIDC 공급자를 검색합니다.

      $ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
      Copy to Clipboard Toggle word wrap

      출력 예

      https://<oidc_provider_name>
      Copy to Clipboard Toggle word wrap

      다음 단계에서 사용할 OIDC 공급자 이름 <oidc_provider_name> 을 출력에서 복사합니다.

    4. 다음 명령을 실행하여 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
      Copy to Clipboard Toggle word wrap

      출력 예

      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
      Copy to Clipboard Toggle word wrap

      다음 단계에서 사용할 수 있도록 출력에서 <aws_role_arn>을 복사합니다. 예를 들어, arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds .

    5. 다음 명령을 실행하여 ARN 역할에 서비스 계정을 바인딩합니다.

      $ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
      Copy to Clipboard Toggle word wrap
  3. 비밀 저장소 공급자를 정의하려면 비밀 공급자 클래스를 만듭니다.

    1. SecretProviderClass 객체를 정의하는 YAML 파일을 만듭니다.

      Example secret-provider-class-aws.yaml

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-aws-provider                   
      1
      
        namespace: my-namespace                 
      2
      
      spec:
        provider: aws                           
      3
      
        parameters:                             
      4
      
          objects: |
            - objectName: "testParameter"
              objectType: "ssmparameter"
      Copy to Clipboard Toggle word wrap

      1
      비밀 공급자 클래스의 이름을 지정합니다.
      2
      비밀 공급자 클래스에 대한 네임스페이스를 지정합니다.
      3
      공급자를 aws 로 지정합니다.
      4
      공급자별 구성 매개변수를 지정합니다.
    2. 다음 명령을 실행하여 SecretProviderClass 객체를 만듭니다.

      $ oc create -f secret-provider-class-aws.yaml
      Copy to Clipboard Toggle word wrap
  4. 이 비밀 공급자 클래스를 사용하기 위해 배포를 만듭니다.

    1. 배포 객체를 정의하는 YAML 파일을 만듭니다.

      deployment.yaml의 예

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-aws-deployment                              
      1
      
        namespace: my-namespace                              
      2
      
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-storage
        template:
          metadata:
            labels:
              app: my-storage
          spec:
            serviceAccountName: aws-provider
            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
      Copy to Clipboard Toggle word wrap

      1
      배포에 대한 이름을 지정합니다.
      2
      배포에 대한 네임스페이스를 지정합니다. 이는 비밀 공급자 클래스와 동일한 네임스페이스여야 합니다.
      3
      비밀 공급자 클래스의 이름을 지정합니다.
    2. 다음 명령을 실행하여 배포 객체를 만듭니다.

      $ oc create -f deployment.yaml
      Copy to Clipboard Toggle word wrap

검증

  • Pod 볼륨 마운트의 AWS Systems Manager Parameter Store에서 비밀에 액세스할 수 있는지 확인하세요.

    1. 다음 명령을 실행하여 Pod 마운트의 비밀을 나열합니다.

      $ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
      Copy to Clipboard Toggle word wrap

      출력 예

      testParameter
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 포드 마운트에서 비밀을 확인하세요.

      $ oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
      Copy to Clipboard Toggle word wrap

      출력 예

      <secret_value>
      Copy to Clipboard Toggle word wrap

2.7.3.3. Azure Key Vault에서 비밀 마운트

Secrets Store CSI Driver Operator를 사용하면 Azure Key Vault에서 OpenShift Container Platform의 CSI(Container Storage Interface) 볼륨으로 비밀을 마운트할 수 있습니다. Azure Key Vault에서 비밀을 마운트하려면 클러스터를 Microsoft Azure에 설치해야 합니다.

사전 요구 사항

  • 클러스터가 Azure에 설치되었습니다.
  • Secrets Store CSI Driver Operator를 설치했습니다. 자세한 내용은 Secrets Store CSI 드라이버 설치를 참조하세요.
  • 필요한 비밀을 저장하도록 Azure Key Vault를 구성했습니다.
  • Azure CLI(az)를 설치했습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. Azure Key Vault 공급자를 설치하세요.

    1. 공급자 리소스에 대한 다음 구성을 사용하여 YAML 파일을 만듭니다.

      중요

      Secrets Store CSI 드라이버용 Azure Key Vault 공급자는 업스트림 공급자입니다.

      이 구성은 OpenShift Container Platform에서 제대로 작동하도록 업스트림 Azure 설명서 에 제공된 구성을 수정한 것입니다. 이 구성을 변경하면 기능에 영향을 미칠 수 있습니다.

      azure-provider.yaml 파일 예시

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: csi-secrets-store-provider-azure
        namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: csi-secrets-store-provider-azure-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-azure-cluster-rolebinding
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: csi-secrets-store-provider-azure-cluster-role
      subjects:
      - kind: ServiceAccount
        name: csi-secrets-store-provider-azure
        namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: apps/v1
      kind: DaemonSet
      metadata:
        namespace: openshift-cluster-csi-drivers
        name: csi-secrets-store-provider-azure
        labels:
          app: csi-secrets-store-provider-azure
      spec:
        updateStrategy:
          type: RollingUpdate
        selector:
          matchLabels:
            app: csi-secrets-store-provider-azure
        template:
          metadata:
            labels:
              app: csi-secrets-store-provider-azure
          spec:
            serviceAccountName: csi-secrets-store-provider-azure
            hostNetwork: true
            containers:
              - name: provider-azure-installer
                image: mcr.microsoft.com/oss/azure/secrets-store/provider-azure:v1.4.1
                imagePullPolicy: IfNotPresent
                args:
                  - --endpoint=unix:///provider/azure.sock
                  - --construct-pem-chain=true
                  - --healthz-port=8989
                  - --healthz-path=/healthz
                  - --healthz-timeout=5s
                livenessProbe:
                  httpGet:
                    path: /healthz
                    port: 8989
                  failureThreshold: 3
                  initialDelaySeconds: 5
                  timeoutSeconds: 10
                  periodSeconds: 30
                resources:
                  requests:
                    cpu: 50m
                    memory: 100Mi
                  limits:
                    cpu: 50m
                    memory: 100Mi
                securityContext:
                  allowPrivilegeEscalation: false
                  readOnlyRootFilesystem: true
                  runAsUser: 0
                  capabilities:
                    drop:
                    - ALL
                volumeMounts:
                  - mountPath: "/provider"
                    name: providervol
            affinity:
              nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                  - matchExpressions:
                    - key: type
                      operator: NotIn
                      values:
                      - virtual-kubelet
            volumes:
              - name: providervol
                hostPath:
                  path: "/var/run/secrets-store-csi-providers"
            tolerations:
            - operator: Exists
            nodeSelector:
              kubernetes.io/os: linux
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 csi-secrets-store-provider-azure 서비스 계정에 대한 특권 액세스 권한을 부여하세요.

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-azure -n openshift-cluster-csi-drivers
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 공급자 리소스를 만듭니다.

      $ oc apply -f azure-provider.yaml
      Copy to Clipboard Toggle word wrap
  2. 키 보관소에 액세스하기 위한 서비스 주체를 만듭니다.

    1. 다음 명령을 실행하여 서비스 주체 클라이언트 비밀번호를 환경 변수로 설정합니다.

      $ SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --name https://$KEYVAULT_NAME --query 'password' -otsv)"
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 서비스 주체 클라이언트 ID를 환경 변수로 설정합니다.

      $ SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name https://$KEYVAULT_NAME --query '[0].appId' -otsv)"
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 서비스 주체 클라이언트 비밀과 ID로 일반 비밀을 만듭니다.

      $ oc create secret generic secrets-store-creds -n my-namespace --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET}
      Copy to Clipboard Toggle word wrap
    4. secrets-store.csi.k8s.io/used=true 레이블을 적용하여 공급자가 이 nodePublishSecretRef 비밀을 찾을 수 있도록 합니다.

      $ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
      Copy to Clipboard Toggle word wrap
  3. 비밀 저장소 공급자를 정의하려면 비밀 공급자 클래스를 만듭니다.

    1. SecretProviderClass 객체를 정의하는 YAML 파일을 만듭니다.

      Example secret-provider-class-azure.yaml

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-azure-provider                 
      1
      
        namespace: my-namespace                 
      2
      
      spec:
        provider: azure                         
      3
      
        parameters:                             
      4
      
          usePodIdentity: "false"
          useVMManagedIdentity: "false"
          userAssignedIdentityID: ""
          keyvaultName: "kvname"
          objects: |
            array:
              - |
                objectName: secret1
                objectType: secret
          tenantId: "tid"
      Copy to Clipboard Toggle word wrap

      1
      비밀 공급자 클래스의 이름을 지정합니다.
      2
      비밀 공급자 클래스에 대한 네임스페이스를 지정합니다.
      3
      공급자를 azure 로 지정합니다.
      4
      공급자별 구성 매개변수를 지정합니다.
    2. 다음 명령을 실행하여 SecretProviderClass 객체를 만듭니다.

      $ oc create -f secret-provider-class-azure.yaml
      Copy to Clipboard Toggle word wrap
  4. 이 비밀 공급자 클래스를 사용하기 위해 배포를 만듭니다.

    1. 배포 객체를 정의하는 YAML 파일을 만듭니다.

      deployment.yaml의 예

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-azure-deployment                            
      1
      
        namespace: my-namespace                              
      2
      
      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-azure-provider" 
      3
      
                  nodePublishSecretRef:
                    name: secrets-store-creds                
      4
      Copy to Clipboard Toggle word wrap

      1
      배포에 대한 이름을 지정합니다.
      2
      배포에 대한 네임스페이스를 지정합니다. 이는 비밀 공급자 클래스와 동일한 네임스페이스여야 합니다.
      3
      비밀 공급자 클래스의 이름을 지정합니다.
      4
      Azure Key Vault에 액세스하기 위한 서비스 주체 자격 증명이 포함된 Kubernetes 비밀의 이름을 지정합니다.
    2. 다음 명령을 실행하여 배포 객체를 만듭니다.

      $ oc create -f deployment.yaml
      Copy to Clipboard Toggle word wrap

검증

  • Pod 볼륨 마운트에서 Azure Key Vault의 비밀에 액세스할 수 있는지 확인하세요.

    1. 다음 명령을 실행하여 Pod 마운트의 비밀을 나열합니다.

      $ oc exec my-azure-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
      Copy to Clipboard Toggle word wrap

      출력 예

      secret1
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 포드 마운트에서 비밀을 확인하세요.

      $ oc exec my-azure-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/secret1
      Copy to Clipboard Toggle word wrap

      출력 예

      my-secret-value
      Copy to Clipboard Toggle word wrap

2.7.3.4. Google Secret Manager에서 비밀 마운트

Secrets Store CSI Driver Operator를 사용하면 Google Secret Manager의 비밀을 OpenShift Container Platform의 CSI(Container Storage Interface) 볼륨에 마운트할 수 있습니다. Google Secret Manager에서 비밀을 마운트하려면 클러스터를 Google Cloud Platform(GCP)에 설치해야 합니다.

사전 요구 사항

  • Secrets Store CSI Driver Operator를 설치했습니다. 자세한 내용은 Secrets Store CSI 드라이버 설치를 참조하세요.
  • Google Secret Manager를 구성하여 필요한 비밀을 저장했습니다.
  • Google Cloud 서비스 계정에서 key.json 이라는 서비스 계정 키를 생성했습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. Google Secret Manager 공급자를 설치하세요.

    1. 공급자 리소스에 대한 다음 구성을 사용하여 YAML 파일을 만듭니다.

      gcp-provider.yaml 파일 예시

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: csi-secrets-store-provider-gcp
        namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: csi-secrets-store-provider-gcp-rolebinding
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: csi-secrets-store-provider-gcp-role
      subjects:
        - kind: ServiceAccount
          name: csi-secrets-store-provider-gcp
          namespace: openshift-cluster-csi-drivers
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: csi-secrets-store-provider-gcp-role
      rules:
        - apiGroups:
            - ""
          resources:
            - serviceaccounts/token
          verbs:
            - create
        - apiGroups:
            - ""
          resources:
            - serviceaccounts
          verbs:
            - get
      ---
      apiVersion: apps/v1
      kind: DaemonSet
      metadata:
        name: csi-secrets-store-provider-gcp
        namespace: openshift-cluster-csi-drivers
        labels:
          app: csi-secrets-store-provider-gcp
      spec:
        updateStrategy:
          type: RollingUpdate
        selector:
          matchLabels:
            app: csi-secrets-store-provider-gcp
        template:
          metadata:
            labels:
              app: csi-secrets-store-provider-gcp
          spec:
            serviceAccountName: csi-secrets-store-provider-gcp
            initContainers:
            - name: chown-provider-mount
              image: busybox
              command:
              - chown
              - "1000:1000"
              - /etc/kubernetes/secrets-store-csi-providers
              volumeMounts:
              - mountPath: "/etc/kubernetes/secrets-store-csi-providers"
                name: providervol
              securityContext:
                privileged: true
            hostNetwork: false
            hostPID: false
            hostIPC: false
            containers:
              - name: provider
                image: us-docker.pkg.dev/secretmanager-csi/secrets-store-csi-driver-provider-gcp/plugin@sha256:a493a78bbb4ebce5f5de15acdccc6f4d19486eae9aa4fa529bb60ac112dd6650
                securityContext:
                  privileged: true
                imagePullPolicy: IfNotPresent
                resources:
                  requests:
                    cpu: 50m
                    memory: 100Mi
                  limits:
                    cpu: 50m
                    memory: 100Mi
                env:
                  - name: TARGET_DIR
                    value: "/etc/kubernetes/secrets-store-csi-providers"
                volumeMounts:
                  - mountPath: "/etc/kubernetes/secrets-store-csi-providers"
                    name: providervol
                    mountPropagation: None
                    readOnly: false
                livenessProbe:
                  failureThreshold: 3
                  httpGet:
                    path: /live
                    port: 8095
                  initialDelaySeconds: 5
                  timeoutSeconds: 10
                  periodSeconds: 30
            volumes:
              - name: providervol
                hostPath:
                  path: /etc/kubernetes/secrets-store-csi-providers
            tolerations:
              - key: kubernetes.io/arch
                operator: Equal
                value: amd64
                effect: NoSchedule
            nodeSelector:
              kubernetes.io/os: linux
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 csi-secrets-store-provider-gcp 서비스 계정에 대한 특권 액세스 권한을 부여합니다.

      $ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-gcp -n openshift-cluster-csi-drivers
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 공급자 리소스를 만듭니다.

      $ oc apply -f gcp-provider.yaml
      Copy to Clipboard Toggle word wrap
  2. Google Secret Manager 비밀번호를 읽을 수 있는 권한을 부여합니다.

    1. 다음 명령을 실행하여 새 프로젝트를 만듭니다.

      $ oc new-project my-namespace
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 Pod 보안 허용을 위해 my-namespace 네임스페이스에 레이블을 지정합니다.

      $ oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
      Copy to Clipboard Toggle word wrap
    3. 포드 배포를 위한 서비스 계정을 만듭니다.

      $ oc create serviceaccount my-service-account --namespace=my-namespace
      Copy to Clipboard Toggle word wrap
    4. 다음 명령을 실행하여 key.json 파일에서 일반 비밀번호를 만듭니다.

      $ oc create secret generic secrets-store-creds -n my-namespace --from-file=key.json 
      1
      Copy to Clipboard Toggle word wrap
      1
      Google Secret Manager에서 이 key.json 파일을 생성했습니다.
    5. secrets-store.csi.k8s.io/used=true 레이블을 적용하여 공급자가 이 nodePublishSecretRef 비밀을 찾을 수 있도록 합니다.

      $ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
      Copy to Clipboard Toggle word wrap
  3. 비밀 저장소 공급자를 정의하려면 비밀 공급자 클래스를 만듭니다.

    1. SecretProviderClass 객체를 정의하는 YAML 파일을 만듭니다.

      Example secret-provider-class-gcp.yaml

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-gcp-provider                        
      1
      
        namespace: my-namespace                      
      2
      
      spec:
        provider: gcp                                
      3
      
        parameters:                                  
      4
      
          secrets: |
            - resourceName: "projects/my-project/secrets/testsecret1/versions/1"
              path: "testsecret1.txt"
      Copy to Clipboard Toggle word wrap

      1
      비밀 공급자 클래스의 이름을 지정합니다.
      2
      비밀 공급자 클래스에 대한 네임스페이스를 지정합니다.
      3
      공급자를 gcp 로 지정합니다.
      4
      공급자별 구성 매개변수를 지정합니다.
    2. 다음 명령을 실행하여 SecretProviderClass 객체를 만듭니다.

      $ oc create -f secret-provider-class-gcp.yaml
      Copy to Clipboard Toggle word wrap
  4. 이 비밀 공급자 클래스를 사용하기 위해 배포를 만듭니다.

    1. 배포 객체를 정의하는 YAML 파일을 만듭니다.

      deployment.yaml의 예

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-gcp-deployment                              
      1
      
        namespace: my-namespace                              
      2
      
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-storage
        template:
          metadata:
            labels:
              app: my-storage
          spec:
            serviceAccountName: my-service-account           
      3
      
            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-gcp-provider"   
      4
      
                  nodePublishSecretRef:
                    name: secrets-store-creds                
      5
      Copy to Clipboard Toggle word wrap

      1
      배포에 대한 이름을 지정합니다.
      2
      배포에 대한 네임스페이스를 지정합니다. 이는 비밀 공급자 클래스와 동일한 네임스페이스여야 합니다.
      3
      생성한 서비스 계정을 지정하세요.
      4
      비밀 공급자 클래스의 이름을 지정합니다.
      5
      Google Secret Manager에 액세스하기 위한 서비스 주체 자격 증명이 포함된 Kubernetes 비밀의 이름을 지정합니다.
    2. 다음 명령을 실행하여 배포 객체를 만듭니다.

      $ oc create -f deployment.yaml
      Copy to Clipboard Toggle word wrap

검증

  • Pod 볼륨 마운트에서 Google Secret Manager의 비밀에 액세스할 수 있는지 확인하세요.

    1. 다음 명령을 실행하여 Pod 마운트의 비밀을 나열합니다.

      $ oc exec my-gcp-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
      Copy to Clipboard Toggle word wrap

      출력 예

      testsecret1
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 포드 마운트에서 비밀을 확인하세요.

      $ oc exec my-gcp-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testsecret1
      Copy to Clipboard Toggle word wrap

      출력 예

      <secret_value>
      Copy to Clipboard Toggle word wrap

2.7.3.5. HashiCorp Vault의 비밀이 쌓이고 있습니다.

Secrets Store CSI Driver Operator를 사용하면 HashiCorp Vault에서 OpenShift Container Platform의 CSI(Container Storage Interface) 볼륨으로 비밀을 마운트할 수 있습니다.

중요

Secrets Store CSI Driver Operator를 사용하여 HashiCorp Vault의 비밀을 마운트하는 기능은 다음 클라우드 공급자를 통해 테스트되었습니다.

  • AWS(Amazon Web Services)
  • Microsoft Azure

다른 클라우드 제공업체도 작동할 수 있지만 아직 테스트되지 않았습니다. 향후에 추가적인 클라우드 공급자를 테스트할 수도 있습니다.

사전 요구 사항

  • Secrets Store CSI Driver Operator를 설치했습니다. 자세한 내용은 Secrets Store CSI 드라이버 설치를 참조하세요.
  • Helm을 설치했습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. 다음 명령을 실행하여 HashiCorp Helm 저장소를 추가합니다.

    $ helm repo add hashicorp https://helm.releases.hashicorp.com
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 Helm이 최신 버전을 인식하도록 모든 저장소를 업데이트합니다.

    $ helm repo update
    Copy to Clipboard Toggle word wrap
  3. HashiCorp Vault 공급자를 설치하세요.

    1. 다음 명령을 실행하여 Vault에 대한 새 프로젝트를 만듭니다.

      $ oc new-project vault
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 Pod 보안 허용을 위한 볼트 네임스페이스에 레이블을 지정합니다.

      $ oc label ns vault security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 볼트 서비스 계정에 대한 특권 액세스 권한을 부여하세요.

      $ oc adm policy add-scc-to-user privileged -z vault -n vault
      Copy to Clipboard Toggle word wrap
    4. 다음 명령을 실행하여 vault-csi-provider 서비스 계정에 대한 특권 액세스 권한을 부여합니다.

      $ oc adm policy add-scc-to-user privileged -z vault-csi-provider -n vault
      Copy to Clipboard Toggle word wrap
    5. 다음 명령을 실행하여 HashiCorp Vault를 배포합니다.

      $ helm install vault hashicorp/vault --namespace=vault \
        --set "server.dev.enabled=true" \
        --set "injector.enabled=false" \
        --set "csi.enabled=true" \
        --set "global.openshift=true" \
        --set "injector.agentImage.repository=docker.io/hashicorp/vault" \
        --set "server.image.repository=docker.io/hashicorp/vault" \
        --set "csi.image.repository=docker.io/hashicorp/vault-csi-provider" \
        --set "csi.agent.image.repository=docker.io/hashicorp/vault" \
        --set "csi.daemonSet.providersDir=/var/run/secrets-store-csi-providers"
      Copy to Clipboard Toggle word wrap
    6. 다음 명령을 실행하여 securityContext를 privileged 로 설정하도록 설정된 vault-csi-driver 데몬을 패치합니다.

      $ oc patch daemonset -n vault vault-csi-provider --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/securityContext", "value": {"privileged": true} }]'
      Copy to Clipboard Toggle word wrap
    7. 다음 명령을 실행하여 vault-csi-provider 포드가 제대로 시작되었는지 확인하세요.

      $ oc get pods -n vault
      Copy to Clipboard Toggle word wrap

      출력 예

      NAME                       READY   STATUS    RESTARTS   AGE
      vault-0                    1/1     Running   0          24m
      vault-csi-provider-87rgw   1/2     Running   0          5s
      vault-csi-provider-bd6hp   1/2     Running   0          4s
      vault-csi-provider-smlv7   1/2     Running   0          5s
      Copy to Clipboard Toggle word wrap

  4. 필요한 비밀을 저장하도록 HashiCorp Vault를 구성합니다.

    1. 다음 명령을 실행하여 비밀을 생성합니다.

      $ oc exec vault-0 --namespace=vault -- vault kv put secret/example1 testSecret1=my-secret-value
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 secret/example1 경로에서 비밀을 읽을 수 있는지 확인하세요.

      $ oc exec vault-0 --namespace=vault -- vault kv get secret/example1
      Copy to Clipboard Toggle word wrap

      출력 예

      = Secret Path =
      secret/data/example1
      
      ======= Metadata =======
      Key                Value
      ---                -----
      created_time       2024-04-05T07:05:16.713911211Z
      custom_metadata    <nil>
      deletion_time      n/a
      destroyed          false
      version            1
      
      === Data ===
      Key            Value
      ---            -----
      testSecret1    my-secret-value
      Copy to Clipboard Toggle word wrap

  5. Kubernetes 인증을 사용하도록 Vault를 구성하세요.

    1. 다음 명령을 실행하여 Kubernetes 인증 방법을 활성화합니다.

      $ oc exec vault-0 --namespace=vault -- vault auth enable kubernetes
      Copy to Clipboard Toggle word wrap

      출력 예

      Success! Enabled kubernetes auth method at: kubernetes/
      Copy to Clipboard Toggle word wrap

    2. Kubernetes 인증 방법을 구성합니다.

      1. 다음 명령을 실행하여 토큰 검토자를 환경 변수로 설정합니다.

        $ TOKEN_REVIEWER_JWT="$(oc exec vault-0 --namespace=vault -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
        Copy to Clipboard Toggle word wrap
      2. 다음 명령을 실행하여 Kubernetes 서비스 IP 주소를 환경 변수로 설정합니다.

        $ KUBERNETES_SERVICE_IP="$(oc get svc kubernetes --namespace=default -o go-template="{{ .spec.clusterIP }}")"
        Copy to Clipboard Toggle word wrap
      3. 다음 명령을 실행하여 Kubernetes 인증 방법을 업데이트합니다.

        $ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/config \
          issuer="https://kubernetes.default.svc.cluster.local" \
          token_reviewer_jwt="${TOKEN_REVIEWER_JWT}" \
          kubernetes_host="https://${KUBERNETES_SERVICE_IP}:443" \
          kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Copy to Clipboard Toggle word wrap

        출력 예

        Success! Data written to: auth/kubernetes/config
        Copy to Clipboard Toggle word wrap

    3. 다음 명령을 실행하여 애플리케이션에 대한 정책을 만듭니다.

      $ oc exec -i vault-0 --namespace=vault -- vault policy write csi -<<EOF
        path "secret/data/*" {
        capabilities = ["read"]
        }
        EOF
      Copy to Clipboard Toggle word wrap

      출력 예

      Success! Uploaded policy: csi
      Copy to Clipboard Toggle word wrap

    4. 다음 명령을 실행하여 애플리케이션에 액세스하기 위한 인증 역할을 만듭니다.

      $ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/role/csi \
        bound_service_account_names=default \
        bound_service_account_namespaces=default,test-ns,negative-test-ns,my-namespace \
        policies=csi \
        ttl=20m
      Copy to Clipboard Toggle word wrap

      출력 예

      Success! Data written to: auth/kubernetes/role/csi
      Copy to Clipboard Toggle word wrap

    5. 다음 명령을 실행하여 모든 볼트 포드가 제대로 실행되고 있는지 확인하세요.

      $ oc get pods -n vault
      Copy to Clipboard Toggle word wrap

      출력 예

      NAME                       READY   STATUS    RESTARTS   AGE
      vault-0                    1/1     Running   0          43m
      vault-csi-provider-87rgw   2/2     Running   0          19m
      vault-csi-provider-bd6hp   2/2     Running   0          19m
      vault-csi-provider-smlv7   2/2     Running   0          19m
      Copy to Clipboard Toggle word wrap

    6. 다음 명령을 실행하여 모든 secrets-store-csi-driver 포드가 제대로 실행되고 있는지 확인하세요.

      $ oc get pods -n openshift-cluster-csi-drivers | grep -E "secrets"
      Copy to Clipboard Toggle word wrap

      출력 예

      secrets-store-csi-driver-node-46d2g                  3/3     Running   0             45m
      secrets-store-csi-driver-node-d2jjn                  3/3     Running   0             45m
      secrets-store-csi-driver-node-drmt4                  3/3     Running   0             45m
      secrets-store-csi-driver-node-j2wlt                  3/3     Running   0             45m
      secrets-store-csi-driver-node-v9xv4                  3/3     Running   0             45m
      secrets-store-csi-driver-node-vlz28                  3/3     Running   0             45m
      secrets-store-csi-driver-operator-84bd699478-fpxrw   1/1     Running   0             47m
      Copy to Clipboard Toggle word wrap

  6. 비밀 저장소 공급자를 정의하려면 비밀 공급자 클래스를 만듭니다.

    1. SecretProviderClass 객체를 정의하는 YAML 파일을 만듭니다.

      예시 secret-provider-class-vault.yaml

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-vault-provider                   
      1
      
        namespace: my-namespace                   
      2
      
      spec:
        provider: vault                           
      3
      
        parameters:                               
      4
      
          roleName: "csi"
          vaultAddress: "http://vault.vault:8200"
          objects:  |
            - secretPath: "secret/data/example1"
              objectName: "testSecret1"
              secretKey: "testSecret1"
      Copy to Clipboard Toggle word wrap

      1
      비밀 공급자 클래스의 이름을 지정합니다.
      2
      비밀 공급자 클래스에 대한 네임스페이스를 지정합니다.
      3
      공급자를 볼트 로 지정합니다.
      4
      공급자별 구성 매개변수를 지정합니다.
    2. 다음 명령을 실행하여 SecretProviderClass 객체를 만듭니다.

      $ oc create -f secret-provider-class-vault.yaml
      Copy to Clipboard Toggle word wrap
  7. 이 비밀 공급자 클래스를 사용하기 위해 배포를 만듭니다.

    1. 배포 객체를 정의하는 YAML 파일을 만듭니다.

      deployment.yaml의 예

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: busybox-deployment                                    
      1
      
        namespace: my-namespace                                     
      2
      
        labels:
          app: busybox
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: busybox
        template:
          metadata:
            labels:
              app: busybox
          spec:
            terminationGracePeriodSeconds: 0
            containers:
            - image: registry.k8s.io/e2e-test-images/busybox:1.29-4
              name: busybox
              imagePullPolicy: IfNotPresent
              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-vault-provider"        
      3
      Copy to Clipboard Toggle word wrap

      1
      배포에 대한 이름을 지정합니다.
      2
      배포에 대한 네임스페이스를 지정합니다. 이는 비밀 공급자 클래스와 동일한 네임스페이스여야 합니다.
      3
      비밀 공급자 클래스의 이름을 지정합니다.
    2. 다음 명령을 실행하여 배포 객체를 만듭니다.

      $ oc create -f deployment.yaml
      Copy to Clipboard Toggle word wrap

검증

  • Pod 볼륨 마운트에서 HashiCorp Vault의 비밀에 액세스할 수 있는지 확인하세요.

    1. 다음 명령을 실행하여 Pod 마운트의 비밀을 나열합니다.

      $ oc exec busybox-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
      Copy to Clipboard Toggle word wrap

      출력 예

      testSecret1
      Copy to Clipboard Toggle word wrap

    2. 다음 명령을 실행하여 포드 마운트에서 비밀을 확인하세요.

      $ oc exec busybox-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret1
      Copy to Clipboard Toggle word wrap

      출력 예

      my-secret-value
      Copy to Clipboard Toggle word wrap

2.7.4. Kubernetes 비밀로 마운트된 콘텐츠의 동기화 활성화

마운트된 볼륨의 콘텐츠에서 Kubernetes 비밀을 생성하기 위해 동기화를 활성화할 수 있습니다. 동기화를 활성화하려는 예로는 배포에서 환경 변수를 사용하여 Kubernetes 비밀을 참조하는 것입니다.

주의

OpenShift Container Platform 클러스터와 etcd에 비밀을 저장하지 않으려면 동기화를 활성화하지 마세요. 비밀번호를 참조하기 위해 환경 변수를 사용하려는 경우처럼 필요한 경우에만 이 기능을 활성화하세요.

동기화를 활성화하면 비밀을 마운트하는 Pod를 시작한 후 마운트된 볼륨의 비밀이 Kubernetes 비밀로 동기화됩니다.

콘텐츠를 마운트한 모든 포드가 삭제되면 동기화된 Kubernetes 비밀도 삭제됩니다.

사전 요구 사항

  • Secrets Store CSI Driver Operator를 설치했습니다.
  • 비밀 저장소 제공자를 설치했습니다.
  • 비밀 공급자 클래스를 생성했습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. 다음 명령을 실행하여 SecretProviderClass 리소스를 편집합니다.

    $ oc edit secretproviderclass my-azure-provider 
    1
    Copy to Clipboard Toggle word wrap
    1
    my-azure-provider를 비밀 공급자 클래스의 이름으로 바꾸세요.
  2. 동기화된 Kubernetes 비밀에 대한 구성으로 secretsObjects 섹션을 추가합니다.

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: my-azure-provider
      namespace: my-namespace
    spec:
      provider: azure
      secretObjects:                                   
    1
    
        - secretName: tlssecret                        
    2
    
          type: kubernetes.io/tls                      
    3
    
          labels:
            environment: "test"
          data:
            - objectName: tlskey                       
    4
    
              key: tls.key                             
    5
    
            - objectName: tlscrt
              key: tls.crt
      parameters:
        usePodIdentity: "false"
        keyvaultName: "kvname"
        objects:  |
          array:
            - |
              objectName: tlskey
              objectType: secret
            - |
              objectName: tlscrt
              objectType: secret
        tenantId: "tid"
    Copy to Clipboard Toggle word wrap
    1
    동기화된 Kubernetes 비밀에 대한 구성을 지정합니다.
    2
    생성할 Kubernetes Secret 객체의 이름을 지정합니다.
    3
    생성할 Kubernetes Secret 객체의 유형을 지정합니다. 예를 들어, Opaque 또는 kubernetes.io/tls 입니다.
    4
    동기화할 마운트된 콘텐츠의 개체 이름이나 별칭을 지정합니다.
    5
    Kubernetes 비밀을 채울 지정된 objectName 의 데이터 필드를 지정합니다.
  3. 파일을 저장하여 변경 사항을 적용합니다.

2.7.5. Pod 볼륨 마운트에서 비밀 상태 보기

Pod 볼륨 마운트에서 비밀의 자세한 정보(버전 포함)를 볼 수 있습니다.

Secrets Store CSI Driver Operator는 Pod와 동일한 네임스페이스에 SecretProviderClassPodStatus 리소스를 생성합니다. 이 리소스를 검토하면 Pod 볼륨 마운트의 비밀에 대한 자세한 정보(버전 포함)를 확인할 수 있습니다.

사전 요구 사항

  • Secrets Store CSI Driver Operator를 설치했습니다.
  • 비밀 저장소 제공자를 설치했습니다.
  • 비밀 공급자 클래스를 생성했습니다.
  • Secrets Store CSI Driver Operator에서 볼륨을 마운트하는 Pod를 배포했습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  • 다음 명령을 실행하여 Pod 볼륨 마운트의 비밀에 대한 자세한 정보를 확인하세요.

    $ oc get secretproviderclasspodstatus <secret_provider_class_pod_status_name> -o yaml 
    1
    Copy to Clipboard Toggle word wrap
    1
    비밀 공급자 클래스 포드 상태 개체의 이름은 <pod_name>-<namespace>-<secret_provider_class_name> 형식입니다.

    출력 예

    ...
    status:
      mounted: true
      objects:
      - id: secret/tlscrt
        version: f352293b97da4fa18d96a9528534cb33
      - id: secret/tlskey
        version: 02534bc3d5df481cb138f8b2a13951ef
      podName: busybox-<hash>
      secretProviderClassName: my-azure-provider
      targetPath: /var/lib/kubelet/pods/f0d49c1e-c87a-4beb-888f-37798456a3e7/volumes/kubernetes.io~csi/secrets-store-inline/mount
    Copy to Clipboard Toggle word wrap

2.7.6. Secrets Store CSI 드라이버 운영자 제거

사전 요구 사항

  • OpenShift Container Platform 웹 콘솔에 액세스합니다.
  • 클러스터에 대한 관리자 액세스.

프로세스

Secrets Store CSI Driver Operator를 제거하려면:

  1. secrets-store.csi.k8s.io 공급자를 사용하는 모든 애플리케이션 포드를 중지합니다.
  2. 선택한 비밀 저장소에 대한 타사 공급자 플러그인을 제거합니다.
  3. 컨테이너 스토리지 인터페이스(CSI) 드라이버와 관련 매니페스트를 제거합니다.

    1. 관리 CustomResourceDefinitions ClusterCSIDriver를 클릭합니다.
    2. 인스턴스 탭에서 secrets-store.csi.k8s.io 의 맨 왼쪽에 있는 드롭다운 메뉴를 클릭한 다음 ClusterCSIDriver 삭제를 클릭합니다.
    3. 메시지가 표시되면 삭제를 클릭합니다.
  4. CSI 드라이버 Pod가 더 이상 실행되지 않는지 확인합니다.
  5. Secrets Store CSI Driver Operator를 설치 제거합니다.

    참고

    Operator를 설치 제거하려면 CSI 드라이버를 먼저 제거해야 합니다.

    1. Operators 설치된 Operators를 클릭합니다.
    2. 설치된 운영자 페이지에서 스크롤하거나 이름으로 검색 상자에 "Secrets Store CSI"를 입력하여 운영자를 찾은 다음 클릭합니다.
    3. 설치된 운영자 > 운영자 세부 정보 페이지의 오른쪽 위에서 작업 운영자 제거를 클릭합니다.
    4. Operator 설치 제거 창이 표시되면 제거 버튼을 클릭하여 네임스페이스에서 Operator를 제거합니다. 클러스터에 Operator가 배포한 애플리케이션을 수동으로 정리해야 합니다.

      제거 후 Secrets Store CSI Driver Operator는 더 이상 웹 콘솔의 설치된 운영자 섹션에 나열되지 않습니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat