감사 로깅

이 페이지에서는 Google Kubernetes Engine 클러스터에서 감사 로깅을 사용하는 방법을 설명합니다.

개요

모든 Kubernetes 지원 클러스터에는 Kubernetes API 서버에 대해 이루어진 호출을 시간순으로 기록하는 Kubernetes 감사 로깅이 있습니다. Kubernetes 감사 로그 항목은 의심스러운 API 요청 조사, 통계 수집 또는 원치 않는 API 호출에 대한 모니터링 알림 생성에 유용합니다.

GKE 클러스터는 Kubernetes 감사 로깅을 Cloud 감사 로깅Stackdriver Logging과 통합합니다. Google Cloud Platform 프로젝트에서 Kubernetes 감사 로그 항목을 볼 수 있습니다.

Kubernetes가 작성하는 항목 외에 프로젝트의 감사 로그에는 Kubernetes Engine이 작성하는 항목이 있습니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 수행하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 지역 클러스터를 사용하는 경우 기본 컴퓨팅 지역을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

프로젝트에 Kubernetes Engine 클러스터가 있어야 합니다. 기존 클러스터를 사용하거나 이 주제의 연습을 위해 새 클러스터를 만들 수 있습니다. 기존 클러스터를 사용하는 경우, 최근에 활동이 있었던 클러스터여야 합니다. 예를 들어 최근에 배포를 만들지 않은 경우, 다음 명령을 입력하여 배포를 만들 수 있습니다.

kubectl run log-exercise --image nginx

Kubernetes 감사 로깅에 대해 알아봅니다.

프로젝트의 감사 로그

GCP 프로젝트에는 다음과 같은 감사 로그가 있습니다.

  • 관리자 활동 로그
  • 데이터 액세스 로그

관리자 활동 로깅은 기본적으로 사용 설정되며, 추가 비용이 없습니다.

데이터 액세스 로깅은 기본적으로 사용되지 않으며, 사용 설정하면 추가 요금이 청구될 수 있습니다. 데이터 액세스 로깅 사용 설정 및 관련 비용에 대한 자세한 내용은 데이터 액세스 로그 구성을 참조하세요.

Kubernetes Engine은 액세스 투명성 로깅을 지원하지 않습니다.

다양한 Google Cloud Platform 서비스가 프로젝트의 로그에 항목을 작성합니다. Kubernetes 서비스도 프로젝트의 감사 로그에 항목을 작성합니다. Kubernetes Engine 클러스터의 경우, 다음 서비스가 작성하는 로그 항목이 가장 관련성이 높습니다.

서비스 표시 이름
k8s.io Kubernetes
container.googleapis.com Kubernetes Engine

프로젝트의 관리자 활동 로그 보기

콘솔

  1. GCP 콘솔에서 로깅 메뉴의 로그 페이지로 이동합니다.

    로그 페이지로 이동

  2. 페이지 상단 근처에서 리소스 유형을 선택하는 드롭다운 메뉴를 찾습니다. 드롭다운 메뉴에서 Kubernetes 클러스터를 선택합니다.

  3. 원하는 경우, 위치를 지정하거나 모든 위치를 선택합니다. 위치를 선택하면 해당 위치의 특정 클러스터를 선택할 수 있습니다.

  4. 오른쪽의 다음 메뉴는 로그 선택 메뉴입니다. 드롭다운 메뉴에서 활동을 선택하고 확인을 클릭합니다.

  5. 기본적으로 모든 로그 수준이 표시됩니다. 경고와 같은 로그 수준을 지정하려면 로그 수준을 나타내는 드롭다운 메뉴에서 선택합니다.

  6. 지난 1시간 동안의 로그 항목만 표시될 수 있습니다. 지난 1시간 동안의 로그 항목이 표시되지 않으면 이전 로그 로드를 클릭합니다.

  7. 위에서 설명한 드롭다운 메뉴 바로 위의 라벨로 필터링 또는 텍스트 검색창에서 아래쪽 화살표를 클릭하여 드롭다운 메뉴를 엽니다. 메뉴에서 고급 필터로 전환을 클릭합니다.

  8. 입력란에 다음과 비슷한 필터가 표시됩니다.

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  9. 줄 시작 부분에 있는 화살표를 클릭하여 로그 항목 중 하나를 엽니다. 항목의 logName 필드는 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity 값을 갖습니다.

gcloud

프로젝트 관리자 활동 로그의 처음 두 로그 항목을 나열합니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"' \
    --limit 2 \
    --freshness 300d

