ID 발급 및 사용 확인


이 페이지에서는 로그를 사용하여 Google Kubernetes Engine(GKE) 클러스터 제어 플레인에서 Kubernetes ID(인증서 및 서비스 계정 토큰 형식)의 발급 및 사용을 확인하는 방법을 보여줍니다. 이 인증은 전적으로 선택사항이며 제어 영역을 보호하는 데 필요하지 않습니다.

이 가이드는 사용자 인증 정보 발급 및 서명에 대한 특정 조직 규정 준수 또는 정책 요구사항이 있는 보안 관리자 및 플랫폼 소유자를 대상으로 합니다. GKE 제어 영역 권한으로 이미 자체 관리 키 및 CA를 설정했어야 합니다.

다음 개념에 익숙해야 합니다.

이 페이지에서는 GKE의 선택적 제어 영역 기능 세트 중 하나를 설명합니다. 이 기능을 사용하면 제어 영역 보안 상태를 확인하거나 관리하는 키를 사용하여 제어 영역에서 암호화 및 사용자 인증 정보 서명을 구성하는 등의 작업을 실행할 수 있습니다. 자세한 내용은 GKE 제어 영역 권한 정보를 참고하세요.

기본적으로 Google Cloud는 관리형 컨트롤 플레인에 다양한 보안 조치를 적용합니다. 이 페이지에서는 GKE 제어 영역을 더 잘 확인하거나 제어할 수 있는 선택적 기능을 설명합니다.

ID 발급 로그 정보

GKE ID 발급 로그는 제어 영역에서 사용자 인증 정보를 발급할 때와 이러한 사용자 인증 정보가 클러스터에서 사용될 때를 기록하는 제어 영역 감사 로그입니다. 이러한 로그를 사용하여 ID 발급 로그를 Cloud KMS, Certificate Authority Service, Kubernetes API 로그와 연결하여 발급 및 사용을 비롯한 사용자 인증 정보의 전체 기간을 추적할 수 있습니다. GKE 컨트롤 플레인 권한을 사용하는 경우 GKE ID 발급 로그가 사용 설정됩니다. 이 로그는 다음 유형의 사용자 인증 정보의 발급 및 사용을 추적합니다.

  • X.509 인증서
  • 클러스터 JSON 웹 토큰 (JWT)

X.509 인증서

Kubernetes는 클라이언트 인증서 인증에 X.509 인증서를 사용합니다. 인증서를 발급하기 위해 Kubernetes 제어 플레인은 승인된 CertificateSigningRequest를 CA 서비스의 인증 기관 (CA)에 전송합니다. 그런 다음 CA는 Cloud KMS의 해당 키를 사용하여 인증서 다이제스트에 서명하는 인증서를 발급합니다.

Kubernetes API 서버 로그에는 인증서로 인증된 Kubernetes API 호출의 인증서 서명 세부정보가 포함됩니다. 로그의 사용자 인증 정보 ID 항목은 다음 형식을 갖습니다.

"authentication.k8s.io/credential-id": "X509SHA256=CERTIFICATE_HASH"

CERTIFICATE_HASH 값은 인증서의 SHA256 해시이며 인증서의 수명 주기를 추적하는 데 사용할 수 있습니다.

