이 페이지에서는 GKE 로그를 액세스 투명성 로그와 연결하여 Google 직원이 Google Kubernetes Engine (GKE) 클러스터 제어 영역에 연결했는지 확인하는 방법을 설명합니다.
액세스 투명성 로그는 Google 직원이 콘텐츠에 액세스할 때 수행한 작업을 기록합니다. 이 가이드는 GKE의 추가 로깅 소스와 상관시켜 액세스 투명성 로그의 콘텐츠와 관련 액세스 승인 승인을 추가로 확인하려는 보안 관리자를 위해 작성되었습니다. 이 인증은 전적으로 선택사항이며 제어 영역을 보호하는 데 필요하지 않습니다.
다음 개념을 숙지해야 합니다.
이 페이지에서는 GKE의 선택적 제어 영역 기능 세트 중 하나를 설명합니다. 이 기능을 사용하면 제어 영역 보안 상태를 확인하거나 관리하는 키를 사용하여 제어 영역에서 암호화 및 사용자 인증 정보 서명을 구성하는 등의 작업을 실행할 수 있습니다. 자세한 내용은 GKE 제어 영역 권한 정보를 참고하세요.
기본적으로 Google Cloud 는 관리 컨트롤 플레인에 다양한 보안 조치를 적용합니다. 이 페이지에서는 GKE 제어 영역을 더 잘 확인하거나 제어할 수 있는 선택적 기능을 설명합니다.
클러스터 제어 영역 인스턴스에 대한 Google 액세스 정보
문제 해결 세션 중 또는 기타 타당한 비즈니스 사유로 인해 사이트 안정성 엔지니어, Cloud 고객 지원 담당자와 같은 Google 직원이 제어 플레인을 호스팅하는 Compute Engine 인스턴스에 대한 관리 액세스가 필요할 수 있습니다. 고객 지원 패키지 및 구성에 따라 액세스 투명성은 이 관리 액세스에 대한 자세한 감사 로깅을 제공합니다. 액세스 승인을 사용하면 Google 직원이 리소스에 액세스하기 전에 명시적인 승인을 받도록 요구할 수 있습니다. 관리 액세스 및 액세스 권한을 승인하고 변경사항을 기록하는 데 사용할 수 있는 도구에 대해 자세히 알아보려면 Google 직원의 관리 액세스를 참고하세요.
제어 영역 액세스 로그
GKE 제어 영역 권한을 사용 설정하면 GKE에서 제어 영역 액세스 로그를 생성합니다. 이 로그는 원하는 경우 액세스 투명성과 액세스 승인에서 생성된 감사 로그를 교차 참조하는 데 사용할 수 있습니다. GKE는 Logging의 _Default
버킷에 컨트롤 플레인 액세스 로그를 추가하여 컨트롤 플레인 인스턴스의 수신 네트워크 연결 및 특정 SSH 이벤트를 기록합니다. 클러스터의 제어 영역 액세스 로그를 생성하려면 프로젝트에서 GKE 제어 영역 권한을 사용 설정해야 합니다.
GKE는 제어 영역의 다음 액세스 로그를 생성합니다.
제어 영역 연결 로그의 양은 클러스터의 노드 수, 제어 영역 인스턴스 수 (지역 클러스터에는 zonal 클러스터보다 제어 영역 인스턴스가 더 많음), 워크로드가 Kubernetes API 서버를 호출하는 빈도와 같은 요인에 따라 다릅니다. SSH 로그의 양은 적으며 노드 재시작 수에 따라 다릅니다.
제어 영역 연결을 확인하려면 클러스터의 제어 영역 액세스 로그를 찾아 액세스 투명성 및 액세스 승인의 감사 로그와 일치시킵니다. 이렇게 하면 제어 영역 인스턴스에 대한 모든 SSH 연결이 Google 직원의 승인된 관리 액세스 권한으로 인한 것인지 확인할 수 있습니다. 클러스터에 GKE 제어 영역 권한을 사용 설정하면 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 제어 영역 권한 기능을 사용할 수 있는지 확인합니다. 이러한 기능을 사용하려면 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의 로깅 및 모니터링을 구성하는 방법을 알아보세요.
- 로그에 대한 필드 수준 액세스를 구성하는 방법을 알아보세요.
- 로그 사용 한도에 대해 알아보세요.