튜토리얼: 정책 제어 관리

이 튜토리얼에서는 Certificate Authority Service 리소스에 정책 제어를 구현하는 방법을 보여줍니다.

목표

이 튜토리얼에서는 다음과 같은 정책 제어를 통해 DNS 인증서에 대해 공유 인증 기관(CA) 풀을 구성하는 방법을 설명합니다.

  • prod-dns-requester 사용자는 *.prod.example.com 도메인에 대해 종단 개체 서버 TLS 인증서를 요청할 수 있습니다.
  • test-dns-requester 사용자는 *.test.example.com 도메인에 대해 종단 개체 서버 TLS 인증서를 요청할 수 있습니다.
  • blank-check-requester 사용자는 CA 풀에서 모든 종류의 인증서를 요청할 수 있습니다.

이 튜토리얼에서는 이 시나리오 목표를 달성하기 위해 CA 풀의 인증서 발급 정책, 인증서 템플릿, 조건부 IAM 바인딩을 사용합니다.

시작하기 전에

CA 풀 만들기

CA 풀을 만들려면 다음 안내를 따르세요.

  1. issuance-policy.yaml 파일을 사용하는 CA 풀을 만들려면 다음 gcloud 명령어를 사용합니다.

    gcloud

    gcloud privateca pools create POOL_NAME \
        --tier=ENTERPRISE
    

    각 항목의 의미는 다음과 같습니다.

    • --tier 플래그는 CA 풀의 등급을 지정하기 위해 사용됩니다. 등급에 대한 자세한 내용은 작업 등급 선택을 참조하세요.
  2. 새로 만든 CA 풀에서 Google 관리 리소스로 CA를 만들려면 다음 gcloud 명령어를 사용합니다.

    gcloud

    gcloud privateca roots create CA_NAME \
       --pool=POOL_NAME \
       --subject="CN=Example DNS Root, O=Example LLC, C=US" \
       --validity="10Y" \
       --max-chain-length=1 \
       --auto-enable
    

    각 항목의 의미는 다음과 같습니다.

    • POOL_NAME은 CA 풀의 고유 식별자입니다.
    • --subject 플래그는 인증서 주체의 이름을 전달하기 위해 사용됩니다.
    • --validity 플래그는 CA의 유효 기간을 결정합니다. 기본 유효 기간은 10년입니다.
    • --max-chain-length 플래그는 CA에 따라 허용되는 하위 CA의 최대 깊이를 결정합니다.
    • --auto-enable 플래그는 STAGED 상태가 아닌 ENABLED 상태로 CA를 만듭니다. CA 상태에 대한 자세한 내용은 CA 상태를 참조하세요.

테스트 인증서를 위한 정책 제어 구성

발급 정책 변경사항은 즉시 적용됩니다. 프로덕션에 사용하기 전에 테스트 정책 제어를 구성하는 것이 좋습니다. 이 섹션에서는 테스트 정책 제어를 구성하는 방법을 설명합니다.

테스트 및 프로덕션 DNS 템플릿 모두 서버 TLS 인증서에 대해 동일한 사전 정의된 값을 사용해야 합니다. YAML 파일 leaf_server_tls_predefined_values.yaml을 만들고 다음과 같은 종단 개체 서버 TLS 구성을 파일에 복사합니다.

  keyUsage:
    baseKeyUsage:
      digitalSignature: true
      keyEncipherment: true
    extendedKeyUsage:
      serverAuth: true
  caOptions:
    isCa: false

테스트 DNS 구성을 위한 정책 제어 구성

이 섹션에서는 test-dns-requester 사용자가 *.test.example.com 도메인에서 DNS에 대해 종단 개체 서버 TLS 인증서를 요청하도록 허용하는 정책 제어를 설정하는 방법을 설명합니다.

테스트 인증서를 위한 DNS 인증서 템플릿 만들기

