728x90
소개
다양한 팀으로 구성된 조직에서는 컨테이너 권한 관리가 매우 중요합니다. 컨테이너에 최소한의 권한만 설정하면 보안 위험을 줄이고, 운영 효율성을 높일 수 있습니다. 이번 블로그는 아래 주제들을 차례로 다룰 예정입니다.
- 최소 권한으로 Kubernetes Pod 및 Docker 컨테이너 생성 방법
- 운영 중 권한 수정 방법
- Kubernetes Ingress 및 Egress 보안 설정
1. Kubernetes Pod 최소 권한 설정
최소 권한 YAML 설정 예제
- Kubernetes Pod를 생성할 때, 반드시 필요한 권한만 설정하는 것이 중요합니다.
apiVersion: v1
kind: Pod
metadata:
name: minimal-permissions-pod
labels:
app: example-app
spec:
containers:
- name: minimal-container
image: nginx:latest
securityContext:
runAsUser: 1000 # 비루트(non-root) 사용자
runAsGroup: 3000 # 비루트 그룹
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
resources:
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "64Mi"
cpu: "250m"
주요 설정
- runAsUser 및 runAsGroup : 비루트 사용자와 그룹을 설정
- allowPrivilegeEscalation : 권한 상승 방지
- capabilities.drop : 불필요한 Linux 권한 제거
- 리소스 제한 : 메모리, cpu 사용량 제한으로 자원 남용 방지
2. Docker 컨테이너 최소 권한 설정
Docker 명령어 예제
Docker 컨테이너 실행 시, 다음 플래그를 사용하여 권한을 제한할 수 있습니다
# docker run \
--name minimal-container \
--user 1000:3000 \
--cap-drop=ALL \
--memory="128m" \
--cpus="0.5" \
nginx:latest
설명
- --user : 특정 비루트 사용자로 컨테이너 실행
- --cap-drop=ALL : 모든 불필요한 권한 제거
- --memory 및 --cpus : 메모리와 CPU 사용량 제한
3. 운영 중 권한 수정 방법
Kubernetes Pod
- 실행 중인 Pod의 권한을 수정하려면 다음과 같이 진행할 수 있습니다.
- Pod 패치
- Deployment YAML 수정 후 적용
# kubectl patch pod minimal-permissions-pod -p '{"spec":{"securityContext":{"runAsUser":2000}}}'
# kubectl edit deployment minimal-deployment
Docker 컨테이너
- Docker는 실행 중인 컨테이너의 사용자나 권한을 직접 수정할 수 없습니다. 대신 컨테이너를 중지 후 권한 수정 후 재실행하면 가능합니다.
# docker stop minimal-container
# docker run \
--name minimal-container \
--user 2000:3000 \
--cap-drop=ALL \
nginx:latest
4. Kubernetes Ingress 및 Egress 보안
Ingress 설정
- Ingress는 HTTP/HTTPS 트래픽을 관리합니다. 보안을 강화하려면 다음과 같이 설정합니다
- SSL/TLS : tls 섹션을 설정해 HTTPS를 강제합니다.
- 주석(Annotatnions) : 모든 HTTP 트래픽을 HTTPS로 리다이렉트
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: tls-secret
Egress 설정
- Egress 정책은 아웃바운드 트래픽을 제한합니다.
- policyTypes : 아웃바운드 트래픽을 제어하려면 Egress를 지정
- ipBlock :특정 CIDR 범위에만 접근 허용
- ports : 특정 프로토콜과 포트로 제한
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-egress
namespace: default
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 192.168.1.0/24
ports:
- protocol: TCP
port: 443
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 서비스 및 로드 밸런싱 이해 (1) | 2025.02.07 |
---|---|
[Kubernetes] Rolling Update : 점진적 업데이트, 버전 관리 (0) | 2025.02.06 |
[Kubernetes] Kubernetes Deployment replicas 설정 이해 및 실습 (0) | 2025.02.04 |
[Kubernetes] 로드밸런싱을 위해 Control-plane 증설 이후 작업 (0) | 2025.02.03 |
[Kubernetes] CoreDNS & 쿠버네티스 버전의 관계 (0) | 2025.01.28 |