Menerbitkan sertifikat yang membuktikan identitas pihak ketiga

Tutorial ini menunjukkan cara menerbitkan sertifikat yang membuktikan identitas pihak ketiga menggunakan refleksi identitas dan kumpulan identitas workload.

Anda dapat menggunakan refleksi identitas untuk membuat sertifikat yang cocok dengan identitas terverifikasi pemohon sertifikat. Dengan menggunakan refleksi identitas, Anda dapat membatasi pemohon sertifikat tanpa hak istimewa untuk hanya meminta sertifikat dengan nama alternatif subjek (SAN) yang sesuai dengan identitas dalam kredensialnya.

Tujuan

Tutorial ini memberikan informasi tentang cara menggunakan Layanan CA dengan kumpulan workload identity untuk menggabungkan identitas pihak ketiga dan mendapatkan sertifikat yang membuktikan identitas ini.

Sebelum memulai

Sebelum memulai, pastikan bahwa Anda memahami konsep berikut:

  • Kumpulan identitas workload: Kumpulan identitas workload memungkinkan Anda mengelola penyedia identitas pihak ketiga. Untuk mengetahui informasi selengkapnya, lihat Mengelola penyedia dan kumpulan workload identity.
  • Workload identity federation: Gabungan identitas workload memanfaatkan kumpulan identitas workload untuk memberi identitas pihak ketiga akses ke layanan Google Cloud. Untuk mengetahui informasi selengkapnya, lihat Workload identity federation.
  • Layanan Token Keamanan (STS): Layanan Token Keamanan memungkinkan Anda menukar kredensial pihak ketiga dengan token pihak pertama (Google Cloud). Untuk mengetahui informasi selengkapnya, lihat Layanan Token Keamanan.
  • Refleksi identitas: Fitur refleksi identitas memungkinkan identitas terverifikasi pemohon sertifikat menuju ke sertifikat yang diminta. Untuk mengetahui informasi selengkapnya, lihat Refleksi identitas.

Pastikan Anda memiliki peran IAM berikut:

  • Untuk mengelola certificate authority (CA) dan kumpulan CA, serta meminta sertifikat, Anda harus memiliki peran CA Service Operation Manager (privateca.caManager). Untuk mengetahui informasi selengkapnya tentang peran IAM untuk Layanan CA, lihat Kontrol akses dengan IAM.
  • Untuk mengelola kumpulan dan penyedia workload identity, Anda harus memiliki peran Workload Identity Pool Admin (iam.workloadIdentityPoolAdmin).
  • Untuk membuat akun layanan, Anda harus memiliki peran Service Account Admin (iam.serviceAccountAdmin).

Untuk mengetahui informasi tentang cara memberikan peran IAM, lihat Mengelola akses ke project, folder, dan organisasi. Anda dapat memberikan peran IAM yang diperlukan ke Akun Google, akun layanan, grup Google, akun Google Workspace, atau domain Cloud Identity.

Menyiapkan penyedia dan kumpulan workload identity

Tutorial ini menjelaskan cara menggunakan penyedia Google OpenID Connect (OIDC) yang dikombinasikan dengan akun layanan untuk berfungsi sebagai identitas pihak ketiga. Penyedia OIDC Akun Google bertindak sebagai penyedia identitas (IDP) pihak ketiga dan akun layanan Google Cloud adalah contoh identitas pihak ketiga yang dinyatakan oleh IDP ini.

Kumpulan identitas workload mendukung berbagai penyedia identitas, termasuk Microsoft Azure/On-Local Active Directory, AWS, dan penyedia identitas berbasis SAML.

Untuk menyiapkan penyedia dan kumpulan workload identity, lakukan hal berikut: 1. Untuk merepresentasikan kumpulan identitas federasi yang tepercaya, buat kumpulan identitas workload:

```
gcloud iam workload-identity-pools create IDENTITY_POOL_ID --location global --display-name "tutorial-wip"
```

Replace the following:

