この記事では、独自のDockerfileを作成するための安全でないオプションと、シークレットの操作や静的分析ツールの組み込みなどのベストプラクティスについて説明します。ただし、安全なDockerfileを作成するためのベストプラクティスドキュメントを用意するだけでは不十分です。まず、コーディングの文化を整理する必要があります。これには、たとえば、サードパーティコンポーネントを使用するプロセスの形式化と制御、独自のソフトウェア請求書(SBOM)の編成、独自のベースイメージを作成するための原則の構築、安全な機能の一貫した使用などが含まれます。この場合、BSIMM成熟度評価モデルは、プロセスを整理するための開始点として役立ちます。ただし、この記事では技術的な側面に焦点を当てます。
Dockerfile
LABEL latest
latest
, , . , . :
FROM redis@sha256:3479bbcab384fa343b52743b933661335448f816
LABEL version 1.0
LABEL description "Test image for labels"
LABEL, , . LABEL securitytxt
.
LABEL securitytxt="https://www.example.com/.well-known/security.txt"
apt-get upgrade
, yum update
, , . , , . , . Software Composition Analysis (SCA).
:
RUN apt-get install cowsay=3.03+dfsg1-6
cowsay=3.03+dfsg1-6
libcowsay
, .
curl wget ( "-", ). Zero trust, ( ). , , :
RUN wget http://somesite.com/some-packet/install.sh | sh
, , , GNU Privacy Guard (GPG). , .
-, . - GPG, . , Node.js:
RUN gpg --keyserver pool.sks-keyservers.net \
--recv-keys 7937DFD2AB06298B2293C3187D33FF9D0246406D \
114F43EE0176B71C7BC219DD50A3051F888C628D
ENV NODE_VERSION 0.10.38
ENV NPM_VERSION 2.10.0
RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v \
$NODE_VERSION-linux-x64.tar.gz" \
&& curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/\SHASUMS256.txt.asc" \
&& gpg --verify SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.gz$" SHASUMS256.txt.asc | sha256sum -c -
, :
GPG-
Node.js
- Node.js SHA256
GPG- , - ,
, - sha256sum
, , . , , .
deb rpm. GPG, - .
GPG- .
RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 \
--recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
RUN echo "deb http://nginx.org/packages/mainline/debian/\
jessie nginx" >> /etc/apt/sources.list
, , .
SHA256:
RUN curl -sSL -o redis.tar.gz \
http://download.redis.io/releases/redis-3.0.1.tar.gz \
&& echo "0e21be5d7c5e6ab6adcbed257619897db59be9e1ded7ef6fd1582d0cdb5e5bb7 \
*redis.tar.gz" | sha256sum -c -
ADD
ADD
, , . , , zip- . zip- (DoS) , .
ADD
, URL , , "-":
ADD https://cloudberry.engineering/absolutely-trust-me.tar.gz
COPY
, , SCA .
USER Dockerfile
, shell , root', . , USER
. , root .
RUN groupadd -r user_grp &&
useradd -r -g user_grp user
USER user
gosu sudo
gosu , root Dockerfile , .
chown
entrypoint-, root, - redis.
#!/bin/bash
set -e
if [ "$1" = 'redis-server' ];
then
chown -R redis .
exec gosu redis "$@"
fi
exec "$@"
- , sudo su, gosu fork , :
$ docker run -it --rm ubuntu:trusty su -c 'exec ps aux'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 46636 2688 ? Ss+ 02:22 0:00 su -c exec ps a
root 6 0.0 0.0 15576 2220 ? Rs 02:22 0:00 ps aux
$ docker run -it --rm ubuntu:trusty sudo ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 3.0 0.0 46020 3144 ? Ss+ 02:22 0:00 sudo ps aux
root 7 0.0 0.0 15576 2172 ? R+ 02:22 0:00 ps aux
$ docker run -it --rm -v $PWD/gosu-amd64:/usr/local/bin/gosu:ro ubuntu:trusty gosu root ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 7140 768 ? Rs+ 02:22 0:00 ps aux
, . , gosu sudo, fork' Linux PAM pam_open_session()
pam_close_session()
. gosu sudo .
Distroless images
Linux- (Ubuntu, Debian, Alpine) Disroless-. , (, bash). , , . "" Trivy, Clair .
, , . , , UNIX- Alpine. , , , .
:
The Quest for Minimal Docker Images, part 1
The Quest for Minimal Docker Images, part 2
The Quest for Minimal Docker Images, part 3
, multi-stage , . .
Docker-slim, .
ENV
. wget. , . , , API Docker:
# docker inspect ubuntu -f {{json .Config.Env}}
["SECRET=mypassword", ...]
, /proc
. Vault, , HashiCorp Vault Conjur, .
(multi-stage) , . - , . .
#builder
FROM ubuntu as intermediate
WORKDIR /app
COPY secret/key /tmp/
RUN scp -i /tmp/key build@acme/files .
#runner
FROM ubuntu
WORKDIR /app
COPY --from=intermediate /app .
- , .
BuildKit
Docker 18.09 BuildKit, , .
:
# syntax = docker/dockerfile:1.0-experimental
FROM alpine
# shows secret from default secret location
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecre
# shows secret from custom secret location
RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar
buildkit --secret
.
:
$ docker build --no-cache --progress=plain --secret id=mysecret,src=mysecret.txt .
, , . , .dockerignore
. .git
, .aws
, .env
.
COPY . .
- Twitter Vine. 2016 DockerHub vinewww, Vine, API .
Dockerfile
Dockerfile, . :
Hadolint - Dockerfile. security Docker (). .
Conftest - , Dockerfile. Dockerfile Rego, , , Open Policy Agent . , . Conftest , , . .
. :
Dockerfile Pentest-in-Docker. . - debian:wheazy
, Debian, Bash, (RCE). www-data, reverse-shell. - sudo, www-data root . USER
Dockerfile - - root , API Docker.
-
-
-
Docker Security Best Practices from the Dockerfile
10 Docker Security Best Practices
Docker Security. Using Containers Safely in Production
-
-