4.2.5. 보안 컨텍스트 제약 조건
사용자가 수행할 수 있는 작업을 제어하는 RBAC 리소스 외에도 OpenShift Container Platform은 Pod 에서 수행할 수 있는 작업과 액세스할 수 있는 작업을 제어하는 SCC( 보안 컨텍스트 제약 조건)를 제공합니다. 관리자는 CLI 를 사용하여 SCC를 관리할 수 있습니다.
SCC는 영구 스토리지에 대한 액세스를 관리하는 데도 매우 유용합니다.
SCC는 시스템에 적용하기 위해 Pod를 실행해야 하는 조건 집합을 정의하는 오브젝트입니다. 이를 통해 관리자는 다음을 제어할 수 있습니다.
- 권한 있는 컨테이너 실행.
- 컨테이너가 추가하도록 요청할 수 있는 기능.
- 호스트 디렉터리를 볼륨으로 사용.
- 컨테이너의 SELinux 컨텍스트
- 사용자 ID입니다.
- 호스트 네임스페이스 및 네트워킹 사용
-
Pod의 볼륨을 보유한
FSGroup
할당 - 허용 가능한 추가 그룹 구성
- 읽기 전용 루트 파일 시스템 사용 필요
- 볼륨 유형의 사용 제어
- 허용 가능한 seccomp 프로필 구성
기본적으로 7개의 SCC가 클러스터에 추가되며 CLI를 사용하여 클러스터 관리자가 볼 수 있습니다.
$ oc get scc
출력 예
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny 10 false [configMap downwardAPI emptyDir persistentVolumeClaim secret] hostaccess false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir hostPath persistentVolumeClaim secret] hostmount-anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir hostPath nfs persistentVolumeClaim secret] hostnetwork false [] MustRunAs MustRunAsRange MustRunAs MustRunAs <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret] nonroot false [] MustRunAs MustRunAsNonRoot RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret] privileged true [*] RunAsAny RunAsAny RunAsAny RunAsAny <none> false [*] restricted false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim secret]
기본 SCC를 수정하지 마십시오. OpenShift Container Platform을 업그레이드할 때 기본 SCC를 사용자 정의하면 문제가 발생할 수 있습니다. 대신 새 SCC를 만듭니다.
CLI를 사용하여 클러스터 관리자가 각 SCC에 대한 정의도 볼 수 있습니다. 예를 들어 권한 있는 SCC의 경우 다음을 수행합니다.
$ oc get -o yaml --export scc/privileged
출력 예
allowHostDirVolumePlugin: true allowHostIPC: true allowHostNetwork: true allowHostPID: true allowHostPorts: true allowPrivilegedContainer: true allowedCapabilities: 1 - '*' apiVersion: v1 defaultAddCapabilities: [] 2 fsGroup: 3 type: RunAsAny groups: 4 - system:cluster-admins - system:nodes kind: SecurityContextConstraints metadata: annotations: kubernetes.io/description: 'privileged allows access to all privileged and host features and the ability to run as any user, any group, any fsGroup, and with any SELinux context. WARNING: this is the most relaxed SCC and should be used only for cluster administration. Grant with caution.' creationTimestamp: null name: privileged priority: null readOnlyRootFilesystem: false requiredDropCapabilities: [] 5 runAsUser: 6 type: RunAsAny seLinuxContext: 7 type: RunAsAny seccompProfiles: - '*' supplementalGroups: 8 type: RunAsAny users: 9 - system:serviceaccount:default:registry - system:serviceaccount:default:router - system:serviceaccount:openshift-infra:build-controller volumes: - '*'
- 1
- Pod에서 요청할 수 있는 기능 목록입니다. 빈 목록은 기능을 요청할 수 없음을 나타내고, 특수 기호
*
는 모든 기능을 요청할 수 있음을 나타냅니다. - 2
- 모든 포드에 추가할 추가 기능 목록입니다.
- 3
- 보안 컨텍스트에 허용되는 값을 지시하는
FSGroup
전략입니다. - 4
- 이 SCC에 액세스할 수 있는 그룹입니다.
- 5
- Pod에서 삭제될 기능 목록입니다.
- 6
- 보안 컨텍스트에 허용되는 값을 지시하는 사용자 전략 유형으로 실행합니다.
- 7
- 보안 컨텍스트에 허용되는 값을 지정하는 SELinux 컨텍스트 전략 유형입니다.
- 8
- 보안 컨텍스트에 허용되는 추가 그룹을 지시하는 보충 그룹 전략입니다.
- 9
- 이 SCC에 액세스할 수 있는 사용자입니다.
SCC의 users
및 groups
필드는 사용할 수 있는 SCC를 제어합니다. 기본적으로 클러스터 관리자, 노드 및 빌드 컨트롤러에는 권한 있는 SCC에 대한 액세스 권한이 부여됩니다. 인증된 모든 사용자에게는 제한된 SCC에 대한 액세스 권한이 부여됩니다.
Docker에는 포드의 각 컨테이너에 허용되는 기본 기능 목록이 있습니다. 컨테이너에서는 이 기본 목록의 기능을 사용하지만 Pod 매니페스트 작성자는 추가 기능을 요청하거나 일부 기본값을 삭제하여 이를 변경할 수 있습니다. allowedCapabilities
,defaultAddCapabilities
및 requiredDropCapabilities
필드는 Pod에서 이러한 요청을 제어하고 요청 가능한 기능, 각 컨테이너에 추가해야 하는 기능 및 금지해야 하는 기능을 지정하는 데 사용됩니다.
권한 있는 SCC:
- 권한 있는 Pod를 허용합니다.
- 호스트 디렉터리를 볼륨으로 마운트할 수 있습니다.
- 포드가 모든 사용자로 실행되도록 허용합니다.
- Pod가 모든 MCS 레이블로 실행되도록 허용합니다.
- 포드에서 호스트의 IPC 네임스페이스를 사용하도록 허용합니다.
- 포드에서 호스트의 PID 네임스페이스를 사용하도록 허용합니다.
- Pod에서 FSGroup을 사용하도록 허용합니다.
- 포드에서 추가 그룹을 사용하도록 허용합니다.
- 포드에서 seccomp 프로필을 사용할 수 있습니다.
- 포드에서 기능을 요청할 수 있습니다.
restricted SCC:
- Pod가 권한에 따라 실행되지 않도록 합니다.
- Pod에서 호스트 디렉터리 볼륨을 사용할 수 없는지 확인합니다.
- Pod를 미리 할당된 UID 범위에서 사용자로 실행해야 합니다.
- Pod를 사전 할당된 MCS 라벨로 실행해야 합니다.
- Pod에서 FSGroup을 사용하도록 허용합니다.
- 포드에서 추가 그룹을 사용하도록 허용합니다.
각 SCC에 대한 자세한 내용은 SCC에 제공되는 kubernetes.io/description 주석을 참조하십시오.
SCC는 포드에서 액세스할 수 있는 보안 기능을 제어하는 설정 및 전략으로 구성됩니다. 이 설정은 세 가지 범주로 분류됩니다.
부울로 제어 |
이 유형의 필드는 기본적으로 가장 제한적인 값으로 설정됩니다. 예를 들어, |
허용 가능한 설정으로 제어 | 이 유형의 필드는 해당 값이 허용되는지 확인하기 위해 설정과 대조됩니다. |
전략으로 제어 | 가치를 생성하는 전략이 있는 항목에서는 다음을 제공합니다.
|
4.2.5.1. SCC 전략
4.2.5.1.1. RunAsUser
-
MustRunAs -
runAsUser
를 구성해야 합니다. 구성된runAsUser
를 기본값으로 사용합니다. 구성된runAsUser
에 대해 검증합니다. - MustRunAsRange - 사전 할당된 값을 사용하지 않는 경우 최솟값과 최댓값을 정의해야 합니다. 최솟값을 기본값으로 사용합니다. 전체 허용 범위에 대해 검증합니다.
-
MustRunAsNonRoot - Pod를 0이 아닌
runAsUser
를 사용하여 제출하거나 Pod의 이미지에USER
지시문이 정의되어 있어야 합니다. 기본값이 제공되지 않습니다. -
RunAsAny - 기본값이 제공되지 않습니다. 모든
runAsUser
를 지정할 수 있습니다.
4.2.5.1.2. SELinuxContext
-
MustRunAs - 사전 할당된 값을 사용하지 않는 경우
seLinuxOptions
를 구성해야 합니다.seLinuxOptions
를 기본값으로 사용합니다.seLinuxOptions
에 대해 검증합니다. -
RunAsAny - 기본값이 제공되지 않습니다. 모든
seLinuxOptions
를 지정할 수 있습니다.
4.2.5.1.3. SupplementalGroups
- MustRunAs - 사전 할당된 값을 사용하지 않는 경우 범위를 하나 이상 지정해야 합니다. 첫 번째 범위의 최솟값을 기본값으로 사용합니다. 모든 범위에 대해 검증합니다.
-
RunAsAny - 기본값이 제공되지 않습니다. 임의의
supplementalGroups
을 지정할 수 있습니다.
4.2.5.1.4. FSGroup
- MustRunAs - 사전 할당된 값을 사용하지 않는 경우 범위를 하나 이상 지정해야 합니다. 첫 번째 범위의 최솟값을 기본값으로 사용합니다. 첫 번째 범위의 첫 번째 ID에 대해 검증합니다.
-
RunAsAny - 기본값이 제공되지 않습니다.
fsGroup
ID를 지정할 수 있습니다.