Cloud/k8s-CKA

[CKA] 43. k8s 각종 보안 (image, securityContext)

jinkwon.kim 2023. 11. 5. 10:19
728x90
반응형

개요

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/

 

Pull an Image from a Private Registry

This page shows how to create a Pod that uses a Secret to pull an image from a private container image registry or repository. There are many private registries in use. This task uses Docker Hub as an example registry. 🛇 This item links to a third party

kubernetes.io

 

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

[CKA] 44. network policy

728x90
반응형

'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