

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS Private CA Connector for Kubernetes를 시작합니다.
<a name="PcaKubernetes-get-started"></a>

다음 주제에서는를 AWS Private CA 사용하여 Kubernetes 클러스터에서 통신을 보호하는 방법을 보여줍니다. 또 다른 예는 GitHub[의 Kubernetes에 대한 전송 중 암호화](https://github.com/aws-samples/sample-encryption-in-transit-for-kubernetes)를 참조하세요.

프라이빗 인증 기관을 사용하여 Amazon EKS 클러스터와의 통신을 보호할 수 있습니다. 시작하기 전에 다음이 있는지 확인하십시오.
+ 보안 정책으로 범위가 지정된 적절한 권한이 있는 AWS 계정입니다.

------
#### [ Amazon EKS clusters ]

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "IAM",
        "Effect": "Allow",
        "Action": [
          "iam:CreateRole",
          "iam:AttachRolePolicy",
          "iam:GetRole"
        ],
        "Resource": "*"
      },
      {
        "Sid": "EKS",
        "Effect": "Allow",
        "Action": [
          "eks:CreateAddon",
          "eks:DescribeAddon",
          "eks:CreatePodIdentityAssociation",
          "eks:DescribeCluster"
        ],
        "Resource": "*"
      },
      {
        "Sid": "IAMPassRole",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "arn:aws:iam::*:role/CertManagerPrivateCARole"
      }
    ]
  }
  ```

------

------
#### [ Other clusters ]

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "GetAndIssuePCACertificates",
        "Effect": "Allow",
        "Action": [
          "acm-pca:GetCertificate",
          "acm-pca:IssueCertificate"
        ],
        "Resource": "*"
      },
      {
        "Sid": "RolesAnywhere",
        "Effect": "Allow",
        "Action": [
          "rolesanywhere:CreateProfile"
        ],
        "Resource": "*"
      },
      {
        "Sid": "IAM",
        "Effect": "Allow",
        "Action": [
          "iam:CreateRole",
          "iam:AttachRolePolicy"
        ],
        "Resource": "*"
      },
      {
        "Sid": "IAMPassRole",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "arn:aws:iam::*:role/CertManagerPrivateCARole"
      }
    ]
  }
  ```

------

