OWASP(Open Web Application Security Project)은
인터넷 세상에서 발생가능한 가장 중요한 보안 취약점을 정리한 문서입니다.
전세계 보안 전문가들의 의견을 종합하여 주기적으로 업데이트 됩니다.
Overview
Docker Container에 대한 OWASP TOP 10 보안 위협 중
첫 번째 항목인 D01 - Secure User Mapping에 대한 학습 내용을 담았습니다.
기술적 난이도가 낮은 1~3은 필수로 적용하고 그 규모와 복잡성에 따라 4~5로 감사 및 규정을 강제하는 것이 합리적으로 보입니다.
도커 컨테이너는 총 5가지 관점의 보안 포인트가 존재하며,
전체적으로 OWASP 최소 권한의 원칙[1]을 지키도록 준수하려고 노력해야 합니다.
기본 컨테이너는 호스트 머신의 기능 호출 권한이 없으나 가급적 useradd[3] 혹은 linux namespace[4]를 사용하여 공격 표면을 최소화 하여야 한다.
특권 컨테이너는 호스트 머신의 기능 호출 권한이 생겨 OWASP 10 보안 위반 사례에 해당하는 치명적인 공격 표면을 제공한다.
모든 컨테이너는 Multi-stage build를 사용해 불필요 파일을 제거하고 이미지화해야합니다.
모든 컨테이너의 Runtime Security 강화를 위해서 Seccomp[7], AppArmor[8], SELinux[9] 등을 사용할 수 있습니다.
모든 컨테이너에 PaC 관점을 도입하기 위해 OPA[10] 등을 사용할 수 있습니다.
모든 내용은 기술적 참고사항(Tech. Ref.)과 보안 사례 참고사항(OWASP. Ref.)로 구분하여 참조해두었습니다.
Secure User Mapping
basic container, privileged container, useradd container, linux namespace container의 실습코드는 모두 각 [Ref]에 포함되어 있습니다.
기본적으로 도커 컨테이너는 격리된 네임스페이스에 격리된 권한을 가집니다.
특히 도커 컨테이너는 호스트 머신의 기능을 사용할 수 없습니다.
이는 OWSAP 최소 권한의 원칙[1]을 준수하는 설정입니다.
하지만 특수한 경우에서 --privileged[3] 옵션을 사용할 수 있습니다.
이 경우 도커 컨테이너는 호스트 머신의 모든 기능을 사용할 수 있습니다.
이는 OWASP 최소 권한의 원칙을 위반하며 이 컨테이너를 기점으로 다른 컨테이너에 엑세스하거나 루트 시스템을 제어할 수 있습니다.
따라서 2가지 방법을 사용할 수 있습니다.
useradd[3]를 사용하여 제한된 다른 사용자를 루트 사용자로 변경하는 방법
linux namespace[4]를사사용하여 컨테이너를 격리시키는 방법
(pid / network / uts namespace 3가지를 사용할 수 있음) [5]
useradd container - [Ref]
# Dockerfile... RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 expressjs --ingroup nodejs EXPOSE 8080 RUN chown -R expressjs:nodejs /app USER expressjs
linux namespace container …?
docker run -d secure-user-mapping --pid=host --network=host
또한 Docker Multi-stage build[6]를 사용하면
OWASP 최소 권한의 관점[1]에서 공격 표면을 줄일 수 있어 보입니다.
FROM golang:latest AS builder
WORKDIR /go/src/app
COPY . .
d
RUN go get -d -v ./...
RUN go build -o dalfox
# 러닝 이미지(Running Image)
FROM debian:buster
RUN mkdir /app
COPY --from=builder /go/src/app/dalfox /app/dalfox
COPY --from=builder /go/src/app/samples /app/samples
WORKDIR /app/
CMD ["/app/dalfox"]
추가적으로 아래의 3가지 방식을 사용하여 추가적인 Docker contaienr 런타임 보안을 강화할 수 있습니다.
seccomp[7]를 활용한 리눅스 커널 호출 차단
AppArmor[8]을 활용한 특정 파일시스템 경로, 네트워크 포트 제어
SELinux[9]를 활용한 특정 파일시스템 경로, 네트워크 포트 제어
번외로는 PaC(Policy as Code) 관점으로 정책 기반의 제어도 사례가 존재합니다.
OPA[10]를 활용하여 컨테이너에 정책 기반 감사 실행