0Pricing
Cloud & IT Cert Prep · 강의

컨테이너 보안: 이미지 강화 및 런타임 보호

불필요한 패키지를 제거하고 루트가 아닌 사용자로 실행하며 런타임 보안 도구(Falco, Sysdig)를 사용해 비정상적인 컨테이너 동작을 탐지하도록 Docker 이미지를 강화합니다.

컨테이너 보안: 이미지 강화 및 런타임 보호은(는) CoddyKit의 무료 Cloud & IT Cert Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cloud & IT Cert Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

컨테이너 보안의 기초

컨테이너는 애플리케이션 코드와 해당 종속성을 호스트 OS 커널을 공유하는 격리된 단위로 묶습니다. 전체 게스트 OS를 포함하는 VM과는 다른 방식입니다. 이러한 공유 구조 덕분에 컨테이너는 가볍고 빠르지만, 다른 보안 모델이 적용됩니다. 컨테이너 탈출 취약점이 있으면 공격자가 컨테이너 밖으로 빠져나와 호스트 커널에 직접 접근할 수 있으며, 다른 모든 컨테이너에도 영향을 줄 수 있습니다. 컨테이너 보안은 세 계층에 초점을 둡니다. 이미지(무엇이 포함되어 있는가), 실행 환경(컨테이너가 실행 중에 무엇을 할 수 있는가), 오케스트레이션 플랫폼(컨테이너를 어떻게 관리하는가)입니다.

최소 기반 이미지: 공격 표면 줄이기

컨테이너 이미지에 설치된 모든 패키지는 잠재적인 공격 표면입니다. 최소 기반 이미지 원칙은 가능한 가장 작은 기반에서 시작하는 것을 의미합니다. 예로는 Alpine Linux(5MB, 최소한의 패키지), 배포판 없는 이미지(셸이나 패키지 관리자는 없고 실행 환경과 애플리케이션만 포함하는 Google의 이미지), scratch(정적으로 컴파일된 바이너리용 완전히 빈 이미지)가 있습니다. 셸이 없는 컨테이너에서는 공격자가 코드 실행에 성공하더라도 wget, curl 또는 다른 도구를 쉽게 실행해 공격을 확대할 수 없습니다. 이를 최소 노출을 통한 방어 원칙이라고 합니다.

# Bad: starts from a full OS image
FROM ubuntu:22.04

# Better: minimal Alpine base
FROM alpine:3.18

# Best: distroless for Java apps
FROM gcr.io/distroless/java17-debian11

비루트 사용자로 실행하기: 첫 번째 규칙

기본적으로 Docker 컨테이너는 root(UID 0)로 실행됩니다. 공격자가 컨테이너화된 애플리케이션의 취약점을 악용하면 컨테이너 내부에서 root 권한을 얻습니다. 컨테이너가 볼륨을 공유하거나 호스트 마운트를 사용한다면 컨테이너 내부의 root가 호스트의 root와 동일한 권한을 가질 수 있습니다. 해결 방법은 간단합니다. Dockerfile에 전용 사용자를 만들고 최종 CMD/ENTRYPOINT 전에 USER 지시어로 해당 사용자로 전환하면 됩니다. 많은 컨테이너 보안 검사 도구는 비루트 사용자가 없는 모든 이미지를 문제 항목으로 표시합니다.

FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --chown=appuser:appgroup app /app/app
USER appuser
CMD ["/app/app"]

변경 불가능한 컨테이너와 읽기 전용 파일 시스템

변경 불가능한 컨테이너는 실행 중에 파일 시스템을 수정할 수 없는 컨테이너입니다. Docker에서 --read-only를 활성화하거나 Kubernetes에서 readOnlyRootFilesystem: true를 설정하면 공격자가 디스크에 악성 코드를 작성하거나 구성 파일을 수정하거나 실행 중인 컨테이너 안에 도구를 설치하지 못하게 할 수 있습니다. 실제로 데이터를 기록해야 하는 애플리케이션(로그, 임시 파일)은 특정 tmpfs 볼륨을 마운트해 임시 기록을 수행할 수 있습니다. 변경 불가능한 컨테이너는 실행 중 상태가 컨테이너 내부의 수정으로 보안 파이프라인을 우회하는 것이 아니라 이미지와 구성에서만 비롯되어야 한다는 원칙을 강제합니다.

# Run container with read-only root filesystem
docker run --read-only \
  --tmpfs /tmp \
  --tmpfs /var/run \
  myapp:latest

이미지 스캔: 배포 전에 CVE 찾기

