서버구축 (WEB,DB)

Kubernetes 클러스터 Audit 감사 로그 수집 및 모니터링

날으는물고기 2024. 10. 1. 00:45

kubectl 명령어를 통해 수행한 액션 로그를 기록하고 모니터링하는 방법은 크게 두 가지로 나눌 수 있습니다. 첫 번째는 kubectl의 클라이언트 측에서 로그를 기록하는 방법이고, 두 번째는 쿠버네티스 서버 측에서 API 서버의 액세스 로그를 모니터링하는 방법입니다.

1. 클라이언트 측에서 kubectl 명령어 로그 기록

kubectl 클라이언트에서 수행한 명령어를 로컬 파일에 기록하는 방법입니다.

방법 1: kubectl alias 설정을 통한 로깅

kubectl 명령어를 로깅하는 가장 간단한 방법은 alias를 설정하는 것입니다. 아래 예시는 kubectl 명령어를 수행할 때마다 해당 명령어를 로그 파일에 기록하는 방법입니다.

alias kubectl='kubectl --context=my-cluster | tee -a ~/.kubectl-command.log'

이렇게 설정하면 kubectl 명령어를 실행할 때마다 그 명령어와 결과가 ~/.kubectl-command.log 파일에 저장됩니다.

방법 2: 쉘 히스토리 활용

bash와 같은 쉘을 사용하는 경우, 히스토리를 활성화하여 kubectl 명령어를 포함한 모든 명령어 기록을 저장할 수 있습니다.

export HISTFILE=~/.kubectl_history
export HISTSIZE=10000
export HISTTIMEFORMAT="%F %T "

이렇게 하면 ~/.kubectl_history 파일에 모든 명령어와 실행 시간이 기록됩니다. 나중에 이 파일을 분석하여 kubectl 명령어 로그를 확인할 수 있습니다.

2. 서버 측에서 API 서버 액세스 로그 모니터링

쿠버네티스 API 서버는 모든 kubectl 요청을 처리하며, 이 요청들은 API 서버의 로그에 기록됩니다. 이를 통해 누가 어떤 리소스에 대해 어떤 요청을 보냈는지 확인할 수 있습니다.

방법 1: API 서버 감사 로깅(Audit Logging)

쿠버네티스는 감사 로깅(Audit Logging)을 통해 클러스터에서 수행된 모든 API 요청을 기록할 수 있습니다. 이를 설정하려면 kube-apiserver의 감사 로깅 기능을 활성화해야 합니다.

  1. Audit Policy 설정 파일 작성: audit-policy.yaml 파일을 작성합니다.
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
  resources:
  - group: ""
    resources: ["pods", "services"]
- level: RequestResponse
  users: ["admin"]
  verbs: ["create", "update", "delete"]
  resources:
  - group: ""
    resources: ["pods", "services"]
  1. API 서버에 감사 로깅 설정 적용: kube-apiserver 실행에 --audit-policy-file--audit-log-path 옵션을 추가합니다.
kube-apiserver --audit-policy-file=/etc/kubernetes/audit-policy.yaml --audit-log-path=/var/log/kubernetes/audit.log

이제 API 서버는 모든 kubectl 요청을 /var/log/kubernetes/audit.log 파일에 기록합니다.

방법 2: 클라우드 환경에서의 로깅

AWS, GCP, Azure 등의 클라우드 환경에서 쿠버네티스를 운영하는 경우, 클라우드의 로그 관리 서비스를 통해 API 서버 로그를 수집하고 분석할 수 있습니다. 예를 들어 AWS에서는 CloudTrail을 사용하여 API 요청 로그를 기록하고 모니터링할 수 있습니다.

3. 로깅된 데이터의 모니터링 및 분석

로깅된 데이터를 모니터링하려면 ELK(Elasticsearch, Logstash, Kibana) 스택이나 Prometheus와 같은 모니터링 도구를 사용할 수 있습니다. 로그 파일을 Logstash로 전송한 뒤, Kibana를 사용하여 시각화하거나 특정 패턴에 대한 알림을 설정할 수 있습니다. 이러한 방법을 통해 kubectl 명령어 로그를 효과적으로 기록하고 모니터링할 수 있습니다. 보안 및 컴플라이언스 요구사항에 따라 적절한 방법을 선택하여 사용하면 됩니다.

