27.18.2. SCC, 기본값, 허용된 범위
SCC는 포드에 기본 사용자 ID, fsGroup
ID, 보조 그룹 ID 및 SELinux 레이블이 부여되는지 여부에 영향을 미칩니다. 또한 포드 정의에 제공된 ID 또는 이미지에서 제공된 ID가 허용되는 ID 범위에 대해 검증되는지 여부에 영향을 미칩니다. 검증이 필요하고 실패하면 Pod도 실패합니다.
SCC는 runAsUser
,supplementalGroups
및 fsGroup
과 같은 전략을 정의합니다. 이러한 전략은 Pod가 권한 부여되었는지 확인하는 데 도움이 됩니다. RunAsAny 로 설정된 전략 값은 기본적으로 포드가 해당 전략과 관련하여 원하는 작업을 수행할 수 있음을 나타냅니다. 해당 전략에 대한 권한을 건너뛰고 해당 전략을 기반으로 OpenShift Container Platform 기본값이 생성되지 않습니다. 따라서 결과 컨테이너의 ID 및 SELinux 레이블은 OpenShift Container Platform 정책 대신 컨테이너 기본값을 기반으로 합니다.
RunAsAny 를 간략하게 요약하려면 다음을 수행합니다.
- 포드 정의(또는 이미지)에 정의된 모든 ID가 허용됩니다.
- 포드 정의(및 이미지)에 ID가 없으면 컨테이너에서 Docker에 대한 루트 (0)인 ID를 할당합니다.
- SELinux 레이블이 정의되어 있지 않으므로 Docker에서 고유한 레이블을 할당합니다.
이러한 이유로 일반 개발자가 SCC에 액세스할 수 없도록 ID 관련 전략에 대한 RunAsAny 가 있는 SCC를 보호해야 합니다. 반면 MustRunAs 또는 MustRunAs Range 로 설정된 SCC 전략은 ID 검증(ID 관련 전략의 경우)을 트리거하고 해당 값을 Pod 정의 또는 이미지에 직접 제공하지 않은 경우 OpenShift Container Platform에서 기본값을 컨테이너에 제공합니다.
RunAsAny FSGroup
전략을 사용하여 SCC에 액세스할 수 있도록 허용하면 사용자가 블록 장치에 액세스할 수 없습니다. 포드는 블록 장치를 인계받으려면 fsGroup
을 지정해야 합니다. 일반적으로 SCC FSGroup
전략이 MustRunAs 로 설정된 경우 이 작업이 수행됩니다. 사용자 Pod에 RunAsAny FSGroup 전략이 있는 SCC가 할당되면 사용자가
자체를 지정해야 한다는 것을 확인할 때까지 권한 거부 오류가 발생할 수 있습니다.
fsGroup
SCC는 허용되는 ID(사용자 또는 그룹)의 범위를 정의할 수 있습니다. 범위 검사가 필요한 경우(예: MustRunAs사용) 허용 범위는 SCC에 정의되지 않은 경우 프로젝트에서 ID 범위를 결정합니다. 따라서 프로젝트에서 허용되는 ID 범위를 지원합니다. 그러나 SCC와 달리 프로젝트는 runAsUser
와 같은 전략을 정의하지 않습니다.
허용되는 범위는 컨테이너 ID에 대한 경계를 정의하기 때 뿐만 아니라 범위 내의 최소 값이 문제의 ID 기본값이 되기 때문에 유용합니다. 예를 들어 SCC ID 전략 값이 MustRunAs 이면 ID 범위의 최소 값이 100 이고 포드 정의에는 ID가 없으며 이 ID의 기본값으로 100이 제공됩니다.
Pod 승인의 일부로 Pod에서 사용할 수 있는 SCC를 검사하여 Pod의 요청과 가장 잘 일치하도록 우선순위 순서에 따라 가장 제한적입니다. SCC의 전략 유형을 RunAsAny로 설정하는 것은 제한적이지 않지만 MustRunAs 유형은 더 제한적입니다. 이러한 모든 전략이 평가됩니다. Pod에 할당된 SCC를 보려면 oc get pod
명령을 사용합니다.
# oc get pod <pod_name> -o yaml ... metadata: annotations: openshift.io/scc: nfs-scc 1 name: nfs-pod1 2 namespace: default 3 ...
- 1
- 포드에서 사용하는 SCC의 이름입니다(이 경우 사용자 지정 SCC).
- 2
- Pod의 이름입니다.
- 3
- 프로젝트 이름입니다. OpenShift Container Platform의 "네임스페이스"는 "프로젝트"와 교환할 수 있습니다. 자세한 내용은 프로젝트 및 사용자를 참조하십시오.
포드와 일치하는 SCC를 즉시 알 수 없으므로 위의 명령은 라이브 컨테이너에서 UID, 추가 그룹 및 SELinux 레이블 변경을 이해하는 데 매우 유용할 수 있습니다.
전략이 RunAsAny 로 설정된 모든 SCC를 사용하면 해당 전략의 특정 값을 포드 정의(및/또는 이미지)에 정의할 수 있습니다. 이 값이 사용자 ID(runAsUser)
에 적용되는 경우 컨테이너가 root로 실행되지 않도록 SCC에 대한 액세스를 제한해야 합니다.
포드는 종종 restricted SCC와 일치하기 때문에 이 관련 보안을 알고 있어야 합니다. restricted SCC에는 다음과 같은 특징이 있습니다.
-
runAsUser
전략이 MustRunAsRange 로 설정되어 있기 때문에 사용자 ID가 제한됩니다. 이렇게 하면 사용자 ID가 검증됩니다. -
허용되는 사용자 ID 범위가 SCC에 정의되어 있지 않기 때문에 (자세한 내용은 oc get -o yaml --export scc restricted' 참조) 프로젝트의
openshift.io/sa.scc.uid-range
범위는 범위 검사 및 필요한 경우 기본 ID에 사용됩니다. -
Pod 정의에 사용자 ID가 지정되지 않고 일치하는 SCC의
runAsUser
가 MustRunAsRange 로 설정된 경우 기본 사용자 ID가 생성됩니다. -
프로젝트의 기본 MCS 레이블을 사용하는 SELinux 레이블(SELinux
Context
가 MustRunAs로 설정됨)이 필요합니다. -
fsGroup
ID는 MustRunAs 로 설정되어 있는FSGroup
전략으로 인해 단일 값으로 제한됩니다. 사용할 값이 지정된 첫 번째 범위의 최소 값임을 나타냅니다. -
허용 가능한
fsGroup
ID 범위가 SCC에 정의되지 않으므로 프로젝트의 최소openshift.io/sa.scc.supplemental-groups
범위(또는 사용자 ID에 사용되는 것과 동일한 범위)는 검증 및 필요한 경우 기본 ID에 사용됩니다. -
Pod에
fsGroup
ID가 지정되지 않고 일치하는 SCC의FS
ID가 생성됩니다.Group이 MustRunAs 로 설정된 경우 기본 fs
Group -
범위를 확인할 필요가 없으므로 임의의 보조 그룹 ID가 허용됩니다. 이는
supplementalGroups
전략이 RunAsAny 로 설정된 결과입니다. - 위의 두 그룹 전략의 RunAsAny 로 인해 기본 보충 그룹은 실행 중인 포드에 대해 생성되지 않습니다. 따라서 포드 정의에 또는 이미지에서 그룹이 정의되지 않은 경우 컨테이너에는 보충 그룹이 사전 정의되어 있지 않습니다.
다음은 SCC와 프로젝트의 상호 작용을 요약하는 기본 프로젝트 및 사용자 지정 SCC(my-custom-scc)를 보여줍니다.
$ oc get project default -o yaml 1 ... metadata: annotations: 2 openshift.io/sa.scc.mcs: s0:c1,c0 3 openshift.io/sa.scc.supplemental-groups: 1000000000/10000 4 openshift.io/sa.scc.uid-range: 1000000000/10000 5 $ oc get scc my-custom-scc -o yaml ... fsGroup: type: MustRunAs 6 ranges: - min: 5000 max: 6000 runAsUser: type: MustRunAsRange 7 uidRangeMin: 1000100000 uidRangeMax: 1000100999 seLinuxContext: 8 type: MustRunAs SELinuxOptions: 9 user: <selinux-user-name> role: ... type: ... level: ... supplementalGroups: type: MustRunAs 10 ranges: - min: 5000 max: 6000
- 1
- 기본값은 프로젝트 이름입니다.
- 2
- 기본값은 해당 SCC 전략이 RunAsAny 가 아닌 경우에만 생성됩니다.
- 3
- 포드 정의 또는 SCC에 정의되지 않은 경우 SELinux 기본값입니다.
- 4
- 허용되는 그룹 ID 범위. ID 검증은 SCC 전략이 RunAsAny 인 경우에만 발생합니다. 범위를 두 개 이상 지정할 수 있으며 쉼표로 구분할 수 있습니다. 지원되는 형식은 아래를 참조하십시오.
- 5
- <4> 와 동일하지만 사용자 ID의 경우입니다. 또한 단일 사용자 ID 범위만 지원됩니다.
- 6 10
- MustRunAs 는 그룹 ID 범위 검사를 시행하고 컨테이너의 그룹 기본값을 제공합니다. 이 SCC 정의를 기반으로 기본값은 5000(최소 ID 값)입니다. SCC에서 범위를 생략하면 기본값은 1000000000(프로젝트에서 파생됨)입니다. 지원되는 다른 유형 RunAsAny 는 범위 확인을 수행하지 않으므로 그룹 ID를 허용하고 기본 그룹을 생성하지 않습니다.
- 7
- MustRunAsRange 는 사용자 ID 범위 검사를 시행하고 UID 기본값을 제공합니다. 이 SCC를 기반으로 기본 UID는 1000100000(최소 값)입니다. SCC에서 최소 및 최대 범위를 생략하면 기본 사용자 ID는 1000000000(프로젝트에서 파생됨)입니다. MustRunAsNonRoot 및 RunAsAny 는 기타 지원되는 유형입니다. 대상 스토리지에 필요한 사용자 ID를 포함하도록 허용되는 ID 범위를 정의할 수 있습니다.
- 8
- MustRunAs 로 설정하면 SCC의 SELinux 옵션 또는 프로젝트에 정의된 MCS 기본값으로 컨테이너가 생성됩니다. RunAsAny 유형은 SELinux 컨텍스트가 필요하지 않으며 포드에 정의되지 않은 경우 컨테이너에 설정되어 있지 않음을 나타냅니다.
- 9
- SELinux 사용자 이름, 역할 이름, 유형 및 레이블을 여기에 정의할 수 있습니다.
허용되는 범위에는 두 가지 형식이 지원됩니다.
-
M은
시작 ID이고
N
은 카운트이므로, 범위는M
+N-1을 통해 M
이 됩니다. -
m
-N
. 여기서M
은 다시 시작 ID이고N
은 최종 ID입니다. 기본 그룹 ID는 첫 번째 범위의 시작 ID이며, 이 프로젝트에서1000000000
입니다. SCC에서 최소 그룹 ID를 정의하지 않은 경우 프로젝트의 기본 ID가 적용됩니다.