------
+ Kubernetes 클러스터. Amazon Elastic Kubernetes Service 클러스터를 생성하려면 [Amazon EKS 빠른 시작 안내서](https://docs.aws.amazon.com/eks/latest/userguide/quickstart.html)를 참조하세요. 간소화를 위해 클러스터 이름을 포함할 환경 변수를 생성합니다.

  ```
  export CLUSTER={{aws-privateca-demo}}
  ```

  
+ CA 및 Amazon EKS 클러스터가 AWS 리전 위치한 입니다. 간소화를 위해 리전을 보관할 환경 변수를 생성합니다.

  ```
  export REGION={{{{aws-region}}}}
  ```
+  AWS Private CA 프라이빗 인증 기관의 Amazon 리소스 이름(ARN)입니다. 간소화를 위해 프라이빗 CA ARN을 보관할 환경 변수를 생성합니다.

  ```
  export CA_ARN="arn:aws:acm-pca:{{region}}:{{account}}:certificate-authority/{{CA_ID}}/certificate/{{certificate_ID}}"
  ```

  프라이빗 CA를 생성하려면에서 프라이빗 CA [https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html)생성을 참조하세요. AWS Private CA
+ 다음 소프트웨어가 설치된 컴퓨터:
  + [AWS CLI v2](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 구성됨
  + [kubectl v1.13 이상](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
  + 비 Amazon EKS 클러스터의 경우 [Helm v3](https://helm.sh/docs/intro/install/)

## cert-manager 설치
<a name="kubernetes-install-cert-manager"></a>

프라이빗 CA를 사용하려면 인증서를 요청하고 배포하며 인증서 갱신을 자동화하는 `cert-manager>` 추가 기능을 설치해야 합니다. 또한 프라이빗 인증서를 발급할 수 있는 `aws-private-ca-issuer` 플러그인을 설치해야 합니다 AWS Private CA. 다음 단계에 따라 추가 기능 및 플러그인을 설치합니다.

------
#### [ Amazon EKS clusters ]

Amazon EKS 추가 기능으로 `cert-manager`를 설치합니다.

```
aws eks create-addon \
  --cluster-name {{$CLUSTER}} \
  --addon-name cert-manager \
  --region $REGION
```

------
#### [ Other clusters ]

Helm`cert-manager`을 사용하여를 설치합니다.

```
helm repo add jetstack https://charts.jetstack.io
helm repo update

helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true
```

------

## IAM 권한 구성
<a name="kubernetes-iam-permissions"></a>

`aws-privateca-issuer` 플러그인에는가와 상호 작용하는 권한이 필요합니다 AWS Private CA. Amazon EKS 클러스터의 경우 포드 자격 증명을 사용합니다. 다른 클러스터의 경우를 사용합니다 AWS Identity and Access Management Roles Anywhere.

먼저 IAM 정책을 생성합니다. 정책은 `AWSPrivateCAConnectorForKubernetesPolicy` 관리형 정책을 사용합니다. 정책에 대한 자세한 내용은 *AWS 관리형 정책 참조 가이드*의 [AWSPrivateCAConnectorForKubernetesPolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSPrivateCAConnectorForKubernetesPolicy.html)를 참조하세요.

------
#### [ Amazon EKS clusters ]

1. 다음 신뢰 정책을 `trust-policy.json` 포함하는 라는 파일을 생성합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "TrustPolicyForEKSClusters",
         "Effect": "Allow",
         "Principal": {
           "Service": "pods.eks.amazonaws.com"
         },
         "Action": [
           "sts:AssumeRole",
           "sts:TagSession"
         ]
       }
     ]
   }
   ```

------

1. 다음 명령을 실행하여 IAM 역할을 생성합니다.

   ```
   ROLE_ARN=$(aws iam create-role \
     --role-name CertManagerPrivateCARole \
     --assume-role-policy-document file://trust-policy.json \
     --region $REGION \
     --output text \
     --query "Role.Arn")
    
    aws iam attach-role-policy \
     --role-name CertManagerPrivateCARole \
     --policy-arn arn:aws:iam::aws:policy/AWSPrivateCAConnectorForKubernetesPolicy
   ```

------
#### [ Other clusters ]

1. 에 저장된 프라이빗 CA를 신뢰하는 트러스트 앵커를 생성합니다`CA_ARN`. 지침은 [시작하기를 참조하세요 IAM Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html). 환경 변수를 생성하여 트러스트 앵커 ARN을 저장합니다.

   ```
   export TRUST_ANCHOR_ARN={{trustAnchorArn}}
   ```

1. 다음 신뢰 정책을 `trust-policy.json` 포함하는 라는 파일을 생성합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "TrustPolicyForSelfManagedOrOnPremiseClusters",
               "Effect": "Allow",
               "Principal": {
                   "Service": "rolesanywhere.amazonaws.com"
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:SetSourceIdentity",
                   "sts:TagSession"
               ],
               "Condition": {
                   "ArnEquals": {
                       "aws:SourceArn": [
                           "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TRUST_ANCHOR_ARN"
                       ]
                   },
                   "StringEquals": {
                       "aws:PrincipalTag/x509Subject/CN": "aws-privateca-issuer"
                   }
               }
           }
       ]
   }
   ```

------

1. 다음 명령을 실행하여 IAM 역할을 생성합니다.

   ```
   ROLE_ARN=$(aws iam create-role \
     --role-name CertManagerPrivateCARole \
     --assume-role-policy-document file://trust-policy.json \
     --query "Role.Arn" \
     --region $REGION \
     --output text)
     
    aws iam attach-role-policy \
     --role-name CertManagerPrivateCARole \
     --region $REGION \
     --policy-arn arn:aws:iam::aws:policy/AWSPrivateCAConnectorForKubernetesPolicy
   ```

------

## AWS Private CA 클러스터 발급자 설치 및 구성
<a name="kubernetes-install-aws-private-ca-cluster-issuer"></a>

`aws-privateca-connector-for-kubernetes` 추가 기능을 설치하려면 다음 명령을 사용합니다.

------
#### [ Amazon EKS clusters ]

추가 기능을 생성합니다.

```
aws eks create-addon --region $REGION \
  --cluster-name $CLUSTER \
  --addon-name aws-privateca-connector-for-kubernetes \
  --pod-identity-associations "[{
    \"serviceAccount\": \"aws-privateca-issuer\",
    \"roleArn\": \"$ROLE_ARN\"
  }]"
```

그런 다음 추가 기능이 활성화될 때까지 기다립니다.

```
aws eks describe-addon \
  --cluster-name $CLUSTER \
  --addon-name aws-privateca-connector-for-kubernetes \
  --region $REGION \
  --query 'addon.status'
```

------
#### [ Other clusters ]

1.  IAM Roles Anywhere다음에서 프로필을 생성합니다.

   ```
   PROFILE_ARN=$(aws rolesanywhere create-profile \
     --name "privateca-profile" \
     --role-arns "$ROLE_ARN" \
     --region "$REGION" \
     --query 'profile.profileArn' \
     --enabled \
     --output text)
   ```

1. Kubernetes용 커넥터와 함께 사용하고 AWS Private CA다음을 사용하여 인증 IAM Roles Anywhere 할 클라이언트 인증서를 생성합니다.

   1. 클라이언트 인증서에 대한 프라이빗 키를 생성합니다.

      ```
      openssl genrsa -out client.key 2048
      ```

   1. 클라이언트 인증서에 대한 인증서 서명 요청(CSR)을 생성합니다.

      ```
      openssl req -new \
        -key client.key \
        -out client.csr \
        -subj "/CN=aws-privateca-issuer"
      ```

   1.  AWS Private CA다음에서 클라이언트 인증서를 발급합니다.

      ```
      CERT_ARN=$(aws acm-pca issue-certificate \
        --signing-algorithm SHA256WITHRSA \
        --csr fileb://client.csr \
        --validity Value=1,Type=DAYS \
        --certificate-authority-arn "$CA_ARN" \
        --region "$REGION" \
        --query 'CertificateArn' \
        --output text)
      ```

   1. 클라이언트 인증서를 로컬에 저장합니다.

      ```
      aws acm-pca get-certificate \
        --certificate-authority-arn $CA_ARN \
        --certificate-arn $CERT_ARN \
        --region $REGION \
        --query 'Certificate' 
        --output text > pca-issuer-client-cert.pem
      ```

1. 클라이언트 인증서를 사용하여 클러스터에 AWS Private CA 발급자를 설치합니다.

   1. `awspca` Helm 리포지토리를 추가합니다.

      ```
      helm repo add awspca https://cert-manager.github.io/aws-privateca-issuer 
      helm repo update
      ```

   1. 네임스페이스 생성:

      ```
      kubectl create namespace aws-privateca-issuer
      ```

   1. 이전에 생성한 인증서를 보안 암호에 넣습니다.

      ```
      kubectl create secret tls aws-privateca-credentials \
        -n aws-privateca-issuer \
        --cert=pca-issuer-client-cert.pem \
        --key=client.key
      ```

1.  IAM Roles Anywhere다음을 사용하여 AWS Private CA 발급자를 설치합니다.

   1. 라는 파일을 생성`values.yaml`하여 IAM Roles Anywhere다음과 함께 사용할 AWS Private CA 발급자 플러그인을 구성합니다.

      ```
      cat > values.yaml <<EOF
      env:
        AWS_EC2_METADATA_SERVICE_ENDPOINT: "http://127.0.0.1:9911"
      
      extraContainers:
        - name: "rolesanywhere-credential-helper"
          image: "public.ecr.aws/rolesanywhere/credential-helper:latest"
          command: ["aws_signing_helper"]
          args:
            - "serve"
            - "--private-key"
            - "/etc/cert/tls.key"
            - "--certificate"
            - "/etc/cert/tls.crt"
            - "--role-arn"
            - "$ROLE_ARN"
            - "--profile-arn"
            - "$PROFILE_ARN"
            - "--trust-anchor-arn"
            - "$TRUST_ANCHOR_ARN"
          volumeMounts:
            - name: cert
              mountPath: /etc/cert/
              readOnly: true
      
      volumes:
        - name: cert
          secret:
            secretName: aws-privateca-credentials
      EOF
      ```

   1.  IAM Roles Anywhere다음을 사용하여 AWS Private CA 발급자를 설치합니다.

      ```
      helm install aws-privateca-issuer awspca/aws-privateca-issuer \
        -n aws-privateca-issuer \
        -f values.yaml
      ```

------

발급자가 준비될 때까지 기다립니다. 다음 명령을 사용합니다.

```
kubectl wait --for=condition=ready pods --all -n aws-privateca-issuer --timeout=120s
```

그런 다음 설치를 확인하여 모든 포드가 `READY` 상태에 도달했는지 확인합니다.

```
kubectl -n aws-privateca-issuer get all
```

를 구성하려면 발급자의 구성을 `cluster-issuer.yaml`포함하는 라는 YAML 파일을 `aws-private-ca-cluster-issuer`생성합니다.

```
cat > cluster-issuer.yaml <<EOF
apiVersion: awspca.cert-manager.io/v1beta1
kind: AWSPCAClusterIssuer
metadata:
  name: aws-privateca-cluster-issuer
spec:
  arn: "$CA_ARN"
  region: "$REGION"
EOF
```

그런 다음 클러스터 구성을 적용합니다.

```
kubectl apply -f cluster-issuer.yaml
```

발급자의 상태를 확인합니다.

```
kubectl describe awspcaclusterissuer aws-privateca-cluster-issuer
```

다음과 유사한 응답이 나타납니다.

```
Status:
  Conditions:
    Last Transition Time:  2025-08-13T21:00:00Z
    Message:               AWS PCA Issuer is ready
    Reason:                Verified
    Status:                True
    Type:                  Ready
```

## cert-manager를 사용하여 AWS Private CA 클라이언트 인증서 관리
<a name="kubernetes-manage-pca-certificate"></a>

Amazon EKS 클러스터를 사용하지 않는 경우에서 신뢰할 수 있는 인증서를 수동으로 부트스트랩한 후에서 관리하는 클라이언트 인증 인증서로 전환할 `aws-privateca-issuer` 수 있습니다`cert-manager`. 이렇게 하면가 클라이언트 인증 인증서를 자동으로 갱신`cert-manager`할 수 있습니다.

1. 라는 파일을 생성합니다`pca-auth-cert.yaml`.

   ```
   cat > pca-auth-cert.yaml <<EOF
   apiVersion: cert-manager.io/v1
   kind: Certificate
   metadata:
     name: aws-privateca-client-cert
     namespace: aws-privateca-issuer
   spec:
     secretName: aws-privateca-credentials
     duration: 168h
     renewBefore: 48h
     commonName: aws-privateca-issuer
     privateKey:
       algorithm: ECDSA
       size: 256
       rotationPolicy: Always
     usages:
       - client auth
     issuerRef:
       name: aws-privateca-cluster-issuer
       kind: AWSPCAClusterIssuer
       group: awspca.cert-manager.io
   EOF
   ```

1. 새 관리형 클라이언트 인증 인증서를 생성합니다.

   ```
   kubectl apply -f pca-auth-cert.yaml
   ```

1. 인증서가 생성되었는지 확인합니다.

   ```
   kubectl get certificate aws-privateca-client-cert -n aws-privateca-issuer
   ```

   다음과 유사한 응답이 나타납니다.

   ```
   NAME                        READY   SECRET                      AGE
   aws-privateca-client-cert   True    aws-privateca-credentials   19m
   ```

## 첫 번째 TLS 인증서 발급
<a name="kubernetes-issue-certificate"></a>

이제 `cert-manager` 및가 설치`aws-privateca-issuer`되었으므로 인증서를 발급할 수 있습니다.

인증서 리소스가 `certificate.yaml` 포함된 라는 YAML 파일을 생성합니다.

```
cat > certificate.yaml <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-certificate
  namespace: default
spec:
  secretName: example-certificate-tls
  issuerRef:
    name: aws-privateca-cluster-issuer
    kind: AWSPCAClusterIssuer
    group: awspca.cert-manager.io
  commonName: example.internal
  dnsNames:
    - example.internal
    - api.example.internal
  duration: 2160h # 90 days
  renewBefore: 360h # 15 days
  usages:
    - digital signature
    - key encipherment
    - server auth
EOF
```

다음 명령을 사용하여 인증서를 적용합니다.

```
kubectl apply -f certificate.yaml
```

그런 다음 다음 명령을 사용하여 인증서의 상태를 확인할 수 있습니다.

```
kubectl get certificate example-certificate
kubectl describe certificate example-certificate
```

다음과 비슷한 응답이 표시됩니다.

```
NAME                 READY   SECRET                    AGE
example-certificate  True    example-certificate-tls   30s
```

다음 명령을 사용하여 발급된 인증서를 검사할 수 있습니다.

```
kubectl get secret example-certificate-tls -o yaml
```

다음 명령을 사용하여 인증서를 디코딩하고 검사할 수도 있습니다.

```
kubectl get secret example-certificate-tls -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
```