3분만에 가능! 최고의 Dockerfile을 작성한 후에 할 일 중 하나

16998 단어 5dockerfile도커

개요



Dockerfile을 작성하는 모범 사례을 읽고 모범 사례 Dockerfile을 만들거나 만들고 싶은 사람이 대상입니다.

그 Dockerfile로 괜찮은지 3분 안에 체크할 수 있는 툴을 만들었습니다. Hadolint와 같은 단순한 Dockerfile의 Linter가 아니라 빌드한 이미지의 내용까지 세세하게 분석합니다.

일반 Linter에서는 원리적으로 불가능한 기본 이미지에 존재하는 위험도 포함하여 조사할 수 있습니다.
← GitHub의 Star를 받으면 기쁩니다. Dockle의 내부에서 사용되고 있는 툴은 Trivy, Vuls등과 같기 때문에, 그 근처를 근거로 해, 동작 원리를 다른 기사에 정리했습니다. 사람을 떨리는 툴 「Dockle」의 구조를 해설

또한 DockerHub에서 인기있는 컨테이너에 대해 시도한 결과를 사이트로 공개하고 있습니다. 조작 방법도 포함하고, 다른 기사에 정리했습니다.
DockerHub에서 공개된 컨테이너가 안전한지 확인해 보았다 【인기 컨테이너 상위 800개! 】

