GKE 노드에서 Linux 감사 로그 사용 설정

이 페이지에서는 Container-Optimized OS를 실행하는 Google Kubernetes Engine 노드에서 자세한 운영체제 감사 로그를 사용 설정하는 방법을 설명합니다. 이 페이지에서는 Google Cloud의 작업 제품군에 로그를 보내도록 Logging 에이전트를 구성하는 방법도 설명합니다.

운영체제 감사 로깅은 Cloud 감사 로그Kubernetes 감사 로그와는 다릅니다.

개요

노드의 운영체제 로그는 오류 메시지, 로그인 시도, 바이너리 실행과 같은 클러스터 및 워크로드 상태의 중요한 정보를 제공합니다. 이 정보를 사용하여 문제를 디버깅하거나 보안 이슈를 조사할 수 있습니다.

클러스터의 각 노드에서 로그를 수집하려면 DaemonSet를 예약할 수 있는 각 클러스터 노드에서 정확히 하나의 Pod를 실행하는 DaemonSet를 사용합니다. 이 Pod는 호스트의 auditd 로깅 데몬을 구성하고 로깅 에이전트가 Stackdriver 또는 다른 로그 수집 서비스로 로그를 전송하도록 구성합니다.

기본적으로 감사는 이벤트 이후에 발생하며 사후 보안 조치입니다. auditd 로그만으로는 클러스터에서 증거를 수집하기에 충분하지 않을 수 있습니다. 전체 보안 전략의 일부로 auditd 로깅을 가장 잘 사용하는 방법을 고려하세요.

제한사항

이 페이지에서 설명하는 로깅 메커니즘은 컨테이너 최적화 OS를 실행하는 노드에서만 작동합니다.

로깅 DaemonSet 작동 방식

이 섹션에서는 개발자의 필요에 맞게 구성할 수 있도록 예시 로깅 DaemonSet의 작동 방식을 설명합니다. 다음 섹션에서는 DaemonSet를 배포하는 방법을 설명합니다.

예시 매니페스트는 DaemonSet, ConfigMap과 이를 포함하는 네임스페이스를 정의합니다.

DaemonSet는 클러스터의 각 노드에 Pod를 배포합니다. Pod에는 컨테이너가 2개 있습니다. 첫 번째 컨테이너는 cloud-audit-setup systemd 서비스를 시작하는 init 컨테이너입니다. 두 번째 컨테이너인 fluentd-gcp-cos-auditdfluentd를 기반으로 하는 애플리케이션인 Google Cloud의 작업 제품군 Logging 에이전트에 사용됩니다.

예시 로깅 DaemonSet는 다음 이벤트를 로깅합니다.

  • auditd 시스템 구성 수정
  • AppArmor 권한 검사
  • execve(), socket(), setsockopt(), mmap() 실행
  • 네트워크 연결
  • 사용자 로그인
  • SSH 세션 및 기타 모든 TTY(kubectl exec -t 세션 포함)

로깅 DaemonSet 구성

ConfigMap(fluentd-gcp-config-cos-auditd)을 사용하여 로깅 DaemonSet를 구성합니다. 제공된 예시는 감사 로그를 Google Cloud의 작업 제품군으로 전송하지만 로그를 Google Cloud 이외의 작업 제품군 대상에 전송하도록 구성할 수 있습니다.

auditd에서 생성한 로그의 양은 매우 많을 수 있으며, 이는 시스템 리소스를 소비하고 기본 로깅 구성보다 많은 로그를 전송하므로 추가 비용이 발생할 수 있습니다. 필터를 설정하여 로깅 볼륨을 관리할 수 있습니다.

로깅 DaemonSet 배포

  1. 기존 클러스터를 사용하거나 새 클러스터를 생성할 수 있습니다.

  2. 예시 매니페스트를 다운로드합니다.

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-node-tools/master/os-audit/cos-auditd-logging.yaml > cos-auditd-logging.yaml
    
  3. 예시 매니페스트를 필요에 맞게 수정합니다. DaemonSet 작동 방식에 대한 자세한 내용은 이전 섹션을 참조하세요.

  4. 로깅 DaemonSet 및 ConfigMap을 배포합니다.

    kubectl apply -f cos-auditd-logging.yaml
    
  5. 로깅 Pod가 시작되었는지 확인합니다. 매니페스트에 다른 네임스페이스를 정의한 경우 사용 중인 네임스페이스의 이름으로 cos-auditd를 바꿉니다.

    kubectl get pods --namespace=cos-auditd
    

    Pod가 실행 중이면 출력은 다음과 같습니다.

    NAME                                             READY   STATUS    RESTARTS   AGE
    cos-auditd-logging-g5sbq                         1/1     Running   0          27s
    cos-auditd-logging-l5p8m                         1/1     Running   0          27s
    cos-auditd-logging-tgwz6                         1/1     Running   0          27s
    

    클러스터의 각 노드에 하나의 Pod가 배포됩니다. 이 경우 클러스터에는 노드가 3개 있습니다.

  6. 이제 Google Cloud의 작업 제품군에서 감사 로그에 액세스할 수 있습니다. 로그 뷰어에서 VM 인스턴스별로 결과를 필터링합니다.

로그 내보내기

로그를 내보내는 방법은 다음 페이지를 참조하세요.

삭제

auditd 로깅을 사용 중지하려면 로깅 DaemonSet를 삭제하고 노드를 재부팅합니다. 감사 구성이 사용 설정되면 잠기며 노드를 다시 만들어야만 변경할 수 있습니다.

  1. 클러스터에서 DaemonSet, ConfigMap, 네임스페이스를 삭제합니다.

    kubectl delete -f cos-auditd-logging.yaml
    
  2. 클러스터의 노드를 재부팅합니다. 먼저 이러한 노드가 속한 인스턴스 그룹을 가져옵니다.

    instance_group=$(gcloud compute instance-groups managed list \
                        --format="value(name)" \
                        --filter=${CLUSTER_NAME})
    

    그런 다음 인스턴스를 직접 가져옵니다.

    instances=$(gcloud compute instance-groups managed list-instances ${instance_group} \
                   --format="csv(instance)[no-heading][terminator=',']")
    

    마지막으로 인스턴스를 다시 만듭니다.

    gcloud compute instance-groups managed recreate-instances ${instance_group} \
       --instances=${instances}
    

다음 단계