Kubernetes 클러스터에서 kubectl 및 콘솔 접근 로그를 통합적으로 수집하고 관리하기 위해 다음과 같은 단계를 거칠 수 있습니다.

1. kubectl 로그 수집

kubectl 명령어 로그를 수집하기 위해 다음 방법을 사용할 수 있습니다. Kubernetes의 Audit Logging 기능을 활용하여 API 서버에 대한 모든 접근 로그를 수집할 수 있습니다.

  1. Audit Policy 설정: audit-policy.yaml 파일을 생성하여 어떤 이벤트를 로깅할지 정의합니다.
    apiVersion: audit.k8s.io/v1
    kind: Policy
    rules:
    - level: Metadata
      resources:
      - group: ""
        resources: ["pods"]
      verbs: ["create", "delete", "update"]
  2. API 서버에 Audit Policy 적용: kube-apiserver 시작 옵션에 --audit-policy-file--audit-log-path를 추가합니다.
    --audit-policy-file=/etc/kubernetes/audit-policy.yaml
    --audit-log-path=/var/log/kubernetes/audit.log

2. 콘솔 접근 로그 수집

Kubernetes 관리용 콘솔 (예: Kubernetes Dashboard, Lens 등)의 접근 로그를 수집하려면 해당 콘솔의 로그 설정을 참고하여 로그를 적절히 수집할 수 있도록 설정해야 합니다.

  1. Dashboard 설치
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
  2. Dashboard 로그 확인
    kubectl logs 명령어로 Dashboard 로그를 확인할 수 있습니다.
    kubectl -n kubernetes-dashboard logs <dashboard-pod-name>

3. 중앙화된 로그 수집 및 관리

로그 수집을 중앙화하기 위해 ELK 스택(Elasticsearch, Logstash, Kibana) 또는 Loki+Grafana와 같은 로그 수집 및 시각화 도구를 사용할 수 있습니다.

  1. Elasticsearch 설치
    kubectl apply -f https://download.elastic.co/downloads/eck/1.7.1/all-in-one.yaml
  2. Logstash 설정
    Logstash를 통해 kubectl 및 콘솔 로그를 수집하도록 설정합니다.
    input {
      file {
        path => "/var/log/kubernetes/audit.log"
        start_position => "beginning"
      }
    }
    output {
      elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        index => "kubernetes-logs"
      }
    }
  3. Kibana 설치
    kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/v1.7.1/config/samples/kibana/kibana.yaml
  4. Kibana에서 대시보드 설정
    Kibana를 통해 로그를 시각화하고 모니터링 대시보드를 설정합니다.

4. Loki+Grafana 설정

Loki와 Grafana를 사용하여 로그를 수집하고 시각화할 수도 있습니다.

  1. Loki 설치
    helm upgrade --install loki grafana/loki-stack
  2. Promtail 설정
    Promtail을 사용하여 로그를 Loki로 전송합니다.
    server:
      http_listen_port: 9080
    clients:
      - url: http://loki:3100/loki/api/v1/push
    positions:
      filename: /tmp/positions.yaml
    scrape_configs:
    - job_name: kubernetes-logs
      static_configs:
      - targets:
        - localhost
        labels:
          job: kubernetes-logs
          __path__: /var/log/kubernetes/audit.log
  3. Grafana에서 대시보드 설정
    Grafana를 통해 Loki 데이터를 시각화하고 모니터링 대시보드를 설정합니다.

이렇게 설정하면 Kubernetes 클러스터의 모든 접근 로그를 중앙에서 모니터링하고 관리할 수 있습니다. Kubernetes 클러스터에서 kubectl 명령어를 통한 apply, patch 등의 설정 변경 이력을 수집하고 모니터링 할 수 있습니다.

1. Audit Logging 설정

