๐ณ ๅฎนๅจๅฎๅ จ้ฒ้:Docker Rootless ๆจกๅผ่้กๅๅฎๅ จๆๆๅฏฆๅ
ๅฎนๅจๅฎๅ จๅธธ่ฆ็็ ดๅฃ,ๅพๅพไธๆฏ「ๅฎนๅจ่ฃก่ทไบไป้บผ」,่ๆฏ「Daemon ่ไธปๆฉๆฌ้」ๆฌ่บซ่ขซๆพๅคงไบ。 ้็ฏ็จๅ ฉๆขไธป็ทๆ้ขจ้ช้ไธไพ:็ฌฌไธๆขๆฏ Docker Rootless(่ฎ daemon ่ๅฎนๅจไปฅ้ root ่บซๅ้่ก),็ฌฌไบๆขๆฏ ้กๅๅฎๅ จๆๆ(ๅจไธ็ทๅๆ CVE ่ๅฏไฟฎ่ฃ้ ็ฎๅ ๆชๅบไพ)。
๐ ็ฎๆจ่้ฉ็จๅ ดๆฏ
- ้ไฝ Docker daemon ่ขซๆปๆๅพ็ไธปๆฉๆฌ้้ขจ้ช(Rootless)
- ๅปบ็ซๅฏ่ฝๅฐ็้กๅๆๆๆต็จ:ๆฌๆฉๆๆ、CI ๆ้、่ผธๅบๅ ฑๅ(Trivy / Docker Scout)
- ้ฉๅ:ๅคไฝฟ็จ่ ไธปๆฉ、ๅฏฆ้ฉ็ฐๅข、้่ฆ็ธฎๅฐ blast radius ็้จ็ฝฒ
- ไธ้ฉๅ:ไฝ ๆ็ขบ้่ฆๅคง้็นๆฌ่ฝๅ(ไพๅฆ้ๅธธไพ่ณด privileged、ๅบๅฑค็ถฒ่ทฏ/ๅฒๅญ้ฉ ๅๅผท่ฆๅ)
๐ง Rootless Docker ๆฏไป้บผ?็บไป้บผๅฎๆๆ?
Rootless ๆจกๅผ็ๆ ธๅฟๅฐฑๆฏ:Docker daemon ่ๅฎนๅจ้ฝๅจ user namespace ๅ งไปฅ้ root ่บซๅๅท่ก, ็จไพ้ไฝ daemon / runtime ๅบ็พๆผๆดๆ,็ดๆฅๆไธปๆฉ root ๆฌ้้ๅบๅป็้ขจ้ช。
✅ Rootless ็ๅฎๅ จๆถ็(ๅๅฏฆ็)
- daemon ไธๅไปฅ root ๆฌ้ๅธธ้ง,ๆปๆ้ข็ธฎๅฐ
- ๆด้ฉๅๅค็งๆถๆๅ ฑ็จไธปๆฉ(้ฟๅ ๆไบบๆๆดๅฐไธปๆฉๆไธๆฐด)
- ๅฏ่「ๅฎนๅจๅ ง้ root ๅท่ก」、「ๆๅฐๅ capability」、「ๅฏ่ฎๆชๆก็ณป็ตฑ」ไธ่ตท็ๅ
๐ Rootless ๅฎ่ฃๅๆชขๆฅ(ๅฟ ่ฆๆขไปถ)
Rootless ไธ้ setuid ่็นๆฌ(้คไบๅฟ
่ฆ็ newuidmap/newgidmap),ๆไปฅไธปๆฉ็ซฏ่ฆๅ
ๆปฟ่ถณ user namespace ็ๆ ๅฐๆขไปถ。
1) ็ขบ่ชๅฟ ่ฆๅทฅๅ ท
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y uidmap
# RHEL/CentOS/Fedora(่ฆ็ผ่ก็ๅฅไปถๅ็จฑๅฏ่ฝไธๅ)
sudo dnf install -y uidmap
2) ็ขบ่ช subuid/subgid ่ณๅฐ 65536
whoami
id -u
# ่ณๅฐ่ฆๆ 65536 ็ญ subordinate id
grep ^$(whoami): /etc/subuid
grep ^$(whoami): /etc/subgid
ๅฆๆๆฒๆ,่ซ่ฃไธ(ไปฅไธ็คบๆ,่ซไพไฝ ็็ฐๅข่ฆๅ็ฏๅ):
# ไพ:็ตฆ็ฎๅไฝฟ็จ่
ไธๆฎต 65536 ็็ฏๅ
# ๅฏฆ้่ตทๅงๅผ่ซ้ฟๅ
่ๅ
ถไปไฝฟ็จ่
่ก็ช
echo "$(whoami):231072:65536" | sudo tee -a /etc/subuid
echo "$(whoami):231072:65536" | sudo tee -a /etc/subgid
๐ Rootless ๅฎ่ฃ่ๅๅ(ๅปบ่ญฐ systemd user ๆจกๅผ)
ๆ ๅข A:ไฝ ๅทฒ็จๅฅไปถๅฎ่ฃ Docker(ๆๅธธ่ฆ)
# ไปฅ「้ root ไฝฟ็จ่
」ๅท่ก
dockerd-rootless-setuptool.sh install
ๆฅ่ไฝ ๆๅพๅฐ้กไผผๆ็คบ:ๅปบ็ซ user systemd ๆๅ、ๅปบ็ซ rootless context、ไปฅๅๅฏ่ฝ้่ฆ่จญๅฎ DOCKER_HOST。
ๅๅ/่จญๅฎ้ๆฉ่ชๅๅๅ
systemctl --user start docker
systemctl --user enable docker
# ่ฎไฝฟ็จ่
ๅจๆช็ปๅ
ฅๆไน่ฝๅๅ user service
sudo loginctl enable-linger $(whoami)
็ขบ่ช็ฎๅ Docker context
docker context ls
docker context use rootless
docker info | head
⚠️ Rootless ๅธธ่ฆ้ๅถ่ๅฐ็ญ(ไฝ ไธๅฎๆ่ธฉๅฐ็)
1) ้่ฆ็ถๅฎ 80/443 ้้ก「<1024」port?
Rootless ้ ่จญ็กๆณ็ดๆฅ็ถๅฎ็นๆฌ port。ๅธธ่ฆๅๆณๆๅ ฉๅ:
ๅๆณ A:็ตฆ rootlesskit ็ถๅฎไฝ port ็่ฝๅ(่ผๅธธ็จ)
sudo setcap cap_net_bind_service=ep $(which rootlesskit)
systemctl --user restart docker
ๅๆณ B:่ชฟๆด็ณป็ตฑๅ ่จฑ้็นๆฌ port ่ตท้ป
# ๅ
่จฑ้ root ็ถๅฎๆๆไฝ port(ๅฝฑ้ฟ้ข่ผๅคง,่ซ่ฉไผฐ)
echo "net.ipv4.ip_unprivileged_port_start=0" | sudo tee /etc/sysctl.d/99-rootless.conf
sudo sysctl --system
2) ็บไป้บผ docker run --memory/--cpus ๆฒๆๆ?
Rootless ็่ณๆบ้ๅถ้ๅธธ้่ฆ cgroup v2 + systemd ๆๅฎๆดๆฏๆด;่ฅไธๆปฟ่ถณๆขไปถ,Rootless ๅฏ่ฝๆๅฟฝ็ฅ้จๅ cgroup ็ธ้ๅๆธ。
ไฝ ๅฏไปฅๅ ๆชขๆฅ:
docker info | egrep -i "Cgroup|Driver"
ๅฆๆไฝ ่ฆๆๆดๅคๆงๅถๅจๅงๆดพ็ตฆ user slice(็คบๆ):
sudo mkdir -p /etc/systemd/system/user@.service.d
cat << 'EOF' | sudo tee /etc/systemd/system/user@.service.d/delegate.conf
[Service]
Delegate=cpu cpuset io memory pids
EOF
sudo systemctl daemon-reload
๐ ้กๅๅฎๅ จๆๆ:Trivy ่ Docker Scout(ๅ ฉๅฅ้ฝๆ็จๅฐ)
็บไป้บผไธๅช็จไธๅฅ?
- Trivy:้ๅบฆๅฟซ、ๅจ CI ๅพๅธธ่ฆ、่ผธๅบๆ ผๅผๅฎๆด(ๅซ SARIF / SPDX / CycloneDX ็ญ)
- Docker Scout:ๅ Docker ็ๆ
ๆดๅๅพๅฅฝ,
quickviewๅฏไปฅๅฟซ้็้ขจ้ช,cvesๅฏ่ผธๅบ SARIF/Markdown ๅ ฑๅ
✅ Trivy:ๆๅธธ็จ็ไธ็จฎๆๆๆนๅผ
1) ็ดๆฅๆๆ้กๅ
trivy image python:3.4-alpine
2) ๅช็ HIGH/CRITICAL(็ธฎๅฐๅช้ณ)
trivy image --severity HIGH,CRITICAL alpine:3.15
3) ๅฟฝ็ฅ「็ฎๅๆฒๆไฟฎ่ฃ็ๆฌ」็้ ็ฎ(ๆดๆฅ่ฟๅฏ่ฝๅฐไฟฎๅพฉๆธ ๅฎ)
trivy image --ignore-unfixed alpine:3.15
CI ๆ้ๅปบ่ญฐ(ๆๅ้ก็ดๆฅ fail)
# ๆๆๅฐๅฎๅ
จๅ้กๅฐฑๅๅณ exit code 1
trivy image --severity HIGH,CRITICAL --exit-code 1 your-image:tag
่ผธๅบๅ ฑๅ(็คบๆ:SARIF ็ตฆ GitHub/GitLab ๅฎๅ จๅ ฑ่กจ)
trivy image --format sarif -o trivy.sarif your-image:tag
✅ Docker Scout:ๅฟซ้็ธฝ่ฆฝ + CVE ๅ ฑๅ
1) quickview:ไธ็ผ็้ขจ้ช่ base image ๅปบ่ญฐ
docker scout quickview golang:1.19.4
# ๆ็ธฎๅฏซ
docker scout qv
2) cves:ๅๅบ CVE(ๅฏๅ severity、ๅฏ่ผธๅบๅ ฑๅ)
docker scout cves alpine
docker scout cves --only-severity critical,high your-image:tag
่ผธๅบ SARIF(ๆนไพฟไธ้ฒ CI ๅฎๅ จๆชข่ฆ)
docker scout cves --format sarif --output scout.sarif.json your-image:tag
่ผธๅบ Markdown(้ฉๅ่ฒผๅฐ MR/PR ่จ่ซ)
docker scout cves --format markdown your-image:tag
๐งฉ ๅปบ่ญฐ่ฝๅฐๆต็จ(ไฝ ๅฏไปฅ็ดๆฅ็ ง้ๅฅ่ท)
- ้็ผ/ๆธฌ่ฉฆไธปๆฉ:Rootless Docker(ๅ ๆ daemon ้ขจ้ชๅฃไฝ)
- Build:ๅค้ๆฎตๅปบ็ฝฎ + ๆๅฐๅ base image(ๅ ๆธๅฐๅฅไปถๆธ)
- Scan(ๆฌๆฉ):Trivy ๅ ้ไธ่ผช(HIGH/CRITICAL + ignore-unfixed)
- Scan(CI):Trivy ๆ้ + Docker Scout ่ผธๅบๅ ฑๅ(SARIF/Markdown)
- Remediate:ๅชๅ ่็「ๅฏไฟฎ่ฃ(fixable)」่「ไฝ ็็ๆ็จๅฐ็ๅฅไปถ」
- Release:ๆจ registry + ่จ้ๆๆ็ตๆ(็ๅญ)
✅ ๅบ่ฒจๅๆชขๆฅๆธ ๅฎ(่ถ ็ฒพ็ฐก็)
- Rootless:daemon/containers ไปฅ้ root ่บซๅ้ไฝ
- ๅฎนๅจๅ ง:้ ่จญ้ root user(ไธ่ฆๅ จ้ฝ่ท root)
- ้กๅ:ๅทฒๆๆ(HIGH/CRITICAL),CI ๆ gate
- ๅ ฑๅ:SARIF / Markdown ๅฏ่ฟฝๆบฏ
- ไฟฎ่ฃ:่ณๅฐๆๅฏไฟฎ่ฃ็ critical/high ๅฃๅฐๅฏๆฅๅ
ไฝ ็ฎๅ็็ฐๅขๆฏ Debian/Ubuntu ้ๆฏ RHEL/CentOS?Rootless ไฝ ้ๅฐๆๅค็ๆฏ「ไฝ port」้ๆฏ「cgroup ้ๅถ」?
ไนๆญก่ฟ่ฒผไธไฝ ็ docker info ้้ตๆฎต่ฝ,ๆๅฏไปฅ็ดๆฅๅนซไฝ ๅคๆท่ฉฒๆ้บผ่ชฟ。
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