- <var>IDENTITY_POOL_ID</var>: The unique identifier of the new workload
  identity pool.
  1. Buat penyedia kumpulan workload identity untuk penyedia identitas pihak ketiga:

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID --location global --workload-identity-pool IDENTITY_POOL_ID --display-name "tutorial-oidc" --attribute-mapping "google.subject=assertion.sub" --issuer-uri="https://accounts.google.com"
    

    Ganti kode berikut:

    • PROVIDER_ID: ID unik penyedia identitas yang ingin Anda buat di kumpulan workload identity.

    Anda dapat menyesuaikan flag berikut untuk kasus penggunaan Anda:

    • attribute-mapping: Tanda ini menetapkan pemetaan antara klaim pihak ketiga ke klaim utama Google, google.subject. google.subject adalah pemetaan wajib yang dapat ditetapkan ke klaim apa pun atau kombinasi klaim menggunakan ekspresi CEL. Untuk mengetahui informasi selengkapnya, lihat Menentukan pemetaan dan kondisi atribut.
    • issuer-uri: Untuk penyedia OIDC, tanda ini adalah endpoint yang dapat diakses secara publik dan dihubungi Google untuk memverifikasi token pihak ketiga. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan penyedia identitas eksternal.

    Untuk mengetahui informasi selengkapnya tentang cara menyiapkan penyedia workload identity, lihat Mengonfigurasi workload identity federation.

Membuat kumpulan CA dan CA penerbit

Bagian ini menjelaskan cara membuat kumpulan CA dan menambahkan CA root ke dalamnya. Anda dapat menggunakan kumpulan CA ini untuk menerbitkan sertifikat yang mencerminkan identitas. Jika Anda ingin menggunakan kumpulan CA dan CA yang sudah ada, Anda dapat melewati bagian ini.

Alih-alih CA {i>root<i}, Anda juga dapat memilih untuk membuat CA bawahan. Membuat CA root membantu mempersingkat prosedur.

  1. Buat kumpulan CA di tingkat DevOps:

    gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devops
    

    Ganti kode berikut:

    • CA_POOL_ID - ID kumpulan CA Layanan CA yang menerbitkan sertifikat.
    • LOCATION - Lokasi kumpulan CA.

    Untuk informasi selengkapnya tentang membuat kumpulan CA, lihat Membuat kumpulan CA.

  2. Buat CA root:

    gcloud privateca roots create CA_ID --pool CA_POOL_ID  --location LOCATION --subject "CN=test,O=test-org"
    

    Ganti kode berikut:

    • CA_ID - ID certificate authority yang menerbitkan sertifikat.
    • CA_POOL_ID - ID kumpulan CA Layanan CA yang menerbitkan sertifikat.
    • LOCATION - Lokasi kumpulan CA.

    Untuk informasi selengkapnya tentang membuat CA root, lihat Membuat CA root.

  3. Mengaktifkan identitas yang digabungkan dari kumpulan identitas workload untuk menerbitkan sertifikat dari Kumpulan CA. Refleksi identitas memerlukan peran IAM Pemohon Sertifikat Workload Layanan CA (roles/privateca.workloadCertificateRequester) untuk pemohon CreateCertificate.

    Anda dapat merepresentasikan akun utama kumpulan identitas workload dalam berbagai perincian, mulai dari satu subjek hingga semua identitas dalam kumpulan di seluruh penyedia. Untuk mengetahui informasi selengkapnya, lihat kumpulan akun utama atau akun utama yang tersedia (gunakan tab Google Cloud CLI) agar sesuai dengan kasus penggunaan Anda.

    gcloud privateca pools add-iam-policy-binding CA_POOL_ID --location LOCATION --role roles/privateca.workloadCertificateRequester --member "principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/*"
    

    Ganti kode berikut:

    • PROJECT_NUMBER - Nomor project project tempat Anda membuat kumpulan workload identity.

Membuat akun layanan yang merepresentasikan identitas pihak ketiga

Prosedur berikut mengasumsikan bahwa akun layanan mewakili pihak ketiga. Bagian ini menunjukkan cara menggunakan endpoint IAM GenerateIdToken untuk mengambil identitas pihak ketiga dalam bentuk token OIDC. Bergantung pada kasus penggunaan, Anda mungkin memerlukan langkah berbeda untuk mendapatkan token identitas pihak ketiga pilihan Anda.

gcloud iam service-accounts create SERVICE_ACCOUNT

Ganti kode berikut:

  • SERVICE_ACCOUNT - ID akun layanan yang mewakili identitas pihak ketiga.

Terbitkan sertifikat yang membuktikan identitas pihak ketiga

Sebelum memulai, pastikan Anda memiliki peran IAM Service Account Token Creator (roles/iam.serviceAccountTokenCreator). Anda memerlukan peran IAM ini untuk memanggil GenerateIdToken API.

