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를 생성했습니다. 예를 들어 자동화된 인증서 관리 환경(ACME)은 "Let's Encrypt ACME" 서비스가 있는Issuer
발급
자를 입력합니다. 자세한 내용은 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 검색 공급자 서비스 노출 동작을 완전히 제어하려면 요구 사항에 따라 관리 경로를 비활성화할 수 있습니다.
프로세스
OIDC 검색 공급자를 수동으로 구성하려면 다음 명령을 실행하여
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 검색 공급자 경로를 구성했습니다.
프로세스
다음 명령을 실행하여 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 다음 명령을 실행하여 애플리케이션 시크릿을 생성합니다.
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 이름을 동적으로 가져옵니다.
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 다음 명령을 실행하여 Pod 내에서 스크립트를 실행합니다.
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 스토리지가 생성되었습니다.
프로세스
다음 명령을 실행하여 SPIFFE Workload 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 다음 명령을 실행하여 애플리케이션 워크로드 Pod를 사용하여 새 파일을 생성하고 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 블로그 스토리지에 파일을 업로드합니다.
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 서버를 초기화하는 단계는 다음과 같습니다.
- Vault 초기화 및 해제
- KV(key-value) 시크릿 엔진을 활성화하고 테스트 시크릿을 저장합니다.
- SPIRE를 사용하여 JSON 웹 토큰(JWT) 인증 구성
- 데모 애플리케이션 배포
- 시크릿 인증 및 검색
사전 요구 사항
- Vault가 실행 중인지 확인합니다.
- Vault가 초기화되지 않았는지 확인합니다. Vault 서버를 한 번만 초기화할 수 있습니다.
프로세스
다음 명령을 실행하여
vault
Pod에 대한 원격 쉘을 엽니다.oc rsh -n vault statefulset/vault
$ oc rsh -n vault statefulset/vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 Vault를 초기화하여 unseal 키 및 root 토큰을 가져옵니다.
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 다음 명령을 실행하여 이전 명령에서 받은 unseal 키 및 root 토큰을 내보냅니다.
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 다음 명령을 실행하여 unseal 키를 사용하여 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
를 입력하여 Pod를 종료합니다.
검증
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
Pod에서 다른 쉘 세션을 엽니다.oc rsh -n vault statefulset/vault
$ oc rsh -n vault statefulset/vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이 새 세션 내에서 root 토큰을 다시 내보내고 다음 명령을 실행하여 로그인합니다.
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 시크릿
/ 경로에서 KV 시크릿
엔진을 활성화하고 다음 명령을 실행하여 테스트 시크릿을 생성합니다.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 Pod 쉘로 돌아가 임시 파일을 생성하고 다음 명령을 실행하여
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 Workload 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 다음 명령을 실행하여 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')
$ 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"
)가 표시되어 전체 워크플로우가 성공했는지 확인해야 합니다.