AKS(Azure Kubernetes Service) 클러스터(미리 보기)에 배포하기 전에 이미지 무결성을 사용하여 서명된 이미지의 유효성을 검사합니다.
AKS(Azure Kubernetes Service) 및 기본 컨테이너 모델은 클라우드 네이티브 애플리케이션의 확장성과 관리 효율성을 향상합니다. AKS를 사용하면 시스템의 런타임 요구에 따라 유연한 소프트웨어 애플리케이션을 시작할 수 있습니다. 그러나 이러한 유연성은 새로운 과제를 도입할 수 있습니다.
이러한 애플리케이션 환경에서 서명된 컨테이너 이미지를 사용하면 배포가 신뢰할 수 있는 엔터티에서 빌드되고 이미지가 생성된 이후에 변조되지 않았는지 확인하는 데 도움이 됩니다. 이미지 무결성은 서명된 이미지만 AKS 클러스터에 배포되는지 확인하기 위해 Azure Policy 기본 제공 정의를 추가할 수 있는 서비스입니다.
참고 항목
이미지 무결성은 Ratify를 기반으로 하는 기능입니다. AKS 클러스터에서 기능 이름 및 속성 이름은 ImageIntegrity
이고 관련 이미지 무결성 Pod의 이름에는 Ratify
가 포함됩니다.
Important
AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.
필수 구성 요소
Azure 구독 Azure 구독이 없는 경우 무료 계정을 만들 수 있습니다.
aks-preview
CLI 확장 버전 0.5.96 이상.클러스터에서 AKS에 대한 Azure Policy 추가 기능이 사용하도록 설정되어 있는지 확인합니다. 이 추가 기능이 설치되어 있지 않은 경우 AKS용 Azure Policy 추가 기능 설치를 참조하세요.
OIDC 발급자로 사용하도록 설정된 AKS 클러스터. 새 클러스터를 만들거나 기존 클러스터를 업데이트하려면 OIDC 발급자를 사용하여 AKS 클러스터 구성을 참조하세요.
Azure 구독에 등록된
EnableImageIntegrityPreview
및AKS-AzurePolicyExternalData
기능 플래그. 다음 명령을 실행하여 기능 플래그를 등록합니다.az feature register
명령을 사용하여EnableImageIntegrityPreview
및AKS-AzurePolicyExternalData
기능 플래그를 등록합니다.# Register the EnableImageIntegrityPreview feature flag az feature register --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview" # Register the AKS-AzurePolicyExternalData feature flag az feature register --namespace "Microsoft.ContainerService" --name "AKS-AzurePolicyExternalData"
상태가 등록됨으로 표시되는 데 몇 분 정도 걸릴 수 있습니다.
또한
az feature show
명령을 사용하여 등록 상태를 확인합니다.# Verify the EnableImageIntegrityPreview feature flag registration status az feature show --namespace "Microsoft.ContainerService" --name "EnableImageIntegrityPreview" # Verify the AKS-AzurePolicyExternalData feature flag registration status az feature show --namespace "Microsoft.ContainerService" --name "AKS-AzurePolicyExternalData"
상태가 등록됨으로 표시되면
az provider register
명령을 사용하여Microsoft.ContainerService
리소스 공급자의 등록을 새로 고칩니다.az provider register --namespace Microsoft.ContainerService
고려 사항 및 제한 사항
- AKS 클러스터는 Kubernetes 버전 1.26 이상을 실행해야 합니다.
- 프로덕션 ACR(Azure Container Registry) 레지스트리 또는 워크로드에는 이 기능을 사용하면 안 됩니다.
- 이미지 무결성은 클러스터 전체에서 동시에 최대 200개의 고유한 서명을 지원합니다.
- 표기법은 유일하게 지원되는 검증 도구입니다.
- 감사는 유일하게 지원되는 확인 정책 효과입니다.
이미지 무결성 작동 방식
이미지 무결성은 Ratify, Azure Policy 및 Gatekeeper를 사용하여 AKS 클러스터에 배포하기 전에 서명된 이미지의 유효성을 검사합니다. 클러스터에서 이미지 무결성을 사용하도록 설정하면 Ratify
Pod가 배포됩니다. 이 Ratify
Pod가 수행하는 작업은 다음과 같습니다.
Ratify
CRD를 통해 설정한 구성에 따라 Azure Key Vault의 인증서를 조정합니다.- Azure Policy에서 유효성 검사 요청을 받으면 ACR에 저장된 이미지에 액세스합니다. 이 환경을 사용하도록 설정하기 위해 Azure Policy는 OPA(Open Policy Agent)에 대한 허용 컨트롤러 웹후크인 Gatekeeper를 확장합니다.
- 대상 이미지가 신뢰할 수 있는 인증서로 서명되어 신뢰할 수 있는 것으로 간주되는지 여부를 결정합니다.
AzurePolicy
및Gatekeeper
는 유효성 검사 결과를 준수 상태로 사용하여 배포 요청을 허용할지 여부를 결정합니다.
AKS 클러스터에서 이미지 무결성 사용
참고 항목
이미지 서명 확인은 거버넌스 지향 시나리오이며 Azure Policy를 활용하여 AKS 클러스터의 이미지 서명을 대규모로 확인합니다. Azure Policy의 기본 제공 정의 라이브러리에서 사용할 수 있는 AKS의 이미지 무결성 기본 제공 Azure Policy 이니셔티브를 사용하는 것이 좋습니다.
az policy assignment create
명령을 사용하여 AKS 정책 이니셔티브[Preview]: Use Image Integrity to ensure only trusted images are deployed
으로 정책 할당을 만듭니다.export SCOPE="/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}" export LOCATION=$(az group show --name ${RESOURCE_GROUP} --query location -o tsv) az policy assignment create --name 'deploy-trustedimages' --policy-set-definition 'af28bf8b-c669-4dd3-9137-1e68fdc61bd6' --display-name 'Audit deployment with unsigned container images' --scope ${SCOPE} --mi-system-assigned --role Contributor --identity-scope ${SCOPE} --location ${LOCATION}
Ratify
Pod는 이 기능을 사용하도록 설정한 후에 배포됩니다.
참고 항목
이 정책은 클러스터에서 업데이트 작업을 검색할 때 클러스터에 이미지 무결성 기능을 배포합니다. 기능을 즉시 사용하도록 설정하려면 az policy remediation create
명령을 사용하여 정책 수정을 만들어야 합니다.
assignment_id=$(az policy assignment show --name 'deploy-trustedimages' --scope ${SCOPE} --query id -o tsv)
az policy remediation create --policy-assignment "$assignment_id" --definition-reference-id deployAKSImageIntegrity --name remediation --resource-group ${RESOURCE_GROUP}
확인 구성 설정
이미지 무결성이 대상 서명된 이미지를 제대로 확인하려면 kubectl
을 사용하여 K8s CRD를 통해 Ratify
구성을 설정해야 합니다.
이 문서에서는 공식 Ratify 설명서의 자체 서명된 CA 인증서를 사용하여 확인 구성을 설정합니다. 자세한 예제는 Ratify CRD를 참조하세요.
verify-config.yaml
이라는VerifyConfig
파일을 만들고 다음 YAML에 복사합니다.apiVersion: config.ratify.deislabs.io/v1beta1 kind: CertificateStore metadata: name: certstore-inline spec: provider: inline parameters: value: | -----BEGIN CERTIFICATE----- MIIDQzCCAiugAwIBAgIUDxHQ9JxxmnrLWTA5rAtIZCzY8mMwDQYJKoZIhvcNAQEL BQAwKTEPMA0GA1UECgwGUmF0aWZ5MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMB4X DTIzMDYyOTA1MjgzMloXDTMzMDYyNjA1MjgzMlowKTEPMA0GA1UECgwGUmF0aWZ5 MRYwFAYDVQQDDA1SYXRpZnkgU2FtcGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAshmsL2VM9ojhgTVUUuEsZro9jfI27VKZJ4naWSHJihmOki7IoZS8 3/3ATpkE1lGbduJ77M9UxQbEW1PnESB0bWtMQtjIbser3mFCn15yz4nBXiTIu/K4 FYv6HVdc6/cds3jgfEFNw/8RVMBUGNUiSEWa1lV1zDM2v/8GekUr6SNvMyqtY8oo ItwxfUvlhgMNlLgd96mVnnPVLmPkCmXFN9iBMhSce6sn6P9oDIB+pr1ZpE4F5bwa gRBg2tWN3Tz9H/z2a51Xbn7hCT5OLBRlkorHJl2HKKRoXz1hBgR8xOL+zRySH9Qo 3yx6WvluYDNfVbCREzKJf9fFiQeVe0EJOwIDAQABo2MwYTAdBgNVHQ4EFgQUKzci EKCDwPBn4I1YZ+sDdnxEir4wHwYDVR0jBBgwFoAUKzciEKCDwPBn4I1YZ+sDdnxE ir4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQEL BQADggEBAGh6duwc1MvV+PUYvIkDfgj158KtYX+bv4PmcV/aemQUoArqM1ECYFjt BlBVmTRJA0lijU5I0oZje80zW7P8M8pra0BM6x3cPnh/oZGrsuMizd4h5b5TnwuJ hRvKFFUVeHn9kORbyQwRQ5SpL8cRGyYp+T6ncEmo0jdIOM5dgfdhwHgb+i3TejcF 90sUs65zovUjv1wa11SqOdu12cCj/MYp+H8j2lpaLL2t0cbFJlBY6DNJgxr5qync cz8gbXrZmNbzC7W5QK5J7fcx6tlffOpt5cm427f9NiK2tira50HU7gC3HJkbiSTp Xw10iXXMZzSbQ0/Hj2BF4B40WfAkgRg= -----END CERTIFICATE----- --- apiVersion: config.ratify.deislabs.io/v1beta1 kind: Store metadata: name: store-oras spec: name: oras # If you want to you use Workload Identity for Ratify to access Azure Container Registry, # uncomment the following lines, and fill the proper ClientID: # See more: https://ratify.dev/docs/reference/oras-auth-provider # parameters: # authProvider: # name: azureWorkloadIdentity # clientID: XXX --- apiVersion: config.ratify.deislabs.io/v1beta1 kind: Verifier metadata: name: verifier-notary-inline spec: name: notation artifactTypes: application/vnd.cncf.notary.signature parameters: verificationCertStores: # certificates for validating signatures certs: # name of the trustStore - certstore-inline # name of the certificate store CRD to include in this trustStore trustPolicyDoc: # policy language that indicates which identities are trusted to produce artifacts version: "1.0" trustPolicies: - name: default registryScopes: - "*" signatureVerification: level: strict trustStores: - ca:certs trustedIdentities: - "*"
kubectl apply
명령을 사용하여 클러스터에VerifyConfig
를 적용합니다.kubectl apply -f verify-config.yaml
AKS 클러스터에 샘플 이미지 배포
kubectl run demo
명령을 사용하여 서명된 이미지를 배포합니다.kubectl run demo-signed --image=ghcr.io/deislabs/ratify/notary-image:signed
다음 예제 출력은 이미지 무결성을 사용하여 배포할 수 있음을 보여 줍니다.
ghcr.io/deislabs/ratify/notary-image:signed pod/demo-signed created
사용자 고유의 이미지를 사용하려면 이미지 서명에 대한 지침을 참조하세요.
이미지 무결성 사용 안 함
--disable-image-integrity
플래그가 있는az aks update
명령을 사용하여 클러스터에서 이미지 무결성을 사용하지 않도록 설정합니다.az aks update --resource-group myResourceGroup --name MyManagedCluster --disable-image-integrity
정책 이니셔티브 제거
az policy assignment delete
명령을 사용하여 정책 이니셔티브를 제거합니다.az policy assignment delete --name 'deploy-trustedimages'
다음 단계
이 문서에서는 이미지 무결성을 사용하여 서명된 이미지의 유효성을 검사한 후 AKS(Azure Kubernetes Service) 클러스터에 배포하는 방법을 알아보았습니다. 고유한 컨테이너에 서명하는 방법을 알아보려면 Notary 및 Azure Key Vault(미리 보기)를 사용하여 컨테이너 이미지 빌드, 서명 및 확인을 참조하세요.
Azure Kubernetes Service