10.5. Zero Trust Workload Identity Manager OIDC 페더레이션


Zero Trust Workload Identity Manager는 SPIRE 서버가 OIDC 공급자 역할을 할 수 있도록 하여 OpenID Connect(OIDC)와 통합됩니다. 이를 통해 워크로드는 로컬 SPIRE 에이전트에서 검증 가능한 JSON 웹 토큰(SPIFFE 검증 가능 신원 문서(JWT-SVID))을 요청하고 수신할 수 있습니다. 클라우드 공급자와 같은 외부 시스템은 SPIRE 서버에서 노출된 OIDC 검색 엔드포인트를 사용하여 공개 키를 검색할 수 있습니다.

중요

Red Hat OpenShift용 Zero Trust Workload Identity Manager는 기술 미리 보기 기능에 불과합니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

다음 공급자는 SPIRE OIDC 페더레이션과 호환되는 것으로 검증되었습니다.

  • Azure Entra ID
  • Vault

10.5.1. Entra ID OpenID Connect에 대하여

Entra ID는 사용자 관리와 액세스 제어를 중앙에서 관리하는 클라우드 기반 ID 및 액세스 관리 서비스입니다. Entra ID는 사용자 신원을 확인하고 애플리케이션에 ID 토큰을 발급하는 신원 제공자 역할을 합니다. 이 토큰에는 필수적인 사용자 정보가 포함되어 있어 애플리케이션이 사용자의 자격 증명을 관리하지 않고도 사용자가 누구인지 확인할 수 있습니다.

Entra ID OpenID Connect(OIDC)를 SPIRE와 통합하면 워크로드에 자동화된 단기 암호화 ID가 제공됩니다. SPIRE에서 발급한 ID는 Entra ID로 전송되어 정적 비밀 없이 서비스를 안전하게 인증합니다.

10.5.1.1. 관리되는 OIDC 검색 공급자 경로에 대한 외부 인증서 구성

관리되는 경로는 외부 경로 인증서 기능을 사용하여 tls.externalCertificate 필드를 외부에서 관리되는 TLS(전송 계층 보안) 비밀의 이름으로 설정합니다.

사전 요구 사항

  • Zero Trust Workload Identity Manager 0.2.0 이상을 설치했습니다.
  • 클러스터에 SPIRE 서버, SPIRE 에이전트, SPIFFEE CSI 드라이버 및 SPIRE OIDC Discovery Provider 피연산자를 배포했습니다.
  • Red Hat OpenShift용 cert-manager Operator를 설치했습니다. 자세한 내용은 Red Hat OpenShift용 cert-manager Operator 설치를 참조하세요 .
  • 공개적으로 신뢰할 수 있는 CA 서비스로 구성된 ClusterIssuer 또는 Issuer를 생성했습니다. 예를 들어, "Let's Encrypt ACME" 서비스를 갖춘 ACME(자동화된 인증서 관리 환경) 유형 발급자입니다 . 자세한 내용은 ACME 발급자 구성을 참조하세요.

프로세스

  1. 다음 명령을 실행하여 참조된 비밀을 읽을 수 있는 라우터 서비스 계정 권한을 제공하는 역할을 만듭니다.

    $ oc create role secret-reader \
      --verb=get,list,watch \
      --resource=secrets \
      --resource-name=$TLS_SECRET_NAME \
      -n zero-trust-workload-identity-manager
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 새로 생성된 Role 리소스와 라우터 서비스 계정을 바인딩하는 RoleBinding 리소스를 만듭니다.

    $ oc create rolebinding secret-reader-binding \
      --role=secret-reader \
      --serviceaccount=openshift-ingress:router \
      -n zero-trust-workload-identity-manager
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 이전 단계에서 생성된 비밀을 참조하도록 SpireOIDCDIscoveryProvider 사용자 지정 리소스(CR) 개체를 구성합니다.

    $ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
    spec:
      externalSecretRef: ${TLS_SECRET_NAME}
    '
    Copy to Clipboard Toggle word wrap

