10.5. 제로 트러스트 워크로드 ID 관리자 OIDC 페더레이션


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

중요

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

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

다음 공급자는 SPIRE OIDC 페더레이션과 함께 작동하는 것으로 확인됩니다.

  • Azure Entra ID
  • Vault

10.5.1. Entra ID OpenID Connect 정보

Entra ID는 사용자 관리 및 액세스 제어를 중앙 집중화하는 클라우드 기반 ID 및 액세스 관리 서비스입니다. Entra ID는 ID 공급자 역할을 하며, 애플리케이션에 대한 사용자 ID 및 발행 및 ID 토큰을 확인합니다. 이 토큰에는 필수 사용자 정보가 있어 애플리케이션이 사용자 자격 증명을 관리하지 않고 사용자를 확인할 수 있습니다.

OIDC(Entra ID OpenID Connect)를 SPIRE와 통합하면 워크로드에서 수명이 짧은 자동 암호화 ID를 제공합니다. SPIRE-issued ID는 정적 보안 없이 서비스를 안전하게 인증하기 위해 Entra ID로 전송됩니다.

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

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

사전 요구 사항

  • Zero Trust Workload Identity Manager 0.2.0 이상을 설치했습니다.
  • 클러스터에 SPIRE 에이전트, SPIFFEE CSI Driver 및 SPIRE OIDC 검색 공급자 피연산자를 배포했습니다.
  • cert-manager Operator for Red Hat OpenShift가 설치되어 있습니다. 자세한 내용은 cert-manager Operator for Red Hat OpenShift를 설치합니다.
  • 공개적으로 신뢰할 수 있는 CA 서비스로 구성된 Cluster Issuer 또는 Issuer를 생성했습니다. 예를 들어 자동화된 인증서 관리 환경(ACME)은 "Let's Encrypt 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 검색 공급자 서비스 노출 동작을 완전히 제어하려면 요구 사항에 따라 관리 경로를 비활성화할 수 있습니다.

프로세스

  • OIDC 검색 공급자를 수동으로 구성하려면 다음 명령을 실행하여 managedRoutefalse 로 설정합니다.

    $ 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 검색 공급자 경로를 구성했습니다.

프로세스

  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. 다음 명령을 실행하여 애플리케이션 시크릿을 생성합니다.

    $ 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 이름을 동적으로 가져옵니다.

      $ 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. 다음 명령을 실행하여 Pod 내에서 스크립트를 실행합니다.

      $ 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 스토리지가 생성되었습니다.

프로세스

  1. 다음 명령을 실행하여 SPIFFE Workload 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. 다음 명령을 실행하여 애플리케이션 워크로드 Pod를 사용하여 새 파일을 생성하고 Blob Storage에 파일을 업로드합니다.

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

    $ 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 Pod를 배포합니다.
    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를 초기화해야 합니다.

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

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

사전 요구 사항

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

프로세스

  1. 다음 명령을 실행하여 vault Pod에 대한 원격 쉘을 엽니다.

    $ oc rsh -n vault statefulset/vault
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 Vault를 초기화하여 unseal 키 및 root 토큰을 가져옵니다.

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

    $ 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. 다음 명령을 실행하여 unseal 키를 사용하여 Vault를 봉인 해제합니다.

    $ vault operator unseal -format=json $UNSEAL_KEY
    Copy to Clipboard Toggle word wrap
  5. exit 를 입력하여 Pod를 종료합니다.

검증

  • 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 Pod에서 다른 쉘 세션을 엽니다.

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

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

    $ 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 Pod 쉘로 돌아가 임시 파일을 생성하고 다음 명령을 실행하여 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 Workload 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. 다음 명령을 실행하여 Vault 클라이언트 토큰을 가져오려면 curl 을 사용하여 JWT 토큰을 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