쿠버네티스 보안 설정

쿠버네티스 보안 설정

서론


쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 그러나 많은 기업과 개발자가 쿠버네티스를 사용함에 따라 보안의 중요성도 함께 증가하고 있습니다. 쿠버네티스의 보안 설정은 클러스터와 애플리케이션을 보호하는 데 필수적입니다. 이번 포스팅에서는 Role-Based Access Control(RBAC)과 네트워크 폴리시(Network Policy) 등 주요 보안 설정 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


Role-Based Access Control (RBAC)


RBAC란?


RBAC(Role-Based Access Control)은 사용자의 역할에 따라 리소스에 대한 접근 권한을 제어하는 보안 메커니즘입니다. 쿠버네티스에서 RBAC는 사용자, 그룹, 서비스 계정 등이 특정 작업을 수행할 수 있도록 권한을 설정하는 데 사용됩니다.


RBAC 구성 요소


RBAC는 네 가지 주요 구성 요소로 구성됩니다.


  1. Role: 네임스페이스 내의 리소스에 대한 권한을 정의합니다.
  2. ClusterRole: 클러스터 범위에서 리소스에 대한 권한을 정의합니다.
  3. RoleBinding: Role을 사용자 또는 그룹에 바인딩합니다.
  4. ClusterRoleBinding: ClusterRole을 사용자 또는 그룹에 바인딩합니다.

RBAC 설정 예제


다음은 RBAC를 설정하는 예제입니다. 여기서는 nginx 네임스페이스 내에서 파드를 읽을 수 있는 권한을 정의합니다.


  1. Role 생성

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

  1. RoleBinding 생성

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: nginx
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

이 YAML 파일들을 사용하여 Role과 RoleBinding을 생성합니다.


kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml

네트워크 폴리시(Network Policy)


네트워크 폴리시란?


네트워크 폴리시는 쿠버네티스 클러스터 내에서 파드 간의 네트워크 트래픽을 제어하는 규칙을 정의합니다. 이를 통해 특정 파드가 다른 파드 또는 네임스페이스로의 접근을 제한할 수 있습니다.


네트워크 폴리시 구성 요소


네트워크 폴리시는 두 가지 주요 구성 요소로 구성됩니다.


  1. Ingress: 파드로 들어오는 트래픽을 제어합니다.
  2. Egress: 파드에서 나가는 트래픽을 제어합니다.

네트워크 폴리시 설정 예제


다음은 네트워크 폴리시를 설정하는 예제입니다. 여기서는 nginx 네임스페이스 내의 모든 파드가 특정 네임스페이스로부터의 인바운드 트래픽만 허용하도록 설정합니다.


apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-nginx
  namespace: nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: frontend
    ports:
    - protocol: TCP
      port: 80

이 YAML 파일을 사용하여 네트워크 폴리시를 생성합니다.


kubectl apply -f networkpolicy.yaml

기타 보안 설정


이미지 서명 및 검증


컨테이너 이미지를 서명하고 검증하는 것은 이미지의 신뢰성을 보장하는 데 중요합니다. Docker Content Trust(DCT)를 사용하여 이미지를 서명하고 검증할 수 있습니다.


export DOCKER_CONTENT_TRUST=1
docker push myregistry/myimage:mytag

시크릿(Secret) 관리


시크릿은 암호, 토큰, 키와 같은 민감한 정보를 저장하고 관리하는 데 사용됩니다. 시크릿을 사용하여 환경 변수를 설정할 수 있습니다.


  1. 시크릿 생성

kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypass

  1. 시크릿 사용

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

쿠버네티스 클러스터 보안 모범 사례


  1. 최소 권한 원칙: 사용자가 필요한 최소 권한만을 가지도록 Role과 RoleBinding을 설정합니다.
  2. 네임스페이스 분리: 서로 다른 팀이나 프로젝트는 네임스페이스를 분리하여 관리합니다.
  3. 네트워크 폴리시 적용: 네트워크 폴리시를 사용하여 파드 간의 트래픽을 제어합니다.
  4. 시크릿 암호화: 시크릿을 저장할 때 암호화를 사용합니다.
  5. 이미지 검증: 신뢰할 수 있는 출처의 이미지만 사용하고, 이미지를 서명하고 검증합니다.

결론


쿠버네티스의 보안 설정은 클러스터와 애플리케이션을 보호하는 데 필수적입니다. 이번 포스팅에서는 RBAC와 네트워크 폴리시를 중심으로 보안 설정 방법을 자세히 설명했습니다. 이를 통해 쿠버네티스 클러스터에서 보안을 강화하고, 안정적인 운영을 할 수 있기를 바랍니다.

다음 이전