k8s 42

ETCD Backup&Restore

ETCD는 K8s 클러스터의 모든 데이터가 위치한 저장소로, 주기적으로 백업하여 혹시 모를 재난에 대비할 수 있어야 한다. 다행히 자체적으로 스냅샷과 복원 기능을 제공하기 때문에 어렵지 않게 사용할 수 있다. K8s Master node에서 아래와 같은 작업을 진행한다. etcdctl CLI에서 etcd를 관리할 수 있는 툴이다. Ubuntu의 경우, etcd-client 패키지를 설치하면 바로 사용할 수 있다. apt update -y && apt install -y etcd-client Snapshot 생성 다음 명령어로 현재 etcd 클러스터의 snapshot을 현재 위치에 'etcd-snapshot.db' 파일로 저장할 수 있다. ETCDCTL_API=3 etcdctl --cacert=/etc/k..

Kubernetes 2021.05.29

[CKS] 취득 후기

첫 시도 5/15에 CKS 시험을 치뤘으며, 결과만 먼저 얘기하자면 66%로 커트라인인 67%를 넘기지 못하여 불합격 처리되었다. 전체 15문제 중 배점이 높은 ImagePolicyWebhook을 제대로 설정하지 못했고, 몇몇 문제에 말려서 시간을 허비하는 바람에 답안을 충분히 검토할 시간이 부족했다. 다 풀고 나니 5분 밖에 남지 않은 상황이라 아무 것도 할 수가 없었다. 아마 Manifest 파일 정의까지만 해놓은 상태에서 깜빡하고 적용을 하지 않은 답안들이 꽤 있었을 것이다. 게다가 시험 환경에서 제공하는 Notepad가 있는줄 모르고, 계속 vim을 들락날락 하면서 복사/붙여넣기 하느라 불필요한 시간을 낭비했다. CKA나 CKAD와는 달리, 대부분의 문제가 단순히 리소스 하나만 정의하는데서 끝나지..

[CKS] Supply Chain Security

Image Footprint 다음과 같은 Dockerfile이 있다고 가정한다. FROM ubuntu ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y golang-go COPY app.go . RUN CGO_ENABLED=0 go build app.go CMD ["./app"] 'app.go' 파일은 아래와 같다. 1초마다 현재 사용자의 이름과 UID를 출력하며, 만약 위와 같이 따로 User를 특정하지 않는다면 root를 사용할 것이다. package main import ( "fmt" "time" "os/user" ) func main () { user, err := user.Current() if err != n..

[CKS] Runtime Security

Behavioral Analytics strace strace는 Debugging 목적으로 프로세스의 system call 호출을 intercept하여 로그를 남기는 Linux 명령어이다. 다음은 'ls' 에서 어떤 system call을 사용하는지 strace로 확인한 내용이다. 비교적 간단한 프로세스임에도 불구하고 fstat, mmap 등수많은 system call을 사용하고 있음을 알 수 있다. '-cw' 옵션을 추가하면 다음과 같이 해당 프로세스의 system call 사용 현황을 요약하여 볼 수 있다. 현재 실행중인 ETCD 컨테이너 안의 etcd 프로세스의 PID를 확인해보자. ps aux | grep etcd command를 확인하면, etcd의 PID가 3623인 것을 알 수 있다. str..

Open Policy Agent

Request Workflow 관리자나 Pod이 Kubernetes 클러스터에 접근시, API 서버 내부적으로 다음과 같은 순서를 통해 Request를 처리한다. 모든 Workflow를 통과해야만, 정상적으로 작업이 이루어진다. 1. Authentication 클라이언트에서 전달한 TLS Certificate의 Common Name 필드를 조회하여, 유효한 사용자인지 검증한다. 간단히 말하면 현재 클라이언트가 누구인지 확인하는 과정이다. 2. Authorization 해당 사용자에 대한 RBAC(Role, RoleBinding, etc.)을 확인하여 Request에서 요구하는 작업을 수행할 권한이 있는지 체크한다. 3. Admission Control Authentication 및 Authorizatio..

Kubernetes 2021.05.05

[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: ..

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