쿠버네티스 보안
계정 인증
인증 (Authentication)
쿠버네티스는 계정 체제를 관리함에 있어서 사람이 사용하는 사용자 계정과 시스템이 사용하는 서비스 계정 두 가지 개념을 제공한다.
일반적인 사용자
일반적인 사용자는 우리가 일반적으로 생각하는 사용자 아이디의 개념이다.
쿠버네티스는 자체적으로 사용자 계정을 관리하고 이를 인증(Authenticate)하는 시스템이 없다.
반드시 별도의 외부 계정 시스템을 사용해야 하며 계정 시스템 연동을 위해서 OAuth나 구글 계정(Google Account)이나 오픈스택의 키스톤(keystone)과 같은 계정 연동 방식을 지원한다.
서비스 계정
쿠버네티스가 직접 관리하는 사용자 계정이다.
클라이언트가 쿠버네티스 API를 호출하거나 콘솔이나 기타 클라이언트가 쿠버네티스 API를 접근하고자 할때 이는 실제 사용자가 아니라 시스템 계정이다.
인증 (Authentication) 방법
Basic HTTP Auth: HTTP 요청에 사용자 아이디와 비밀번호를 실어 보내서 인증하는 방식이다.
Access token via HTTP Header: 일반적인 REST API 인증에 많이 사용되는 방식이다.
Client cert: 클라이언트의 식별을 인증서(Certification)를 이용해서 인증하는 방식이다.
Custom made: 운영자가 필요에 따라 직접 인증 방식을 구현하는 방식이다.
권한 관리 (Authorization)
쿠버네티스의 권한 처리 체계는 기본적으로 역할 기반의 권한 인가 체계를 가지고 있다.
ABAC(Attribute-based access control)와 RBAC(Role-based access control) 2가지 방법이 제공된다.
ABAC (Attribute-based access control)
단어의 의미 그대로 속성(Attribute) 기반의 권한 관리다.
사용가능한 속성으로는 일반적으로 사용자(user), 그룹(group), 요청 경로(request path), 요청 동사(request verb)등 외에도 네임스페이스, 자원 등으로 설정한다.
RBAC (Role-based access control)
역할(Role) 기반으로 권한을 관리한다.
사용자와 역할을 별개로 선언한 다음에 그 두가지를 바인딩하여 사용자에게 권한을 부여한다.
서버에 접근할 필요없이 kubectl이나 API를 이용해서 관리하는 것이 가능하다.
네트워크 정책
네트워크 정책 개념
파드 그룹에 대해 서로간 또는 외부 네트워크 엔드포인트와의 통신 여부를 결정하는 정책이다.
네트워크 정책으로 파드간 통신, 네임스페이스간 통신, 포트 번호 지정 등을 서술적으로 설정할 수 있다.
NetworkPolicy 리소스들은 파드들을 선택하고 선택된 파드들에 허용되는 트래픽을 특정하는 규칙을 정의하기 위해 레이블을 사용한다.
네트워크 정책들은 네트워크 프로바이더가 제공하는 네트워크 플러그인을 통해 실현된다.
Ingress 트래픽 컨트롤 정의
ipBlock: CIDR IP 대역으로 특정 IP 대역에서만 트래픽이 들어오도록 지정할 수 있다.
podSelector: label을 이용하여 특정 label을 가지고 있는 파드들에서 들어오는 트래픽만 수신 가능하도록 지정할 수 있다.
namespaceSelector: 특정 네임스페이스로부터 들어오는 트래픽만 수신 가능하도록 지정할 수 있다.
Protocol & Port: 받을 수 있는 프로토콜과 허용되는 포트를 정의한다.
Egress 트래픽 컨트롤 정의
Egress 트래픽 컨트롤은 ipBlock과 Protocol & Port 두 가지만 지원한다.
ipBlock: 트래픽이 나갈 수 있는 IP 대역을 정의한다.
Protocol & Port: 트래픽을 내보낼 수 있는 프로토콜과 포트를 정의한다.
Using Cilium - Controlling Ingress/Egress from Namespaces
네트워크 폴리시(NetworkPolicy)로 실리움(Cilium)을 사용한다.
네트워킹 애드온
쿠버네티스는 클러스터 내부에 가상 네트워크를 구성해서 사용하는데 이때 kube-proxy 이외에 네트워킹 관련한 애드온을 사용한다.
AWS, Azure, Google 클라우드와 같은 서비스에서 제공하는 쿠버네티스를 사용한다면 별도의 네트워킹 애드온을 사용하지 않더라도 각 클라우드 벤더에서 구현되어 있다.
쿠버네티스를 직접 보유 중인 서버들에 설치해서 구성을 하려면 네트워킹 관련 애드온을 설치해서 사용해야 한다.
네트워킹 애드온의 종류는 ACI, Calico, Canal, Cilium, CNI-Genie, Contiv, Flannel, Multus, NSX-T, Nuage, Romana, WeaveNet 등이 있고, OCI의 CNI(Container Network Interface)를 구현하고 있다면 다른 애드온들도 사용이 가능하다.
Security Context
보안 컨텍스트 개념
쿠버네티스의 파드나 컨테이너에 대한 접근 제어 설정(Access Control Setting)이나 특수 권한(Privilege)를 설정하는 기능을 제공한다.
파드 또는 컨테이너의 권한 부여, 환경 설정 접근을 정의하는 securityContext 필드를 사용한다.
파드 또는 컨테이너 내의 securityContext 필드는 컨테이너 프로세스들이 사용하는 사용자(runAsUser)와 그룹(fsGroup), 가용량, 권한 설정, 보안 정책(SELinux/AppArmor/Seccomp)을 설정하기 위해 사용된다.
런타임 UID, GID를 포함한다.
보안 컨텍스트 스펙
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: gcr.io/google-samples/node-hello:1.0
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
Pod Security Policy
Pod Security Policy 개념
SecurityContext는 컨테이너나 파드의 보안 기능을 정의한다.
Pod Security Policy는 보안 기능에 대한 정책을 정의한다.
파드 생성 및 업데이트에 관한 세밀한 권한 인증을 제공한다.
파드 스펙에 대한 보안적 측면을 통제하는 클러스터-수준 리소스다.
PodSecurityPolicy 객체는 관련 필드들에 대한 기본값들을 포함하여 파드가 시스템 내로 받아들여지기 위해 구동될 때의 조건들 집합을 정의한다.
파드 보안 정책 통제는 선택적인 입장 승인 컨트롤러로서 구현된다.
Pod Security Policy 스펙
kind: PodSecurityPolicy
metadata:
name: example
spec:
privileged: false # Don't allow privileged pods!
# The rest fills in some required fileds.
seLinux:
rule: RunASAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
Pod Security Policy 동작