Kubernetes Audit Logging을 통해 API 서버에 대한 모든 접근과 변경 이력을 기록할 수 있습니다. apply, patch 등의 이벤트를 포함하여 상세히 로그를 남기도록 설정합니다. audit-policy.yaml 파일을 생성하여 적용할 이벤트를 설정합니다. 다음 예시는 create, update, patch 이벤트를 로깅하도록 설정합니다.

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
  verbs: ["create", "update", "patch"]
  resources:
  - group: ""
    resources: ["*"]
  - group: "apps"
    resources: ["deployments", "statefulsets", "daemonsets"]
  - group: "batch"
    resources: ["jobs", "cronjobs"]

API 서버에 Audit Policy 적용

kube-apiserver 시작 옵션에 --audit-policy-file--audit-log-path를 추가하여 설정합니다.

--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit.log

2. 로그 수집 및 중앙화

수집된 로그를 중앙에서 모니터링하고 분석할 수 있도록 ELK 스택 또는 Loki+Grafana를 사용하여 로그를 중앙화합니다. ELK 스택을 사용하여 로그를 수집하고 분석합니다.

  1. Elasticsearch 설치
    kubectl apply -f https://download.elastic.co/downloads/eck/1.7.1/all-in-one.yaml
  2. Logstash 설정
    Logstash를 통해 audit.log 파일을 수집하여 Elasticsearch로 전송합니다.
    input {
      file {
        path => "/var/log/kubernetes/audit.log"
        start_position => "beginning"
      }
    }
    filter {
      json {
        source => "message"
      }
    }
    output {
      elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        index => "kubernetes-logs"
      }
    }
  3. Kibana 설치 및 설정
    kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/v1.7.1/config/samples/kibana/kibana.yaml
  4. Kibana 대시보드 설정
    Kibana에서 Audit 로그를 시각화하고 필요한 이벤트를 모니터링할 수 있도록 대시보드를 설정합니다.

Loki+Grafana 설정

Loki와 Grafana를 사용하여 로그를 수집하고 시각화합니다.

  1. Loki 설치
    helm upgrade --install loki grafana/loki-stack
  2. Promtail 설정
    Promtail을 사용하여 audit.log 파일을 Loki로 전송합니다.
    server:
      http_listen_port: 9080
    clients:
      - url: http://loki:3100/loki/api/v1/push
    positions:
      filename: /tmp/positions.yaml
    scrape_configs:
    - job_name: kubernetes-logs
      static_configs:
      - targets:
        - localhost
        labels:
          job: kubernetes-logs
          __path__: /var/log/kubernetes/audit.log
  3. Grafana 대시보드 설정
    Grafana에서 Loki 데이터를 시각화하고 모니터링 대시보드를 설정합니다.

3. 지속적인 모니터링 및 알림 설정

로그를 수집한 후, 지속적으로 모니터링하고 이상 이벤트 발생 시 알림을 받을 수 있도록 설정합니다. Kibana에서 Watcher 기능을 사용하여 특정 이벤트에 대한 알림을 설정합니다.

  1. Watcher 생성
    Kibana에서 Watcher를 생성하여 특정 조건에 따라 알림을 설정합니다.
     {
       "trigger": {
         "schedule": {
           "interval": "5m"
         }
       },
       "input": {
         "search": {
           "request": {
             "indices": ["kubernetes-logs"],
             "body": {
               "query": {
                 "bool": {
                   "must": [
                     {"match": {"verb": "patch"}}
                   ]
                 }
               }
             }
           }
         }
       },
       "actions": {
         "email_admin": {
           "email": {
             "to": "admin@example.com",
             "subject": "Kubernetes Patch Event Alert",
             "body": "Patch event detected in Kubernetes cluster"
           }
         }
       }
     }

Grafana 알림 설정

Grafana에서 Alerting 기능을 사용하여 특정 조건에 따라 알림을 설정합니다.

  1. Grafana 알림 채널 설정
    Grafana의 Alerting 메뉴에서 이메일, Slack 등 알림 채널을 설정합니다.
  2. 알림 규칙 생성
    대시보드에서 특정 쿼리에 대한 알림 규칙을 생성하여 조건이 충족되면 알림을 받습니다.