검증

  1. SpireOIDCDiscoveryProvider CR에서 다음 명령을 실행하여 ManageRouteReady 조건이 True 로 설정되었는지 확인합니다.

    $ oc wait --for=jsonpath='{.status.conditions[?(@.type=="ManagedRouteReady")].status}'=True SpireOIDCDiscoveryProvider/cluster --timeout=120s
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 HTTPS를 통해 OIDC 엔드포인트에 안전하게 액세스할 수 있는지 확인하세요.

    $ curl https://$JWT_ISSUER_ENDPOINT/.well-known/openid-configuration
    
    {
      "issuer": "https://$JWT_ISSUER_ENDPOINT",
      "jwks_uri": "https://$JWT_ISSUER_ENDPOINT/keys",
      "authorization_endpoint": "",
      "response_types_supported": [
        "id_token"
      ],
      "subject_types_supported": [],
      "id_token_signing_alg_values_supported": [
        "RS256",
        "ES256",
        "ES384"
      ]
    }%
    Copy to Clipboard Toggle word wrap

10.5.1.2. 관리되는 경로 비활성화

OIDC Discovery Provider 서비스 노출 동작을 완벽하게 제어하려면 요구 사항에 따라 관리되는 경로를 비활성화할 수 있습니다.

프로세스

  • OIDC Discovery Provider를 수동으로 구성하려면 다음 명령을 실행하여 managedRoute를 false 로 설정합니다.

    $ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
    spec:
      managedRoute: "false"
    Copy to Clipboard Toggle word wrap

10.5.1.3. Microsoft Azure에서 Entra ID 사용

Entra ID 구성이 완료되면 Azure에서 작동하도록 Entra ID를 설정할 수 있습니다.

사전 요구 사항

  • 공개적으로 신뢰할 수 있는 CA에서 TLS 인증서를 제공하도록 SPIRE OIDC Discovery Provider Route를 구성했습니다.

프로세스

  1. 다음 명령을 실행하여 Azure에 로그인합니다.

    $ az login
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 Azure 구독 및 테넌트에 대한 변수를 구성합니다.

    $ export SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" -o tsv) 
    1
    Copy to Clipboard Toggle word wrap
    $ export TENANT_ID=$(az account list --query "[?isDefault].tenantId" -o tsv) 
    1
    Copy to Clipboard Toggle word wrap
    $ export LOCATION=centralus 
    1
    Copy to Clipboard Toggle word wrap
    1
    고유 구독 식별자입니다.
    1
    Azure Active Directory 인스턴스의 ID입니다.
    1
    리소스가 생성되는 Azure 지역입니다.
  3. 다음 명령을 실행하여 리소스 변수 이름을 정의합니다.

    $ export NAME=ztwim 
    1
    Copy to Clipboard Toggle word wrap
    $ export RESOURCE_GROUP="${NAME}-rg" 
    1
    Copy to Clipboard Toggle word wrap
    $ export STORAGE_ACCOUNT="${NAME}storage" 
    1
    Copy to Clipboard Toggle word wrap
    $ export STORAGE_CONTAINER="${NAME}storagecontainer" 
    1
    Copy to Clipboard Toggle word wrap
    $ export USER_ASSIGNED_IDENTITY_NAME="${NAME}-identity" 
    1
    Copy to Clipboard Toggle word wrap
    1
    모든 리소스에 대한 기본 이름입니다.
    1
    리소스 그룹의 이름입니다.
    1
    저장소 계정의 이름입니다.
    1
    저장 용기의 이름입니다.
    1
    관리되는 ID의 이름입니다.
  4. 다음 명령을 실행하여 리소스 그룹을 만듭니다.

    $ az group create \
      --name "${RESOURCE_GROUP}" \
      --location "${LOCATION}"
    Copy to Clipboard Toggle word wrap

10.5.1.4. Azure Blob 저장소 구성

콘텐츠를 저장하는 데 사용할 새로운 저장소 계정을 만들어야 합니다.

