소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.
streamingConnectionIdleTimeout
필드는 연결이 자동으로 닫히기 전까지 스트리밍 연결이 유휴 상태에 있을 수 있는 최대 시간을 지정합니다. 유휴 시간 초과를 설정하면 서비스 거부 공격 및 연결 수 부족을 방지할 수 있습니다. 필드 값을 0
으로 설정하면 유휴 시간 초과가 비활성화됩니다.streamingConnectionIdleTimeout
필드를 0
으로 설정하여 스트리밍 연결 시간 초과를 비활성화합니다.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
streamingConnectionIdleTimeout: 0
AlwaysAllow
모드에서 API 서버는 권한 부여 확인을 수행하지 않습니다. 이 모드는 모든 요청을 허용하기 때문입니다.AlwaysAllow
를 권한 부여 모드 중 하나로 사용하여 Kubernetes API 서버를 시작합니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=...,AlwaysAllow,...
...
--root-ca-file
플래그 없이 시작됩니다. 결과적으로 Kubernetes 컨트롤러 관리자는 해당 루트 CA 인증서를 Pod에 게시하지 않습니다. 루트 CA 인증서가 없으면 Pod는 연결을 설정하기 전에 API 서버의 제공 인증서를 확인할 수 없습니다. 이러한 연결은 MiTM(Man-in-The-Middle) 공격에 취약합니다.--root-ca-file
플래그 없이 Kubernetes 컨트롤러 관리자를 시작합니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: example.domain/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
AlwaysAllow
모드 또는 Webhook
모드를 사용하여 요청에 권한을 부여합니다. 권한 부여 모드를 지정하지 않으면 기본적으로 AlwaysAllow
로 설정됩니다. AlwaysAllow
모드에서 Kubelet은 권한 부여 확인을 수행하지 않습니다. 이 모드는 모든 요청을 허용하기 때문입니다. Kubelet은 작업자 시스템 워크로드를 관리하는 Kubernetes 주요 에이전트이기 때문에 공격자는 제어되지 않은 요청을 사용하여 충분히 보호되지 않고 보안에 민감한 서비스 API에 액세스할 수 있습니다.AlwaysAllow
로 설정되어 있기 때문에 Kubelet이 권한 부여 확인을 수행하지 않습니다.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authorization:
mode: AlwaysAllow
clientCAFile
필드를 포함하지 않습니다.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
--kubelet-client-certificate
플래그 및 --kubelet-client-key
플래그로 각각 인증서 기반 Kubelet 인증을 지원하기 위한 클라이언트 인증서 및 해당하는 개인 키를 지정하지 않고 Kubernetes API 서버를 시작합니다.
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
--kubelet-certificate-authority
플래그로 Kubelet의 제공 인증서를 확인하는 루트 인증서 번들을 지정하지 않고 Kubernetes API 서버를 시작합니다.
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
Node
권한 부여는 Kubelet의 API 요청에 특별히 권한을 부여하는 특수 목적의 권한 부여 모드입니다. 이 모드는 Kubelet이 올바르게 작동하는 데 필요한 최소한의 권한 집합을 제공합니다.Node
권한 부여 모드 없이 Kubernetes API 서버를 시작합니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=RBAC,Webhook
...
NodeRestriction
승인 컨트롤러를 활성화하십시오. NodeRestriction
승인 컨트롤러는 모든 Kubelet이 해당 Node 및 Pod 개체를 수정하는 것을 제한하며 민감한 시스템 개체에 대한 액세스를 거부합니다. 이는 손상된 노드가 Kubernetes 클러스터의 다른 노드에 대한 권한을 얻는 것을 방지합니다.Pod
정의는 NodeRestriction
승인 컨트롤러를 활성화하지 않고 Kubernetes API 서버를 시작합니다.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodSecurityPolicy
...
PodSecurityPolicy
승인 컨트롤러가 없으면 K-Rail, Kyverno, OPA/Gatekeeper와 같은 Kubernetes용 대체 보안 적용 도구가 없을 경우 보안 제어가 취약함을 나타냅니다. PodSecurityPolicy
승인 컨트롤러는 클러스터에서 허용 가능한 보안 관련 Pod 속성을 지정하는 Pod 보안 정책을 적용합니다. 예를 들어 PodSecurityPolicy
를 사용하면 Pod
가 생성될 때마다 기본적으로 권한 있는 컨테이너를 금지하고 권한 에스컬레이션을 허용하지 않을 수 있습니다.Pod
정의는 PodSecurityPolicy
승인 컨트롤러를 활성화하지 않고 Kubernetes API 서버를 시작합니다.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
RBAC
(Role-Based Access Control)는 조직 내 개별 사용자의 역할에 따라 컴퓨터 또는 네트워크 리소스에 대한 액세스를 제어합니다. RBAC는 가장 안전한 권한 부여 모드입니다.RBAC
권한 부여 모드 없이 Kubernetes API 서버를 시작합니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=Node,Webhook
...
securityContext
필드가 없기 때문에 보안 컨텍스트 없이 Pod
를 정의합니다.
apiVersion: v1
kind: Pod
...
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
SecurityContextDeny
승인 컨트롤러는 Pod가 Kubernetes 클러스터에서 권한 에스컬레이션을 허용하는 특정 SecurityContext 필드를 설정하는 것을 방지합니다. 적절한 Pod 보안 정책과 같은 Kubernetes에 대한 대체 정책 적용 도구가 없으면 SecurityContextDeny
승인 컨트롤러를 활성화해야 합니다.Pod
정의는 SecurityContextDeny
승인 컨트롤러를 활성화하지 않고 Kubernetes API 서버를 시작합니다.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
--service-account-private-key-file
플래그를 사용하십시오.--service-account-private-key-file
플래그 없이 Kubernetes 컨트롤러 관리자를 시작합니다.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
...
ServiceAccount
승인 컨트롤러는 서비스 계정 관리를 자동화합니다. ServiceAccount
승인 컨트롤러의 몇 가지 이점은 자동화된 자격 증명 순환을 통해 액세스 토큰 유출의 위험을 완화하고 기밀을 스토리지에 보관할 필요를 없앤다는 것입니다. ServiceAccount
승인 컨트롤러는 기본적으로 활성화되지만 고의적으로 비활성화했습니다.Pod
정의는 Kubernetes API 서버를 시작하고 ServiceAccount
승인 컨트롤러를 비활성화합니다.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=ServiceAccount,PodNodeSelector
...
NamespaceLifecycle
승인 컨트롤러는 Kubernetes 시스템의 무결성을 두 가지 방법으로 유지합니다. 첫째, 존재하지 않는 네임스페이스나 종료되는 네임스페이스에서 객체가 만들어지는 것을 방지합니다. 둘째, Kubernetes 중요 서비스가 포함된 시스템 예약 네임스페이스가 삭제되는 것을 방지합니다.NamespaceLifecycle
승인 컨트롤러는 기본적으로 활성화되지만 Kubernetes API 서버를 시작하는 명령이 --disable-admission-plugin
플래그를 사용하여 비활성화되었습니다.--disable-admission-plugins
플래그에 포함된 NamespaceLifecycle
의 존재는 NamespaceLifecycle
승인 컨트롤러를 비활성화합니다.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=...,NamespaceLifecycle,...
...
--peer-auto-tls
플래그를 true
로 설정합니다. 결과적으로 etcd 인스턴스는 피어와의 TLS 연결에 자체 서명된 인증서를 사용합니다.
...
spec:
containers:
- command:
...
- etcd
...
- --peer-auto-tls=true
...
root
액세스를 제공하지 않고 명명된 root
작업을 수행하는 것을 허용합니다. CAP_SYS_ADMIN
기능은 가능한 가장 광범위한 시스템 관리 작업을 수행할 수 있는 권한을 Pod에 부여합니다.CAP_SYS_ADMIN
기능을 Pod의 컨테이너에 추가합니다.
...
kind: Pod
...
spec:
containers:
...
securityContext:
capabilities:
add:
- CAP_SYS_ADMIN
- SYS_TIME
...
privileged
필드는 컨테이너에 호스트에서 실행되는 다른 프로세스와 거의 동일한 권한을 허용합니다. 그러면 공격 표면이 확장되고 최소 권한으로 이미지를 실행하는 원칙이 위반됩니다.privileged: true
를 설정하여 Pod가 특권 모드에서 실행됩니다.
...
kind: Pod
...
spec:
containers:
- name: ...
image: ...
securityContext:
privileged: true
...