이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/Kubernetes 보안

kube-bench

이쿠우우 2022. 5. 1. 16:53
반응형

kube-bench

 

목표

kubernetes 취약점 점검 tool은 kube-bench 사용법에 대해 알아봄
 
 
 

kube-bench란?

Aqua security에서 개발한 것으로
kube-bench는 kubernetes cluster가 보안적으로 안전하게 구성되어있는지 검사해주는 tool임.
CIS Kubernetes Benchmark 문서를 기반으로 kubernetes cluster의 취약점을 확인해줌.
취약점 scan 결과를 PASS, FAIL, WARN 3가지로 출력해주고
FAIL, WARN 항목에 대해서는 
Remediations 항목에서 어떻게 하면 개선되는지 가이드까지 해줌.
 
 

CIS Benchmark 란?

CIS(Center for Internet Security, 비영리 조직)에서 배포하는 보안 취약점 점검 문서.
IT에서 사용되는 다양한 OS, Application 등 범위를 가리지 않고 
안전하게 사용할 수 있도록 보안 가이드 문서를 제공하고 있음.
kubernetes 이외에 linux, windows, db was 등 다양한 OS와 Application에 대한 
보안 가이드가 작성되어있음.
 
 

kube-bench 사용법 1

(kubernetes cluster에 배포해서 scan하는 방법)
 
해당 방법은 kube-bench container를 kubernetes cluster에 배포해서
cluster 전체를 scan하는 방법임.
cluster 전체라 하면 master(control) node, worker node, etcd, policies 등을 한번에 검사할 수 있음.
 
 

kubebench.yml 파일 생성

---
apiVersion: batch/v1
kind: Job
metadata:
  name: kube-bench
spec:
  template:
    metadata:
      labels:
        app: kube-bench
    spec:
      hostPID: true
      containers:
        - name: kube-bench
          image: aquasec/kube-bench:v0.6.8
          command: ["kube-bench"]
          volumeMounts:
            - name: var-lib-etcd
              mountPath: /var/lib/etcd
              readOnly: true
            - name: var-lib-kubelet
              mountPath: /var/lib/kubelet
              readOnly: true
            - name: var-lib-kube-scheduler
              mountPath: /var/lib/kube-scheduler
              readOnly: true
            - name: var-lib-kube-controller-manager
              mountPath: /var/lib/kube-controller-manager
              readOnly: true
            - name: etc-systemd
              mountPath: /etc/systemd
              readOnly: true
            - name: lib-systemd
              mountPath: /lib/systemd/
              readOnly: true
            - name: srv-kubernetes
              mountPath: /srv/kubernetes/
              readOnly: true
            - name: etc-kubernetes
              mountPath: /etc/kubernetes
              readOnly: true
              # /usr/local/mount-from-host/bin is mounted to access kubectl / kubelet, for auto-detecting the Kubernetes version.
              # You can omit this mount if you specify --version as part of the command.
            - name: usr-bin
              mountPath: /usr/local/mount-from-host/bin
              readOnly: true
            - name: etc-cni-netd
              mountPath: /etc/cni/net.d/
              readOnly: true
            - name: opt-cni-bin
              mountPath: /opt/cni/bin/
              readOnly: true
      restartPolicy: Never
      volumes:
        - name: var-lib-etcd
          hostPath:
            path: "/var/lib/etcd"
        - name: var-lib-kubelet
          hostPath:
            path: "/var/lib/kubelet"
        - name: var-lib-kube-scheduler
          hostPath:
            path: "/var/lib/kube-scheduler"
        - name: var-lib-kube-controller-manager
          hostPath:
            path: "/var/lib/kube-controller-manager"
        - name: etc-systemd
          hostPath:
            path: "/etc/systemd"
        - name: lib-systemd
          hostPath:
            path: "/lib/systemd"
        - name: srv-kubernetes
          hostPath:
            path: "/srv/kubernetes"
        - name: etc-kubernetes
          hostPath:
            path: "/etc/kubernetes"
        - name: usr-bin
          hostPath:
            path: "/usr/bin"
        - name: etc-cni-netd
          hostPath:
            path: "/etc/cni/net.d/"
        - name: opt-cni-bin
          hostPath:
            path: "/opt/cni/bin/"
 

kubebench.yml 배포

kubectl apply -f kubebench.yml
생성된 pod의 STATUS 상태가 Completed인지 확인

 

 

결과 확인

 
[명령어]
kubectl logs [kube-bench pod name]
 
결과를 확인해보면 아래와 같이 
CIS benchmark 항목 당 결과를 알 수 있음 (PASS, FAIL, WARN)
FAIL, WARN 항목에 대해서는 
Remediations 항목에서 어떻게 하면 개선되는지 가이드까지 해줌.
Summary 항목에서는 (PASS, FAIL, WARN) count를 확인할 수 있음

 
 
 

항목 개선 Test로 FAIL 상태인 1.2.20 항목을 PASS로 변경해보겠음.

Remediations 을 확인해보니 아래와 같이 가이드함

 
가이드대로
/etc/kubernetes/manifests/kube-apiserver.yaml 파일을 아래와 같이 편집함.
--audit-log-maxage=30
설정을 추가

 
해당 apiserver static pod를 수정하면
항목이 반영되는 동안 잠시 apiserver에 접속하지 못하다가

 
수정이 완료되면 apiserver가 되살아남.

 
이후 kube-bench를 삭제하고 다시 재배포해서 scan을 다시 하면

 
다음과 같이 1.2.20 항목이 FAIL 에서 PASS로 변경된 것을 확인할 수 있음

 
 
 

kube-bench 사용법 2

(host에 kube-bench를 설치해서 사용하는 방법)
 
kube-bench를 host에 설치해서 사용하게 되면
해당 host가 kubernetes control node라면 control 항목만 scan이 가능하고
worker node라면 worker node 항목만 scan이 가능함.
 
 

CentOS의 경우 kube-bench 설치 방법

 
sudo yum install kube-bench_0.6.2_linux_amd64.rpm -y
 
 

설치 확인

kube-bench version

 
 

controller node scan 명령어

 
[명령어]
kube-bench run --targets master
 
[결과]

 
 

항목 1개만 Scan 하는 명령어

 
[명령어]
kube-bench run --targets master --check 1.2.20
 
[결과]

 

반응형