Azure Kubernetes Service의 Istio 기반 서비스 메시 추가 기능을 위한 CA 인증서 플러그 인

Azure Kubernetes Service용 Istio 기반 서비스 메시 추가 기능에서 기본적으로 Istio CA(인증 기관)는 자체 서명된 루트 인증서와 키를 생성하고 이를 사용하여 워크로드 인증서에 서명합니다. 루트 CA 키를 보호하려면 오프라인으로 보안 컴퓨터에서 실행되는 루트 CA를 사용해야 합니다. 루트 CA를 사용하여 각 클러스터에서 실행되는 Istio CA에 중간 인증서를 발급할 수 있습니다. Istio CA는 관리자가 지정한 인증서와 키를 사용하여 워크로드 인증서에 서명하고 관리자가 지정한 루트 인증서를 신뢰할 수 있는 루트로 워크로드에 배포할 수 있습니다. 이 문서에서는 Azure Kubernetes Service용 Istio 기반 서비스 메시 추가 기능에서 Istio CA에 대한 자체 인증서와 키를 가져오는 방법을 설명합니다.

Istio를 사용한 루트 및 중간 CA를 보여 주는 다이어그램.

이 문서에서는 Azure Key Vault를 사용하여 Istio 기반 서비스 메시 추가 기능에 대한 입력으로 제공되는 루트 인증서, 서명 인증서 및 키를 사용하여 Istio 인증 기관을 구성하는 방법을 설명합니다.

시작하기 전에

Azure CLI 버전 확인

추가 기능을 사용하려면 Azure CLI 버전 2.57.0 이상이 설치되어 있어야 합니다. az --version을 실행하여 버전을 확인할 수 있습니다. 설치 또는 업그레이드하려면 [Azure CLI 설치][azure-cli-install]을 참조하세요.

Azure Key Vault 설정

  1. Istio 추가 기능에 인증서와 키 입력을 제공하려면 Azure Key Vault 리소스가 필요합니다.

  2. 루트 인증서, 중간 인증서, 중간 키 및 인증서 체인을 오프라인으로 생성해야 합니다. 여기의 1~3단계에는 이러한 파일을 생성하는 방법에 대한 예가 있습니다.

  3. 인증서와 키를 사용하여 Azure Key Vault에서 비밀을 만듭니다.

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path-to-folder/cert-chain.pem>
    
  4. 클러스터의 비밀 자격 증명 모음 CSI 드라이버용 Azure Key Vault 공급자를 사용하도록 설정합니다.

    az aks enable-addons --addons azure-keyvault-secrets-provider --resource-group $RESOURCE_GROUP --name $CLUSTER
    

    참고 항목

    인증서를 회전할 때 비밀이 클러스터에 동기화되는 속도를 제어하려면 Azure Key Vault 비밀 공급자 추가 기능의 --rotation-poll-interval 매개 변수를 사용할 수 있습니다. 예: az aks addon update --resource-group $RESOURCE_GROUP --name $CLUSTER --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 20s

  5. Azure Key Vault 리소스에 액세스할 수 있도록 추가 기능의 사용자 할당 관리 ID에 권한을 부여합니다.

    OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId' -o tsv)
    
    az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list
    

    참고 항목

    Vault 액세스 정책 대신 권한 모델에 대한 Azure RBAC 권한 부여를 사용하여 Key Vault를 만든 경우 여기 지침에 따라 관리 ID에 대한 권한을 만듭니다. 추가 기능의 사용자 할당 관리 ID의 Key Vault Reader에 대한 Azure 역할 할당을 추가합니다.