Untuk mendapatkan sertifikat yang membuktikan identitas pihak ketiga, lakukan hal berikut:

  1. Mendapatkan token identitas pihak ketiga dari penyedia identitas pihak ketiga Anda.

    curl

    export ID_TOKEN=`curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;print(json.load(sys.stdin)['token'])"`
    

    Ganti kode berikut:

    • PROJECT_ID - ID project Google Cloud untuk project tempat Anda ingin membuat resource.

    Library klien

    Untuk mengakses token pihak ketiga secara terprogram, Anda bisa mendapatkan token dari kredensial yang bersumber file atau kredensial yang bersumber dari URL. Untuk mengetahui informasi selengkapnya, baca bagian Mengautentikasi dengan menggunakan library klien, gcloud CLI, atau Terraform. Dalam tutorial ini, kita mengikuti alur kerja kredensial sumber file.

    Muat kredensial Anda ke jalur yang dapat dibaca oleh pemohon sertifikat:

    curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;       print(json.load(sys.stdin)['token']) > /tmp/oidc_token.txt
    

    Ganti kode berikut:

    • PROJECT_ID: Project ID untuk project tempat Anda ingin membuat resource.
  2. Tukarkan token pihak ketiga dengan token OAuth gabungan menggunakan endpoint token STS:

    curl

    export STS_TOKEN=`curl -L -X POST 'https://sts.googleapis.com/v1/token' -H 'Content-Type: application/json' \
    -d '{
        "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
        "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID",
        "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
        "scope": "https://www.googleapis.com/auth/cloud-platform",
        "subject_token": "'$ID_TOKEN'",
        "subject_token_type": "urn:ietf:params:oauth:token-type:jwt"
    }' | python3 -c "import sys;import json; print(json.load(sys.stdin)['access_token'])"`
    

    Library klien

    1. Buat file konfigurasi kredensial bernama oidc_token.txt yang dapat dibaca oleh kode permintaan sertifikat untuk menjalankan pertukaran token.
    gcloud iam workload-identity-pools create-cred-config projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID --output-file=/tmp/cred_config.json --credential-source-file=/tmp/oidc_token.txt
    
    1. Baca file oidc_token.txt untuk menetapkan mekanisme otorisasi di library klien:

    python

    import json
    
    from google.auth import identity_pool
    
    with open('/tmp/cred_config.json', 'r') as f:
      json_config_info = json.loads(f.read())
    credentials = identity_pool.Credentials.from_info(json_config_info)
    scoped_credentials = credentials.with_scopes(
        ['https://www.googleapis.com/auth/cloud-platform'])
    
  3. Buat permintaan ke CA Service dengan mode permintaan subjek REFLECTED_SPIFFE:

    curl

    1. Opsional: Jika tidak memiliki CSR, buat CSR dengan menjalankan perintah berikut.

      export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
      
    2. Minta sertifikat dengan CSR, seumur hidup, dan mode permintaan subjek yang ditampilkan:

      curl -H "Authorization: Bearer $(echo $STS_TOKEN)" https://privateca.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/caPools/CA_POOL_ID/certificates\?alt\=json  -X POST -H "Content-Type: application/json" -H 'Accept: application/json' --data '{"lifetime": "100s", "pemCsr": "'$TUTORIAL_CSR'", "subjectMode": "REFLECTED_SPIFFE"}'
      

    Library klien

    Untuk meneruskan token pihak pertama ke Layanan CA, Anda harus membuat klien berkredensial. Anda kemudian dapat menggunakan klien berkredensial ini untuk membuat permintaan sertifikat:

    1. Mulai klien Layanan CA berkredensial:

      python

      caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
      
    2. Minta sertifikat.

      Python

      Untuk mengautentikasi ke CA Service, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

      import google.cloud.security.privateca_v1 as privateca_v1
      from google.protobuf import duration_pb2
      
      def create_certificate(
          project_id: str,
          location: str,
          ca_pool_name: str,
          ca_name: str,
          certificate_name: str,
          common_name: str,
          domain_name: str,
          certificate_lifetime: int,
          public_key_bytes: bytes,
      ) -> None:
          """
          Create a Certificate which is issued by the Certificate Authority present in the CA Pool.
          The key used to sign the certificate is created by the Cloud KMS.
      
          Args:
              project_id: project ID or project number of the Cloud project you want to use.
              location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
              ca_pool_name: set a unique name for the CA pool.
              ca_name: the name of the certificate authority which issues the certificate.
              certificate_name: set a unique name for the certificate.
              common_name: a title for your certificate.
              domain_name: fully qualified domain name for your certificate.
              certificate_lifetime: the validity of the certificate in seconds.
              public_key_bytes: public key used in signing the certificates.
          """
      
          caServiceClient = privateca_v1.CertificateAuthorityServiceClient()
      
          # The public key used to sign the certificate can be generated using any crypto library/framework.
          # Also you can use Cloud KMS to retrieve an already created public key.
          # For more info, see: https://cloud.google.com/kms/docs/retrieve-public-key.
      
          # Set the Public Key and its format.
          public_key = privateca_v1.PublicKey(
              key=public_key_bytes,
              format_=privateca_v1.PublicKey.KeyFormat.PEM,
          )
      
          subject_config = privateca_v1.CertificateConfig.SubjectConfig(
              subject=privateca_v1.Subject(common_name=common_name),
              subject_alt_name=privateca_v1.SubjectAltNames(dns_names=[domain_name]),
          )
      
          # Set the X.509 fields required for the certificate.
          x509_parameters = privateca_v1.X509Parameters(
              key_usage=privateca_v1.KeyUsage(
                  base_key_usage=privateca_v1.KeyUsage.KeyUsageOptions(
                      digital_signature=True,
                      key_encipherment=True,
                  ),
                  extended_key_usage=privateca_v1.KeyUsage.ExtendedKeyUsageOptions(
                      server_auth=True,
                      client_auth=True,
                  ),
              ),
          )
      
          # Create certificate.
          certificate = privateca_v1.Certificate(
              config=privateca_v1.CertificateConfig(
                  public_key=public_key,
                  subject_config=subject_config,
                  x509_config=x509_parameters,
              ),
              lifetime=duration_pb2.Duration(seconds=certificate_lifetime),
          )
      
          # Create the Certificate Request.
          request = privateca_v1.CreateCertificateRequest(
              parent=caServiceClient.ca_pool_path(project_id, location, ca_pool_name),
              certificate_id=certificate_name,
              certificate=certificate,
              issuing_certificate_authority_id=ca_name,
          )
          result = caServiceClient.create_certificate(request=request)
      
          print("Certificate creation result:", result)
      
      

    3. Verifikasi sertifikat. Sertifikat Anda harus memiliki subjek yang berisi URI tunggal SAN. SAN yang menyatakan identitas dalam format berikut:

      spiffe://IDENTITY_POOL_ID.PROJECT_NUMBER.global.workload.id.goog/subject/<oidc_subject_number>
      

      Ganti:

      • IDENTITY_POOL_ID: ID unik dari kumpulan identitas workload.
      • PROJECT_NUMBER - Nomor project project tempat Anda membuat kumpulan workload identity.

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource Layanan CA yang Anda buat setelah dokumen ini, lakukan operasi berikut menggunakan Google Cloud CLI:

  1. Hapus CA yang Anda buat.

    1. Menonaktifkan CA:

      gcloud privateca roots disable CA_ID --pool CA_POOL_ID  --location LOCATION
      

      Ganti:

      • CA_ID: ID unik CA.
      • CA_POOL_ID: ID unik kumpulan CA.
      • LOCATION: Lokasi kumpulan CA.
    2. Hapus CA:

      gcloud privateca roots delete CA_ID --pool CA_POOL_ID  --location LOCATION --ignore-active-certificates
      

      Ganti:

      • CA_ID: ID unik CA.
      • CA_POOL_ID: ID unik kumpulan CA.
      • LOCATION: Lokasi kumpulan CA.
  2. Hapus kumpulan CA yang Anda buat.

    gcloud privateca pools delete CA_POOL_ID --location LOCATION
    

    Ganti:

    • CA_POOL_ID: ID unik kumpulan CA.
    • LOCATION: Lokasi kumpulan CA.

    Untuk mengetahui informasi selengkapnya tentang perintah gcloud privateca pools delete, lihat gcloud privateca pool delete.

  3. Hapus kumpulan workload identity yang Anda buat:

    gcloud iam workload-identity-pools delete IDENTITY_POOL_ID --location global
    

    Ganti:

    • IDENTITY_POOL_ID: ID unik dari kumpulan identitas beban kerja.
  4. Hapus akun layanan yang Anda buat:

    gcloud iam service-accounts delete SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com
    

    Ganti:

    • SERVICE_ACCOUNT: ID unik dari kumpulan identitas beban kerja.
    • PROJECT_ID: Project yang memiliki akun layanan.

Peran IAM Pemohon Sertifikat Workload Layanan CA (privateca.workloadCertificateRequester) membatasi subjek sertifikat yang diterbitkan hanya identitas pemohon. Pastikan pengguna atau workload yang menggunakan fitur refleksi identitas hanya diberi peran IAM CA Service Workload Certificate (privateca.workloadCertificateRequester). Untuk mematuhi prinsip hak istimewa terendah, Anda dapat menghindari pemberian peran IAM Pemohon Sertifikat Layanan CA (privateca.certificateRequester).

Langkah selanjutnya