프로덕션에서 도커를 실행할 때 고려해야 할 가장 우수하고 포괄적 인 방법은 무엇입니까?


42

마지막으로, 중요한 고객 데이터가 포함 된 온라인 비즈니스 크리티컬 프로덕션 시스템을 Docker Swarm으로 옮기고 자하는 Docker를 매우 좋아합니다. 일부는 이미 그렇게했을 수도 있습니다. 다른 조직은 루트 모드에서 실행되는 프로덕션 프로세스를 금지하는 정책으로이를 감당할 수 없습니다.

Docker 프로덕션 환경에서 고려해야 할 빌딩 블록 점검 목록은 무엇입니까? 하나는 모두 필요하지는 않지만 평가를 위해서는 모두 중요해야합니다.

면책 조항 : 나는 "큰 끝없는 목록"을 피하기위한 SE 정책이 있다는 것을 알고 있지만이 점검 목록은 매우 클 수는 없으며 끝도 없습니다.

이 빌딩 블록은 무엇입니까?

  1. 아직 배포되지 않은 경우 고급 보안 설정 (강화 된 커널, SELinux 등)으로 Linux 호스트 시스템을 실행하는 것이 좋습니다.
  2. 알파인, 비지 박스, 작은 스크래치와 같은 작은 Docker 기본 이미지를 사용하는 것도 고려하십시오 (예 : 빈 기본 이미지로 시작)
  3. 루트 이외의 USER 설정 사용
  4. 컨테이너에 부여 된 이미 축소 된 커널 기능 세트를 추가로 줄이기 위해 신중하게 평가
  5. 컨테이너 당 하나의 실행 가능한 바이너리 만 프로세스를 시작하는 것이 좋습니다.
  6. 쉘 액세스를 얻기 위해 시스템을 중단하려는 사람들은 컨테이너에 모든 쉘이 비활성화되어 있는지 알 수 있습니다.
  7. 가능한 경우 읽기 전용 볼륨 마운트

질문 : 다른 무엇?


나는 이것이 매우 광범위하다는 것을 알았습니다. 그러나 동시에 나는 그 질문을 좋아했습니다. 그래서, 나는 공동체가 이것에 대해 결정하도록 할 것이다 :)
Dawny33

태그 devsecops는 무엇을 의미합니까?
030


이것이 Consider using a tiny Docker base image, like alpine, busybox or even scratch e.g. start with an empty base image보안을 강화 하는 이유를 설명해 주 시겠습니까?
030

3
@ 030은 설치가 적을수록 유지 관리가되지 않거나 잠재적으로 악용 될 수있는 불필요한 서비스 / 소프트웨어로부터 더 잘 보호 할 수 있습니다. 각 컨테이너는 단일 서비스 / 목표를 제공하는 데 사용되기 때문에 최소한으로 줄이면 항상 더 잘 작동합니다.
레온

답변:


23

컨테이너가 실행중인 호스트

도커 컨테이너를 실행하는 모든 노드에서 도커 보안 벤치를 실행 하십시오 https://github.com/docker/docker-bench-security

도커 컨테이너를 실행하는 노드에서 다음 명령을 실행합니다.

docker run -it --net host --pid host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

검사 목록을 반환합니다.

[INFO] 1 - Host Configuration

[WARN] 1.1  - Ensure a separate partition for containers has been created

[NOTE] 4.2  - Ensure that containers use trusted base images

