전체 글 77

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

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% 이상 득점해야 통과로 문제 난이도에 따라 점수가 다..

DevOps

What is DevOps? DevOps에 대한 정의는 관점에 따라 다를 수 있지만, 일반적으로 개발과 IT 운영의 협업을 통해 제품을 더욱 빠르고 자주 배포함(high deploy rate)과 동시에 신뢰성, 안정성, 보안을 향상시키는 개발 방법론이자 문화라고 할 수 있다. 또한 'DevOps Handbook'의 공동 저자인 John Willis는 자신의 책에서 DevOps를 다음과 같이 정의하고 있다. "DevOps is about humans. DevOps is a set of practices and patterns that turn human capital into high-performance organizational capital." - John Willis DevOps는 기술, 프로세스,..

개발 철학 2021.04.26

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