ㅡ.ㅡ

[Container] PSS(Pod Security Standards) 본문

Security

[Container] PSS(Pod Security Standards)

ekwkqk12 2022. 2. 27. 18:57

1. Privileged

가장 넓은 수준의 권한을 제공하는 정책으로 알려진 권한 상승을 허용

2. Baseline

알려진 권한 상승을 방지하는 최소 제한 정책으로 지정된 구성만을 허용

2-1. HostProcess

Windows Pod는 Windows노드에 엑세스를 가능하게하는 HostProcess 컨테이너를 실행할수 있는 기능을 기본적으로 제공하여 노드에 엑세스를 가능함

Restricted Fields

  • spec.securityContext.windowsOptions.hostProcess
  • spec.containers[*].securityContext.windowsOptions.hostProcess
  • spec.initContainers[*].securityContext.windowsOptions.hostProcess
  • spec.ephemeralContainers[*].securityContext.windowsOptions.hostProcess

Allowed Values

  • Undefined/nil
  • false

Kyverno Policy
WindowsOptions 내 hostProcess가 설정되어 있지 않거나 false 설정되어있는지 점검
https://kyverno.io/policies/pod-security/baseline/disallow-host-process/disallow-host-process/

2-2. Host Namespaces

Pod가 호스트 네임스페이스를 통해 공유 정보에 대한 접근 및 권한 상승에 사용할 수 있음

Restricted Fields

  • spec.hostNetwork
  • spec.hostPID
  • spec.hostIPC

Allowed Values

  • Undefined/nil
  • false

Kyverno Policy
spec 내 호스트 네임스페이스 필드가 설정되어있지 않거나 false 설정되어있는지 점검
https://kyverno.io/policies/pod-security/baseline/disallow-host-namespaces/disallow-host-namespaces/

2-3. Privileged Containers

특권 모드의 컨테이너를 실행하여 호스트에서 실행되는 프로세스와 거의 동일한 접근을 허용함(네트워크 스택 조작 및 장치 접근과 같은 리눅스 기능을 사용)

Restricted Fields

  • spec.containers[*].securityContext.privileged
  • spec.initContainers[*].securityContext.privileged
  • spec.ephemeralContainers[*].securityContext.privileged

Allowed Values

  • Undefined/nil
  • false

Kyverno Policy
spec 내 securityContext.privileged가 설정되어있지 않거나 false 설정되어있는지 점검
https://kyverno.io/policies/pod-security/baseline/disallow-privileged-containers/disallow-privileged-containers/

2-4. Capabilities

세분화된 root의 다양한 권한을 지정하여 사용할 수 있음

Restricted Fields

  • spec.containers[*].securityContext.capabilities.add
  • spec.initContainers[*].securityContext.capabilities.add
  • spec.ephemeralContainers[*].securityContext.capabilities.add

Allowed Values

  • Undefined/nil
  • AUDIT_WRITE
  • CHOWN
  • DAC_OVERRIDE
  • FOWNER
  • FSETID
  • KILL
  • MKNOD
  • NET_BIND_SERVICE
  • SETFCAP
  • SETGID
  • SETPCAP
  • SETUID
  • SYS_CHROOT

Kyverno Policy
securityContext.capabilities.add 내 허용된 권한 외 다른 권한이 설정되어있는지 점검
(AUDIT_WRITE, CHOWN, DAC_OVERRIDE, FOWNER, FSETID, KILL, MKNOD, NET_BIND_SERVICE, SETFCAP, SETGID, SETPCAP, SETUID, SYS_CHROOT)
https://kyverno.io/policies/pod-security/baseline/disallow-capabilities/disallow-capabilities/

2-5. HostPath Volumes

호스트와 공유되는 볼륨을 설정하여 공유 데이터에 엑세스하거나 권한 을 상승시키는데 사용할 수 있음

Restricted Fields

  • spec.volumes[*].hostPath

Allowed Values

  • Undefined/nil

Kyverno Policy
spec.volumes 내 hostPath 볼륨이 설정되어있는지 점검
https://kyverno.io/policies/pod-security/baseline/disallow-host-path/disallow-host-path/

2-6. Host Ports

호스트 포트에 접근이되면 해당 포트를 통해 스니핑하여 데이터에 접근이 가능 해짐

Restricted Fields

  • spec.containers[].ports[].hostPort
  • spec.initContainers[].ports[].hostPort
  • spec.ephemeralContainers[].ports[].hostPort