플러그 인 CA 인증서로 Istio 기반 서비스 메시 추가 기능 설정

  1. 이전에 만들어진 Azure Key Vault 비밀을 참조하면서 기존 AKS 클러스터에 대해 Istio 서비스 메시 추가 기능을 사용하도록 설정합니다.

    az aks mesh enable --resource-group $RESOURCE_GROUP --name $CLUSTER \
    --root-cert-object-name root-cert \
    --ca-cert-object-name ca-cert \
    --ca-key-object-name ca-key \
    --cert-chain-object-name cert-chain \
    --key-vault-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$AKV_NAME
    

    참고 항목

    Istio CA에서 생성된 자체 서명 루트 인증서를 사용하는 Istio 추가 기능이 있는 기존 클러스터의 경우 플러그 인 CA로 전환하는 것이 지원되지 않습니다. 플러그 인 CA 입력을 통과하려면 먼저 이러한 클러스터에서 메시를 사용하지 않도록 설정한 다음 위 명령을 사용하여 다시 사용하도록 설정해야 합니다.

  2. 클러스터에 cacerts가 만들어졌는지 확인합니다.

    kubectl get secret -n aks-istio-system
    

    예상 출력:

    NAME                                                         TYPE                 DATA   AGE
    cacerts                                                      opaque               4      13h
    sh.helm.release.v1.azure-service-mesh-istio-discovery.v380   helm.sh/release.v1   1      2m15s
    sh.helm.release.v1.azure-service-mesh-istio-discovery.v381   helm.sh/release.v1   1      8s    
    
  3. Istio 컨트롤 플레인이 사용자 지정 인증 기관을 선택했는지 확인합니다.

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController | grep x509
    

    예상 출력은 다음과 유사해야 합니다.

    2023-11-06T15:49:15.493732Z     info    x509 cert - Issuer: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", Subject: "", SN: e191d220af347c7e164ec418d75ed19e, NotBefore: "2023-11-06T15:47:15Z", NotAfter: "2033-11-03T15:49:15Z"
    2023-11-06T15:49:15.493764Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", SN: 885034cba2894f61036f2956fd9d0ed337dc636, NotBefore: "2023-11-04T01:40:02Z", NotAfter: "2033-11-01T01:40:02Z"
    2023-11-06T15:49:15.493795Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
    

인증 기관 회전

보안이나 정책상의 이유로 인증 기관을 주기적으로 회전해야 할 수도 있습니다. 이 섹션에서는 중간 CA 및 루트 CA 회전 시나리오를 처리하는 방법을 안내합니다.

중간 인증 기관 회전

  1. 루트 CA를 동일하게 유지하면서 중간 CA를 회전할 수 있습니다. 새 인증서 및 키 파일을 사용하여 Azure Key Vault 리소스의 비밀을 업데이트합니다.

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
    
  2. --rotation-poll-interval의 기간 동안 기다리세요. Azure Key Vault 리소스에서 업데이트된 새 중간 CA를 기반으로 클러스터에서 cacerts 비밀이 새로 고쳐졌는지 확인합니다.

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
    

    예상 출력은 다음과 유사해야 합니다.

    2023-11-07T06:16:21.091844Z     info    Update Istiod cacerts
    2023-11-07T06:16:21.091901Z     info    Using istiod file format for signing ca files
    2023-11-07T06:16:21.354423Z     info    Istiod has detected the newly added intermediate CA and updated its key and certs accordingly
    2023-11-07T06:16:21.354910Z     info    x509 cert - Issuer: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", Subject: "", SN: b2753c6a23b54d8364e780bf664672ce, NotBefore: "2023-11-07T06:14:21Z", NotAfter: "2033-11-04T06:16:21Z"
    2023-11-07T06:16:21.354967Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", SN: 17f36ace6496ac2df88e15878610a0725bcf8ae9, NotBefore: "2023-11-04T01:40:22Z", NotAfter: "2033-11-01T01:40:22Z"
    2023-11-07T06:16:21.355007Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
    2023-11-07T06:16:21.355012Z     info    Istiod certificates are reloaded
    
  3. 워크로드는 기본적으로 24시간 동안 유효한 Istio 컨트롤 플레인으로부터 인증서를 받습니다. Pod를 다시 시작하지 않으면 모든 워크로드가 24시간 내에 새 중간 CA를 기반으로 새 리프 인증서를 가져옵니다. 이러한 모든 워크로드가 새 중간 CA에서 즉시 새 리프 인증서를 가져오도록 하려면 워크로드를 다시 시작해야 합니다.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    