프로세스

  1. 다음 명령을 실행하여 콘텐츠를 저장하는 데 사용되는 새 저장소 계정을 만듭니다.

    $ az storage account create \
      --name ${STORAGE_ACCOUNT} \
      --resource-group ${RESOURCE_GROUP} \
      --location ${LOCATION} \
      --encryption-services blob
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 새로 생성된 스토리지 계정의 스토리지 ID를 얻습니다.

    $ export STORAGE_ACCOUNT_ID=$(az storage account show -n ${STORAGE_ACCOUNT} -g ${RESOURCE_GROUP} --query id --out tsv)
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 새로 만든 스토리지 계정 내에 스토리지 컨테이너를 만들어 BLOB 저장을 지원하는 위치를 제공합니다.

    $ az storage container create \
      --account-name ${STORAGE_ACCOUNT} \
      --name ${STORAGE_CONTAINER} \
      --auth-mode login
    Copy to Clipboard Toggle word wrap

10.5.1.5. Azure 사용자 관리 ID 구성

새로운 사용자 관리 ID를 만든 다음, 사용자 관리 ID와 연관된 서비스 주체의 클라이언트 ID를 얻어야 합니다.

프로세스

  1. 다음 명령을 실행하여 새로운 사용자 관리 ID를 만든 후 해당 사용자 관리 ID와 연관된 서비스 주체의 클라이언트 ID를 가져옵니다.

    $ az identity create \
      --name ${USER_ASSIGNED_IDENTITY_NAME} \
      --resource-group ${RESOURCE_GROUP}
    
    $ export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 Azure 사용자가 할당한 관리 ID의 CLIENT_ID를 검색하고 환경 변수로 저장합니다.

    $ export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 사용자 관리 ID와 연결된 서비스 주체에 역할을 연결합니다.

    $ az role assignment create \
      --role "Storage Blob Data Contributor" \
      --assignee "${IDENTITY_CLIENT_ID}" \
      --scope ${STORAGE_ACCOUNT_ID}
    Copy to Clipboard Toggle word wrap

10.5.1.6. 데모 애플리케이션 만들기

데모 애플리케이션을 사용하면 전체 시스템이 제대로 작동하는지 확인할 수 있습니다.

프로세스

데모 애플리케이션을 만들려면 다음 단계를 완료하세요.

  1. 다음 명령을 실행하여 애플리케이션 이름과 네임스페이스를 설정합니다.

    $ export APP_NAME=workload-app
    Copy to Clipboard Toggle word wrap
    $ export APP_NAMESPACE=demo
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 네임스페이스를 생성합니다.

    $ oc create namespace $APP_NAMESPACE
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 애플리케이션 Secret을 생성합니다.

    $ oc apply -f - << EOF
    apiVersion: v1
    kind: Secret
    metadata:
      name: $APP_NAME
      namespace: $APP_NAMESPACE
    stringData:
      AAD_AUTHORITY: https://login.microsoftonline.com/
      AZURE_AUDIENCE: "api://AzureADTokenExchange"
      AZURE_TENANT_ID: "${TENANT_ID}"
      AZURE_CLIENT_ID: "${IDENTITY_CLIENT_ID}"
      BLOB_STORE_ACCOUNT: "${STORAGE_ACCOUNT}"
      BLOB_STORE_CONTAINER: "${STORAGE_CONTAINER}"
    EOF
    Copy to Clipboard Toggle word wrap

10.5.1.7. 워크로드 애플리케이션 배포

데모 애플리케이션이 생성되면,

사전 요구 사항

  • 데모 애플리케이션이 생성되어 배포되었습니다.