이 섹션에서는 종단 개체 서버 TLS 구성이 포함된 인증서 템플릿을 만드는 방법을 설명합니다. 이 인증서 템플릿은 *.test.example.com 도메인에서 DNS SAN만 사용하도록 인증서를 제한합니다. 이러한 제한사항은 Common Expression Language(CEL) 표현식을 사용해서 구현됩니다. 이 인증서 템플릿은 또한 인증서 요청에 지정된 모든 주체를 삭제합니다.

  1. 다음 gcloud 명령어를 사용해서 종단 개체 서버 TLS 확장을 포함하고, 인증서 요청에 지정된 모든 subject를 삭제하고, 허용되는 SAN을 제한하는 인증서 템플릿을 만듭니다.

    gcloud

    gcloud privateca templates create test-server-tls-template \
      --predefined-values-file  ./leaf_server_tls_predefined_values.yaml \
      --no-copy-subject \
      --copy-sans \
      --identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.test.example.com'))"
    

    각 항목의 의미는 다음과 같습니다.

    • --predefined-values-file 플래그는 인증서 템플릿으로 설정된 사전 정의된 X.509 값을 설명하는 YAML 파일을 전달하기 위해 사용됩니다.
    • --no-copy-subject 플래그는 인증서 요청에서 모든 호출자 지정 주체를 삭제합니다.
    • --copy sans 플래그는 인증서 요청의 SAN 확장이 서명된 인증서에 복사되도록 보장합니다.
    • --identity-cel-expression 플래그는 발급 전 인증서의 ID에 따라 평가되는 CEL 표현식을 전달하기 위해 사용됩니다. CEL 표현식을 사용해서 여러 정책 제어를 구현하는 방법은 CEL 사용을 참조하세요.

    인증서 템플릿 만들기에 대한 자세한 내용은 인증서 템플릿 만들기를 참조하세요.

DNS 테스트 인증서를 위한 IAM 바인딩 만들기

DNS CA 풀에서 test-dns-requester@ 사용자가 테스트 서버 TLS 인증서를 요청하도록 허용하려면 CA 풀에 조건부 IAM 바인딩을 만듭니다. 인증서 요청에 test-server-tls-template 템플릿 참조가 포함된 경우에만 privateca.certificateRequester 역할을 test-dns-requester@ 사용자에게 부여합니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

  1. 정책 YAML 파일 test_dns_condition.yaml을 만들고 다음과 같은 TLS 구성을 파일에 복사합니다.

    title: test DNS binding
    description: allows user to only create DNS test certificates
    expression: api.getAttribute("privateca.googleapis.com/template", "") == "PROJECT_ID/-/test-server-tls-template"
    

    IAM 조건에 제공된 템플릿 이름이 인증서 요청의 템플릿 이름과 일치해야 합니다. 따라서 CEL 표현식의 privateca.googleapis.com/template 속성에 프로젝트 ID를 제공하는 경우 인증서를 요청할 때 프로젝트 ID를 제공해야 합니다. CEL 표현식에 프로젝트 번호를 제공할 경우 인증서 요청에도 프로젝트 번호를 제공해야 합니다.

  2. 다음 gcloud 명령어를 사용해서 test-dns-requester@가 CA 풀에서 프로덕션 테스트 TLS 인증서만 요청하도록 허용하는 정책 제어를 추가합니다.

    gcloud

    gcloud privateca pools add-iam-policy-binding POOL_NAME \
        --role='roles/privateca.certificateRequester' \
        --member='user:test-dns-requester@' \
        --condition-from-file=./test_dns_condition.yaml
    

    각 항목의 의미는 다음과 같습니다.

    • --role 플래그는 구성원에게 할당할 역할 이름을 전달하기 위해 사용됩니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
    • --member 플래그는 바인딩을 추가할 구성원을 전달하기 위해 사용됩니다.
    • condition-from-file 플래그는 CEL 조건을 포함하는 파일 이름을 전달하기 위해 사용됩니다.
  3. 다음 gcloud를 사용해서 test-dns-requester@가 'test-server-tls-template' 인증서 템플릿을 사용하도록 허용하는 정책 제어를 추가합니다.

    gcloud

    gcloud privateca templates add-iam-policy-binding test-server-tls-template \
        --role='roles/privateca.templateUser' \
        --member='user:test-dns-requester@'
    

    각 항목의 의미는 다음과 같습니다.

    • --role 플래그는 구성원에게 할당할 역할 이름을 전달하기 위해 사용됩니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
    • --member 플래그는 바인딩을 추가할 구성원을 전달하기 위해 사용됩니다.

    IAM 정책 구성에 대한 자세한 내용은 IAM 정책 구성을 참조하세요.

프로덕션 인증서를 위한 정책 제어 구성

정책 제어를 테스트한 후에는 이러한 정책 제어를 프로덕션 환경에 사용할 수 있습니다.

