개요
일반 Kubernetes Cluster를 사용할 때는 PSP, PSA를 고려하지 않았지만.. Redhat OpenShift를 사용하면서 Namespace를 생성하면 자동으로 PSA가 붙어서 Pod에 대한 보안이 적용되고 동작이 제한되었다. OCP를 잘 사용하기 위해 PSA에 대한 개념을 정리한다.
Pod Security Policy가 kubernetes v1.21부터 Deprecated 되면서, 이보다 더욱 향상된 기능으로 Pod Security Admission을 제공한다.
Pod Security Admission Controller는 Pod Security Standards를 사용하며, 이는 정확하게 사전 정의된 세 가지 Pod Security Policies(Privileged, Baseline, Restricted)으로 가정할 수 있다.
Pod Security Admission
Kubernetes Pod Security Standards은 파드에 대한 다양한 격리 수준을 정의한다. 이러한 표준을 사용하면 명확하고 일관된 방식으로 파드의 동작을 제한하는 방법을 정의할 수 있다.
쿠버네티스는 Pod Security Standards을 적용하기 위해 내장형 Pod Security admission controller를 제공한다. Pod security restrictions은 파드가 생성될 때 namespace 수준에서 적용된다.
Policy Mode
선택한 라벨은 잠재적인 위반이 감지된 경우 컨트롤 플레인이 수행하는 작업을 정의한다.
Mode | Description |
enforce | 정책을 위반하면 포드가 거부됩니다. |
audit | 정책 위반으로 인해 감사 로그 에 기록된 이벤트에 감사 주석이 추가되지만 그렇지 않은 경우에는 허용됩니다. |
warn | 정책 위반은 사용자에게 경고를 표시하지만 그렇지 않은 경우에는 허용됩니다. |
각 모드에는 사용되는 정책을 결정하는 두 가지 레이블이 있다.
# The per-mode level label indicates which policy level to apply for the mode.
#
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>: <LEVEL>
# Optional: per-mode version label that can be used to pin the policy to the
# version that shipped with a given Kubernetes minor version (for example v1.28).
#
# MODE must be one of `enforce`, `audit`, or `warn`.
# VERSION must be a valid Kubernetes minor version, or `latest`.
pod-security.kubernetes.io/<MODE>-version: <VERSION>
참고
pod security standards
LEVEL : <LEVEL> 대신 포드 보안 표준 중 하나를 정의해야 한다. 현재 세 가지 포드 보안 표준을 사용할 수 있다.
Profile | Description |
Privileged | 제한되지 않은 정책으로 가능한 가장 광범위한 수준의 권한을 제공합니다. 이 정책은 알려진 권한 상승을 허용합니다. |
Baseline | 알려진 권한 에스컬레이션을 방지하는 최소한의 제한 정책. 기본(최소로 지정된) 파드 구성을 허용한다. |
Restricted | 현재 파드 강화 모범 사례를 따르는 매우 제한적인 정책. |
참고
https://kubernetes.io/docs/concepts/security/pod-security-standards/#profile-details
이러한 각 정책은 파드 사양 내에서 제한되는 필드와 허용되는 값을 정의한다. 이러한 정책에 의해 제한되는 일부 필드는 다음과 같다:
- spec.containers[*].ports
- spec.volumes[*].hostPath
- spec.securityContext
- spec.containers[*].securityContext
참고
https://medium.com/geekculture/pod-security-admission-controller-namespace-level-52158281d918
https://medium.com/@LachlanEvenson/hands-on-with-kubernetes-pod-security-admission-b6cac495cd11
테스트
nginx namespace를 생성하고 pod를 생성해 보겠다.
Namespace 생성
$ kubectl create ns nginx
$ kubectl get ns nginx -oyaml
apiVersion: v1
kind: Namespace
metadata:
annotations:
openshift.io/sa.scc.mcs: s0:c27,c4
openshift.io/sa.scc.supplemental-groups: 1000710000/10000
openshift.io/sa.scc.uid-range: 1000710000/10000
labels:
kubernetes.io/metadata.name: nginx
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/audit-version: v1.24
pod-security.kubernetes.io/warn: restricted
pod-security.kubernetes.io/warn-version: v1.24
name: nginx
spec:
finalizers:
- kubernetes
status:
phase: Active
- pod-security.kubernetes.io/audit: restricted
- auth mode에 restricted pod security standards가 붙었다.
- pod-security.kubernetes.io/warn: restricted
- warn mode에 restricted pod security standards가 붙었다.
Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: nginx
spec:
containers:
- name: nginx
image: nginx
securityContext:
runAsUser: 0 # 위반
runAsUser를 0(root)으로 설정하면 restricted pod security standard를 위반한다.
하지만 위의 파드를 생성해 보겠다.
$ kubectl apply -f nginx.yaml
Warning: would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), runAsUser=0 (container "nginx" must not set runAsUser=0), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
pod/nginx created
restricted:v1.24를 위반했다고 경고 메시지가 나오긴 하지만 파드가 생성되었다.
왜냐하면 restricted standard가 audit, warn mode에 적용되었기 때문이다.
이와 같이 PSA를 사용해서 Pod 보안 규칙을 제어하고 설정할 수 있다.
'DevOps > Kubernetes' 카테고리의 다른 글
모놀리식(Monolithic)에서 MSA으로 전환시 고려사항 (2) | 2024.09.05 |
---|---|
[OCP] permission denied, mkdir in container on openshift (0) | 2023.12.20 |
AWS EKS Node 인스턴스 타입의 최대 Pod 개수 (Too many pods 해결 방법) (0) | 2023.08.04 |
Kubernetes Deprecated API Version Check 방법 (클러스터 버전 업그레이드 사전 작업) (1) | 2023.05.23 |
Kubernetes QoS(Qualitu Of Service)와 Pod Eviction의 상관 관계 (0) | 2023.03.25 |