[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image

README 저장소에서 인용하십시오.

Docker Bench for Security는 프로덕션 환경에서 Docker 컨테이너를 배포하는 데 대한 수십 가지 일반적인 모범 사례를 확인하는 스크립트입니다. 테스트는 모두 자동화되어 있으며 CIS Docker Community Edition Benchmark v1.1.0 에서 영감을 얻었습니다 .

보안 벤치에서보고 한 문제 중 일부는 공식 도커 보안 기사 를 읽고 질문에 정의 된 글 머리 기호와 비교하여 다음 사항도 중요합니다.

  • SSL을 구현하여 도커 데몬 소켓을 보호하십시오.
  • 공증인과 DOCKER_CONTENT_TRUST변수를 사용한 콘텐츠 신뢰

7

Docker는 여전히 개발 중입니다.

다른 모든 소프트웨어와 마찬가지로 버그가 발생하고 안전하지 않은 기능이 추가 될 수 있으며, 보안 침해로 이어지는 아키텍처 결함이있을 수 있습니다. 이것을 과소 평가하지 마십시오! 오늘날 시스템은 완전히 안전하지만 다음 주 패치를 통해 누군가 버그를 발견하고 악용을 작성하며 갑자기 시스템이 활짝 열려 있습니다.

꼭 필요한 경우가 아니면 최신 버전으로 업데이트하지 마십시오. 대신 잘 테스트 된 최신 버전을 사용하십시오.

Docker는 가상화가 아닙니다.

누군가가 Docker 컨테이너에서 탈출하면 해당 공격자는 실제 컴퓨터에 즉시 있습니다. 위반을 방지하는 가상화와 같은 두 번째 게이트는 없습니다.

Docker 컨테이너를 다른 프로그램처럼 취급하십시오. 가능한 가장 낮은 사용자 권한으로 실행하고, 필요하지 않은 모든 네트워크 트래픽을 차단하고, 성능이 허용되는 경우 전체 Docker 호스트를 가상화하십시오.

도커는 보호되지 않습니다

Docker 컨테이너 내에서 실행되는 코드는 Docker의 질문없이 실행됩니다. 공격자는 컨테이너에 소프트웨어를 간단히 설치할 수 있으며 Docker는 다른 코드와 마찬가지로 소프트웨어를 실행합니다.

질문에서 언급 한 것 외에도 Docker 이미지가 이상한 일을하고 있는지 메트릭과 경고를 사용하여 알림을 받으십시오. 갑작스럽고 지속적인 CPU 스파이크가 있습니까? 프로그램이 갑자기 네트워크 포트를 스캔합니까? 의심스러운 디스크 액세스가 있습니까? 그 중 하나라도 발생하면 알림을 받아야합니다. 이러한 것들을 측정하는 데 사용할 수있는 많은 도구가 있으므로 사용해야합니다.


7

도커 이미지 자체

추가 옵션은 Clair 를 사용하는 것 입니다.

Clair는 응용 프로그램 컨테이너 (현재 appc 및 docker 포함)의 취약점에 대한 정적 분석을위한 오픈 소스 프로젝트입니다.

Clair는 정기적으로 구성된 소스 세트에서 취약성 메타 데이터를 수집하여 데이터베이스에 저장합니다.

클라이언트는 Clair API를 사용하여 컨테이너 이미지를 색인화합니다. 이미지에있는 기능 목록을 작성하여 데이터베이스에 저장합니다.

클라이언트는 Clair API를 사용하여 특정 이미지의 취약성에 대한 데이터베이스를 쿼리합니다. 이미지를 다시 스캔 할 필요가 없도록 각 요청에 대해 취약성과 기능의 상관 관계가 설정됩니다.

취약성 메타 데이터에 대한 업데이트가 발생하면 변경이 발생했음을 경고 시스템에 알림을 보낼 수 있습니다.

우리의 목표는 컨테이너 기반 인프라의 보안을보다 투명하게 볼 수 있도록하는 것입니다. 따라서이 프로젝트는 프랑스 용어로 맑고 밝으며 투명하게 번역 된 후에 클레어 (Clair)로 명명되었습니다.


5

이 스레드의 포인트 외에도; 내 추천은 다음과 같습니다.

  • dumb-init로 Docker PID1을 제어하십시오.
  • 컨테이너 오케스트레이션 시스템이없는 프로덕션 환경에서 도커를 실행하지 마십시오
    • Kubernetes, Mesos, Swarm 등에서 선택하십시오.
  • 도커 이미지 내에서 사용자 제어를 위해 gosu 사용
  • 컨테이너에서 상태 저장 앱을 실행중인 경우 12 단계 앱 패러다임을 따르십시오.
    • 컨테이너에서 상태 저장 앱 (mysql, zookeeper, elasticsearch)을 실제로 실행해야하는 경우 Kubernetes Statefulsets 와 같은 오케 스트레이터 패러다임을 활용하십시오
  • Hashicorp Vault / Consul과 같은 도구를 사용하여 강력한 비밀 / 구성 관리 수행
  • 준비, 통합 테스트를 통해 철저하게 준비하는 CI 파이프 라인을 통해 개발하기 위해 개발자가 구축 한 동일한 컨테이너를 배송하십시오.
  • CVE 및 패치 관련 알림을 작성하고 패치 알림에서 빌드를 트리거합니다.
  • 실행중인 컨테이너에 대한 통찰력을 얻기 위해 광범위한 로깅을 수행해야합니다 .devs SSH에 호스트 또는 컨테이너에 대한 액세스 권한을 부여하고 싶지 않습니다.
    • 추천 : 유창
  • 컨테이너 및 호스트 메트릭이 모두 있음
    • 권장 사항 : prometheus + node-exporter

2

도커 진입 점을 sed명령 으로 채우는 경우 다음 연습을 고려하십시오.

  • confd 와 같은 도구 를 사용하여 docker 이미지 구성 파일을 관리하고 업데이트하십시오.

Confd 는 지원되는 많은 키-값 저장소에서 데이터를 읽고 구성 템플릿을 동적으로 렌더링합니다.


0

루트가 아닌 권한, 앱의 위치와 같은 특정 사항을 고려하면서 A2D 를 사용 하여 앱을 도커 이미지로 구울 수 있습니다 .

docker run -v $PWD:/projectName utrecht/a2d:1.0.0 \
       -projectName someProjectName -dockerfile /projectName/Dockerfile

보고:

FROM golang:1.12.4-alpine as builder
COPY . ./someProjectName/
WORKDIR someProjectName
RUN adduser -D -g '' someProjectName && \
    apk add git && \
    CGO_ENABLED=0 go build && \
    cp someProjectName /someProjectName && \
    chmod 100 /someProjectName

FROM scratch
COPY --from=builder /etc/group /etc/group
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder --chown=someProjectName:someProjectName /someProjectName /usr/local/someProjectName
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
USER someProjectName
ENTRYPOINT ["/usr/local/someProjectName"]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.