즉시 시도해 보겠습니다.
  • 2019.6.15 추가 : Docker를 통해 실행하는 방법을 추가했습니다
  • 2019.6.17 추가:
  • --ignore 옵션 추가
  • IGNORE 된 항목의 메시지가 표시되지 않도록 수정되었습니다.
  • Linter와의 차이에 대한 설명을 "마지막으로"에 추가했습니다.

  • 2019.6.19 덧붙여 : Dockle가 어떻게 움직이고 있는지의 설명 등을 다른 기사에 정리했습니다.
  • 2019.7.10 추가: htps : //이런 rs. 오도 ​​th. ch 에서 스캔 결과를 게시했습니다.

  • 실제로 할 일



    Homebrew (Mac / Linux)


    $ export DOCKER_CONTENT_TRUST=1
    $ docker build -t test-image:v1 .
    $ brew install goodwithtech/r/dockle
    $ dockle test-image:v1
    

    리눅스


    $ export DOCKER_CONTENT_TRUST=1
    $ docker build -t test-image:v1 .
    $ VERSION=$(
     curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
     grep '"tag_name":' | \
     sed -E 's/.*"v([^"]+)".*/\1/' \
    ) && curl -L -o dockle.tar.gz https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.tar.gz
    $ tar zxvf dockle.tar.gz
    $ ./dockle test-image:v1
    

    Windows


    $ export DOCKER_CONTENT_TRUST=1
    $ docker build -t test-image:v1 .
    $ VERSION=$(
     curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
     grep '"tag_name":' | \
     sed -E 's/.*"v([^"]+)".*/\1/' \
    ) && curl -L -o dockle.zip https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Windows-64bit.zip
    $ unzip dockle.zip && rm dockle.zip
    $ ./dockle.exe test-image:v1
    

    도커


    $ VERSION=$(
     curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
     grep '"tag_name":' | \
     sed -E 's/.*"v([^"]+)".*/\1/' \
    ) && docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
     goodwithtech/dockle:v${VERSION} test-image:v1
    

    리모트의 이미지를 지정하는 경우, /var/run/docker.sock-v 옵션이 불필요합니다.

    결과


    PASS    - CIS-DI-0001: Create a user for the container
    PASS    - CIS-DI-0005: Enable Content trust for Docker
    PASS    - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
    PASS    - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
    PASS    - CIS-DI-0008: Remove setuid and setgid permissions in the images
    PASS    - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
    PASS    - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
    PASS    - CIS-DI-0010: Do not store secret files
    PASS    - DKL-DI-0001: Avoid sudo command
    PASS    - DKL-DI-0002: Avoid sensitive directory mounting
    PASS    - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
    PASS    - DKL-DI-0004: Use apk add with --no-cache
    PASS    - DKL-DI-0005: Clear apt-get caches
    PASS    - DKL-DI-0006: Avoid latest tag
    PASS    - DKL-LI-0001: Avoid empty password
    PASS    - DKL-LI-0002: Be unique UID
    PASS    - DKL-LI-0002: Be unique GROUP
    

    여기서 확인된 항목은 CIS Benchmarks 항목Dockerfile 모범 사례 중에서 발췌한 것입니다.

    실패하면 어떻게 고쳐야 하는지 대략적인 제안이 표시됩니다.
    WARN    - CIS-DI-0001: Create a user for the container
            * Last user should not be root
    PASS    - CIS-DI-0005: Enable Content trust for Docker
    WARN    - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
            * not found HEALTHCHECK statement
    PASS    - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
    INFO    - CIS-DI-0008: Remove setuid and setgid permissions in the images
            * Found setuid file: usr/lib/openssh/ssh-keysign urwxr-xr-x
    FATAL   - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
            * Use COPY : /bin/sh -c #(nop) ADD file:81c0a803075715d1a6b4f75a29f8a01b21cc170cfc1bff6702317d1be2fe71a3 in /app/credentials.json
    FATAL   - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
            * Suspicious ENV key found : MYSQL_PASSWD
    FATAL   - CIS-DI-0010: Do not store secret files
            * Suspicious filename found : app/credentials.json
    PASS    - DKL-DI-0001: Avoid sudo command
    FATAL   - DKL-DI-0002: Avoid sensitive directory mounting
            * Avoid mounting sensitive dirs : /usr
    PASS    - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
    PASS    - DKL-DI-0004: Use apk add with --no-cache
    FATAL   - DKL-DI-0005: Clear apt-get caches
            * Use 'rm -rf /var/lib/apt/lists' after 'apt-get install' : /bin/sh -c apt-get update && apt-get install -y git
    PASS    - DKL-DI-0006: Avoid latest tag
    FATAL   - DKL-LI-0001: Avoid empty password
            * No password user found! username : nopasswd
    PASS    - DKL-LI-0002: Be unique UID
    PASS    - DKL-LI-0002: Be unique GROUP
    

    확실하지 않은 경우 README 에서 코드( CIS-DI-0001 등)를 검색해 보면 수정 팁을 찾을 수 있습니다.

    모두 PASS하면 좋지만 PASS하지 않아도 괜찮습니다.
    어디까지나 지표로서 이용해 주십시오.

    예를 들어 루트 사용자를 피하는 모범 사례가 있습니다.
    그러나 루트 사용자로 실행할 수도 있습니다.
    CLI 도구 등은 기본적으로 HEALTHCHECK를 사용하지 않습니다.
    tar 파일을 압축 해제하고 추가하려면 ADD를 사용할 수도 있습니다.

    모범 사례에서 벗어나는 Dockerfile이 의도한 것인지를 생각하는 계기가 되면 기쁩니다.

    무시하고 싶은 규칙이 있는 경우, -ignore, -i 옵션으로 코드를 지정하면(자), 그 규칙을 무시합니다.
    $ dockle -i CIS-DI-0001 -i CIS-DI-0006 [IMAGE_NAME]
    

    혹은, .dockleignore 라고 하는 파일에 지정한 코드를 써도 무시해 줍니다.

    .dockleignore
    # rootで実行
    CIS-DI-0001
    # HEALTHCHECKは使わない
    CIS-DI-0006
    # latestタグ使う
    DKL-DI-0006
    

    얼마 안된 파일에 실행하면 다음과 같이 됩니다.
    IGNORE  - CIS-DI-0001: Create a user for the container
    INFO    - CIS-DI-0005: Enable Content trust for Docker
            * export DOCKER_CONTENT_TRUST=1 before docker pull/build
    IGNORE  - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
    PASS    - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
    INFO    - CIS-DI-0008: Remove setuid and setgid permissions in the images
            * Found setuid file: usr/lib/openssh/ssh-keysign urwxr-xr-x
    IGNORE  - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
    FATAL   - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
            * Suspicious ENV key found : MYSQL_PASSWD
    FATAL   - CIS-DI-0010: Do not store secret files
            * Suspicious filename found : app/credentials.json
    PASS    - DKL-DI-0001: Avoid sudo command
    FATAL   - DKL-DI-0002: Avoid sensitive directory mounting
            * Avoid mounting sensitive dirs : /usr
    PASS    - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
    PASS    - DKL-DI-0004: Use apk add with --no-cache
    FATAL   - DKL-DI-0005: Clear apt-get caches
            * Use 'rm -rf /var/lib/apt/lists' after 'apt-get install' : /bin/sh -c apt-get update && apt-get install -y git
    PASS    - DKL-DI-0006: Avoid latest tag
    FATAL   - DKL-LI-0001: Avoid empty password
            * No password user found! username : nopasswd
    PASS    - DKL-LI-0002: Be unique UID
    PASS    - DKL-LI-0002: Be unique GROUP
    

    마지막으로


    Dockle 는 Docker 이미지를 분석합니다. 단순한 Dockerfile Linter가 아닙니다.

    그러므로 Linter에는 불가능한 컨테이너 내의 파일 권한 등도 체크할 수 있습니다.
    경쟁 도구에 비해 확인할 수 있는 중요한 항목이 많습니다.

    재미 있다고 생각하신 분은 스타주세요!! 물론 stdin으로 만든 이미지에도 사용할 수 있으며, 범용성이 높습니다. 도커 빌드 -<<EOF FROM busybox RUN echo "hello world" EOF 신경이 쓰이는 점이 있으면, GitHub

    또, 2019/6/17(월)의 트위터 로, 좀 더 자세한 이야기를 합니다.
    통상 1000엔 걸리는 곳을, 무료로 참가할 수 있는 「블로그 테두리」도 남아 있으므로 꼭 와 주세요.

    좋은 웹페이지 즐겨찾기