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 발급자 구성을 참조하세요.
프로세스
다음 명령을 실행하여 참조된 비밀을 읽을 수 있는 라우터 서비스 계정 권한을 제공하는
역할을
만듭니다.oc create role secret-reader \ --verb=get,list,watch \ --resource=secrets \ --resource-name=$TLS_SECRET_NAME \ -n zero-trust-workload-identity-manager
$ 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 Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 새로 생성된 Role 리소스와 라우터 서비스 계정을 바인딩하는
RoleBinding
리소스를 만듭니다.oc create rolebinding secret-reader-binding \ --role=secret-reader \ --serviceaccount=openshift-ingress:router \ -n zero-trust-workload-identity-manager
$ oc create rolebinding secret-reader-binding \ --role=secret-reader \ --serviceaccount=openshift-ingress:router \ -n zero-trust-workload-identity-manager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 이전 단계에서 생성된 비밀을 참조하도록
SpireOIDCDIscoveryProvider
사용자 지정 리소스(CR) 개체를 구성합니다.oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
$ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p=' spec: externalSecretRef: ${TLS_SECRET_NAME} '
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
SpireOIDCDiscoveryProvider
CR에서 다음 명령을 실행하여ManageRouteReady
조건이True
로 설정되었는지 확인합니다.oc wait --for=jsonpath='{.status.conditions[?(@.type=="ManagedRouteReady")].status}'=True SpireOIDCDiscoveryProvider/cluster --timeout=120s
$ oc wait --for=jsonpath='{.status.conditions[?(@.type=="ManagedRouteReady")].status}'=True SpireOIDCDiscoveryProvider/cluster --timeout=120s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 HTTPS를 통해 OIDC 엔드포인트에 안전하게 액세스할 수 있는지 확인하세요.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.2. 관리되는 경로 비활성화 링크 복사링크가 클립보드에 복사되었습니다!
OIDC Discovery Provider 서비스 노출 동작을 완벽하게 제어하려면 요구 사항에 따라 관리되는 경로를 비활성화할 수 있습니다.
프로세스
OIDC Discovery Provider를 수동으로 구성하려면 다음 명령을 실행하여
managedRoute를
false
로 설정합니다.oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
$ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p=' spec: managedRoute: "false"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.3. Microsoft Azure에서 Entra ID 사용 링크 복사링크가 클립보드에 복사되었습니다!
Entra ID 구성이 완료되면 Azure에서 작동하도록 Entra ID를 설정할 수 있습니다.
사전 요구 사항
- 공개적으로 신뢰할 수 있는 CA에서 TLS 인증서를 제공하도록 SPIRE OIDC Discovery Provider Route를 구성했습니다.
프로세스
다음 명령을 실행하여 Azure에 로그인합니다.
az login
$ az login
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Azure 구독 및 테넌트에 대한 변수를 구성합니다.
export SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" -o tsv)
$ export SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" -o tsv)
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export TENANT_ID=$(az account list --query "[?isDefault].tenantId" -o tsv)
$ export TENANT_ID=$(az account list --query "[?isDefault].tenantId" -o tsv)
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export LOCATION=centralus
$ export LOCATION=centralus
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 리소스 변수 이름을 정의합니다.
export NAME=ztwim
$ export NAME=ztwim
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export RESOURCE_GROUP="${NAME}-rg"
$ export RESOURCE_GROUP="${NAME}-rg"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export STORAGE_ACCOUNT="${NAME}storage"
$ export STORAGE_ACCOUNT="${NAME}storage"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export STORAGE_CONTAINER="${NAME}storagecontainer"
$ export STORAGE_CONTAINER="${NAME}storagecontainer"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow export USER_ASSIGNED_IDENTITY_NAME="${NAME}-identity"
$ export USER_ASSIGNED_IDENTITY_NAME="${NAME}-identity"
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 리소스 그룹을 만듭니다.
az group create \ --name "${RESOURCE_GROUP}" \ --location "${LOCATION}"
$ az group create \ --name "${RESOURCE_GROUP}" \ --location "${LOCATION}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.4. Azure Blob 저장소 구성 링크 복사링크가 클립보드에 복사되었습니다!
콘텐츠를 저장하는 데 사용할 새로운 저장소 계정을 만들어야 합니다.
프로세스
다음 명령을 실행하여 콘텐츠를 저장하는 데 사용되는 새 저장소 계정을 만듭니다.
az storage account create \ --name ${STORAGE_ACCOUNT} \ --resource-group ${RESOURCE_GROUP} \ --location ${LOCATION} \ --encryption-services blob
$ az storage account create \ --name ${STORAGE_ACCOUNT} \ --resource-group ${RESOURCE_GROUP} \ --location ${LOCATION} \ --encryption-services blob
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 새로 생성된 스토리지 계정의 스토리지 ID를 얻습니다.
export STORAGE_ACCOUNT_ID=$(az storage account show -n ${STORAGE_ACCOUNT} -g ${RESOURCE_GROUP} --query id --out tsv)
$ export STORAGE_ACCOUNT_ID=$(az storage account show -n ${STORAGE_ACCOUNT} -g ${RESOURCE_GROUP} --query id --out tsv)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 새로 만든 스토리지 계정 내에 스토리지 컨테이너를 만들어 BLOB 저장을 지원하는 위치를 제공합니다.
az storage container create \ --account-name ${STORAGE_ACCOUNT} \ --name ${STORAGE_CONTAINER} \ --auth-mode login
$ az storage container create \ --account-name ${STORAGE_ACCOUNT} \ --name ${STORAGE_CONTAINER} \ --auth-mode login
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.5. Azure 사용자 관리 ID 구성 링크 복사링크가 클립보드에 복사되었습니다!
새로운 사용자 관리 ID를 만든 다음, 사용자 관리 ID와 연관된 서비스 주체의 클라이언트 ID를 얻어야 합니다.
프로세스
다음 명령을 실행하여 새로운 사용자 관리 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)
$ 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 Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Azure 사용자가 할당한 관리 ID의
CLIENT_ID를
검색하고 환경 변수로 저장합니다.export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
$ export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 사용자 관리 ID와 연결된 서비스 주체에 역할을 연결합니다.
az role assignment create \ --role "Storage Blob Data Contributor" \ --assignee "${IDENTITY_CLIENT_ID}" \ --scope ${STORAGE_ACCOUNT_ID}
$ az role assignment create \ --role "Storage Blob Data Contributor" \ --assignee "${IDENTITY_CLIENT_ID}" \ --scope ${STORAGE_ACCOUNT_ID}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.6. 데모 애플리케이션 만들기 링크 복사링크가 클립보드에 복사되었습니다!
데모 애플리케이션을 사용하면 전체 시스템이 제대로 작동하는지 확인할 수 있습니다.
프로세스
데모 애플리케이션을 만들려면 다음 단계를 완료하세요.
다음 명령을 실행하여 애플리케이션 이름과 네임스페이스를 설정합니다.
export APP_NAME=workload-app
$ export APP_NAME=workload-app
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export APP_NAMESPACE=demo
$ export APP_NAMESPACE=demo
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 네임스페이스를 생성합니다.
oc create namespace $APP_NAMESPACE
$ oc create namespace $APP_NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 애플리케이션 Secret을 생성합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.7. 워크로드 애플리케이션 배포 링크 복사링크가 클립보드에 복사되었습니다!
데모 애플리케이션이 생성되면,
사전 요구 사항
- 데모 애플리케이션이 생성되어 배포되었습니다.
프로세스
애플리케이션을 배포하려면 제공된 명령 블록 전체를 복사하여 터미널에 직접 붙여넣으세요. Enter 키를 누르세요.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여
workload-app
pod가 성공적으로 실행되는지 확인하세요.oc get pods -n $APP_NAMESPACE
$ oc get pods -n $APP_NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME READY STATUS RESTARTS AGE workload-app-5f8b9d685b-abcde 1/1 Running 0 60s
NAME READY STATUS RESTARTS AGE workload-app-5f8b9d685b-abcde 1/1 Running 0 60s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SPIFFE JWT 토큰(SVID-JWT)을 검색합니다.
다음 명령을 실행하여 포드 이름을 동적으로 가져옵니다.
POD_NAME=$(oc get pods -n $APP_NAMESPACE -l app=$APP_NAME -o jsonpath='{.items[0].metadata.name}')
$ POD_NAME=$(oc get pods -n $APP_NAMESPACE -l app=$APP_NAME -o jsonpath='{.items[0].metadata.name}')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 포드 내부에서 스크립트를 실행합니다.
oc exec -it $POD_NAME -n $APP_NAMESPACE -- \ /opt/app-root/src/get-spiffe-token.py -a "api://AzureADTokenExchange"
$ oc exec -it $POD_NAME -n $APP_NAMESPACE -- \ /opt/app-root/src/get-spiffe-token.py -a "api://AzureADTokenExchange"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.8. SPIFFE ID 페더레이션을 사용하여 Azure 구성 링크 복사링크가 클립보드에 복사되었습니다!
SPIFFE ID 페더레이션을 사용하여 Azure를 구성하면 데모 애플리케이션에 암호 없이 자동으로 인증할 수 있습니다.
프로세스
다음 명령을 실행하여 사용자 관리 ID와 워크로드 애플리케이션과 연결된 SPIFFE ID 간의 ID를 연합합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.1.9. 애플리케이션 워크로드가 Azure Blob Storage의 콘텐츠에 액세스할 수 있는지 확인 링크 복사링크가 클립보드에 복사되었습니다!
애플리케이션 워크로드가 Azure Blob Storage에 액세스할 수 있는지 확인할 수 있습니다.
사전 요구 사항
- Azure Blob Storage가 생성되었습니다.
프로세스
다음 명령을 실행하여 SPIFFE 워크로드 API에서 JWT 토큰을 검색합니다.
oc rsh -n $APP_NAMESPACE deployment/$APP_NAME
$ oc rsh -n $APP_NAMESPACE deployment/$APP_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
TOKEN
이라는 환경 변수를 만들고 내보냅니다.export TOKEN=$(/opt/app-root/src/get-spiffe-token.py --audience=$AZURE_AUDIENCE)
$ export TOKEN=$(/opt/app-root/src/get-spiffe-token.py --audience=$AZURE_AUDIENCE)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Pod에 포함된 Azure CLI에 로그인합니다.
az login --service-principal \ -t ${AZURE_TENANT_ID} \ -u ${AZURE_CLIENT_ID} \ --federated-token ${TOKEN}
$ az login --service-principal \ -t ${AZURE_TENANT_ID} \ -u ${AZURE_CLIENT_ID} \ --federated-token ${TOKEN}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 애플리케이션 워크로드 포드로 새 파일을 만들고 Blob Storage에 파일을 업로드합니다.
echo “Hello from OpenShift” > openshift-spire-federated-identities.txt
$ echo “Hello from OpenShift” > openshift-spire-federated-identities.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Azure Blog Storage에 파일을 업로드합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여 포함된 파일을 나열하여 파일이 성공적으로 업로드되었는지 확인하세요.
az storage blob list \ --account-name ${BLOB_STORE_ACCOUNT} \ --container-name ${BLOB_STORE_CONTAINER} \ --auth-mode login \ -o table
$ az storage blob list \ --account-name ${BLOB_STORE_ACCOUNT} \ --container-name ${BLOB_STORE_CONTAINER} \ --auth-mode login \ -o table
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 저장소가 추가되었습니다.
프로세스
vault-helm-value.yaml
파일을 만듭니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow helm install
명령을 실행합니다:helm install vault hashicorp/vault \ --create-namespace -n vault \ --values ./vault-helm-value.yaml
$ helm install vault hashicorp/vault \ --create-namespace -n vault \ --values ./vault-helm-value.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Vault 서비스를 노출합니다.
oc expose service vault -n vault
$ oc expose service vault -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow VAULT_ADDR
환경 변수를 설정하여 새 경로에서 호스트 이름을 검색한 다음 다음 명령을 실행하여 내보냅니다.export VAULT_ADDR="http://$(oc get route vault -n vault -o jsonpath='{.spec.host}')"
$ export VAULT_ADDR="http://$(oc get route vault -n vault -o jsonpath='{.spec.host}')"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고TLS가 비활성화되어 있으므로
http://
가 앞에 붙습니다.
검증
Vault 인스턴스가 실행 중인지 확인하려면 다음 명령을 실행하세요.
curl -s $VAULT_ADDR/v1/sys/health | jq
$ curl -s $VAULT_ADDR/v1/sys/health | jq
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.2. Vault 초기화 및 봉인 해제 링크 복사링크가 클립보드에 복사되었습니다!
새로 설치된 금고가 봉쇄되었습니다. 즉, 다른 모든 암호화 키를 보호하는 기본 암호화 키는 시작 시 서버 메모리에 로드되지 않습니다. 봉인을 해제하려면 Vault를 초기화해야 합니다.
Vault 서버를 초기화하는 단계는 다음과 같습니다.
- Vault 초기화 및 봉인 해제
- 키-값(KV) 비밀 엔진을 활성화하고 테스트 비밀을 저장합니다.
- SPIRE를 사용하여 JSON 웹 토큰(JWT) 인증 구성
- 데모 애플리케이션 배포
- 비밀을 인증하고 검색합니다.
사전 요구 사항
- Vault가 실행 중인지 확인하세요.
- Vault가 초기화되지 않았는지 확인하세요. Vault 서버는 한 번만 초기화할 수 있습니다.
프로세스
다음 명령을 실행하여
볼트
포드에서 원격 셸을 엽니다.oc rsh -n vault statefulset/vault
$ oc rsh -n vault statefulset/vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Vault를 초기화하고 봉인 해제 키와 루트 토큰을 받으세요.
vault operator init -key-shares=1 -key-threshold=1 -format=json
$ vault operator init -key-shares=1 -key-threshold=1 -format=json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 이전 명령에서 받은 봉인 해제 키와 루트 토큰을 내보냅니다.
export UNSEAL_KEY=<Your-Unseal-Key>
$ export UNSEAL_KEY=<Your-Unseal-Key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export ROOT_TOKEN=<Your-Root-Token>
$ export ROOT_TOKEN=<Your-Root-Token>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 봉인 해제 키를 사용하여 Vault 봉인을 해제하세요.
vault operator unseal -format=json $UNSEAL_KEY
$ vault operator unseal -format=json $UNSEAL_KEY
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
exit 를
입력하여 포드에서 나가세요.
검증
Vault Pod가 준비되었는지 확인하려면 다음 명령을 실행하세요.
oc get pod -n vault
$ oc get pod -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 65d
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 65d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.3. 키-값 비밀 엔진 활성화 및 테스트 비밀 저장 링크 복사링크가 클립보드에 복사되었습니다!
키-값 비밀 엔진을 활성화하면 자격 증명을 관리하기 위한 안전하고 중앙화된 위치를 구축할 수 있습니다.
사전 요구 사항
- Vault가 초기화되고 봉인이 해제되었는지 확인하세요.
프로세스
다음 명령을 실행하여
Vault
포드에서 다른 셸 세션을 엽니다.oc rsh -n vault statefulset/vault
$ oc rsh -n vault statefulset/vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이 새로운 세션에서 루트 토큰을 다시 내보내고 다음 명령을 실행하여 로그인하세요.
export ROOT_TOKEN=<Your-Root-Token>
$ export ROOT_TOKEN=<Your-Root-Token>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault login "${ROOT_TOKEN}"
$ vault login "${ROOT_TOKEN}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
secret/
경로에서 KV secrets 엔진을 활성화하고 테스트 secrets를 만듭니다.export NAME=ztwim
$ export NAME=ztwim
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault secrets enable -path=secret kv
$ vault secrets enable -path=secret kv
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault kv put secret/$NAME version=v0.1.0
$ vault kv put secret/$NAME version=v0.1.0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
비밀이 올바르게 저장되었는지 확인하려면 다음 명령을 실행하세요.
vault kv get secret/$NAME
$ vault kv get secret/$NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.4. SPIRE를 사용하여 JSON 웹 토큰 인증 구성 링크 복사링크가 클립보드에 복사되었습니다!
SPIFFE ID를 사용하여 애플리케이션이 Vault에 안전하게 로그인할 수 있도록 JSON 웹 토큰(JWT) 인증을 설정해야 합니다.
사전 요구 사항
- Vault가 초기화되고 봉인이 해제되었는지 확인하세요.
- 테스트 비밀이 키-값 비밀 엔진에 저장되어 있는지 확인하세요.
프로세스
로컬 컴퓨터에서 SPIRE 인증 기관(CA) 번들을 검색하여 다음 명령을 실행하여 파일에 저장합니다.
oc get cm -n zero-trust-workload-identity-manager spire-bundle -o jsonpath='{ .data.bundle\.crt }' > oidc_provider_ca.pem
$ oc get cm -n zero-trust-workload-identity-manager spire-bundle -o jsonpath='{ .data.bundle\.crt }' > oidc_provider_ca.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vault 포드 셸로 돌아와서 임시 파일을 만들고 다음 명령을 실행하여
oidc_provider_ca.pem
의 내용을 붙여넣습니다.cat << EOF > /tmp/oidc_provider_ca.pem -----BEGIN CERTIFICATE----- <Paste-Your-Certificate-Content-Here> -----END CERTIFICATE----- EOF
$ cat << EOF > /tmp/oidc_provider_ca.pem -----BEGIN CERTIFICATE----- <Paste-Your-Certificate-Content-Here> -----END CERTIFICATE----- EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 JWT 구성에 필요한 환경 변수를 설정합니다.
export APP_DOMAIN=<Your-App-Domain>
$ export APP_DOMAIN=<Your-App-Domain>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export JWT_ISSUER_ENDPOINT="oidc-discovery.$APP_DOMAIN"
$ export JWT_ISSUER_ENDPOINT="oidc-discovery.$APP_DOMAIN"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export OIDC_URL="https://$JWT_ISSUER_ENDPOINT"
$ export OIDC_URL="https://$JWT_ISSUER_ENDPOINT"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export OIDC_CA_PEM="$(cat /tmp/oidc_provider_ca.pem)"
$ export OIDC_CA_PEM="$(cat /tmp/oidc_provider_ca.pem)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 새 환경 변수를 생성합니다.
export ROLE="${NAME}-role"
$ export ROLE="${NAME}-role"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 JWT 인증 방법을 활성화합니다.
vault auth enable jwt
$ vault auth enable jwt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 ODIC 인증 방법을 구성하세요.
vault write auth/jwt/config \ oidc_discovery_url=$OIDC_URL \ oidc_discovery_ca_pem="$OIDC_CA_PEM" \ default_role=$ROLE
$ vault write auth/jwt/config \ oidc_discovery_url=$OIDC_URL \ oidc_discovery_ca_pem="$OIDC_CA_PEM" \ default_role=$ROLE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
ztwim-policy
라는 이름의 정책을 만듭니다.export POLICY="${NAME}-policy"
$ export POLICY="${NAME}-policy"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 이전에 만든 비밀에 대한 읽기 액세스 권한을 부여합니다.
vault policy write $POLICY -<<EOF path "secret/$NAME" { capabilities = ["read"] } EOF
$ vault policy write $POLICY -<<EOF path "secret/$NAME" { capabilities = ["read"] } EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 다음 환경 변수를 만듭니다.
export APP_NAME=client
$ export APP_NAME=client
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export APP_NAMESPACE=demo
$ export APP_NAMESPACE=demo
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export AUDIENCE=$APP_NAME
$ export AUDIENCE=$APP_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 특정 SPIFFE ID를 사용하여 정책을 워크로드에 바인딩하는 JWT 역할을 만듭니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.5. 데모 애플리케이션 배포 링크 복사링크가 클립보드에 복사되었습니다!
데모 애플리케이션을 배포할 때는 SPIFFE ID를 사용하여 Vault에서 인증하는 간단한 클라이언트 애플리케이션을 만듭니다.
프로세스
로컬 머신에서 다음 명령을 실행하여 애플리케이션의 환경 변수를 설정합니다.
export APP_NAME=client
$ export APP_NAME=client
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export APP_NAMESPACE=demo
$ export APP_NAMESPACE=demo
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export AUDIENCE=$APP_NAME
$ export AUDIENCE=$APP_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Kubernetes 매니페스트를 적용하여 데모 앱의 네임스페이스, 서비스 계정 및 배포를 생성합니다. 이 배포에서는 SPIFFE CSI 드라이버 소켓을 마운트합니다.
oc apply -f - <<EOF ... (paste the full YAML from your provided code here) ... EOF
$ oc apply -f - <<EOF # ... (paste the full YAML from your provided code here) ... EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여 클라이언트 배포가 준비되었는지 확인하세요.
oc get deploy -n $APP_NAMESPACE
$ oc get deploy -n $APP_NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME READY UP-TO-DATE AVAILABLE AGE frontend-app 2/2 2 2 120d backend-api 3/3 3 3 120d
NAME READY UP-TO-DATE AVAILABLE AGE frontend-app 2/2 2 2 120d backend-api 3/3 3 3 120d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5.2.6. 비밀 인증 및 검색 링크 복사링크가 클립보드에 복사되었습니다!
데모 애플리케이션을 사용하여 SPIFFE 워크로드 API에서 JWT 토큰을 가져오고 이를 사용하여 Vault에 로그인하고 비밀을 검색합니다.
프로세스
실행 중인 클라이언트 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
$ 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 Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 출력에서 토큰을 복사하고 로컬 컴퓨터의 환경 변수로 내보냅니다.
export IDENTITY_TOKEN=<Your-JWT-Token>
$ export IDENTITY_TOKEN=<Your-JWT-Token>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 새 환경 변수를 생성합니다.
export ROLE="${NAME}-role"
$ export ROLE="${NAME}-role"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
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')
$ 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 Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여 새로 획득한 Vault 토큰을 사용하여 KV 저장소에서 비밀을 읽습니다.
curl -s -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/secret/$NAME | jq
$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/secret/$NAME | jq
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력에서 비밀 내용(
"version": "v0.1.0"
)이 표시되어 전체 워크플로가 성공했음을 확인해야 합니다.