프로세스

  1. 애플리케이션을 배포하려면 제공된 명령 블록 전체를 복사하여 터미널에 직접 붙여넣으세요. Enter 키를 누르세요.

    $ oc apply -f - << EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: $APP_NAME
      namespace: $APP_NAMESPACE
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: $APP_NAME
      namespace: $APP_NAMESPACE
    spec:
      selector:
        matchLabels:
          app: $APP_NAME
      template:
        metadata:
          labels:
            app: $APP_NAME
            deployment: $APP_NAME
        spec:
          serviceAccountName: $APP_NAME
          containers:
            - name: $APP_NAME
              image: "registry.redhat.io/ubi9/python-311:latest"
              command:
                - /bin/bash
                - "-c"
                - |
                  #!/bin/bash
                  pip install spiffe azure-cli
    
                  cat << EOF > /opt/app-root/src/get-spiffe-token.py
                  #!/opt/app-root/bin/python
                  from spiffe import JwtSource
                  import argparse
                  parser = argparse.ArgumentParser(description='Retrieve SPIFFE Token.')
                  parser.add_argument("-a", "--audience", help="The audience to include in the token", required=True)
                  args = parser.parse_args()
                  with JwtSource() as source:
                    jwt_svid = source.fetch_svid(audience={args.audience})
                    print(jwt_svid.token)
                  EOF
    
                  chmod +x /opt/app-root/src/get-spiffe-token.py
                  while true; do sleep 10; done
              envFrom:
              - secretRef:
                  name: $APP_NAME
              env:
                - name: SPIFFE_ENDPOINT_SOCKET
                  value: unix:///run/spire/sockets/spire-agent.sock
              securityContext:
                allowPrivilegeEscalation: false
                capabilities:
                  drop:
                    - ALL
                readOnlyRootFilesystem: false
                runAsNonRoot: true
                seccompProfile:
                  type: RuntimeDefault
              ports:
                - containerPort: 8080
                  protocol: TCP
              volumeMounts:
                - name: spiffe-workload-api
                  mountPath: /run/spire/sockets
                  readOnly: true
          volumes:
            - name: spiffe-workload-api
              csi:
                driver: csi.spiffe.io
                readOnly: true
    EOF
    Copy to Clipboard Toggle word wrap

검증

  1. 다음 명령을 실행하여 workload-app pod가 성공적으로 실행되는지 확인하세요.

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

    출력 예

    NAME                             READY     STATUS      RESTARTS      AGE
    workload-app-5f8b9d685b-abcde    1/1       Running     0             60s
    Copy to Clipboard Toggle word wrap

  2. SPIFFE JWT 토큰(SVID-JWT)을 검색합니다.

    1. 다음 명령을 실행하여 포드 이름을 동적으로 가져옵니다.

      $ POD_NAME=$(oc get pods -n $APP_NAMESPACE -l app=$APP_NAME -o jsonpath='{.items[0].metadata.name}')
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 포드 내부에서 스크립트를 실행합니다.

      $ oc exec -it $POD_NAME -n $APP_NAMESPACE -- \
        /opt/app-root/src/get-spiffe-token.py -a "api://AzureADTokenExchange"
      Copy to Clipboard Toggle word wrap

10.5.1.8. SPIFFE ID 페더레이션을 사용하여 Azure 구성

SPIFFE ID 페더레이션을 사용하여 Azure를 구성하면 데모 애플리케이션에 암호 없이 자동으로 인증할 수 있습니다.

프로세스

  • 다음 명령을 실행하여 사용자 관리 ID와 워크로드 애플리케이션과 연결된 SPIFFE ID 간의 ID를 연합합니다.

    $ az identity federated-credential create \
     --name ${NAME} \
     --identity-name ${USER_ASSIGNED_IDENTITY_NAME} \
     --resource-group ${RESOURCE_GROUP} \
     --issuer https://$JWT_ISSUER_ENDPOINT \
     --subject spiffe://$APP_DOMAIN/ns/$APP_NAMESPACE/sa/$APP_NAME \
     --audience api://AzureADTokenExchange
    Copy to Clipboard Toggle word wrap

애플리케이션 워크로드가 Azure Blob Storage에 액세스할 수 있는지 확인할 수 있습니다.

사전 요구 사항

  • Azure Blob Storage가 생성되었습니다.

