Kubernetes는 컨테이너 오케스트레이션 플랫폼으로, 현대 애플리케이션 개발에서 널리 사용되고 있습니다. 하지만 Kubernetes의 보안을 간과하는 것은 큰 위험을 초래할 수 있습니다. 이번 글에서는 Kubernetes 환경에서 자주 저지르는 보안 실수와 그에 대한 해법을 살펴보도록 하겠습니다.

1. 기본 인증 방법 사용

Kubernetes 클러스터의 기본 설치에서는 보안이 취약한 인증 방법이 사용될 수 있습니다. 예를 들어, 서버와 클라이언트 간의 통신에 TLS를 사용하지 않으면 데이터가 중간에서 노출될 수 있습니다.

해법:

Kubernetes 클러스터를 설정할 때, TLS 인증서를 사용하여 모든 통신을 암호화해야 합니다. 인증서는 kubelet, kube-apiserver, kubectl 등 모든 구성 요소에 대해 적절하게 설정해야 합니다.

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: https://your-kubernetes-api-server:6443
    certificate-authority: /path/to/your/ca.crt
  name: your-cluster
users:
- name: your-user
  user:
    client-certificate: /path/to/your/client.crt
    client-key: /path/to/your/client.key

2. Role-Based Access Control (RBAC) 미사용

Kubernetes는 RBAC를 통해 권한을 세밀하게 설정할 수 있는 기능을 제공합니다. 그러나 많은 사용자들이 기본 권한을 설정한 채로 운영하여, 불필요한 권한 상승 공격에 노출될 수 있습니다.

해법:

RBAC를 설정하여 사용자와 서비스 계정에 최소 권한 원칙(Principle of Least Privilege)을 적용합니다. 다음은 RBAC 정책을 설정하는 간단한 예시입니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: read-pods
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
  namespace: default
subjects:
- kind: User
  name: your-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: read-pods
  apiGroup: rbac.authorization.k8s.io

3. 네트워크 정책 무시

Kubernetes 클러스터에서 네트워크 정책을 설정하지 않으면, 모든 파드가 서로 통신할 수 있는 보안 취약점이 생깁니다. 이는 공격자가 클러스터 내에서 이동할 수 있는 경로를 제공할 수 있습니다.

해법:

네트워크 정책을 정의하여 파드 간의 통신을 제어합니다. 아래는 특정 네임스페이스에서 frontend 파드만 backend 파드와 통신할 수 있도록 설정하는 예제입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend

4. 이미지 보안 검사 미비

컨테이너 이미지는 취약점에 노출될 수 있으며, 이에 대한 검사가 이루어지지 않으면 악성 코드가 포함된 이미지가 배포될 수 있습니다.

해법:

이미지 스캐닝 도구를 사용하여 이미지의 취약점을 사전에 점검합니다. 예를 들어, Trivy와 같은 도구를 사용하여 Docker 이미지를 검사하는 방법은 다음과 같습니다.

trivy image your-image:tag

5. 감사 로그 설정 부족

Kubernetes의 감사 로그는 누가 무엇을 했는지 추적할 수 있는 중요한 요소입니다. 하지만 많은 클러스터에서는 이 설정이 비활성화되어 있습니다.

해법:

Kubernetes의 감사 로그를 활성화하여 모든 API 호출을 기록합니다. kube-apiserver의 설정 파일에 다음과 같이 추가합니다.

--audit-log-path=/var/log/audit.log
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
audit-policy.yaml 파일 예시:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
  resources:
  - group: ""
    resources: ["pods"]

마무리

Kubernetes는 강력한 오케스트레이션 도구이지만, 보안 측면에서는 많은 실수들이 발생할 수 있습니다. 기본 인증 방법 사용, RBAC 미사용, 네트워크 정책 무시, 이미지 보안 검사 부족, 감사 로그 설정 부족은 흔히 발생하는 실수들입니다. 이러한 실수를 방지하기 위해서는 적절한 설정과 습관이 필요합니다. 위에서 제시한 해법을 통해 Kubernetes 클러스터의 보안을 강화하고 안전한 운영 환경을 구축하시기 바랍니다.