はじめに
Docker Hardened Images(DHI)が無料化されました。
Docker Hardened Imagesの特徴
1. シームレスな移行
DebianやAlpineなど、開発者が慣れ親しんだディストリビューションをベースにしている。
DockerfileのFROM行を1行変更するだけで移行可能。
2. 柔軟なカスタマイズ
高いセキュリティを持つが、カスタマイズ性は損ねていない。
3. 自動パッチ適用と迅速なCVE対応
DockerがCVEを常時監視、24時間以内に脆弱性が修正される。(ヤバい)
詳細は以下参照
利用方法
DHIイメージはdockerhubで公開されています。
使ってみる
以下のHardened ImagesのAlpine Baseを使ってみます。
事前準備
ログイン&イメージプル
$ docker login dhi.io
Username: XXX
Password:
WARNING! Your credentials are stored unencrypted in '/home/XXX/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
Login Succeeded
$
$ docker pull dhi.io/alpine-base:3.22
3.22: Pulling from alpine-base
c9d0b1ade7b4: Pull complete
72b3995fb331: Pull complete
fbf89d45e634: Pull complete
fb10bbbfa924: Pull complete
Digest: sha256:8a31a6edf68c75a4a5c7b1491f97b9dd53d7313db1d116065e2776eb6a703751
Status: Downloaded newer image for dhi.io/alpine-base:3.22
dhi.io/alpine-base:3.22
$
比較のためalpineも用意してみます。
$ docker login -u XXX
i Info → A Personal Access Token (PAT) can be used instead.
To create a PAT, visit https://app.docker.com/settings
Password:
WARNING! Your credentials are stored unencrypted in '/home/XXX/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
Login Succeeded
$
$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
1074353eec0d: Pull complete
Digest: sha256:865b95f46d98cf867a156fe4a135ad3fe50d2056aa3f25ed31662dff6da4eb62
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
alpine linux VS [Docker Hardened Images] Alpine Base
イメージサイズ
イメージサイズを比較してみます。
$ docker image ls | grep alpine
alpine latest e7b39c54cdec 8 days ago 8.44MB
dhi.io/alpine-base 3.22 7c6862b0dfc7 4 weeks ago 1.74MB
サイズはDHIが圧倒的に小さいようです。
セキュリティ対策のため、最小限の構成をうたっているだけのことはあります。
8.44MB
1.74MB
ユーザ
alpine linux
/ # cat /etc/passwd
root:x:0:0:root:/root:/bin/sh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
/ #
/ # id
uid=0(root) gid=0(root) groups=0(root),0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
/ #
[Docker Hardened Images] Alpine Base
/ $ cat /etc/passwd
nonroot:x:65532:65532:nonroot:/home/nonroot:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
/ $
/ $ id
uid=65532(nonroot) gid=65532(nonroot) groups=65532(nonroot),65532(nonroot)
/ $
まさかの2ユーザでした。
ディレクトリ
alpine linux
/ # ls /
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
/ #
[Docker Hardened Images] Alpine Base
/ $ ls /
bin dev etc home lib opt proc run sbin sys tmp usr var
/ $
mount,mnt,rootディレクトリがなくなっているようです。
/binディレクトリ
alpine linux
/ # ls /bin
arch dmesg hostname makemime pipe_progress stat
ash dnsdomainname ionice mkdir printenv stty
base64 dumpkmap iostat mknod ps su
bbconfig echo ipcalc mktemp pwd sync
busybox egrep kbd_mode more reformime tar
cat false kill mount rev touch
chattr fatattr link mountpoint rm true
chgrp fdflush linux32 mpstat rmdir umount
chmod fgrep linux64 mv run-parts uname
chown fsync ln netstat sed usleep
cp getopt login nice setpriv watch
date grep ls pidof setserial zcat
dd gunzip lsattr ping sh
df gzip lzop ping6 sleep
/ #
[Docker Hardened Images] Alpine Base
/ $ ls /bin
arch dmesg hostname makemime pipe_progress stat
ash dnsdomainname ionice mkdir printenv stty
base64 dumpkmap iostat mknod ps su
bbconfig echo ipcalc mktemp pwd sync
busybox egrep kbd_mode more reformime tar
cat false kill mount rev touch
chattr fatattr link mountpoint rm true
chgrp fdflush linux32 mpstat rmdir umount
chmod fgrep linux64 mv run-parts uname
chown fsync ln netstat sed usleep
cp getopt login nice setpriv watch
date grep ls pidof setserial zcat
dd gunzip lsattr ping sh
df gzip lzop ping6 sleep
/ $
/bin差異なしでした。
デメリット
更新が頻繁なため、意図せずシステムが動かなくなる可能性がある。
「とりあえず動いていればOK」なシステムを止めてしまう可能性がある。
まとめ
無料、高いセキュリティ、軽量という理由から、幅広いシーンで使えるイメージだと思います。