프로세스

  1. 다음 명령을 실행하여 SPIFFE 워크로드 API에서 JWT 토큰을 검색합니다.

    $ oc rsh -n $APP_NAMESPACE deployment/$APP_NAME
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 TOKEN 이라는 환경 변수를 만들고 내보냅니다.

    $ export TOKEN=$(/opt/app-root/src/get-spiffe-token.py --audience=$AZURE_AUDIENCE)
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 Pod에 포함된 Azure CLI에 로그인합니다.

    $ az login --service-principal \
      -t ${AZURE_TENANT_ID} \
      -u ${AZURE_CLIENT_ID} \
      --federated-token ${TOKEN}
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 애플리케이션 워크로드 포드로 새 파일을 만들고 Blob Storage에 파일을 업로드합니다.

    $ echo “Hello from OpenShift” > openshift-spire-federated-identities.txt
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 Azure Blog Storage에 파일을 업로드합니다.

    $ az storage blob upload \
      --account-name ${BLOB_STORE_ACCOUNT} \
      --container-name ${BLOB_STORE_CONTAINER} \
      --name openshift-spire-federated-identities.txt \
      --file openshift-spire-federated-identities.txt \
      --auth-mode login
    Copy to Clipboard Toggle word wrap

검증

  • 다음 명령을 실행하여 포함된 파일을 나열하여 파일이 성공적으로 업로드되었는지 확인하세요.

    $ az storage blob list \
      --account-name ${BLOB_STORE_ACCOUNT} \
      --container-name ${BLOB_STORE_CONTAINER} \
      --auth-mode login \
      -o table
    Copy to Clipboard Toggle word wrap

10.5.2. Vault OpenID Connect 소개

SPIRE를 활용한 Vault OpenID Connect(OIDC)는 Vault가 신뢰할 수 있는 OIDC 공급자로 SPIRE를 사용하는 안전한 인증 방법을 생성합니다. 워크로드는 고유한 SPIFFE ID를 가진 로컬 SPIRE 에이전트에 JWT-SVID를 요청합니다. 그런 다음 워크로드는 이 토큰을 Vault에 제시하고 Vault는 이를 SPIRE 서버의 공개 키와 비교하여 검증합니다. 모든 조건이 충족되면 Vault는 워크로드에 단기 Vault 토큰을 발급하고, 워크로드는 이제 이 토큰을 사용하여 비밀에 액세스하고 Vault 내에서 작업을 수행할 수 있습니다.

10.5.2.1. Vault 설치

Vault를 OIDC로 사용하려면 먼저 Vault를 설치해야 합니다.

사전 요구 사항

  • 경로를 구성합니다. 자세한 내용은 경로 구성을 참조하세요.
  • Helm이 설치되었습니다.
  • Vault API의 출력을 쉽게 읽을 수 있는 명령줄 JSON 프로세서입니다.
  • HashiCorp Helm 저장소가 추가되었습니다.

프로세스

  1. vault-helm-value.yaml 파일을 만듭니다.

    global:
      enabled: true
      openshift: true 
    1
    
      tlsDisable: true 
    2
    
    injector:
      enabled: false
    server:
      ui:
        enabled: true
      image:
        repository: docker.io/hashicorp/vault
        tag: "1.19.0"
      dataStorage:
        enabled: true 
    3
    
        size: 1Gi
      standalone:
        enabled: true 
    4
    
        config: |
          listener "tcp" {
            tls_disable = 1 
    5
    
            address = "[::]:8200"
            cluster_address = "[::]:8201"
          }
          storage "file" {
            path = "/vault/data"
          }
      extraEnvironmentVars: {}
    Copy to Clipboard Toggle word wrap
    1
    OpenShift 관련 보안 컨텍스트에 대한 배포를 최적화합니다.
    2
    차트에서 생성된 Kubernetes 개체에 대해 TLS를 비활성화합니다.
    3
    Vault 데이터를 저장하기 위해 1Gi 영구 볼륨을 생성합니다.
    4
    단일 Vault 포드를 배치합니다.
    5
    Vault 서버에 TLS를 사용하지 말라고 지시합니다.
  2. helm install 명령을 실행합니다:

    $ helm install vault hashicorp/vault \
      --create-namespace -n vault \
      --values ./vault-helm-value.yaml
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 Vault 서비스를 노출합니다.

    $ oc expose service vault -n vault
    Copy to Clipboard Toggle word wrap
  4. VAULT_ADDR 환경 변수를 설정하여 새 경로에서 호스트 이름을 검색한 다음 다음 명령을 실행하여 내보냅니다.

    $ export VAULT_ADDR="http://$(oc get route vault -n vault -o jsonpath='{.spec.host}')"
    Copy to Clipboard Toggle word wrap
    참고

    TLS가 비활성화되어 있으므로 http:// 가 앞에 붙습니다.

