Hashicorp Vault에서 Cassandra 사용자 인증 정보 순환

개요

이 기능을 사용하면 플랫폼 관리자가 다음을 수행할 수 있습니다.

  • Hashicorp Vault에서 Cassandra 사용자 인증 정보를 순환합니다.
  • 비밀번호 순환 중 문제가 발생하면 Vault에 있는 이전 Cassandra 사용자 인증 정보로 롤백합니다.
  • 한 번에 하나의 리전에 대해 Cassandra 비밀번호를 순환하여 서비스 가용성에 대한 영향을 최소화하고 순환 프로세스를 효율적으로 제어할 수 있습니다.
  • 단일 리전의 순환 시작, 진행률 및 완료를 추적합니다.

이 기능은 Apigee Hybrid 1.13.1 이상에서 제공됩니다.

시작하기 전에

사용자 인증 정보 순환을 설정하기 전

  • Cassandra 데이터베이스를 백업합니다. 이 백업은 순환 전 사용자 인증 정보를 복원할 수 있도록 하기 위한 것입니다.
  • 클러스터가 정상 상태인지 확인합니다(즉, 모든 Apigee 리소스가 실행 중이고 대기 중인 상태 변경사항이 없음).

단일 리전 설정

  1. 새 Cassandra 사용자 인증 정보에 대해 Apigee 네임스페이스에 새로운 SecretProviderClass Kubernetes 리소스를 만듭니다. 사용할 템플릿은 Hashicorp Vault에 Cassandra 보안 비밀 저장을 참조하세요. 이렇게 하면 Vault 역할이 Kubernetes 네임스페이스 내의 보안 비밀에 액세스할 수 있습니다.
  2. 다음 템플릿을 사용하여 새 SecretRotation 커스텀 리소스를 만듭니다.
    # rotation.yaml
    
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: SecretRotation
    metadata:
      name: ROTATION_PROCESS_NAME
      namespace: APIGEE_NAMESPACE
    spec:
      organizationId: ORG_NAME
      rotationId: ROTATION_ID
      timeoutMinutes: 480 # optional. overrides the default (480m == 8hr).
                          # less than or equal to 0 means infinite timeout.
      precheck: true
      cassandra:
        oldSecretProviderClass: OLD_SPC_NAME
        newSecretProviderClass: NEW_SPC_NAME
        jobType: ROTATE
    
    • ROTATION_PROCESS_NAME: 순환 작업의 고유 이름입니다. 순환 사전 확인 작업 및 순환 작업에 대해 metadata.name을 고유한 값으로 설정해야 합니다. 예를 들어 sr-1-precheck 다음에 sr-1과 같이 설정할 수 있습니다.
    • ROTATION_ID: spec.rotationId를 커스텀 식별자(예: rotation-1-precheck)로 설정합니다.
    • NEW_SPC_NAME: spec.cassandra.newSecretProviderClass를 이전 단계에서 만든 새로운 보안 비밀 제공자 클래스 이름으로 설정합니다.
    • OLD_SPC_NAME: spec.cassandra.oldSecretProviderClassApigeeDatastore에서 현재 사용 중인 SPC 이름으로 설정합니다.
  3. rotation.yaml 파일을 적용하여 순환 사전 확인 작업을 트리거합니다.
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  4. 사전 확인 작업이 완료되었을 때 확인할 작업 상태를 확인합니다.
    kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
  5. 순환 사전 확인 작업이 완료되면 metadata.name 값을 변경하고 spec.precheckfalse로 설정합니다. 파일을 다시 적용하여 순환을 수행합니다.
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  6. 순환 작업이 완료되고 트래픽이 계속 올바르게 작동하는지 확인되었으면 다음 두 단계에 따라 프로세스를 정리합니다.
    1. metadata.name의 값을 업데이트하고 spec.cassandra.jobTypeCLEANUP으로 설정합니다.
    2. 파일을 적용하여 정리 작업을 트리거합니다.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml

    정리 작업이 끝나면 순환 프로세스가 완료됩니다.

  7. Cassandra 데이터베이스를 백업합니다. 이 백업은 순환된 사용자 인증 정보를 복원할 수 있도록 하기 위한 것입니다.
  8. Vault에서 이전 Cassandra 사용자 인증 정보, 역할, 정책을 삭제합니다.

멀티 리전 설정