Kubernetes API 서버 인증서 로그를 사용하여 다음 서비스의 로그를 상호 연관시켜 인증서 수명 주기를 추적할 수 있습니다.

  • GKE ID 발급 로그: protoPayload.metadata.credentialId 쿼리를 사용하여 Kubernetes API 서버 로그의 사용자 인증 정보 ID를 기반으로 특정 GKE ID 발급 로그를 찾습니다. 그런 다음 GKE ID 발급 로그의 protoPayload.metadata.certificateFingerprint 필드를 사용하여 ID 발급 로그와 CA 서비스 로그를 연결합니다.
  • CA 서비스 로그: 다음 ID가 포함된 인증서 발급 로그 항목을 찾습니다.
    • cert_fingerprint.sha256_hash: 서명된 인증서의 SHA256 해시입니다. 이 ID를 사용하여 로그를 GKE 및 Kubernetes API 이벤트와 일치시킵니다.
    • tbs_certificate_digest: Cloud KMS 키로 서명하기 위해 전송된 인증서 콘텐츠의 해시입니다. 이 ID를 사용하여 로그를 Cloud KMS 로그와 일치시킵니다.
  • Cloud KMS 서명 로그: CA 서비스 로그의 tbs_certificate_digest 값을 사용하여 예상되는 Cloud KMS 키가 인증서에 서명했는지 확인합니다.

JSON 웹 토큰 (JWT)

서명된 JWT (JSON 웹 토큰)는 Kubernetes API에 대한 요청을 인증할 때 Kubernetes 서비스 계정과 같은 클러스터의 항목에 대한 Bearer 토큰으로 사용됩니다. 특정 서비스 계정을 사용하는 포드가 생성되면 Kubernetes는 JWT를 만들고 포드에 마운트합니다. GKE 제어 평면 권한을 사용하여 자체 키와 CA를 실행하는 경우 이 JWT는 서명되고 나중에 Cloud KMS의 서비스 계정 서명 키를 사용하여 확인됩니다.

Kubernetes API 서버 로그에는 JWT로 인증된 Kubernetes API 호출의 토큰 서명 세부정보가 포함됩니다. 로그의 토큰 서명 항목의 형식은 다음과 같습니다.

"authentication.kubernetes.io/credential-id":"JTI=JWT_ID"

JWT_ID 값은 Kubernetes API 호출에 사용된 JWT를 식별하는 문자열입니다.

Kubernetes API 서버 로그의 JWT ID를 사용하여 다음 로그를 상관시킴으로써 JWT의 수명 주기를 추적할 수 있습니다.

  • GKE ID 발급 로그: Kubernetes API 서버 로그의 JWT ID를 사용하여 특정 JWT 발급 항목을 찾습니다. 각 항목에는 toBeSignedDigest 필드도 포함되며, 이 필드의 값은 Cloud KMS 로그와 일치할 수 있습니다.
  • Cloud KMS 서명 로그: GKE ID 발급 로그의 toBeSignedDigest 필드 값을 사용하여 예상되는 Cloud KMS 키가 JWT에 서명했는지 확인합니다.

가격 책정

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. 자체 관리 CA 또는 키로 GKE 클러스터 제어 영역 구성

  2. 다음 Cloud Audit Logging Service API를 사용 설정합니다.

필요한 역할

ID 발급 로그에 액세스하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

  • Logging에서 모든 작업 수행: Logging 관리자 (roles/logging.admin)
  • 로그 보기: 비공개 로그 뷰어 (roles/logging.privateLogViewer)

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

요구사항 및 제한사항

다음 요구사항 및 제한사항이 적용됩니다.

  • GKE 버전 1.31.1-gke.1846000 이상을 사용해야 합니다.
  • ID 발급 로그는 Cloud 감사 로그로 기록되며 보관 기간은 400일로 설정됩니다. 보관 기간은 구성할 수 없지만 시스템 이벤트 감사 로그를 다른 대상에 라우팅하여 보관 기간을 연장할 수 있습니다.

인증서 확인

GKE 제어 영역 기관 ID 발급 로그를 사용하여 인증서가 성공적으로 발급되었거나 사용되었는지 확인할 수 있습니다. 다음 로그 중 하나 또는 로그 조합을 사용하여 인증서 발급 및 사용에 관한 정보를 확인할 수 있습니다.

인증서 로그

Kubernetes API 인증서 사용 로그

Kubernetes API에 인증서가 사용될 때마다 인증서 서명 세부정보를 로깅합니다.

인증서 발급 작업의 GKE 로그

