Kubernetes 클러스터 Audit 감사 로그 수집 및 모니터링
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
의 감사 로깅 기능을 활성화해야 합니다.
- 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"]
- 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 서버에 대한 모든 접근 로그를 수집할 수 있습니다.
- Audit Policy 설정:
audit-policy.yaml
파일을 생성하여 어떤 이벤트를 로깅할지 정의합니다.apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: "" resources: ["pods"] verbs: ["create", "delete", "update"]
- 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 등)의 접근 로그를 수집하려면 해당 콘솔의 로그 설정을 참고하여 로그를 적절히 수집할 수 있도록 설정해야 합니다.
- Dashboard 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
- Dashboard 로그 확인
kubectl logs
명령어로 Dashboard 로그를 확인할 수 있습니다.kubectl -n kubernetes-dashboard logs <dashboard-pod-name>
3. 중앙화된 로그 수집 및 관리
로그 수집을 중앙화하기 위해 ELK 스택(Elasticsearch, Logstash, Kibana) 또는 Loki+Grafana와 같은 로그 수집 및 시각화 도구를 사용할 수 있습니다.
- Elasticsearch 설치
kubectl apply -f https://download.elastic.co/downloads/eck/1.7.1/all-in-one.yaml
- Logstash 설정
Logstash를 통해kubectl
및 콘솔 로그를 수집하도록 설정합니다.input { file { path => "/var/log/kubernetes/audit.log" start_position => "beginning" } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] index => "kubernetes-logs" } }
- Kibana 설치
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/v1.7.1/config/samples/kibana/kibana.yaml
- Kibana에서 대시보드 설정
Kibana를 통해 로그를 시각화하고 모니터링 대시보드를 설정합니다.
4. Loki+Grafana 설정
Loki와 Grafana를 사용하여 로그를 수집하고 시각화할 수도 있습니다.
- Loki 설치
helm upgrade --install loki grafana/loki-stack
- 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
- 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 스택을 사용하여 로그를 수집하고 분석합니다.
- Elasticsearch 설치
kubectl apply -f https://download.elastic.co/downloads/eck/1.7.1/all-in-one.yaml
- 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" } }
- Kibana 설치 및 설정
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/v1.7.1/config/samples/kibana/kibana.yaml
- Kibana 대시보드 설정
Kibana에서 Audit 로그를 시각화하고 필요한 이벤트를 모니터링할 수 있도록 대시보드를 설정합니다.
Loki+Grafana 설정
Loki와 Grafana를 사용하여 로그를 수집하고 시각화합니다.
- Loki 설치
helm upgrade --install loki grafana/loki-stack
- 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
- Grafana 대시보드 설정
Grafana에서 Loki 데이터를 시각화하고 모니터링 대시보드를 설정합니다.
3. 지속적인 모니터링 및 알림 설정
로그를 수집한 후, 지속적으로 모니터링하고 이상 이벤트 발생 시 알림을 받을 수 있도록 설정합니다. Kibana에서 Watcher 기능을 사용하여 특정 이벤트에 대한 알림을 설정합니다.
- 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 기능을 사용하여 특정 조건에 따라 알림을 설정합니다.
- Grafana 알림 채널 설정
Grafana의 Alerting 메뉴에서 이메일, Slack 등 알림 채널을 설정합니다. - 알림 규칙 생성
대시보드에서 특정 쿼리에 대한 알림 규칙을 생성하여 조건이 충족되면 알림을 받습니다.
이렇게 설정하면 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 서버에 적용합니다.
- Audit Policy 파일 생성
audit-policy.yaml
파일을 생성하고 위의 설정을 추가합니다. - 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 스택을 예로 들어 설명하겠습니다.
- Elasticsearch 설치
kubectl apply -f https://download.elastic.co/downloads/eck/1.7.1/all-in-one.yaml
- 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" } }
- Kibana 설치 및 설정
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/v1.7.1/config/samples/kibana/kibana.yaml
- 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 클러스터의 모든 설정 변경 이력을 실시간으로 모니터링하고, 이상 이벤트 발생 시 즉시 대응할 수 있습니다.