검증

  • Vault 인스턴스가 실행 중인지 확인하려면 다음 명령을 실행하세요.

    $ curl -s $VAULT_ADDR/v1/sys/health | jq
    Copy to Clipboard Toggle word wrap

    출력 예

    {
      "initialized": true,
      "sealed": true,
      "standby": true,
      "performance_standby": false,
      "replication_performance_mode": "disabled",
      "replication_dr_mode": "disabled",
      "server_time_utc": 1663786574,
      "version": "1.19.0",
      "cluster_name": "vault-cluster-a1b2c3d4",
      "cluster_id": "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b"
    }
    Copy to Clipboard Toggle word wrap

10.5.2.2. Vault 초기화 및 봉인 해제

새로 설치된 금고가 봉쇄되었습니다. 즉, 다른 모든 암호화 키를 보호하는 기본 암호화 키는 시작 시 서버 메모리에 로드되지 않습니다. 봉인을 해제하려면 Vault를 초기화해야 합니다.

Vault 서버를 초기화하는 단계는 다음과 같습니다.

  1. Vault 초기화 및 봉인 해제
  2. 키-값(KV) 비밀 엔진을 활성화하고 테스트 비밀을 저장합니다.
  3. SPIRE를 사용하여 JSON 웹 토큰(JWT) 인증 구성
  4. 데모 애플리케이션 배포
  5. 비밀을 인증하고 검색합니다.

사전 요구 사항

  • Vault가 실행 중인지 확인하세요.
  • Vault가 초기화되지 않았는지 확인하세요. Vault 서버는 한 번만 초기화할 수 있습니다.

프로세스

  1. 다음 명령을 실행하여 볼트 포드에서 원격 셸을 엽니다.

    $ oc rsh -n vault statefulset/vault
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 Vault를 초기화하고 봉인 해제 키와 루트 토큰을 받으세요.

    $ vault operator init -key-shares=1 -key-threshold=1 -format=json
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 이전 명령에서 받은 봉인 해제 키와 루트 토큰을 내보냅니다.

    $ export UNSEAL_KEY=<Your-Unseal-Key>
    Copy to Clipboard Toggle word wrap
    $ export ROOT_TOKEN=<Your-Root-Token>
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 봉인 해제 키를 사용하여 Vault 봉인을 해제하세요.

    $ vault operator unseal -format=json $UNSEAL_KEY
    Copy to Clipboard Toggle word wrap
  5. exit 를 입력하여 포드에서 나가세요.

검증

  • Vault Pod가 준비되었는지 확인하려면 다음 명령을 실행하세요.

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

    출력 예

    NAME        READY        STATUS      RESTARTS     AGE
    vault-0     1/1          Running     0            65d
    Copy to Clipboard Toggle word wrap

10.5.2.3. 키-값 비밀 엔진 활성화 및 테스트 비밀 저장

키-값 비밀 엔진을 활성화하면 자격 증명을 관리하기 위한 안전하고 중앙화된 위치를 구축할 수 있습니다.

사전 요구 사항

  • Vault가 초기화되고 봉인이 해제되었는지 확인하세요.