루트 인증 기관 회전

  1. 이전 루트 인증서와 새 루트 인증서가 연결된 루트 인증서 파일을 사용하여 Azure Key Vault 비밀을 업데이트해야 합니다.

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
    

    root-cert.pem의 콘텐츠는 다음 형식을 따릅니다.

    -----BEGIN CERTIFICATE-----
    <contents of old root certificate>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <contents of new root certificate>
    -----END CERTIFICATE-----
    

    추가 기능에는 루트 인증서 업데이트를 확인하기 위해 클러스터에서 10분마다 실행되는 CronJob이 포함되어 있습니다. 업데이트가 검색되면 Istio 컨트롤 플레인(istiod 배포)을 다시 시작하여 업데이트를 선택합니다. 로그를 확인하여 루트 인증서 업데이트가 검색되었고 Istio 컨트롤 플레인이 다시 시작되었는지 확인할 수 있습니다.

    kubectl logs -n aks-istio-system $(kubectl get pods -n aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    예상 출력:

    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

    istiod가 다시 시작된 후 두 개의 인증서가 신뢰 도메인에 추가되었음을 나타내야 합니다.

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system 
    

    예상 출력:

    2023-11-07T06:42:00.287916Z     info    Using istiod file format for signing ca files
    2023-11-07T06:42:00.287928Z     info    Use plugged-in cert at etc/cacerts/ca-key.pem
    2023-11-07T06:42:00.288254Z     info    x509 cert - Issuer: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", Subject: "", SN: 286451ca8ff7bf9e6696f56bef829d42, NotBefore: "2023-11-07T06:40:00Z", NotAfter: "2033-11-04T06:42:00Z"
    2023-11-07T06:42:00.288279Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", SN: 17f36ace6496ac2df88e15878610a0725bcf8ae9, NotBefore: "2023-11-04T01:40:22Z", NotAfter: "2033-11-01T01:40:22Z"
    2023-11-07T06:42:00.288298Z     info    x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
    2023-11-07T06:42:00.288303Z     info    Istiod certificates are reloaded
    2023-11-07T06:42:00.288365Z     info    spiffe  Added 2 certs to trust domain cluster.local in peer cert verifier
    
  2. 24시간(리프 인증서 유효성의 기본 시간) 동안 기다리거나 모든 워크로드를 강제로 다시 시작해야 합니다. 이렇게 하면 모든 워크로드가 mTLS 확인을 위해 이전 인증 기관과 새 인증 기관을 모두 인식합니다.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    
  3. 이제 새 CA로만(이전 CA 없이) Azure Key Vault 비밀을 업데이트할 수 있습니다.

    az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem>
    az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem>
    az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
    

    루트 인증서 업데이트 검색 및 istiod 다시 시작을 확인하려면 CronJob의 로그를 확인합니다.

    kubectl logs -n aks-istio-system $(kubectl get pods -n aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    예상 출력:

    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-17 restarted
    Deployment istiod-asm-1-17 restarted.
    

    istiod가 업데이트된 후에는 새 루트 CA의 사용만 확인해야 합니다.

    kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
    

    예상 출력:

    2023-11-07T08:01:17.780299Z     info    x509 cert - Issuer: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", Subject: "", SN: 1159747c72cc7ac7a54880cd49b8df0a, NotBefore: "2023-11-07T07:59:17Z", NotAfter: "2033-11-04T08:01:17Z"
    2023-11-07T08:01:17.780330Z     info    x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", SN: 2aba0c438652a1f9beae4249457023013948c7e2, NotBefore: "2023-11-04T01:42:12Z", NotAfter: "2033-11-01T01:42:12Z"
    2023-11-07T08:01:17.780345Z     info    x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Root B,O=Istio", SN: 3f9da6ddc4cb03749c3f43243a4b701ce5eb4e96, NotBefore: "2023-11-04T01:41:54Z", NotAfter: "2033-11-01T01:41:54Z"
    

    이 문서에 표시된 출력 예에서 루트 A(추가 기능을 사용하도록 설정할 때 사용됨)에서 루트 B로 이동했음을 확인할 수 있습니다.

  4. 24시간 동안 다시 기다리거나 모든 워크로드를 강제로 다시 시작할 수 있습니다. 강제로 다시 시작하면 워크로드가 새 루트 CA에서 즉시 새 리프 인증서를 가져옵니다.

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>