개요
k8s에서 사용되는 각종 보안을 image, securityContext 알아보겠습니다.
image 보안
k8s에서 image를 pull로 받아 올 때 대분 docker hub를 사용합니다. 그러나 대외비로 작성된 image의 경우 따로 Private Repository를 만들어서 사용합니다. 본 post에는 private repository 구성부터 k8s에서 어떻게 사용할 수 있는지 알아보겠습니다.
private repository
구성 방법은 아래 post 확인 부탁 드립니다.
[docker] docker registry-image 서버 구축
private repository login
docker login private-registry.io
private repository image 주소
image의 주소의구조는 아래와 같이 이루어져 있고 해당 uri를 그대로 k8s에 yaml에서 사용하면 됩니다.
private repository login 정보 저장
개념
k8s에서는 imagePullSecrets을 사용하여 private repository를 k8s에서 사용할 수 있게 도와줍니다.
해당 필드는 단순하게 private repository에 대한 로그인 정보만 가지고 있습니다.
imagePullSecrets 정보 생성
imagePullSecrets 는 secret을 통하여 만들 수 있습니다.
명령어
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
imagePullSecrets 사용법
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
참조
https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
securityContext
개념
Pod 또는 컨테이너 수준에서 실행되는 프로세스의 권한과 관련된 설정을 정의하는데 사용됩니다.
securityContext는 이를 통해 컨테이너와 Pod가 운영 시스템과 상호 작용하는 방식을 제어할 수 있으며, 보안 관련 설정을 세밀하게 조정할 수 있습니다.
주요 기능
권한 감소 (Privilege Escalation Prevention)
container가 추가적인 권한을 얻는 것을 방지합니다.
권한 상승 (Privileged Mode)
container가 호스트 시스템의 리소스에 대한 광범위한 접근을 가질 수 있게 합니다.
리눅스 기능 (Linux Capabilities)
container가 필요한 최소한의 리눅스 기능(capabilities)만을 가질 수 있도록 제한합니다.
SELinux
SELinux 라벨을 사용하여, container의 접근을 제어합니다.
RunAsUser
container가 실행될 때 사용할 UID(User ID)를 지정합니다.
RunAsGroup
container가 실행될 때 사용할 GID(Group ID)를 지정합니다.
ReadOnlyRootFilesystem
container의 루트 파일 시스템을 읽기 전용으로 설정하여 보안을 강화합니다.
AllowPrivilegeEscalation
container 내에서의 권한 상승을 허용할지 결정합니다.
seccompProfiles
seccomp(secure computing mode) 프로파일을 사용하여,container 프로세스에서 실행할 수 있는 시스템 호출을 제한합니다.
AppArmor Profiles
AppArmor 프로파일을 적용하여, container의 동작을 제한하고 시스템 리소스에 대한 접근을 제어합니다.
적용 범위
securityContext 설정은 크게 두 수준에서 적용될 수 있습니다
Pod Security Context
Pod 수준에서 설정하면, 해당 Pod 내의 모든 container에 대한 기본 보안 설정을 정의할 수 있습니다.
아래는 RunAsUser에 대한 에제 입니다.
Container Security Context
container 수준에서 설정하면, 특정 container에 대한 보안 설정을 개별적으로 정의할 수 있습니다.
Pod 수준과 Container 수준에서의 우선 순위는 Container 수준이 더 높습니다.
주요 securityContext - user 설정
container를 실행시 기본적으로root로 실행하게 되어있습니다. 그러나 이렇게 되면 container생성자가 의도하지 않게 많은 권한을 container사용자에게 주게 됨으로 문제가 발생 할 수 있습니다. 그래서 image 생성시 / container 실행시 / pod 생성시 user를 변경 할 수 있습니다. 아래는 3가지의 방법입니다.
Dockefile
dockerfile를 통해서 image 생성시 USER 옵션을 주게 되면 해당 image로 생성한 container는 1000 번의 USER ID를 가지고 실행하게 됩니다.
docker --user 옵션
container 실행시 --user 옵션을 주게 되면 --user 옵션에 명시된 ID로 login 하여 동작합니다.
docker run --user=1000 ubuntu sleep 3600
Pod yaml
Pod의 yaml에서는 아래와 같이 설정 할 수 있습니다.
container 사용자 확인
kubectl exec web-pod --whoami
주요 securityContext - capabilities 설정
container 수준에서만 설정이 가능 합니다.
container의 capabilities는 host의 capabilities 많큼의 capabilities 들어가 있지 않습니다.
그래서 securityContext 를 통해서 capabilities을 추가 할 수 있습니다.
다음 정보를 linux의 capabilities 종류와 container capabilities 의 종류를 비교한 것입니다.
linux capabilities 종류
https://man7.org/linux/man-pages/man7/capabilities.7.html
- CAP_AUDIT_CONTROL: 감사 시스템의 구성을 변경할 수 있는 권한입니다.
- CAP_AUDIT_READ: 감사 로그를 읽을 수 있는 권한입니다.
- CAP_AUDIT_WRITE: 감사 로그에 기록을 남길 수 있는 권한입니다.
- CAP_BLOCK_SUSPEND: 블록 장치의 중단을 방지할 수 있는 권한입니다.
- CAP_BPF: BPF(Berkeley Packet Filter) 프로그램을 관리할 수 있는 권한입니다.
- CAP_SYS_ADMIN: 가장 강력한 capability로, 다양한 시스템 관리 작업을 수행할 수 있습니다.
- CAP_CHECKPOINT_RESTORE: 프로세스의 체크포인트를 생성하고 복원할 수 있는 권한입니다.
- CAP_CHOWN: 다른 사용자의 파일 소유권을 변경할 수 있는 권한입니다.
- CAP_DAC_OVERRIDE: 파일 시스템 권한 체크를 무시할 수 있는 권한입니다.
- CAP_DAC_READ_SEARCH: 파일 시스템에서 파일을 읽고 검색할 때 권한 체크를 무시할 수 있는 권한입니다.
- CAP_FOWNER: 다른 사용자가 소유한 파일을 수정할 수 있는 권한입니다.
- CAP_FSETID: 파일의 set-user-ID와 set-group-ID 플래그를 설정할 수 있는 권한입니다.
- CAP_IPC_LOCK: 메모리에 IPC(Inter-Process Communication) 객체를 고정할 수 있는 권한입니다.
- CAP_IPC_OWNER: IPC 객체에 대한 소유권 검사를 우회할 수 있는 권한입니다.
- CAP_KILL: 다른 사용자의 프로세스를 종료할 수 있는 권한입니다.
- CAP_LEASE: 파일 임대를 생성할 수 있는 권한입니다.
- CAP_LINUX_IMMUTABLE: 파일이 변경 불가능(immutable) 플래그를 설정하거나 해제할 수 있는 권한입니다.
- CAP_MAC_ADMIN, CAP_MAC_OVERRIDE: Mandatory Access Control(MAC) 관련 권한입니다.
- CAP_MKNOD: 장치 파일을 생성할 수 있는 권한입니다.
- CAP_NET_ADMIN: 네트워크 관련 다양한 작업을 수행할 수 있는 권한입니다.
- CAP_NET_BIND_SERVICE: 특정 포트에 소켓을 바인드할 수 있는 권한입니다.
- CAP_NET_BROADCAST: 네트워크 브로드캐스트를 보낼 수 있는 권한입니다.
- CAP_NET_RAW: 원시 소켓을 사용할 수 있는 권한입니다.
- CAP_PERFMON: 시스템의 성능 모니터링 및 제어할 수 있는 권한입니다.
- CAP_SETGID: 프로세스의 GID와 관련된 작업을 수행할 수 있는 권한입니다.
- CAP_SETUID: 프로세스의 UID와 관련된 작업을 수행할 수 있는 권한입니다.
- CAP_SYS_BOOT: 시스템을 재부팅하거나 종료할 수 있는 권한입니다.
- CAP_SYS_CHROOT: chroot 시스템 호출을 사용할 수 있는 권한입니다.
- CAP_SYS_MODULE: 커널 모듈을 로드하거나 제거할 수 있는 권한입니다.
- CAP_SYS_NICE: 프로세스의 스케줄링 우선순위를 변경할 수 있는 권한입니다.
- CAP_SYS_PACCT: 프로세스 계정 정보를 관리할 수 있는 권한입니다.
- CAP_SYS_PTRACE: 다른 프로세스를 추적하거나 제어할 수 있는 권한입니다.
- CAP_SYS_RAWIO: 원시 I/O 작업을 수행할 수 있는 권한입니다.
- CAP_SYS_RESOURCE: 시스템 리소스 제한을 무시할 수 있는 권한입니다.
- CAP_SYS_TIME: 시스템 시계 설정을 변경할 수 있는 권한입니다.
- CAP_SYS_TTY_CONFIG: TTY 장치에 대한 구성을 변경할 수 있는 권한입니다.
- CAP_SYSLOG: 커널 로깅 시스템에 액세스할 수 있는 권한입니다.
- CAP_WAKE_ALARM: 시스템을 깨우는 알람을 설정할 수 있는 권한입니다.
- CAP_LAST_CAP: capability 리스트의 마지막을 나타내는 상수입니다.
conatiner에 할 당된 capabilities 확인
아래 명령어 확인이 가능합니다.
kubectl exec {pod_name} -- capsh --print
현재 container의 실제 capabilities set입니다.
host의 root계정이 가지고 있는 capabilities를 container가 모두 가진게 아닌걸 확인 할 수 있습니다.
특히 ADMIN 관련 권한은 모두 빠져있습니다. 이말은 container root는 딱 container만 영향을 미쳐라는 뜻입니다.
CAP_SYS_ADMIN
CAP_MAC_ADMIN
CAP_NET_ADMIN
CAP_NET_BROADCAST
conatiner에 capabilities 추가 방법
k8에서는 securityContext를 통하여 일부 capabiliites 또는 전체 capabiliites를 추가 할수 있습니다.
일부 capabiliites
아래 필드 를 추가 하면 됩니다.
securityContext:
capabilities:
add: ["NET_ADMIN", "SYS_TIME"]
yaml 파일
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myshell
image: "ubuntu:14.04"
command:
- /bin/sleep
- "300"
securityContext:
capabilities:
add: ["NET_ADMIN", "SYS_TIME"]
Pod의 capabilities
container 에서 capsh --print로 확인
전체 capabiliites
아래 같이 privileged 설정을 true로하여 추가 하면 됩니다.
securityContext:
privileged: true
yaml 파일
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myshell
image: "ubuntu:14.04"
command:
- /bin/sleep
- "300"
securityContext:
privileged: true
Pod의 capabilities
container 에서 capsh --print로 확인
정리
k8s image를 다운로드 받을 private registory를 지원하기 위해서 imagePullSecrets를 지웝합니다.
그리고 securityContext를 통하여 Pod와 Container Level에서 세부적인 권한제어를 제공합니다.
Next Post
'Cloud > k8s-CKA' 카테고리의 다른 글
[CKA] 45. Troubleshooting (0) | 2023.11.07 |
---|---|
[CKA] 44. network policy (0) | 2023.11.05 |
[CKA] 42. service account (0) | 2023.11.04 |
[CKA] 41. Authorization (권한부여) (0) | 2023.10.28 |
[CKA] 40. API 그룹과 목적 (0) | 2023.10.28 |