프로세스

  1. 다음 명령을 실행하여 Vault 포드에서 다른 셸 세션을 엽니다.

    $ oc rsh -n vault statefulset/vault
    Copy to Clipboard Toggle word wrap
  2. 이 새로운 세션에서 루트 토큰을 다시 내보내고 다음 명령을 실행하여 로그인하세요.

    $ export ROOT_TOKEN=<Your-Root-Token>
    Copy to Clipboard Toggle word wrap
    $ vault login "${ROOT_TOKEN}"
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 secret/ 경로에서 KV secrets 엔진을 활성화하고 테스트 secrets를 만듭니다.

    $ export NAME=ztwim
    Copy to Clipboard Toggle word wrap
    $ vault secrets enable -path=secret kv
    Copy to Clipboard Toggle word wrap
    $ vault kv put secret/$NAME version=v0.1.0
    Copy to Clipboard Toggle word wrap

검증

  • 비밀이 올바르게 저장되었는지 확인하려면 다음 명령을 실행하세요.

    $ vault kv get secret/$NAME
    Copy to Clipboard Toggle word wrap

10.5.2.4. SPIRE를 사용하여 JSON 웹 토큰 인증 구성

SPIFFE ID를 사용하여 애플리케이션이 Vault에 안전하게 로그인할 수 있도록 JSON 웹 토큰(JWT) 인증을 설정해야 합니다.

사전 요구 사항

  • Vault가 초기화되고 봉인이 해제되었는지 확인하세요.
  • 테스트 비밀이 키-값 비밀 엔진에 저장되어 있는지 확인하세요.

프로세스

  1. 로컬 컴퓨터에서 SPIRE 인증 기관(CA) 번들을 검색하여 다음 명령을 실행하여 파일에 저장합니다.

    $ oc get cm -n zero-trust-workload-identity-manager spire-bundle -o jsonpath='{ .data.bundle\.crt }' > oidc_provider_ca.pem
    Copy to Clipboard Toggle word wrap
  2. Vault 포드 셸로 돌아와서 임시 파일을 만들고 다음 명령을 실행하여 oidc_provider_ca.pem 의 내용을 붙여넣습니다.

    $ cat << EOF > /tmp/oidc_provider_ca.pem
    -----BEGIN CERTIFICATE-----
    <Paste-Your-Certificate-Content-Here>
    -----END CERTIFICATE-----
    EOF
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 JWT 구성에 필요한 환경 변수를 설정합니다.

    $ export APP_DOMAIN=<Your-App-Domain>
    Copy to Clipboard Toggle word wrap
    $ export JWT_ISSUER_ENDPOINT="oidc-discovery.$APP_DOMAIN"
    Copy to Clipboard Toggle word wrap
    $ export OIDC_URL="https://$JWT_ISSUER_ENDPOINT"
    Copy to Clipboard Toggle word wrap
    $ export OIDC_CA_PEM="$(cat /tmp/oidc_provider_ca.pem)"
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 새 환경 변수를 생성합니다.

    $ export ROLE="${NAME}-role"
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 JWT 인증 방법을 활성화합니다.

    $ vault auth enable jwt
    Copy to Clipboard Toggle word wrap
  6. 다음 명령을 실행하여 ODIC 인증 방법을 구성하세요.

    $ vault write auth/jwt/config \
      oidc_discovery_url=$OIDC_URL \
      oidc_discovery_ca_pem="$OIDC_CA_PEM" \
      default_role=$ROLE
    Copy to Clipboard Toggle word wrap
  7. 다음 명령을 실행하여 ztwim-policy 라는 이름의 정책을 만듭니다.

    $ export POLICY="${NAME}-policy"
    Copy to Clipboard Toggle word wrap
  8. 다음 명령을 실행하여 이전에 만든 비밀에 대한 읽기 액세스 권한을 부여합니다.

    $ vault policy write $POLICY -<<EOF
    path "secret/$NAME" {
        capabilities = ["read"]
    }
    EOF
    Copy to Clipboard Toggle word wrap
  9. 다음 명령을 실행하여 다음 환경 변수를 만듭니다.

    $ export APP_NAME=client
    Copy to Clipboard Toggle word wrap
    $ export APP_NAMESPACE=demo
    Copy to Clipboard Toggle word wrap
    $ export AUDIENCE=$APP_NAME
    Copy to Clipboard Toggle word wrap
  10. 다음 명령을 실행하여 특정 SPIFFE ID를 사용하여 정책을 워크로드에 바인딩하는 JWT 역할을 만듭니다.

    $ vault write auth/jwt/role/$ROLE -<<EOF
    {
      "role_type": "jwt",
      "user_claim": "sub",
      "bound_audiences": "$AUDIENCE",
      "bound_claims_type": "glob",
      "bound_claims": {
        "sub": "spiffe://$APP_DOMAIN/ns/$APP_NAMESPACE/sa/$APP_NAME"
      },
      "token_ttl": "24h",
      "token_policies": "$POLICY"
    }
    EOF
    Copy to Clipboard Toggle word wrap