컨테이너 이미지 스캔 도구는 Docker 이미지에 설치된 패키지를 취약점 데이터베이스(NVD, CVE)와 대조하여 알려진 CVE를 보고합니다. 대표적인 스캐너로는 Trivy(Aqua Security에서 제공하며 빠르고 무료임), Grype(Anchore), Snyk Container, AWS ECR 이미지 스캔이 있습니다. 스캔은 CI/CD 파이프라인에 통합해야 합니다. 그러면 심각도가 CRITICAL 또는 HIGH인 CVE가 있는 모든 이미지가 레지스트리에 푸시되기 전에 파이프라인을 실패시킵니다. 스캐너는 이미지 계층에 실수로 포함된 비밀(API 키, 비밀번호)도 검사해야 합니다.

# Scan a Docker image with Trivy
trivy image --severity HIGH,CRITICAL myapp:latest

# Fail CI pipeline if vulnerabilities found
trivy image --exit-code 1 --severity CRITICAL myapp:latest

비밀 관리: 이미지 계층에 저장하지 않기

흔하면서도 위험한 실수는 Docker 이미지 안에 비밀(API 키, 데이터베이스 비밀번호, TLS 인증서)을 포함하는 것입니다. 이미지에 구워 넣은 환경 변수에 저장하거나 COPY로 추가한 파일에 저장하는 경우가 이에 해당합니다. 이미지에 접근할 수 있는 사람은 누구나 docker history를 사용하거나 이미지 계층을 추출하여 이러한 비밀을 볼 수 있습니다. 이후 계층에서 파일을 삭제하더라도 해당 파일은 이미지 기록에 남아 있습니다. 비밀은 비밀 관리자에서 가져온 환경 변수, Docker secrets 또는 볼륨으로 마운트된 Kubernetes Secrets를 통해 실행 시점에 주입해야 합니다.

# Never bake secrets into images
# Bad: ENV DATABASE_PASSWORD='supersecret'

# Good: inject at runtime via environment
docker run -e DATABASE_PASSWORD=$(vault read -field=password secret/db) myapp:latest

# Or use Docker secrets in Swarm/K8s

실행 시점 보호: Falco 및 시스템 호출 모니터링

실행 시점 보안 도구는 컨테이너가 실행되는 동안 동작을 모니터링하고 비정상적인 활동을 알리거나 차단합니다. Falco(CNCF 프로젝트)는 eBPF 또는 커널 모듈을 사용하여 Linux 커널에 연결하고 시스템 호출을 가로챈 후 규칙과 비교합니다. 예를 들어 컨테이너가 셸을 생성하거나(execve('/bin/sh')), 예상하지 못한 포트에서 네트워크 연결을 열거나, /etc/shadow를 읽으면 경고를 보내는 규칙을 만들 수 있습니다. 이러한 동작 지표는 알려진 CVE가 악용되지 않았더라도 공격이 진행 중임을 나타내는 경우가 많습니다. Sysdig Secure와 Aqua Security는 상용 실행 시점 보호 플랫폼을 제공합니다.

# Example Falco rule: alert on shell execution in container
# - rule: Shell Spawned in Container
#   desc: A shell was spawned in a container
#   condition: container and proc.name in (bash, sh, zsh)
#   output: Shell spawned (user=%user.name container=%container.name)
#   priority: WARNING

Linux 기능 및 Seccomp 프로필

Docker 컨테이너는 기본적으로 여러 Linux 기능을 제거하지만, 대부분의 애플리케이션에 필요한 수준보다 여전히 많은 기능을 유지합니다. 기능은 root 권한을 서로 구분되는 단위로 나눕니다(예: CAP_NET_ADMIN, CAP_SYS_ADMIN). 모범 사례는 모든 기능을 제거한 다음 --cap-drop=ALL --cap-add=NET_BIND_SERVICE를 사용하여 필요한 기능만 다시 추가하는 것입니다. Seccomp(Secure Computing Mode) 프로필은 컨테이너가 호출할 수 있는 시스템 호출을 허용 목록으로 지정합니다. Docker에는 위험한 시스템 호출 약 44개를 차단하는 기본 Seccomp 프로필이 포함되어 있습니다. 특정 애플리케이션에 맞춘 사용자 지정 Seccomp 프로필을 사용하면 애플리케이션이 정상적으로 사용하지 않는 모든 시스템 호출을 차단하여 더욱 제한할 수 있습니다.

# Drop all capabilities, add only what's needed
docker run \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --security-opt seccomp=/etc/docker/seccomp-custom.json \
  myapp:latest

컨테이너 레지스트리 및 이미지 서명

컨테이너 레지스트리(Docker Hub, AWS ECR, Google Artifact Registry)는 이미지를 저장하고 배포합니다. 레지스트리 보안에는 다음이 포함됩니다. 푸시 시 취약점 스캔 활성화, 푸시 권한을 CI/CD 서비스 계정으로만 제한, Sigstore/Cosign 또는 Docker Content Trust(Notary)를 사용한 이미지 서명 활성화, 그리고 이미지 불변성 구성입니다. 이를 통해 실행 환경은 신뢰할 수 있는 출처에서 암호학적으로 서명된 이미지만 가져올 수 있습니다. 또한 태그를 덮어쓸 수 없게 하여, 공격자가 신뢰할 수 있는 :latest 태그를 악성 이미지로 교체하는 태그 변조 공격을 막을 수 있습니다.

# Sign a container image with Cosign
cosign sign --key cosign.key myregistry.io/myapp:v1.2.3

# Verify signature before deployment
cosign verify --key cosign.pub myregistry.io/myapp:v1.2.3

컨테이너 탈출 기법 및 방어

컨테이너 내부에서 코드 실행 권한을 얻은 공격자는 호스트에 접근하기 위해 컨테이너 탈출을 시도할 수 있습니다. 일반적인 기법은 다음과 같습니다. 취약한 권한 있는 컨테이너 악용(--privileged는 호스트에 거의 제한 없는 접근 권한을 부여함), 노출된 Docker 소켓 악용(컨테이너에 마운트된 /var/run/docker.sock은 권한 있는 컨테이너 생성 등을 포함한 전체 Docker API 접근 권한을 부여함), 보호되지 않은 기능을 통한 커널 취약점 악용입니다. 방어 방법은 다음과 같습니다. 반드시 필요한 경우가 아니면 권한 모드를 사용하지 말고, 애플리케이션 컨테이너에 Docker 소켓을 마운트하지 말며, 호스트 커널에 최신 패치를 적용하고, 강력한 격리가 필요한 작업에는 gVisor 또는 Kata Containers를 사용해야 합니다.

# DANGEROUS: never do this in production
# docker run --privileged -v /:/host myapp:latest

# Check if a container is running privileged
docker inspect mycontainer | grep -i privileged

CIS Docker 벤치마크 준수

Center for Internet Security(CIS) Docker Benchmark는 Docker 호스트와 컨테이너를 위한 상세한 보안 구성 지침을 제공합니다. 여기에는 데몬 구성, 이미지 위생, 컨테이너 실행 시점 설정, 네트워크 제어가 포함됩니다. Docker Bench for Security와 같은 도구는 CIS 벤치마크를 기준으로 준수 여부를 자동으로 검사하고, 통과 또는 실패 항목을 점수화한 보고서를 생성합니다. 이 벤치마크를 주기적으로 실행하고 CI/CD에 통합하면 보안 구성의 드리프트를 빠르게 감지할 수 있습니다. Security+ 응시자는 CIS Benchmarks가 시험에서 OS 및 플랫폼 강화의 주요 참고 자료라는 점을 알아야 합니다.

# Run Docker Bench for Security
docker run -it --net host --pid host --userns host --cap-add audit_control \
  -v /var/lib:/var/lib -v /var/run/docker.sock:/var/run/docker.sock \
  -v /etc:/etc docker/docker-bench-security

빠른 확인

이 강의에서 다룬 CompTIA Security+(SY0-701) 개념에 대한 이해도를 확인해 보십시오.

강의 요약

이 강의에서는 다음을 배웠습니다. 최소 구성 기본 이미지와 root가 아닌 사용자는 컨테이너화된 작업의 공격 표면과 권한 수준을 줄입니다. Falco와 같은 실행 시점 보호 도구는 컨테이너 내부에서 공격이 진행 중임을 나타내는 비정상적인 시스템 호출 패턴을 탐지합니다. 또한 권한 있는 컨테이너를 사용하거나 Docker 소켓을 애플리케이션 컨테이너에 마운트해서는 안 됩니다. 이러한 구성은 컨테이너 탈출을 가능하게 하기 때문입니다. 다음으로는 RBAC, 네트워크 정책, Pod 보안 표준을 비롯한 Kubernetes 보안을 살펴보겠습니다.

자주 묻는 질문

“컨테이너 보안: 이미지 강화 및 런타임 보호” 강의는 무료인가요?

네 — “컨테이너 보안: 이미지 강화 및 런타임 보호” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cloud & IT Cert Prep 강의 전체를 잠금 해제할 수 있습니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“컨테이너 보안: 이미지 강화 및 런타임 보호”에서 뭘 배우나요?

불필요한 패키지를 제거하고 루트가 아닌 사용자로 실행하며 런타임 보안 도구(Falco, Sysdig)를 사용해 비정상적인 컨테이너 동작을 탐지하도록 Docker 이미지를 강화합니다. 브라우저에서 직접 실행하는 실습 코드로 Cloud & IT Cert Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cloud & IT Cert Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cloud & IT Cert Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“컨테이너 보안: 이미지 강화 및 런타임 보호” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cloud & IT Cert Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cloud & IT Cert Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 컨테이너 보안: 이미지 강화 및 런타임 보호
  2. Kubernetes 보안: RBAC, 네트워크 정책 및 파드 보안
  3. 서버리스 및 함수 보안
  4. 코드형 인프라 보안 검사
← Cloud & IT Cert Prep(으)로 돌아가기