여기서 [PROJECT_ID]는 프로젝트 ID입니다.

출력에 두 로그 항목이 표시됩니다. 각 로그 항목에서 logName 필드의 값은 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity입니다.

insertId: 18yao5jem14og
labels:
  cluster_version: 1.8.8-gke.0
logName: projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity
...

기본 및 고급 필터링 모드

GCP 콘솔에서 로그 페이지에는 기본과 고급이라는 두 가지 필터링 모드가 있습니다.

기본 모드에서는 드롭다운 메뉴를 사용하여 리소스 유형, 로그 이름, 로그 수준에 따라 표시를 필터링할 수 있습니다. 고급 메뉴에서는 입력란에 커스텀 필터를 입력하여 세밀한 필터링을 사용할 수 있습니다.

활성 상태인 모드 확인하기

로그 페이지의 필터 상자에서 오른쪽에 있는 아래쪽 화살표를 클릭합니다. 메뉴 항목에 고급 필터로 전환이 보이면 페이지는 기본 모드입니다. 필터를 지우고 기본 모드로 돌아가기가 보이면 페이지는 고급 모드입니다.

필터링 모드 변경

필터링 모드를 변경하려면 필터 상자 오른쪽에 있는 아래쪽 화살표를 클릭하고 고급 필터로 전환 또는 필터를 지우고 기본 모드로 돌아가기를 선택합니다.

관리자 활동 로그에 기록하는 서비스 보기

콘솔

  1. GCP 콘솔에서 로깅 메뉴의 로그 페이지로 이동합니다.

    로그 페이지로 이동

  2. 로그 페이지가 아직 고급 모드가 아니라면 고급 모드로 전환합니다. 필터 상자에서 오른쪽에 있는 아래쪽 화살표를 클릭하고 고급 필터로 전환을 선택합니다.

  3. 필터 상자에서 기존 텍스트를 모두 지우고 다음 필터를 입력합니다.

    logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="k8s.io"
    

    여기서 [PROJECT_ID]는 프로젝트 ID입니다.

    필터 제출을 클릭합니다.

    관리자 활동 로그에 k8s.io 서비스가 작성한 모든 항목이 표시됩니다. 즉, 이러한 항목은 Kubernetes 제어 영역이 작성한 것입니다.

  4. 이제 k8s.io 이외의 서비스가 작성한 로그 항목을 찾습니다. 필터 상자에서 serviceName="k8s.io"serviceName!="k8s.io"로 변경합니다. 필터 제출을 클릭합니다.

    관리자 활동 로그에 k8s.io 서비스가 작성하지 않은 로그 항목이 표시됩니다.

  5. 로그 항목 중 하나를 열고 protoPayload 필드를 펼칩니다. serviceName의 값을 보고 어떤 서비스가 로그 항목을 작성했는지 확인합니다.

  6. 이제 container.googleapis.com 서비스가 작성한 로그 항목을 찾습니다. 즉, 이러한 항목은 Kubernetes Engine 제어 영역이 작성한 것입니다. 필터 상자에서 serviceName!="k8s.io"serviceName="container.googleapis.com"으로 변경합니다. 필터 제출을 클릭합니다.

gcloud

프로젝트의 관리자 활동 로그에서 k8s.io 서비스가 작성한 처음 두 로그 항목을 나열합니다. 이것은 Kubernetes 제어 영역이 작성한 항목입니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="k8s.io"' \
    --limit 2 \
    --freshness 300d

여기서 [PROJECT_ID]는 프로젝트 ID입니다.

출력에서 protoPayload:serviceName의 값이 k8s.io임을 볼 수 있습니다.

protoPayload:
  ...
  serviceName: k8s.io

이제 k8s.io 이외의 서비스가 작성한 로그 항목을 찾습니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName!="k8s.io"' \
    --limit 2 \
    --freshness 300d

출력에는 관리자 활동 로그에서 k8s.io 서비스가 작성하지 않은 로그 항목이 나열됩니다.

logName: projects/steve-70/logs/cloudaudit.googleapis.com%2Factivity
...
protoPayload:
  ...
  serviceName: compute.googleapis.com
...

로그 항목 중 하나에서 protoPayload.serviceName의 값을 보고 로그 항목을 작성한 서비스를 확인합니다.

이제 container.googleapis.com 서비스가 작성한 로그 항목을 찾습니다. 즉, 이러한 항목은 Kubernetes Engine 제어 영역이 작성한 것입니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="container.googleapis.com"' \
    --limit 2 \
    --freshness 300d

