Kubernetes 28

[CKS] Minimize Microservice Vulnerabilities

Secret 데이터 암호화 ETCD에 Secret을 저장할 때, API서버에서 Encryption/Decryption을 수행하는 기능에 대해 다룬다. 내용이 꽤 있으므로, 따로 정리해놓은 페이지를 참고하기 바란다. ETCD Encryption Kubernetes Secret 일반적으로 K8s 환경에서 Password, Access Token와 같이 보안에 민감한 데이터를 Secret 리소스로 관리한다. 다음은 간단한 Secret을 생성하는 예시이다. kubectl create secret generic secre.. cwal.tistory.com Container Runtime Sandbox Container는 Host와 Kernel을 공유하도록 설계되어있다. 예를 들어, 다음 명령어를 Container..

[CKS] System Hardening

AppArmor K8s Pod에 AppArmor 적용 K8s에서 AppArmor 기능을 사용하기 위해선 다음과 같은 요구사항을 충족해야 한다. Container Runtime이 AppArmor를 지원 모든 Node에 AppArmor 설치 모든 Node에 AppArmor 프로필 존재 컨테이너 단위로 AppArmor 프로필 명시 다음과 같이 Pod Manifest 파일을 작성한다. kubectl run secure --image=nginx -oyaml --dry-run=client > secure-pod.yaml vim secure-pod.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null annotations: container.apparmor..

[CKS] Cluster Hardening

RBAC Role과 RoleBinding 다음과 같은 시나리오를 진행한다. 1. 네임스페이스 red, blue 생성 kubectl create ns red kubectl create ns blue 2. User 'john'은 red 네임스페이스의 'secret' 리소스에 대해 'get' 동작을 수행할 수 있다. #Role 'secret-manager' 생성 kubectl -n red create role secret-manager --verb=get --resource=secrets #User 'john'과 Role 'secret-manager'를 Binding kubectl -n red create rolebinding secret-manager --role=secret-manager --user=jo..

[CKS] Cluster Setup

Network Policy Default Deny default 네임스페이스에 속한 모든 Pod의 트래픽(ingress, egress)을 차단하는 기본 Network Policy를 아래와 같이 정의한다. apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny spec: podSelector: {} policyTypes: - Egress - Ingress 위 설정은 DNS 서버(ex: coredns)의 접근도 거부되므로, 아래와 같이 DNS 포트는 허용할 수 있다. apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny spec: podSelector: ..

Certified Kubernetes Security Specialist (CKS)

현재 CNCF에서 공인하는 Kubernetes 관련 자격증은 CKA, CKAD, CKS 총 3개이다. 필자는 작년에 CKA, CKAD를 취득했으나, 올해 새로운 학습 목표로 DevSecOps를 공부할겸 CKS 시험도 마저 통과하고자 한다. 자격 개요 Container 기반 어플리케이션 및 Kubernetes 플랫폼에 대한 보안 역량을 검증하는 테스트이다. CNCF에서 주관하는 다른 K8s 자격증(CKA, CKAD)과 동일하게, 별도 구축된 시험 환경에서 각 문제마다 제시하는 요구사항에 맞게 K8s 클러스터를 설정하거나, 리소스를 생성하는 등 단순 이론보다 실제 수행 능력을 평가한다. 2시간 동안 15~20개의 문제를 풀어야 하며, 총 100% 중 67% 이상 득점해야 통과로 문제 난이도에 따라 점수가 다..

ETCD Encryption

Kubernetes Secret 일반적으로 K8s 환경에서 Password, Access Token와 같이 보안에 민감한 데이터를 Secret 리소스로 관리한다. 다음은 간단한 Secret을 생성하는 예시이다. kubectl create secret generic secret1 --from-literal user=admin kubectl create secret generic secret2 --from-literal pass=12345678 secret1: user=admin secret2: pass=12345678 그리고 다음과 같이 위 Secret 2개를 포함하는 Pod을 정의한다. apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers..

Kubernetes 2021.04.21

Kubernetes와 TLS

Kubernetes Components 아래 그림과 같이 Kubernetes에 존재하는 모든 Component 간 통신은 HTTPS를 기반으로 이루어지며, 모든 트래픽이 암호화되므로 데이터의 신뢰성과 보안을 보장할 수 있다. 일반적으로 K8s Component 사이에서 이루어지는 작업은 다음과 같이 요약할 수 있다. kube-apiserver -> etcd: kube-apiserver는 etcd에 접근할 수 있는 유일한 Component로, K8s 클러스터의 상태를 Key-Value 형식으로 etcd 저장소에 관리한다. kubelet -> kube-apiserver: Worker에 배치된 kubelet은 자신이 생성해야할 Pod 정보를 kube-apiserver로부터 가져온다. kube-apiserver..

Imperative Vs. Declarative

Kubernetes Object를 생성하는 방식은 크게 두가지이다. Shell에서 직접 명령어를 실행하거나, 별도의 파일에 Object를 정의하는 방식이다. Infrastructure as Code 관점에선 이를 각각 Imperative(명령형) 접근, Declarative(선언형) 접근으로 구분한다. 예를 들어 Imperative 방식은 택시 기사에게 직진, 좌회전, 우회전 등으로 경로를 일일이 설명하면서 목적지까지 도착하는 반면, Declarative 방식은 기사에게 자신의 목적지를 알려주면 구체적인 설명없이도 알아서 도착하는 것으로 생각할 수 있다. Infrastructure as Code 보다 프로그래밍적인 예시로, nginx 서버를 가상머신에 배포하는 과정을 Code로 비교해보자. Imperat..

Kubernetes 2021.04.08

Container Runtime과 Docker

Container Runtime Docker나 Kubernetes 사용자라면 컨테이너 런타임(Container Runtime)이라는 단어를 종종 들어봤을 것이다. 컨테이너의 개념은 상당히 명확하지만 이에 반해 컨테이너 런타임이 구체적으로 어떤 역할을 맡고 있는지 설명하기란 쉽지 않다. Docker 자체가 컨테이너 런타임인가? kubelet은 Docker와 어떤 방식으로 상호작용하여서 컨테이너를 실행하는가? 이번 시간엔 컨테이너 런타임의 정확한 개념과 기능에 대해 알아보고자 한다. Docker와 Container 기술 표준 우선 Docker의 역사에 대해 짚고 넘어갈 필요가 있다. 2013년에 공개된 Docker는 그동안 어렵게만 여겨졌던 Linux 컨테이너 기술을 쉽게 다룰 수 있도록 아래와 같은 기능을..

Kubernetes 2021.03.09

Pod Lifecycle

Pod Pod은 Kubernetes에서 scheduling 가능한 최소한의 배포 단위로, Pod은 전체 생애에서 단 한번만 schedule된다. 다시 말해서 Node에 할당된 pod은 종료될 때까지, 해당 node에서만 존재할 수 있다는 이야기다. Pod 자체는 Self-heal이 불가능하므로 Fail 발생시 그대로 제거되며, 다른 UUID값을 갖는 Pod으로 대체된다. Pod Phase 'kubectl get pod -o yaml' 등의 명령어로 Pod의 디테일한 정보를 확인해보면, 사용자가 정의한 spec 외에 status 라는 필드가 존재한다. 그리고 이 필드에는 phase 항목이 존재하는데, 이는 Pod의 lifecycle이 현재 어느 단계에 있는지를 알려준다. 우선 Pod의 전체 Lifecycl..