Allowed Values

  • Undefined/nil
  • Known list
  • 0

Kyverno Policy
hostPort가 설정되어 있지 않거나 0으로 설정되어있는지 점검
https://kyverno.io/policies/pod-security/baseline/disallow-host-ports/disallow-host-ports/

2-7. AppArmor

특정 프로그램이나 컨테이너에서 필요한 리눅스 기능, 네트워크 사용, 파일 권한 등에 대한 접근을 허용하는 프로필로 구성됨
권한이 높은 프로필이 지정되면 권한 상승을 할 수 있음

Restricted Fields

  • metadata.annotations["container.apparmor.security.beta.kubernetes.io/*"]

Allowed Values

  • Undefined/nil
  • runtime/default
  • localhost/*

Kyverno Policy
파드에 설정된 AppArmor 프로필이 runtime/default 또는 localhost/* 외의 것으로 지정되어있는지 점검
https://kyverno.io/policies/pod-security/baseline/restrict-apparmor-profiles/restrict-apparmor-profiles/

2-8. SELinux

해당 설정을 통해 권한을 상승시킬수 있다는데.. 잘몰게씀..;;

Restricted Fields

  • spec.securityContext.seLinuxOptions.type
  • spec.containers[*].securityContext.seLinuxOptions.type
  • spec.initContainers[*].securityContext.seLinuxOptions.type
  • spec.ephemeralContainers[*].securityContext.seLinuxOptions.type

Allowed Values

  • Undefined/""
  • container_t
  • container_init_t
  • container_kvm_t

Restricted Fields

  • spec.securityContext.seLinuxOptions.user
  • spec.containers[*].securityContext.seLinuxOptions.user
  • spec.initContainers[*].securityContext.seLinuxOptions.user
  • spec.ephemeralContainers[*].securityContext.seLinuxOptions.user
  • spec.securityContext.seLinuxOptions.role
  • spec.containers[*].securityContext.seLinuxOptions.role
  • spec.initContainers[*].securityContext.seLinuxOptions.role
  • spec.ephemeralContainers[*].securityContext.seLinuxOptions.role

Allowed Values

  • Undefined/""

Kyverno Policy
SELinux 옵션 내 허용된 설정 외 다른 옵션이 설정되어있는지 점검 (contain_t, contain_init_t 또는 container_contain_contain_contain_cont)
SELinux 사용자 또는 역할이 설정되어있는지 점검
https://kyverno.io/policies/pod-security/baseline/disallow-selinux/disallow-selinux/

2-9. /proc Mount Type

/proc 내 설정을 변경하여 마스킹 설정을 제거하여 데이터에 접근할 수 있음

Restricted Fields

  • spec.containers[*].securityContext.procMount
  • spec.initContainers[*].securityContext.procMount
  • spec.ephemeralContainers[*].securityContext.procMount

Allowed Values

  • Undefined/nil
  • Default

Kyverno Policy
securityContext 내 procMount 값이 설정되어있지 않거나 기본 값인지 점검
https://kyverno.io/policies/pod-security/baseline/disallow-proc-mount/disallow-proc-mount/

2-10. Seccomp

해당 프로필은 기본적으로 시스템 호출에 대한 액세스를 거부하는 화이트리스트이다. 이를 변경하여 시스템 호출을 통해 권한 상승할 수 있음

Restricted Fields

  • spec.securityContext.seccompProfile.type
  • spec.containers[*].securityContext.seccompProfile.type
  • spec.initContainers[*].securityContext.seccompProfile.type
  • spec.ephemeralContainers[*].securityContext.seccompProfile.type

Allowed Values

  • Undefined/nil
  • RuntimeDefault
  • Localhost

Kyverno Policy
securityContext 내 seccompProfile.type 값이 설정되어있지 않거나 'RuntimeDefault' 또는 'Localhost' 값인지 점검
https://kyverno.io/policies/pod-security/baseline/restrict-seccomp/restrict-seccomp/

2-11. Sysctls

sysctl값을 변경하여 다른 파드에 침범하여 데이터에 접근하거나 방화벽 정책을 수정할 수 있음

Restricted Fields

  • spec.securityContext.sysctls[*].name

Allowed Values

  • Undefined/nil
  • kernel.shm_rmid_forced
  • net.ipv4.ip_local_port_range
  • net.ipv4.ip_unprivileged_port_start
  • net.ipv4.tcp_syncookies
  • net.ipv4.ping_group_range

Kyverno Policy
securityContext 내 sysctls 값이 설정되어있지 않거나 허용된 값인지 점검
(kernel.shm_rmid_forced, net.ipv4.ip_local_port_range, net.ipv4.ip_unprivileged_port_start, net.ipv4.tcp_syncookies, net.ipv4.ping_group_range)
https://kyverno.io/policies/pod-security/baseline/restrict-sysctls/restrict-sysctls/

3. Resticted

가장 엄격하게 제한되는 정책

3-1. Volume Types

지정된 볼륨만 사용하게하는 정책

Restricted Fields

  • spec.volumes[*]

Allowed Values

  • spec.volumes[*].configMap
  • spec.volumes[*].csi
  • spec.volumes[*].downwardAPI
  • spec.volumes[*].emptyDir
  • spec.volumes[*].ephemeral
  • spec.volumes[*].persistentVolumeClaim
  • spec.volumes[*].projected
  • spec.volumes[*].secret

Kyverno Policy
spec.volumes 값이 허용된 값인지 점검
(name, configMap, csi, downwardAPI, emptyDir, ephemeral, persistentVolumeClaim, projected, secret, '')
https://kyverno.io/policies/pod-security/restricted/restrict-volume-types/restrict-volume-types/

3-2. Privilege Escalation

setuid, setgid를 통해 root로 권한 상승할 수 있음

Restricted Fields

  • spec.containers[*].securityContext.allowPrivilegeEscalation
  • spec.initContainers[*].securityContext.allowPrivilegeEscalation
  • spec.ephemeralContainers[*].securityContext.allowPrivilegeEscalation

Allowed Values

  • false

Kyverno Policy
securityContext 내 allowPrivilegeEscalation값이 false로 설정되어있지 점검
https://kyverno.io/policies/pod-security/restricted/disallow-privilege-escalation/disallow-privilege-escalation/

3-3. Running as Non-root

루트 사용자 금지

Restricted Fields

  • spec.securityContext.runAsNonRoot
  • spec.containers[*].securityContext.runAsNonRoot
  • spec.initContainers[*].securityContext.runAsNonRoot
  • spec.ephemeralContainers[*].securityContext.runAsNonRoot

Allowed Values

  • true

Kyverno Policy
securityContext 내 runAsNonRoot값이 true로 설정되어있는지 점검
https://kyverno.io/policies/pod-security/restricted/require-run-as-nonroot/require-run-as-nonroot/

3-4. Running as Non-root user

루트 사용자 금지(사용자 지정)

Restricted Fields

  • spec.securityContext.runAsUser
  • spec.containers[*].securityContext.runAsUser
  • spec.initContainers[*].securityContext.runAsUser
  • spec.ephemeralContainers[*].securityContext.runAsUser

Allowed Values

  • 0
  • undefined/null

Kyverno Policy
seucrityContext 내 runAsUser 값이 0보다 크거나 설정되지않았는지 점검
https://kyverno.io/policies/pod-security/restricted/require-run-as-non-root-user/require-run-as-non-root-user/

3-5. Capabilities

세분화된 root의 다양한 권한을 지정하여 사용할 수 있음

Restricted Fields

  • spec.containers[*].securityContext.capabilities.drop
  • spec.initContainers[*].securityContext.capabilities.drop
  • spec.ephemeralContainers[*].securityContext.capabilities.drop

Allowed Values

  • Any list of capabilities that includes ALL

Restricted Fields

  • spec.containers[*].securityContext.capabilities.add
  • spec.initContainers[*].securityContext.capabilities.add
  • spec.ephemeralContainers[*].securityContext.capabilities.add

Allowed Values

  • Undefined/nil
  • NET_BIND_SERVICE

Kyverno Policy
capabilities에 NET_BIND_SERVICE만 허용(화이트 리스트)되어있는지 점검
https://kyverno.io/policies/pod-security/restricted/disallow-capabilities-strict/disallow-capabilities-strict/

'Security' 카테고리의 다른 글

[Security] EKS RBAC  (0) 2022.05.20
[Server] 서버 점검  (0) 2022.02.27
[Container] Trivy Docker image Scan  (0) 2021.10.28
[Code] Sonarqube Code Analysis  (0) 2021.10.23
[Code] Sonarqube  (0) 2021.10.23