프로덕션 DNS 인증서를 위한 정책 제어 구성

이 섹션에서는 prod-dns-requester 사용자가 DNS .prod.example.com 도메인에 대해 종단 개체 TLS 인증서를 요청할 수 있도록 정책 제어를 설정하는 방법을 설명합니다.

프로덕션 DNS 인증서를 위한 인증서 템플릿 만들기

다음 안내에 따라 종단 개체 서버 TLS 구성이 포함된 인증서 템플릿을 만듭니다. 이 인증서 템플릿은 *.prod.example.com 도메인에서 DNS SAN만 사용하도록 인증서를 제한합니다. 이러한 제한사항은 Common Expression Language(CEL) 표현식을 사용해서 구현됩니다. 이 인증서 템플릿은 또한 인증서 요청에 지정된 모든 주체를 삭제합니다.

다음 gcloud 명령어를 사용해서 prod-server-tls-template 인증서 템플릿을 만듭니다.

gcloud

  gcloud privateca templates create prod-server-tls-template \
    --predefined-values-file ./leaf_server_tls_predefined_values.yaml \
    --no-copy-subject \
    --copy-sans \
    --identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.prod.example.com'))"

각 항목의 의미는 다음과 같습니다.

  • --predefined-values-file 플래그는 인증서 템플릿으로 설정된 사전 정의된 X.509 값을 설명하는 YAML 파일을 전달하기 위해 사용됩니다.
  • --no-copy-subject 플래그는 인증서 요청에서 모든 호출자 지정 주체를 삭제합니다.
  • --copy sans 플래그는 인증서 요청의 SAN 확장이 서명된 인증서에 복사되도록 보장합니다.
  • --identity-cel-expression 플래그는 발급 전 인증서의 ID에 따라 평가되는 CEL 표현식을 전달하기 위해 사용됩니다. CEL 표현식에 대한 자세한 내용은 CEL 표현식 사용을 참조하세요.

인증서 템플릿 만들기에 대한 자세한 내용은 인증서 템플릿 만들기를 참조하세요.

gcloud privateca templates create 명령어에 대한 자세한 내용은 gcloud privateca templates create를 참조하세요.

프로덕션 DNS IAM 바인딩 만들기

DNS CA 풀에서 prod-dns-requester@ 사용자가 프로덕션 서버 TLS 인증서를 요청하도록 허용하려면 CA 풀에 조건부 IAM 바인딩을 만듭니다. 인증서 요청에 prod-server-tls-template 템플릿 참조가 포함된 경우에만 prod-dns-requester@ 사용자에게 privateca.certificateRequester 역할을 부여합니다. IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

  1. 정책 YAML 파일 prod_dns_condition.yaml을 만들고 다음과 같은 TLS 구성을 파일에 복사합니다.

    title: Production DNS binding
    description: allows user to only create DNS production certificates
    expression: api.getAttribute("privateca.googleapis.com/template", "") == "PROJECT_ID/-/prod-server-tls-template"
    
  2. 다음 gcloud 명령어를 사용해서 prod-dns-requester@가 CA 풀에서 프로덕션 서버 TLS 인증서만 요청하도록 허용하는 정책 제어를 추가합니다.

    gcloud

    gcloud privateca pools add-iam-policy-binding POOL_NAME \
        --role='roles/privateca.certificateRequester' \
        --member='user:prod-dns-requester@' \
        --condition-from-file=./prod_dns_condition.yaml
    

    각 항목의 의미는 다음과 같습니다.

    • --role 플래그는 구성원에게 할당할 역할 이름을 전달하기 위해 사용됩니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
    • --member 플래그는 바인딩을 추가할 구성원을 전달하기 위해 사용됩니다.
    • condition-from-file 플래그는 CEL 조건을 포함하는 파일 이름을 전달하기 위해 사용됩니다.

    gcloud privateca pools add-iam-policy-binding 명령어에 대한 자세한 내용은 gcloud privateca pools add-iam-policy-binding을 참조하세요.

  3. prod-dns-requester@가 'prod-server-tls-template' 인증서 템플릿을 사용하도록 허용하는 정책 제어를 추가하려면 다음 gcloud 명령어를 사용합니다.

    gcloud

    gcloud privateca templates add-iam-policy-binding prod-server-tls-template \
        --role='roles/privateca.templateUser' \
        --member='user:prod-dns-requester@'
    

    각 항목의 의미는 다음과 같습니다.

    • --role 플래그는 구성원에게 할당할 역할 이름을 전달하기 위해 사용됩니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
    • --member 플래그는 바인딩을 추가할 구성원을 전달하기 위해 사용됩니다.

