็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿณ ๅฎนๅ™จๅฎ‰ๅ…จ้€ฒ้šŽ:Docker Rootless ๆจกๅผ่ˆ‡้กๅƒๅฎ‰ๅ…จๆŽƒๆๅฏฆๅ‹™

    ๐Ÿณ ๅฎนๅ™จๅฎ‰ๅ…จ้€ฒ้šŽ: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

    ๐Ÿงฉ ๅปบ่ญฐ่ฝๅœฐๆต็จ‹(ไฝ ๅฏไปฅ็›ดๆŽฅ็…ง้€™ๅฅ—่ท‘)

    1. ้–‹็™ผ/ๆธฌ่ฉฆไธปๆฉŸ:Rootless Docker(ๅ…ˆๆŠŠ daemon ้ขจ้šชๅฃ“ไฝŽ)
    2. Build:ๅคš้šŽๆฎตๅปบ็ฝฎ + ๆœ€ๅฐๅŒ– base image(ๅ…ˆๆธ›ๅฐ‘ๅฅ—ไปถๆ•ธ)
    3. Scan(ๆœฌๆฉŸ):Trivy ๅ…ˆ้Žไธ€่ผช(HIGH/CRITICAL + ignore-unfixed)
    4. Scan(CI):Trivy ๆŽ›้–˜ + Docker Scout ่ผธๅ‡บๅ ฑๅ‘Š(SARIF/Markdown)
    5. Remediate:ๅ„ชๅ…ˆ่™•็†「ๅฏไฟฎ่ฃœ(fixable)」่ˆ‡「ไฝ ็œŸ็š„ๆœ‰็”จๅˆฐ็š„ๅฅ—ไปถ」
    6. 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 ้—œ้ตๆฎต่ฝ,ๆˆ‘ๅฏไปฅ็›ดๆŽฅๅนซไฝ ๅˆคๆ–ท่ฉฒๆ€Ž้บผ่ชฟ。


    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš