이 페이지에서는 GKE 로그를 액세스 투명성 로그와 연관시켜 Google 직원이 Google Kubernetes Engine (GKE) 클러스터 컨트롤 플레인에 연결했는지 확인하는 방법을 설명합니다.
액세스 투명성 로그는 Google 직원이 콘텐츠에 액세스할 때 수행한 작업을 기록합니다. 이 가이드는 액세스 투명성 로그의 콘텐츠와 연결된 액세스 승인 승인을 GKE의 추가 로깅 소스와 상호 연관시켜 추가로 확인하려는 보안 관리자를 대상으로 합니다. 이 확인은 전적으로 선택사항이며 컨트롤 플레인을 보호하는 데 필요하지 않습니다.
다음 개념을 숙지해야 합니다.
이 페이지에서는 GKE의 선택적 컨트롤 플레인 기능 집합 중 한 부분을 설명합니다. 이 기능을 사용하면 컨트롤 플레인 보안 상황 확인, 직접 관리하는 키를 사용한 컨트롤 플레인에서의 암호화 및 사용자 인증 정보 서명 구성과 같은 작업을 실행할 수 있습니다. 자세한 내용은 GKE 제어 영역 권한 정보를 참고하세요.
기본적으로 Google Cloud 는 관리형 컨트롤 플레인에 다양한 보안 조치를 적용합니다. 이 페이지에서는 GKE 컨트롤 플레인을 더 잘 파악하거나 제어할 수 있는 선택적 기능을 설명합니다.
클러스터 컨트롤 플레인 인스턴스에 대한 Google 액세스 정보
문제 해결 세션 중 또는 기타 정당한 비즈니스상의 이유로 사이트 안정성 엔지니어 및 Cloud 고객 지원 직원과 같은 Google 직원이 컨트롤 플레인을 호스팅하는 Compute Engine 인스턴스에 대한 관리 액세스 권한이 필요할 수 있습니다. Customer Care 지원 패키지 및 구성에 따라 액세스 투명성은 이러한 관리 액세스에 대한 자세한 감사 로깅을 제공합니다. 액세스 승인을 사용하면 Google 직원이 리소스에 액세스하기 전에 명시적인 승인을 받도록 요구할 수 있습니다. 관리 액세스 및 액세스 권한을 부여하고 변경사항을 기록하는 데 사용할 수 있는 도구에 대해 자세히 알아보려면 Google 직원의 관리 액세스를 참고하세요.
컨트롤 플레인 액세스 로그
GKE control plane authority를 사용 설정하면 GKE에서 control plane access logs를 생성하며, 이 로그를 사용하여 액세스 투명성 및 액세스 승인에서 생성된 감사 로그를 상호 참조할 수 있습니다. GKE는 컨트롤 플레인 인스턴스에서 수신되는 네트워크 연결과 특정 SSH 이벤트를 기록하기 위해 로깅의 _Default
버킷에 컨트롤 플레인 액세스 로그를 추가합니다. 클러스터의 컨트롤 플레인 액세스 로그를 생성하려면 프로젝트에서 GKE 컨트롤 플레인 권한을 사용 설정해야 합니다.
GKE는 컨트롤 플레인에 대해 다음 액세스 로그를 생성합니다.
컨트롤 플레인 연결 로그의 양은 클러스터의 노드 수, 컨트롤 플레인 인스턴스 수 (리전 클러스터에는 영역 클러스터보다 컨트롤 플레인 인스턴스가 더 많음), 워크로드가 Kubernetes API 서버를 호출하는 빈도와 같은 요인에 따라 달라집니다. SSH 로그의 볼륨은 작으며 노드 재시작 수에 따라 달라집니다.
컨트롤 플레인에 대한 연결을 확인하려면 클러스터의 컨트롤 플레인 액세스 로그를 찾아 액세스 투명성 및 액세스 승인의 감사 로그와 일치시킵니다. 이를 통해 컨트롤 플레인 인스턴스에 대한 모든 SSH 연결이 Google 직원의 승인된 관리 액세스의 결과인지 확인할 수 있습니다. 클러스터에 GKE control plane authority를 사용 설정하면 Google 직원의 컨트롤 플레인에 대한 모든 SSH 액세스가 비대화형이 됩니다. 즉, 모든 SSH 연결은 사용자가 승인한 단일 명령어를 실행합니다.
가격 책정
다음과 같은 가격 책정 고려사항이 적용됩니다.
- 컨트롤 플레인 액세스 로그에는 로깅 가격 책정이 적용됩니다.
- 액세스 투명성은 특정 고객 지원 구독에 포함되어 있습니다. 자세한 내용은 액세스 투명성 가격 책정을 참고하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화하세요. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
Cloud Logging API를 사용 설정합니다.
조직에 액세스 투명성을 사용 설정합니다. 자세한 내용은 액세스 투명성 사용 설정을 참고하세요.
원하는 경우 프로젝트에 액세스 승인을 사용 설정하고 GKE 서비스를 선택합니다. 자세한 내용은 Google 관리 서명 키를 사용하여 액세스 요청 검토 및 승인을 참고하세요.
환경에서 GKE control plane authority 기능을 사용할 수 있는지 확인합니다. 이러한 기능을 선택하려면 Google Cloud 영업팀에 문의하세요.
요구사항
컨트롤 플레인 액세스 로그에는 GKE 버전 1.31.1-gke.1846000 이상이 필요합니다.
필수 역할 및 권한
로그 생성을 사용 설정하고 로그에 액세스하여 처리하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.
-
클러스터에서 컨트롤 플레인 연결 로깅을 사용 설정합니다.
프로젝트의 Kubernetes Engine 클러스터 관리자 (
roles/container.clusterAdmin
) -
로그에 액세스하고 로그 탐색기 및 로그 분석을 사용하려면 프로젝트에 대한 로그 뷰어 (
roles/logging.viewer
)가 있어야 합니다. -
조직에 액세스 투명성을 사용 설정합니다.
조직의 액세스 투명성 관리자 (
roles/axt.admin
)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
GKE 클러스터 컨트롤 플레인 액세스 로그 사용 설정
해당 로깅 구성요소를 사용 설정하여 Autopilot 모드 및 표준 모드 클러스터의 컨트롤 플레인 액세스 로그 생성을 사용 설정할 수 있습니다. 제어 영역 로그 유형에 대한 자세한 내용은 GKE 로그 보기를 참고하세요.
컨트롤 플레인 액세스 로그에 지원되는 로깅 구성요소 이름은 다음과 같습니다.
- 컨트롤 플레인 SSH 로그:
KCP_SSHD
- 컨트롤 플레인 연결 로그:
KCP_CONNECTION
새 클러스터에서 컨트롤 플레인 액세스 로그 사용 설정
다음 예시에서는 두 유형의 컨트롤 플레인 액세스 로그가 모두 사용 설정된 Autopilot 모드 클러스터를 만듭니다. 한 유형의 컨트롤 플레인 액세스 로그만 사용 설정하려면 명령어에서 해당 구성요소 이름을 생략합니다.
gcloud container clusters create-auto CLUSTER_NAME \
--location=LOCATION \
--logging=SYSTEM,KCP_SSHD,KCP_CONNECTION
다음을 바꿉니다.
CLUSTER_NAME
: 새 클러스터 이름입니다.LOCATION
: 클러스터를 만들 위치입니다.
GKE API를 사용하여 클러스터를 만들 때 로깅 구성요소를 지정하려면 projects.locations.clusters.create
메서드에서 Cluster
리소스의 LoggingConfig
객체에 해당 값을 설정합니다.
기존 클러스터에서 컨트롤 플레인 액세스 로그 사용 설정
기존 클러스터의 로깅 구성을 업데이트하여 컨트롤 플레인 액세스 로그를 사용 설정하려면 다음을 수행해야 합니다.
- 클러스터에서 사용하는 기존 로깅 구성요소를 찾습니다.
- 해당 로깅 구성요소를 사용 설정된 상태로 유지하려면 gcloud CLI의
--logging
플래그에 지정할 해당 값을 식별합니다. - 기존 로깅 구성과 함께 컨트롤 플레인 액세스 로그를 사용 설정하도록 클러스터 로깅 구성을 업데이트합니다.
gcloud container clusters update
명령어에서 --logging
플래그에 지정한 값이 클러스터를 설명할 때 표시되는 값과 다릅니다.
클러스터의 기존 로깅 구성을 확인합니다.
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --flatten=loggingConfig \ --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
출력은 다음과 비슷합니다.
SYSTEM_COMPONENTS,WORKLOADS,APISERVER,SCHEDULER,CONTROLLER_MANAGER
이전 단계의 출력에서 로깅 구성요소 구성에 해당하는
--logging
플래그의 gcloud CLI 값을 식별합니다. 특정 로깅 구성요소에 해당하는 gcloud CLI 값 목록은 사용 가능한 로그 표를 참고하세요.컨트롤 플레인 액세스 로그를 사용하여 로깅 구성을 업데이트합니다.
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --logging=SYSTEM,EXISTING_LOGS,KCP_ACCESS_LOGS
다음을 바꿉니다.
EXISTING_LOGS
: 클러스터에서 이미 사용 중인 로깅 구성요소의 쉼표로 구분된 목록입니다. 사용 가능한 로그 표에서 가져온 이러한 로깅 구성요소에 해당하는 gcloud CLI 값을 지정해야 합니다.KCP_ACCESS_LOGS
: 클러스터에 사용 설정할 컨트롤 플레인 액세스 로그 유형을 쉼표로 구분한 목록입니다.- 컨트롤 플레인 SSH 로그의 경우
KCP_SSHD
를 지정합니다. - 컨트롤 플레인 연결 로그의 경우
KCP_CONNECTION
를 지정합니다.
- 컨트롤 플레인 SSH 로그의 경우
GKE API를 사용하여 클러스터를 업데이트할 때 로깅 구성요소를 지정하려면 projects.locations.clusters.update
메서드에서 ClusterUpdate
리소스의 LoggingConfig
객체에 기존 로깅 구성요소 값과 새 로깅 구성요소 값을 설정합니다.
컨트롤 플레인 액세스 로그를 사용 설정하기 위한 클러스터 업데이트 예시
gcloud container clusters describe
명령어에 다음 로깅 구성이 있는 클러스터를 고려해 보세요.
SYSTEM_COMPONENTS,WORKLOADS,APISERVER,SCHEDULER,CONTROLLER_MANAGER
다음 클러스터 업데이트 명령어는 이 예시 클러스터의 기존 로그 구성을 유지하면서 두 가지 유형의 컨트롤 플레인 액세스 로그를 모두 사용 설정합니다.
gcloud container clusters update example-cluster \
--location=us-central1 \
--logging=SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER,KCP_SSHD,KCP_CONNECTION
컨트롤 플레인 액세스 로그와 액세스 투명성 로그 교차 참조
클러스터의 컨트롤 플레인 액세스를 확인하려면 해당 클러스터의 컨트롤 플레인 연결 로그, 컨트롤 플레인 SSH 로그, 액세스 투명성 로그를 가져옵니다.
Google Cloud 콘솔에서 로그 탐색기 페이지를 엽니다.
제어 영역 액세스 로그와 액세스 투명성 로그를 비롯한 특정 클러스터의 모든 로그를 가져오려면 다음 쿼리를 실행하세요.
(logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-connection" resource.labels.cluster_name="CLUSTER_NAME" jsonPayload.connection.dest_port="22") OR (logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-sshd" resource.labels.cluster_name="CLUSTER_NAME") OR (logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Faccess_transparency" json_payload.accesses.methodName="GoogleInternal.SSH.Master" json_payload.accesses.resourceName="//container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME")
출력에는 클러스터의 다음 유형의 로그가 모두 표시되어야 합니다.
- 액세스 투명성 로그
- 컨트롤 플레인 연결 로그
- 각 SSH 세션의 SSH 로그
인증 확인 실행
기본 확인은 이전 섹션에서 로깅 쿼리를 실행할 때 SSH 연결의 모든 로그 유형이 표시되는지 여부입니다. 모든 액세스 투명성 로그에는 해당 컨트롤 플레인 연결 로그와 하나 이상의 SSH 로그가 있어야 합니다. 이러한 로그는 사람이 컨트롤 플레인 인스턴스에서 실행하는 작업에 관한 것이므로 로그 볼륨이 작아야 합니다.
원하는 경우 로그 콘텐츠에 대해 다음 추가 검사를 실행할 수 있습니다.
- 각 컨트롤 플레인 SSH 로그에 대해 SSH 로그의 타임스탬프 전 15분 기간에 액세스 투명성 로그가 있는지 확인합니다. 이 기간은 액세스 투명성에서 초기 연결을 기록한 후 몇 분이 지나 최종 SSH 세션이 종료되는 것을 고려한 것입니다.
- 각 컨트롤 플레인 연결 로그에 대해 컨트롤 플레인 연결 로그의 타임스탬프 전 5분 동안 액세스 투명성 로그가 있는지 확인합니다.
클러스터에 액세스 승인을 사용하는 경우 각 액세스 투명성 로그에 해당하는
accessApprovals
필드가 있는지 확인합니다. 이 필드를 클러스터의 액세스 승인 요청과 상호 참조합니다.프로젝트의 액세스 승인 요청을 확인하려면 이전 액세스 승인 요청 보기를 참고하세요. 액세스 승인에는 제외가 적용될 수 있습니다.
선택적으로 액세스 투명성 로그와 연결된 서명된 액세스 승인의 서명을 검증합니다.
컨트롤 플레인 액세스 로그 세부정보
이 섹션에서는 Google 직원이 컨트롤 플레인 인스턴스에 연결할 때 GKE에서 생성하는 컨트롤 플레인 액세스 로그의 세부정보와 예를 제공합니다.
컨트롤 플레인 연결 로그
GKE는 컨트롤 플레인 인스턴스로의 모든 새 인바운드 네트워크 연결에 대해 컨트롤 플레인 연결 로그를 추가합니다. 이러한 로그에는 다음과 같은 구체적인 세부정보가 포함됩니다.
- 소스 및 대상 IP 주소와 포트
- 연결 방향 및 프로토콜
다음은 제어 영역 연결 로그의 예입니다.
{
insertId: "z1eq8wonio335a5h",
jsonPayload: {
instance: {
vm_name: "gke-dee49f0d6fa34ce3a2ac-f513-d195-vm",
zone: "us-central1-c"
},
cluster: {
cluster_id: "CLUSTER_ID",
cluster_urn: "//container.googleapis.com/projects/PROJECT_NUMBER/locations/us-central1-c/clusters/CLUSTER_NAME"
},
connection: {
state: "NEW",
src_ip: "192.0.2.100",
src_port: 32774,
dest_ip: "203.0.113.12",
dest_port: 22,
direction: "INGRESS"
protocol: "TCP"
},
}
logName: "projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-connection",
receiveTimestamp: "2024-04-11T04:08:01.883070399Z",
resource: {
labels: {
cluster_name: "CLUSTER_NAME",
location: "us-central1-c",
project_id: "PROJECT_ID"
}
type: "gke_cluster",
}
severity: "NOTICE",
timestamp: "2024-04-11T04:07:59.019330Z"
}
로그 항목의 다음 필드는 Google의 작업을 확인하는 데 관련이 있습니다.
cluster.cluster_urn
: 클러스터의 정규화된 리소스 식별자입니다. 이 식별자의 형식은//container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME
이며, 변수는 다음과 같습니다.PROJECT_NUMBER
: 클러스터 프로젝트의 숫자 프로젝트 번호입니다.LOCATION
: 클러스터의 Google Cloud 위치입니다.CLUSTER_NAME
: 클러스터 이름입니다.
connection
: 연결 시도에 관한 세부정보입니다. 이 필드에는 다음 정보가 포함됩니다.state
: 연결 상태 새 연결의 경우 값은NEW
입니다.src_ip
: 연결 소스의 IP 주소입니다.src_port
: 연결 소스의 포트 번호입니다.dest_ip
: 컨트롤 플레인 VM의 내부 IP 주소입니다.dest_port
: 대상 포트 번호입니다.direction
: 연결 방향입니다. 이 값은 항상INGRESS
입니다.protocol
:TCP
과 같은 IP 프로토콜입니다.
컨트롤 플레인 SSH 로그
GKE는 컨트롤 플레인 인스턴스에 대한 SSH 연결과 관련된 이벤트의 컨트롤 플레인 SSH 로그를 추가합니다. GKE는 다음 이벤트를 기록합니다.
- 사용자에 대해 허용된 SSH 키
- 세션 상태가 0에서 1로 변경되어 사용자가 로그인했음을 나타냅니다.
- SSH 세션이 열림
- SSH 세션이 닫힘
- 세션 상태가 1에서 0으로 변경되어 사용자가 로그아웃했음을 나타냅니다.
- SSH 세션 실패
예를 들어 다음 컨트롤 플레인 SSH 로그는 열린 SSH 세션에 관한 것입니다.
{
insertId: "8llczemdulwbbwpa",
jsonPayload: {
instance: {
vm_name: "gke-06cb920c609941c0a5ce-6840-40e9-vm",
zone: "us-central1-c"
},
cluster: {
cluster_id: "891e6d12889747748c1ac16ffcc6cb7c0a96450b36864eb680917c119fd801d0",
cluster_urn: "//container.googleapis.com/projects/PROJECT_NUMBER/locations/us-central1/clusters/CLUSTER_NAME",
},
message: "pam_unix(sshd:session): session opened for user REDACTED by (uid=0)",
},
logName: "projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-ssh",
receiveTimestamp: "2024-04-09T13:21:55.231436462Z"
resource: {
type: "gke_cluster",
labels: {
cluster_name: "CLUSTER_NAME",
location: "us-central1",
project_id: "PROJECT_ID"
}
},
severity: "NOTICE",
timestamp: "2024-04-09T13:21:50.742246Z"
}
로그 항목의 다음 필드는 Google의 작업을 확인하는 데 관련이 있습니다.
cluster.cluster_urn
: 클러스터의 정규화된 리소스 식별자입니다. 이 식별자의 형식은//container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME
이며, 변수는 다음과 같습니다.PROJECT_NUMBER
: 클러스터 프로젝트의 숫자 프로젝트 번호입니다.LOCATION
: 클러스터의 Google Cloud 위치입니다.CLUSTER_NAME
: 클러스터 이름입니다.
message
: SSH 연결에 관한 세부정보입니다.
컨트롤 플레인 액세스 로그 사용 중지
클러스터에서 사용하는 특정 로그 유형을 보려면 다음 명령어를 실행하세요.
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --flatten=loggingConfig \ --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
출력은 다음과 비슷합니다.
SYSTEM_COMPONENTS,WORKLOADS,API_SERVER,SCHEDULER,CONTROLLER_MANAGER,KCP_SSHD,KCP_CONNECTION
클러스터의 컨트롤 플레인 액세스 로그를 사용 중지하려면 다음 명령어를 실행합니다.
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --logging=SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER
--logging
플래그에서 이전 명령어의 출력에 있는 로깅 구성요소를 지정합니다. 이 예시 명령어는 컨트롤 플레인 액세스 로그를 사용 중지하지만 다른 컨트롤 플레인 구성요소 로그는 사용 설정된 상태로 유지합니다.
GKE API를 사용하여 로깅 구성요소를 사용 중지하려면 projects.locations.clusters.update
메서드에서 ClusterUpdate
리소스의 LoggingConfig
객체에 해당하는 값을 설정합니다.
다음 단계
- 컨트롤 플레인 보안에 대해 알아봅니다.
- Google 직원의 관리 액세스에 대해 알아보세요.
- GKE의 로깅 및 모니터링을 구성하는 방법을 알아봅니다.
- 로그에 대한 필드 수준 액세스를 구성하는 방법을 알아보세요.
- 로깅 사용량 한도에 대해 알아봅니다.