1. Kubernetes 보안 개요
Kubernetes는 분산 환경에서 컨테이너를 관리하는 강력한 플랫폼이지만, 기본 설정만으로는 보안이 충분하지 않다.
보안을 강화하려면 다음과 같은 주요 요소를 고려해야 한다.
🔹 Pod 보안(Pod Security) → 실행 정책을 설정하여 보안 수준 강화
🔹 네트워크 보안(Network Policy) → 트래픽을 제어하여 서비스 격리
🔹 비밀 관리(Secret Management) → 민감한 데이터를 안전하게 보호
2. Pod 보안(Pod Security)
1) Pod 보안 정책(PSP, Pod Security Policy)
기존에는 PodSecurityPolicy(PSP)
를 사용하여 Pod 실행 제한 정책을 설정했지만,
Kubernetes v1.25부터 PSP가 제거되었으며, 대신 **Pod Security Admission(PSA)**을 사용한다.
2) Pod Security Admission(PSA)
PSA는 Kubernetes 네임스페이스별로 보안 수준을 적용하는 기능이다.
네임스페이스에 적용할 수 있는 세 가지 보안 수준은 다음과 같다.
보안 수준 | 설명 |
---|---|
Privileged | 제한 없음 (가장 낮은 보안 수준) |
Baseline | 기본적인 보안 제한 적용 (권장) |
Restricted | 가장 강력한 보안 적용 (최고 보안 수준) |
🔹 네임스페이스에 Restricted
보안 수준 적용
apiVersion: v1
kind: Namespace
metadata:
name: secure-namespace
labels:
pod-security.kubernetes.io/enforce: restricted
kubectl apply -f secure-namespace.yaml
3. 네트워크 보안(Network Policy)
1) Network Policy 개요
NetworkPolicy
는 Pod 간의 네트워크 트래픽을 제한하여 보안을 강화하는 Kubernetes 리소스이다.
기본적으로 Kubernetes는 모든 Pod 간 통신을 허용하지만, NetworkPolicy
를 적용하면 허용된 트래픽만 통신 가능하다.
2) Network Policy 예제
🔹 특정 네임스페이스 내에서만 통신 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal
namespace: my-namespace
spec:
podSelector: {} # 모든 Pod에 적용
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {} # 같은 네임스페이스의 모든 Pod 허용
kubectl apply -f network-policy.yaml
🔹 외부 접속 차단, 특정 앱만 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-web
namespace: my-namespace
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
kubectl apply -f allow-web.yaml
4. 비밀 관리(Secret Management)
1) Secret 개요
Secret
은 비밀번호, API 키, 인증 정보 등의 민감한 데이터를 안전하게 저장하는 Kubernetes 리소스이다.
기본적으로 Kubernetes에서 Base64로 인코딩되지만, 암호화 기능을 추가하여 보안성을 높일 수 있다.
2) Secret 생성 및 적용
🔹 YAML을 활용한 Secret 생성
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: dXNlcm5hbWU= # 'username'을 Base64로 인코딩한 값
password: cGFzc3dvcmQ= # 'password'를 Base64로 인코딩한 값
kubectl apply -f my-secret.yaml
🔹 Secret을 환경 변수로 Pod에 적용
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: my-container
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
kubectl apply -f secret-pod.yaml
5. Kubernetes 보안 강화 전략
✅ Pod 보안 정책(PSA) 적용 → 불필요한 권한 제한
✅ 네트워크 정책(Network Policy) 설정 → 서비스 간 트래픽 제어
✅ Secret을 사용하여 민감한 정보 보호
✅ RBAC(Role-Based Access Control) 설정 → 최소 권한 원칙 적용
✅ 이미지 보안 강화 → 신뢰할 수 있는 컨테이너 이미지 사용
✅ Audit 로그 활성화 → 이상 행위 탐지
6. 결론
✅ Kubernetes의 보안 강화를 위해 Pod 보안, 네트워크 정책, Secret 관리가 필수
✅ PSA를 활용하여 네임스페이스 단위로 Pod 보안 수준을 설정
✅ Network Policy를 통해 불필요한 트래픽을 차단하여 서비스 보호
✅ Secret을 이용해 민감한 데이터를 안전하게 관리