제한되지 않은 사용자 정책 제어

blank-check-requester@ 사용자가 제한 없이 모든 인증서를 요청하도록 허용하려면 아무 조건 없이 사용자에게 privateca.certificateRequester 역할을 부여하는 IAM 바인딩을 만듭니다.

gcloud

gcloud privateca pools add-iam-policy-binding POOL_NAME \
  --role='roles/privateca.certificateRequester' \
  --member='user:blank-check-requester@example.com'

각 항목의 의미는 다음과 같습니다.

  • --role 플래그 값은 사용자에게 할당되는 역할을 결정합니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
  • --member 플래그 값은 역할이 할당되는 사용자를 결정합니다.

정책 제어 테스트

인증서 발급 및 IAM 정책을 구현한 후에는 이러한 정책이 예상한 대로 작동하는지 검토하고 테스트하는 것이 중요합니다.

모든 정책 바인딩 검색

CA 풀에 구현된 모든 IAM 정책을 가져옵니다. CA 풀에 대해 모든 IAM 정책을 검색하려면 gcloud privateca pools get-iam-policy 명령어를 사용합니다.

gcloud

gcloud privateca pools get-iam-policy POOL_NAME

각 항목의 의미는 다음과 같습니다.

  • POOL_NAME은 CA 풀의 고유 식별자입니다.

gcloud privateca pools get-iam-policy 명령어에 대한 자세한 내용은 gcloud privateca pools get-iam-policy를 참조하세요.

인증서 생성

이 섹션에서는 범용 인증서, 테스트 및 프로덕션 DNS 인증서 생성에 대한 정보를 제공합니다.

테스트 DNS 인증서 생성

test-dns-requester@ 사용자가 CA 풀에서 테스트 DNS 인증서를 요청하도록 허용하려면 다음 gcloud 명령어를 사용합니다.

gcloud

gcloud privateca certificates create test-dns-1 \
    --project=PROJECT_ID \
    --issuer-location=LOCATION \
    --issuer-pool=POOL_NAME \
    --dns-san=foo.bar.test.example.com \
    --generate-key \
    --key-output-file=KEY_FILE_NAME \
    --cert-output-file=test_dns_cert.pem \
    --template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/test-server-tls-template

각 항목의 의미는 다음과 같습니다.

  • --issuer-location 플래그는 인증서 위치를 설정하기 위해 사용됩니다. 전체 위치 목록은 위치를 참조하세요.
  • --issuer-pool 플래그는 요청된 인증서의 CA 풀을 설정합니다.
  • --dns-san 플래그는 쉼표로 구분된 하나 이상의 DNS SAN을 설정하기 위해 사용됩니다.
  • --generate-key 플래그는 머신에 새 RSA 2048 비공개 키를 생성하도록 트리거합니다.
  • --key-output-file 플래그는 생성된 비공개 키가 작성되는 경로(PEM 형식)를 설정하기 위해 사용됩니다.
  • --cert-output-file 플래그는 결과로 생성된 PEM 인코딩 인증서 체인 파일이 작성되는 경로(종단 개체에서 루트 순)를 설정하기 위해 사용됩니다.
  • --template 플래그는 이 인증서 발급을 위해 사용하려는 인증서 템플릿의 이름을 설정하기 위해 사용됩니다. 지정된 템플릿은 발급 CA 풀과 동일한 위치에 있어야 합니다. 인증서 템플릿에 대한 자세한 내용은 인증서 템플릿 및 발급 정책 개요를 참조하세요.

프로덕션 인증서 생성

이제 prod-dns-requester 사용자가 CA 풀에서 프로덕션 DNS 인증서를 요청할 수 있습니다. --dns-san=foo.bar.prod.example.com는 지정된 값을 사용해서 DNS 유형의 SAN을 인증서 요청에 추가합니다.

gcloud

