쿠버네티스 보안 설정
서론
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 그러나 많은 기업과 개발자가 쿠버네티스를 사용함에 따라 보안의 중요성도 함께 증가하고 있습니다. 쿠버네티스의 보안 설정은 클러스터와 애플리케이션을 보호하는 데 필수적입니다. 이번 포스팅에서는 Role-Based Access Control(RBAC)과 네트워크 폴리시(Network Policy) 등 주요 보안 설정 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.
본론
Role-Based Access Control (RBAC)
RBAC란?
RBAC(Role-Based Access Control)은 사용자의 역할에 따라 리소스에 대한 접근 권한을 제어하는 보안 메커니즘입니다. 쿠버네티스에서 RBAC는 사용자, 그룹, 서비스 계정 등이 특정 작업을 수행할 수 있도록 권한을 설정하는 데 사용됩니다.
RBAC 구성 요소
RBAC는 네 가지 주요 구성 요소로 구성됩니다.
- Role: 네임스페이스 내의 리소스에 대한 권한을 정의합니다.
- ClusterRole: 클러스터 범위에서 리소스에 대한 권한을 정의합니다.
- RoleBinding: Role을 사용자 또는 그룹에 바인딩합니다.
- ClusterRoleBinding: ClusterRole을 사용자 또는 그룹에 바인딩합니다.
RBAC 설정 예제
다음은 RBAC를 설정하는 예제입니다. 여기서는 nginx
네임스페이스 내에서 파드를 읽을 수 있는 권한을 정의합니다.
- Role 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: nginx
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
- 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)
네트워크 폴리시란?
네트워크 폴리시는 쿠버네티스 클러스터 내에서 파드 간의 네트워크 트래픽을 제어하는 규칙을 정의합니다. 이를 통해 특정 파드가 다른 파드 또는 네임스페이스로의 접근을 제한할 수 있습니다.
네트워크 폴리시 구성 요소
네트워크 폴리시는 두 가지 주요 구성 요소로 구성됩니다.
- Ingress: 파드로 들어오는 트래픽을 제어합니다.
- 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) 관리
시크릿은 암호, 토큰, 키와 같은 민감한 정보를 저장하고 관리하는 데 사용됩니다. 시크릿을 사용하여 환경 변수를 설정할 수 있습니다.
- 시크릿 생성
kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypass
- 시크릿 사용
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
쿠버네티스 클러스터 보안 모범 사례
- 최소 권한 원칙: 사용자가 필요한 최소 권한만을 가지도록 Role과 RoleBinding을 설정합니다.
- 네임스페이스 분리: 서로 다른 팀이나 프로젝트는 네임스페이스를 분리하여 관리합니다.
- 네트워크 폴리시 적용: 네트워크 폴리시를 사용하여 파드 간의 트래픽을 제어합니다.
- 시크릿 암호화: 시크릿을 저장할 때 암호화를 사용합니다.
- 이미지 검증: 신뢰할 수 있는 출처의 이미지만 사용하고, 이미지를 서명하고 검증합니다.
결론
쿠버네티스의 보안 설정은 클러스터와 애플리케이션을 보호하는 데 필수적입니다. 이번 포스팅에서는 RBAC와 네트워크 폴리시를 중심으로 보안 설정 방법을 자세히 설명했습니다. 이를 통해 쿠버네티스 클러스터에서 보안을 강화하고, 안정적인 운영을 할 수 있기를 바랍니다.