멀티 리전 설정 절차는 첫 번째 리전 설정과 남은 리전 설정의 두 섹션으로 구분됩니다.

  1. 후속 리전을 시작하기 전에 첫 번째 리전에서 다음 단계를 완료합니다.
    1. 새 Cassandra 사용자 인증 정보에 대해 APIGEE_NAMESPACE 네임스페이스에 새로운 SecretProviderClass Kubernetes 리소스를 만듭니다. 사용할 템플릿은 Hashicorp Vault에 Cassandra 보안 비밀 저장을 참조하세요. 이렇게 하면 Vault 역할이 Kubernetes 네임스페이스 내의 보안 비밀에 액세스할 수 있습니다.
    2. 다음 템플릿을 사용하여 새 SecretRotation 커스텀 리소스를 만듭니다.
      # rotation.yaml
      
      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: SecretRotation
      metadata:
        name: ROTATION_PROCESS_NAME
        namespace: APIGEE_NAMESPACE
      spec:
        organizationId: ORG_NAME
        rotationId: ROTATION_ID
        timeoutMinutes: -1 # this value is required and should not be changed.
        precheck: true
        cassandra:
          oldSecretProviderClass: OLD_SPC_NAME
          newSecretProviderClass: NEW_SPC_NAME
          jobType: ROTATE
      
      • ROTATION_PROCESS_NAME: 순환 작업의 고유 이름입니다. 순환 사전 확인 작업 및 순환 작업에 대해 metadata.name을 고유한 값으로 설정해야 합니다. 예를 들어 sr-1-precheck 다음에 sr-1과 같이 설정할 수 있습니다.
      • ROTATION_ID: spec.rotationId를 커스텀 식별자(예: rotation-1-precheck)로 설정합니다.
      • NEW_SPC_NAME: spec.cassandra.newSecretProviderClass를 이전 단계에서 만든 새로운 보안 비밀 제공자 클래스 이름으로 설정합니다.
      • OLD_SPC_NAME: spec.cassandra.oldSecretProviderClassApigeeDatastore에서 현재 사용 중인 SPC 이름으로 설정합니다.
    3. rotation.yaml 파일을 적용하여 순환 사전 확인 작업을 트리거합니다.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    4. 사전 확인 작업이 완료되었을 때 확인할 작업 상태를 확인합니다.
      kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
    5. 순환 사전 확인 작업이 완료된 후 다음 안내를 따르세요.
      • metadata.name 값을 변경합니다(예: sr-1-precheck에서 sr-1로).
      • spec.precheckfalse로 설정하여 사전 확인을 사용 중지하고 순환을 실행합니다.
      • spec.rotationId를 새 식별자로 설정합니다(예: rotation-1).
    6. 파일을 다시 적용하여 순환을 수행합니다.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    7. SecretRotation 상태를 확인하고 complete가 될 때까지 기다립니다.
      kubectl -n APIGEE_NAMESPACE get sr SR_NAME
  2. 이후 각 리전에서 다음 단계를 완료합니다.
    1. 새 Cassandra 사용자 인증 정보에 대해 Apigee 네임스페이스에 새로운 SecretProviderClass Kubernetes 리소스를 만듭니다. 사용할 템플릿은 Hashicorp Vault에 Cassandra 보안 비밀 저장을 참조하세요. 1a단계와 동일한 정의여야 합니다.
    2. overrides.yaml을 업데이트하고 rotation.yaml 파일의 spec.cassandra.newSecretProviderClass 값과 일치하도록 cassandra.auth.secretProviderClass를 설정합니다.
      cassandra:
        auth:
          secretProviderClass: NEW_SPC_NAME
    3. 연산자 차트를 적용합니다.
      helm upgrade operator apigee-operator/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    4. ReplicaSet가 생성됩니다. 새 컨트롤러 관리자 포드가 새 SPC를 사용하는지 확인합니다.
      export POD=NEW_CONTROLLER_MANAGER_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      결과는 rotation.yaml에서 spec.cassandra.newSecretProviderClass에 설정한 값과 일치해야 합니다. 예를 들면 다음과 같습니다.

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
    5. 데이터 스토어 차트를 적용합니다.
      helm upgrade datastore apigee-datastore/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    6. 데이터 스토어가 출시 상태로 전환됩니다. 데이터 스토어의 출시가 완료되고 실행 상태가 될 때까지 기다립니다.
      kubectl -n APIGEE_NAMESPACE get apigeedatastore DATASTORE_NAME

      대부분의 설치에서 DATASTORE_NAMEdefault입니다.

    7. 새 데이터 스토어 포드에서 새 SPC를 사용하는지 확인합니다.
      export POD=NEW_DATASTORE_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      결과는 rotation.yaml에서 spec.cassandra.newSecretProviderClass에 설정한 값과 일치해야 합니다. 예를 들면 다음과 같습니다.

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
    8. 조직 및 환경 출시가 완료되고 실행 중 상태로 돌아갈 때까지 기다립니다.
      kubectl -n APIGEE_NAMESPACE get apigeeorg ORG_NAME
      kubectl -n APIGEE_NAMESPACE get apigeeenv ENV_NAME
    9. 새 MART, 런타임, 동기화기 포드가 새 SPC를 사용하는지 확인합니다.
      export POD=NEW_MART_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      export POD=NEW_RUNTIME_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      export POD=NEW_SYNCHRONIZER_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      결과는 rotation.yaml에서 spec.cassandra.newSecretProviderClass에 설정한 값과 일치해야 합니다. 예를 들면 다음과 같습니다.

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
  3. 모든 리전의 단계를 완료하고 트래픽이 올바르게 작동하는지 확인한 후 다음 두 단계에 따라 첫 번째 리전에서 프로세스를 정리합니다.
    1. 첫 번째 리전에서 metadata.name 값을 업데이트하고 spec.cassandra.jobTypeCLEANUP으로 설정합니다.
    2. 파일을 적용하여 정리 작업을 트리거합니다.
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    3. 작업 상태를 확인하고 작업 로그를 통해 정리 작업이 완료되었는지 확인합니다.

    정리 작업이 끝나면 순환 프로세스가 완료됩니다.

  4. Cassandra 데이터베이스를 백업합니다. 이 백업은 순환된 사용자 인증 정보를 복원할 수 있도록 하기 위한 것입니다.
  5. Vault에서 이전 Cassandra 사용자 인증 정보, 역할, 정책을 삭제합니다.