gcloud privateca certificates create prod-dns-1 \
    --project=PROJECT_ID \
    --issuer-location=LOCATION \
    --issuer-pool=POOL_NAME \
    --dns-san=foo.bar.prod.example.com \
    --generate-key \
    --key-output-file=KEY_FILE_NAME \
    --cert-output-file=prod_dns_cert.pem \
    --template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/prod-server-tls-template

각 항목의 의미는 다음과 같습니다.

  • --issuer-location 플래그는 인증서 위치를 설정하기 위해 사용됩니다. 전체 위치 목록은 위치를 참조하세요.
  • --issuer-pool 플래그는 요청된 인증서의 CA 풀을 설정합니다.
  • --dns-san 플래그는 쉼표로 구분된 하나 이상의 DNS SAN을 설정하기 위해 사용됩니다.
  • --generate-key 플래그는 머신에 새 RSA 2048 비공개 키를 생성하도록 트리거합니다.
  • --key-output-file 플래그는 생성된 비공개 키가 작성되는 경로(PEM 형식)를 설정하기 위해 사용됩니다.
  • --cert-output-file 플래그는 결과로 생성된 PEM 인코딩 인증서 체인 파일이 작성되는 경로(종단 개체에서 루트 순)를 설정하기 위해 사용됩니다.
  • --template 플래그는 이 인증서를 발급하는 데 사용할 인증서 템플릿 이름을 설정하기 위해 사용됩니다. 지정된 템플릿은 발급 CA 풀과 동일한 위치에 있어야 합니다. 인증서 템플릿에 대한 자세한 내용은 인증서 템플릿 및 발급 정책 개요를 참조하세요.

범용 인증서 생성

blank-check-requester@ 사용자는 gcloud privateca certificates create 명령어를 사용하여 CA 풀에서 인증서를 요청할 수 있습니다.

CA 풀에서 인증서를 요청하려면 CA Service로 생성된 공개/비공개 키를 사용하면 됩니다. 인증서 요청에 대한 자세한 내용은 인증서 요청 및 발급된 인증서 보기를 참조하세요.

삭제

이 섹션에서는 CA 풀에 대한 IAM 정책을 삭제하는 방법을 설명합니다.

특정 IAM 바인딩 삭제

blank-check-requester 사용자의 CA 풀에 대해 IAM 조건부 바인딩을 삭제하려면 다음 gcloud 명령어를 사용합니다.

gcloud

gcloud privateca pools remove-iam-policy-binding POOL_NAME \
    --role='roles/privateca.certificateRequester' \
    --member='user:blank-check-requester@'

각 항목의 의미는 다음과 같습니다.

  • --role 플래그 값은 사용자에게 할당되는 역할을 결정합니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
  • --member 플래그 값은 역할이 할당되는 사용자를 결정합니다.

특정 IAM 바인딩을 삭제하려면 해당 IAM 바인딩과 관련된 모든 정보를 gcloud privateca pools remove-iam-policy-binding 명령어에 제공해야 합니다. 역할 및 구성원은 서로 다른 조건의 여러 IAM 바인딩을 가질 수 있습니다. 다른 바인딩을 실수로 삭제하지 않도록 IAM 바인딩과 관련된 모든 세부정보를 제공하는 것이 중요합니다.

gcloud privateca pools remove-iam-policy-binding 명령어에 대한 자세한 내용은 gcloud privateca pools remove-iam-policy-binding을 참조하세요.

모든 IAM 조건부 바인딩 삭제

IAM 바인딩을 삭제하려면 gcloud privateca pools remove-iam-policy-binding 명령어를 사용하면 됩니다. IAM 조건부 바인딩을 삭제하려면 바인딩에 대한 모든 정보를 제공해야 합니다. 사용자 및 역할에는 둘 이상의 조건부 바인딩이 포함될 수 있습니다. 모든 조건부 바인딩을 삭제하려면 gcloud 명령어에 --all 플래그를 사용합니다.

다음 gcloud 명령어를 사용하여 prod-code-signing-requester 사용자의 모든 바인딩을 삭제합니다.

gcloud

gcloud privateca pools remove-iam-policy-binding POOL_NAME \
    --role='roles/privateca.certificateRequester' \
    --member='user:prod-code-signing-requester@' \
    --all

각 항목의 의미는 다음과 같습니다.

  • --role 플래그 값은 사용자에게 할당되는 역할을 결정합니다. CA Service의 IAM 역할 및 권한에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.
  • --member 플래그 값은 역할이 할당되는 사용자를 결정합니다.