10.5.2.5. 데모 애플리케이션 배포

데모 애플리케이션을 배포할 때는 SPIFFE ID를 사용하여 Vault에서 인증하는 간단한 클라이언트 애플리케이션을 만듭니다.

프로세스

  1. 로컬 머신에서 다음 명령을 실행하여 애플리케이션의 환경 변수를 설정합니다.

    $ export APP_NAME=client
    Copy to Clipboard Toggle word wrap
    $ export APP_NAMESPACE=demo
    Copy to Clipboard Toggle word wrap
    $ export AUDIENCE=$APP_NAME
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 Kubernetes 매니페스트를 적용하여 데모 앱의 네임스페이스, 서비스 계정 및 배포를 생성합니다. 이 배포에서는 SPIFFE CSI 드라이버 소켓을 마운트합니다.

    $ oc apply -f - <<EOF
    # ... (paste the full YAML from your provided code here) ...
    EOF
    Copy to Clipboard Toggle word wrap

검증

  • 다음 명령을 실행하여 클라이언트 배포가 준비되었는지 확인하세요.

    $ oc get deploy -n $APP_NAMESPACE
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME             READY        UP-TO-DATE      AVAILABLE     AGE
    frontend-app     2/2          2               2             120d
    backend-api      3/3          3               3             120d
    Copy to Clipboard Toggle word wrap

10.5.2.6. 비밀 인증 및 검색

데모 애플리케이션을 사용하여 SPIFFE 워크로드 API에서 JWT 토큰을 가져오고 이를 사용하여 Vault에 로그인하고 비밀을 검색합니다.

프로세스

  1. 실행 중인 클라이언트 Pod 내에서 다음 명령을 실행하여 JWT-SVID를 가져옵니다.

    $ oc -n $APP_NAMESPACE exec -it $(oc get pod -o=jsonpath='{.items[*].metadata.name}' -l app=$APP_NAME -n $APP_NAMESPACE) \
      -- /opt/spire/bin/spire-agent api fetch jwt \
      -socketPath /run/spire/sockets/spire-agent.sock \
      -audience $AUDIENCE
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 출력에서 토큰을 복사하고 로컬 컴퓨터의 환경 변수로 내보냅니다.

    $ export IDENTITY_TOKEN=<Your-JWT-Token>
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 새 환경 변수를 생성합니다.

    $ export ROLE="${NAME}-role"
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 curl을 사용하여 JWT 토큰을 Vault 로그인 엔드포인트로 보내 Vault 클라이언트 토큰을 가져옵니다.

    $ VAULT_TOKEN=$(curl -s --request POST --data '{ "jwt": "'"${IDENTITY_TOKEN}"'", "role": "'"${ROLE}"'"}' "${VAULT_ADDR}"/v1/auth/jwt/login | jq -r '.auth.client_token')
    Copy to Clipboard Toggle word wrap

검증

  • 다음 명령을 실행하여 새로 획득한 Vault 토큰을 사용하여 KV 저장소에서 비밀을 읽습니다.

    $ curl -s -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/secret/$NAME | jq
    Copy to Clipboard Toggle word wrap

    출력에서 비밀 내용( "version": "v0.1.0" )이 표시되어 전체 워크플로가 성공했음을 확인해야 합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2025 Red Hat