여기서 [PROJECT_ID]는 프로젝트 ID입니다.

리소스 유형별로 관리자 활동 로그 필터링

관리자 활동 로그의 각 로그 항목은 일정 유형의 리소스에 적용됩니다. 다음은 Kubernetes 클러스터와 가장 관련성이 높은 리소스 유형입니다.

리소스 유형 표시 이름
k8s_cluster Kubernetes 클러스터
gke_cluster GKE 클러스터 작업

Kubernetes API 서버가 작성한 로그 항목은 k8s_cluster 리소스 유형에 적용됩니다. 이러한 로그 항목은 포드, 배포, 보안 비밀 등 클러스터의 Kubernetes 리소스에 대한 작업을 설명합니다.

Kubernetes Engine API 서버가 작성한 로그 항목은 gke_cluster 리소스에 적용됩니다. 이러한 로그 항목은 클러스터 생성 및 삭제 같은 작업을 설명합니다.

콘솔

  1. GCP 콘솔에서 로깅 메뉴의 로그 페이지로 이동합니다.

    로그 페이지로 이동

  2. 로그 페이지가 아직 기본 모드가 아니라면 기본 모드로 전환합니다. 필터 상자에서 오른쪽에 있는 아래쪽 화살표를 클릭하고 필터를 지우고 기본 모드로 돌아가기를 선택합니다.

  3. 리소스 유형을 선택하는 드롭다운 메뉴에서 Kubernetes 클러스터를 선택합니다. 이것은 k8s_cluster 리소스 유형의 표시 이름입니다.

  4. 로그를 선택하는 드롭다운 메뉴에서 활동을 선택하고 확인을 클릭합니다.

    관리자 활동 로그에서 k8s_cluster 리소스 유형에 적용되는 모든 로그 항목이 표시됩니다.

  5. 로그 항목 중 하나를 열고 resource 필드를 펼칩니다. type 필드의 값이 k8s_cluster인지 확인합니다.

  6. 이제 드롭다운 메뉴에서 GKE 클러스터 작업을 선택합니다. 이것은 gke_cluster 리소스 유형의 표시 이름입니다. 로그를 선택하는 드롭다운 메뉴에서 활동을 선택하고 확인을 클릭합니다.

    관리자 활동 로그에서 gke_cluster 리소스 유형에 적용되는 모든 로그 항목이 표시됩니다.

gcloud

프로젝트의 관리자 활동 로그에서 k8s_cluster 리소스 유형에 적용되는 처음 두 로그 항목을 나열합니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="k8s_cluster"' \
    --limit 2 \
    --freshness 300d

여기서 [PROJECT_ID]는 프로젝트 ID입니다.

출력에서 resource:type 필드의 값이 k8s_cluster임을 볼 수 있습니다.

resource:
  ...
  type: k8s_cluster

다음으로 프로젝트 관리자 활동 로그에서 gke_cluster 리소스 유형에 적용되는 처음 두 로그 항목을 나열합니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="gke_cluster"' \
    --limit 2 \
    --freshness 300d

출력에서 resource:type 필드의 값이 gke_cluster임을 볼 수 있습니다.

resource:
  ...
  type: gke_cluster

관리자 활동 로그용 필터의 예

다음은 GCP 콘솔에서 사용해 볼 수 있는 필터의 몇 가지 예입니다. 각 경우에 [PROJECT_ID]를 프로젝트 ID로 바꿉니다.

관리자 활동 로그에서 k8s_cluster 리소스 유형에 적용되고 배포 만들기를 설명하는 항목을 찾습니다.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"deployments.create"

관리자 활동 로그에서 k8s_cluster 리소스 유형에 적용되고 principalEmail 값이 system:anonymous인 항목을 찾습니다. 이러한 항목은 인증 시도 실패를 나타내는 것일 수 있습니다.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail="system:anonymous"

관리자 활동 로그에서 gke_cluster 리소스 유형에 적용되고 클러스터 만들기를 설명하는 항목을 찾습니다.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"

관리자 활동 로그에서 gke_cluster 리소스 유형에 적용되고 severity 값이 ERROR인 항목을 찾습니다.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

관리자 활동 로그에서 k8s_cluster 리소스 유형에 적용되고 보안 비밀에 대한 쓰기 요청을 설명하는 항목을 찾습니다.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.secrets"
NOT protoPayload.methodName:"get"
NOT protoPayload.methodName:"list"
NOT protoPayload.methodName:"watch"