이렇게 설정하면 Kubernetes 클러스터의 설정 변경 이력을 실시간으로 모니터링하고, 이상 이벤트 발생 시 즉시 대응할 수 있습니다. Kubernetes Audit Logging을 적절히 설정하면 디플로이먼트(Deployment), 컨피그맵(ConfigMap), 시크릿(Secret) 등 모든 리소스에 대한 변경 이력을 수집할 수 있습니다. 이를 위해 Audit Policy를 세부적으로 설정해야 합니다.

Audit Policy 설정

다음은 Deployment, ConfigMap, Secret을 포함한 모든 리소스에 대한 생성, 수정, 삭제 이벤트를 로깅하는 예시입니다.

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
  resources:
  - group: ""  # core API group
    resources: ["pods", "secrets", "configmaps"]
  - group: "apps"
    resources: ["deployments", "statefulsets", "daemonsets", "replicasets"]
  - group: "batch"
    resources: ["jobs", "cronjobs"]
  - group: "extensions"
    resources: ["ingresses"]
  verbs: ["create", "update", "patch", "delete"]

이 설정은 다음을 의미합니다.

  • level: RequestResponse는 요청 및 응답 데이터를 모두 기록합니다.
  • group: ""는 core API 그룹(예: Pods, Secrets, ConfigMaps 등)을 포함합니다.
  • group: "apps"는 apps API 그룹(예: Deployments, StatefulSets, DaemonSets 등)을 포함합니다.
  • verbs: ["create", "update", "patch", "delete"]는 생성, 수정, 패치, 삭제 이벤트를 기록합니다.

API 서버에 Audit Policy 적용

Audit Policy 파일을 API 서버에 적용합니다.

  1. Audit Policy 파일 생성
    audit-policy.yaml 파일을 생성하고 위의 설정을 추가합니다.
  2. API 서버 설정 변경
    kube-apiserver의 시작 옵션에 Audit Policy 파일 경로와 로그 파일 경로를 추가합니다.
    --audit-policy-file=/etc/kubernetes/audit-policy.yaml
    --audit-log-path=/var/log/kubernetes/audit.log

로그 수집 및 중앙화

앞서 설명한 방법대로 ELK 스택 또는 Loki+Grafana를 사용하여 로그를 중앙화하고 분석합니다. 여기서는 ELK 스택을 예로 들어 설명하겠습니다.

  1. Elasticsearch 설치
    kubectl apply -f https://download.elastic.co/downloads/eck/1.7.1/all-in-one.yaml
  2. Logstash 설정
    Logstash를 통해 audit.log 파일을 수집하여 Elasticsearch로 전송합니다.
    input {
      file {
        path => "/var/log/kubernetes/audit.log"
        start_position => "beginning"
      }
    }
    filter {
      json {
        source => "message"
      }
    }
    output {
      elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        index => "kubernetes-logs"
      }
    }
  3. Kibana 설치 및 설정
    kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/v1.7.1/config/samples/kibana/kibana.yaml
  4. Kibana 대시보드 설정
    Kibana에서 Audit 로그를 시각화하고 필요한 이벤트를 모니터링할 수 있도록 대시보드를 설정합니다.

로그를 수집한 후, 지속적으로 모니터링하고 이상 이벤트 발생 시 알림을 받을 수 있도록 설정합니다.

Kibana 알림 설정

Kibana에서 Watcher 기능을 사용하여 특정 이벤트에 대한 알림을 설정합니다. Kibana에서 Watcher를 생성하여 특정 조건에 따라 알림을 설정합니다.

 {
   "trigger": {
     "schedule": {
       "interval": "5m"
     }
   },
   "input": {
     "search": {
       "request": {
         "indices": ["kubernetes-logs"],
         "body": {
           "query": {
             "bool": {
               "must": [
                 {"match": {"verb": "patch"}}
               ]
             }
           }
         }
       }
     }
   },
   "actions": {
     "email_admin": {
       "email": {
         "to": "admin@example.com",
         "subject": "Kubernetes Patch Event Alert",
         "body": "Patch event detected in Kubernetes cluster"
       }
     }
   }
 }

이렇게 설정하면 Kubernetes 클러스터의 모든 설정 변경 이력을 실시간으로 모니터링하고, 이상 이벤트 발생 시 즉시 대응할 수 있습니다.

728x90