모든 인증서 발급 작업을 시스템 이벤트 감사 로그로 기록합니다. 이러한 로그는 GKE 제어 영역 기관 사용자 관리 키 또는 CA를 사용하는 모든 클러스터에서 기본적으로 사용 설정됩니다.

CA 서비스 감사 로그

인증서가 발급될 때마다 항목을 기록합니다.

Cloud KMS 감사 로그

CA 서비스의 서명 요청에 대한 응답으로 다이제스트가 서명될 때마다 항목을 로깅합니다.

Kubernetes API 로그로 인증서 사용 확인

인증서를 사용하여 인증된 API 호출의 로그 항목을 찾으려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 표현식을 쿼리 편집기 필드에 붙여넣습니다.

    log_id("cloudaudit.googleapis.com/activity")
    resource.type="k8s_cluster"
    labels."authentication.kubernetes.io/credential-id":"X509SHA256="
    
  3. 쿼리 실행을 클릭합니다.

    이 쿼리는 연결된 X.509 인증서가 있는 모든 Kubernetes API 서버 로그를 반환합니다. 보안 도구를 사용하거나 로그를 직접 확인하여 조사할 특정 로그 항목을 찾습니다.

이러한 로그를 다른 로그 유형과 연결하려면 다음 필드를 찾습니다.

"authentication.k8s.io/credential-id":"CREDENTIAL_ID"

CREDENTIAL_ID 값은 GKE, CA 서비스, Cloud KMS의 로그를 연결하는 데 사용할 수 있는 식별자입니다. CREDENTIAL_ID의 형식은 "X509SHA256=CERTIFICATE_HASH"입니다.

GKE 로그로 인증서 발급 확인

인증서 발급 이벤트의 GKE 로그 항목을 찾으려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 표현식을 쿼리 편집기 필드에 붙여넣습니다.

    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event"
    resource.type="gke_cluster"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.metadata.credentialId="CREDENTIAL_ID"
    

    다음을 바꿉니다.

  3. 쿼리 실행을 클릭합니다.

CA 서비스 로그로 인증서 발급 확인

GKE 인증서 발급 이벤트와 일치하는 CA 서비스 로그를 찾으려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 표현식을 쿼리 편집기 필드에 붙여넣습니다.

    resource.type="audited_resource"
    protoPayload.serviceName="privateca.googleapis.com"
    protoPayload.methodName="google.cloud.security.privateca.v1.CertificateAuthorityService.CreateCertificate"
    protoPayload.response.certificate_description.cert_fingerprint.sha256_hash="CERTIFICATE_HASH"
    

    CERTIFICATE_HASHKubernetes API 로그로 인증서 사용 확인 섹션의 CERTIFICATE_HASH로 바꿉니다. 해시에서 X509SHA256= 접두사를 생략해야 합니다.

  3. 쿼리 실행을 클릭합니다.

    이 쿼리는 인증서 설명 응답 섹션에 tbs_certificate_digest: DIGEST_VALUE 필드가 포함된 로그를 반환합니다.

DIGEST_VALUE를 사용하여 인증서의 Cloud KMS 서명 로그를 일치시킬 수 있습니다.

Cloud KMS 서명 로그로 인증서 발급 확인

CA 서비스 인증서 발급 이벤트의 Cloud KMS 서명 이벤트를 찾으려면 다음 단계를 완료합니다.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 표현식을 쿼리 편집기 필드에 붙여넣습니다.

    protoPayload.request.digest.sha256="DIGEST_VALUE"
    protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog"
    protoPayload.methodName="AsymmetricSign"
    protoPayload.serviceName="cloudkms.googleapis.com"
    

    DIGEST_VALUECA 서비스 로그로 인증서 발급 확인 섹션의 다이제스트 값으로 바꿉니다.

  3. 쿼리 실행을 클릭합니다.

    이 쿼리는 인증서 발급 이벤트의 로그를 반환합니다. Cloud KMS 로그는 인증서와 JWT를 구분하지 않으므로 두 항목의 로그 항목은 동일합니다.

토큰 확인

GKE 제어 영역 기관 ID 발급 로그와 Cloud KMS 서명 로그를 사용하여 JSON 웹 토큰 (JWT)이 성공적으로 발급되었는지 확인할 수 있습니다.

토큰 발급 이벤트의 트레이스백을 시작하는 것은 일반적으로 서비스 계정 활동에 대한 Kubernetes API 로그를 모니터링하는 것으로 시작됩니다. 추가 조사가 필요한 활동 로그를 식별한 후 다음 로그를 사용하여 사용자 인증 정보 발급 및 사용에 관한 정보를 확인할 수 있습니다.

JWT 로그

JWT 사용을 위한 Kubernetes API 로그

Kubernetes API에 JWT가 사용될 때마다 JWT 서명 세부정보를 로깅합니다.

JWT 발급 작업의 GKE 로그

모든 토큰 발급 작업을 시스템 이벤트 감사 로그로 로깅합니다. 이러한 로그는 GKE 제어 영역 기관 사용자 관리 키 또는 CA를 사용하는 모든 클러스터에서 기본적으로 사용 설정됩니다.

Cloud KMS 감사 로그

토큰이 서명되고 발급될 때마다 항목을 기록합니다.

Kubernetes API 서버 로그로 토큰 사용 확인

토큰 사용 이벤트의 로그 항목을 찾으려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 표현식을 쿼리 편집기 필드에 붙여넣습니다.

    log_id("cloudaudit.googleapis.com/activity")
    resource.type="k8s_cluster"
    labels."authentication.kubernetes.io/credential-id":"JTI="
    
  3. 쿼리 실행을 클릭합니다.

    이 쿼리는 연결된 JWT가 있는 모든 Kubernetes API 서버 로그를 반환합니다. 보안 도구를 사용하거나 로그를 직접 확인하여 조사할 특정 로그 항목을 찾습니다.

이러한 로그를 다른 로그 유형과 연결하려면 다음 필드를 찾습니다.

"authentication.k8s.io/credential-id": "JTI=JWT_ID"

JWT_ID는 GKE 및 Cloud KMS의 로그를 연결하는 데 사용할 수 있는 토큰 식별자입니다.

GKE 로그로 토큰 발급 확인

토큰 발행 이벤트의 로그 항목을 찾으려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 표현식을 쿼리 편집기 필드에 붙여넣습니다.

    resource.type="gke_cluster"
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event"
    protoPayload.methodName="google.cloud.gkeauth.v1.Auth.SignServiceAccountJWT"
    protoPayload.metadata.credentialId="JTI=JWT_ID"
    

    다음을 바꿉니다.

  3. 쿼리 실행을 클릭합니다.

    이 쿼리는 toBeSignedDigest 필드가 포함된 로그를 반환합니다.

toBeSignedDigest 값을 사용하여 Cloud KMS 서명 이벤트를 찾을 수 있습니다.

Cloud KMS 서명 로그로 토큰 발급 확인

서명된 다이제스트의 로그 항목을 찾으려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 표현식을 쿼리 편집기 필드에 붙여넣습니다.

    protoPayload.request.digest.sha256="DIGEST_VALUE"
    protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog"
    protoPayload.methodName="AsymmetricSign"
    protoPayload.serviceName="cloudkms.googleapis.com"
    

    DIGEST_VALUEGKE 로그로 토큰 발급 확인 섹션의 toBeSignedDigest 필드 값으로 바꿉니다.

  3. 쿼리 실행을 클릭합니다.

    이 쿼리는 인증서 발급 이벤트의 로그를 반환합니다. Cloud KMS 로그는 인증서와 JWT를 구분하지 않으므로 두 항목의 로그 항목은 동일합니다.

다음 단계