관리자 활동 로그에서 k8s_cluster 리소스 유형에 적용되고 특정 사용자의 포드 요청을 설명하는 항목을 찾습니다.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.pods"
protoPayload.authenticationInfo.principalEmail="dev@example.com"

필터를 구성하는 자세한 방법은 고급 로그 필터를 참조하세요.

로그 항목의 구조

모든 로그 항목은 LogEntry 유형의 객체입니다. 자세한 내용은 감사 로그 데이터 유형을 참조하세요.

데이터 액세스 로그 사용 설정

프로젝트의 ID 및 액세스 관리(IAM) 정책을 가져옵니다.

gcloud projects get-iam-policy [PROJECT_ID] > my-policy.yaml

여기서 [PROJECT_ID]는 프로젝트 ID입니다.

my-policy.yaml을 열어 IAM 정책을 봅니다. 정책에는 다음과 비슷한 bindings 객체가 포함될 수 있습니다.

bindings:
- members:
  - serviceAccount:xxx.gserviceaccount.com
  - serviceAccount:yyy.gserviceaccount.com
  role: roles/container.clusterAdmin
- members:
  ...

my-policy.yaml에서 auditConfigs 객체를 만들거나 기존 auditConfigs에 추가하면 ADMIN_READ, DATA_WRITE, DATA_READauditLogConfigs 아래 나열됩니다.

auditConfigs:
- auditLogConfigs:
  - logType: ADMIN_READ
  - logType: DATA_WRITE
  - logType: DATA_READ
  service: allServices

etag 값은 변경하면 안 됩니다.

업데이트된 파일을 my-policy-2.yaml로 저장합니다.

프로젝트의 IAM 정책을 설정합니다.

gcloud projects set-iam-policy [PROJECT_ID] my-policy-2.yaml

여기서 [PROJECT_ID]는 프로젝트 ID입니다.

프로젝트의 데이터 액세스 로그 보기

콘솔

  1. GCP 콘솔에서 로깅 메뉴의 로그 페이지로 이동합니다.

    로그 페이지로 이동

  2. 로그 페이지가 아직 기본 모드가 아니라면 기본 모드로 전환합니다. 필터 상자에서 오른쪽에 있는 아래쪽 화살표를 클릭하고 필터를 지우고 기본 모드로 돌아가기를 선택합니다.

  3. 페이지 상단 근처에서 리소스 유형을 선택하는 드롭다운 메뉴를 찾습니다. 드롭다운 메뉴에서 Kubernetes 클러스터를 선택합니다.

  4. 로그를 선택하는 드롭다운 메뉴에서 data_access을 선택하고 확인을 클릭합니다.

  5. 라벨로 필터링 또는 텍스트 검색창의 오른쪽에서 아래쪽 화살표를 클릭하여 드롭다운 메뉴를 엽니다. 메뉴에서 고급 필터로 전환을 클릭합니다.

  6. 입력란에 다음과 비슷한 필터가 표시됩니다.

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access"
  7. 로그 항목 중 하나를 열고 항목의 logName 필드 값이 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access인지 확인합니다.

gcloud

프로젝트의 데이터 액세스 로그에서 처음 두 로그 항목을 나열합니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"' \
    --limit 2 \
    --freshness 30d

여기서 [PROJECT_ID]는 프로젝트 ID입니다.

출력에 두 로그 항목이 표시됩니다. 각 로그 항목에서 logName 필드의 값은 projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access입니다.

insertId:  "x0vy9eej0j54"
labels: {…}
logName:  "projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"
...

로그 항목 내보내기 및 저장

로그 항목은 보관 기간이라는 제한된 시간 동안 Stackdriver Logging에 보관됩니다. 보관 기간이 지난 항목은 삭제됩니다.

로그 항목을 더 오래 보관하려면 Cloud Storage, BigQuery 또는 Cloud Pub/Sub 같은 Google 서비스로 내보냅니다.

측정항목 및 알림 설정

Stackdriver Monitoring을 사용하여 로그 항목을 기반으로 측정항목을 설정할 수 있습니다. 로그 기반 측정항목을 사용하여 차트 및 알림을 설정할 수 있습니다.

감사 정책

Kubernetes 감사 정책은 Kubernetes API 서버가 내보내는 로그 항목을 결정합니다. Kubernetes Engine 감사 정책은 관리자 활동 로그에 기록되는 항목과 데이터 액세스 로그에 기록되는 항목을 결정합니다.

Kubernetes Engine의 감사 정책에 대한 자세한 내용은 Kubernetes Engine 감사 정책을 참조하세요.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine