Peta dunia

 

EN: Read in English

Dunia D5: Hantar & Lindung

Container dengan hak paling sedikit

Anda akan belajar: jalankan container bukan sebagai root, dengan sistem fail baca sahaja dan tanpa kuasa lebih.

Teks BM belum disemak oleh penutur asli.

Disemak dengan Docker Engine 29 pada 31 Okt 2026

Masalahnya

Dalam container alpine biasa, id cetak uid=0(root). Transkrip Docker: $ docker run --rm alpine:3.22 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)

Laptop anda~/kedai-api

  • Tiada tingkap terbuka

Bekas (container)

  • Belum ada container

Pek beku (image)

  • alpine:3.221 layer · 12.9MB
  • kedai-api:1.06 layer · 244MB
  • node:24-alpine4 layer · 244MB

0 container (0 berjalan), 3 image, 0 loker.

Dalam bekas makanan itu, aplikasi anda jalan sebagai root: ketua cef, pegang semua kunci. Kalau ada orang menceroboh, dia pun pegang semua kunci.

Tengok

least privilege: Beri setiap pekerja kunci untuk stesennya sahaja. Tiada lebih. (hak paling sedikit) bermaksud bekas cuma dapat kunci yang ia perlu. Docker ada tiga perisai. Padankan setiap satu dengan kerjanya.

Seret kad ke dalam kotak. Atau ketik kad, kemudian ketik kotak.

        Tengok

        Dengan --read-only, touch gagal: Read-only file system. Dengan --cap-drop ALL, chown gagal: Operation not permitted. Transkrip Docker: $ docker run --rm --read-only alpine:3.22 touch /hello touch: /hello: Read-only file system $ docker run --rm --cap-drop ALL alpine:3.22 chown nobody /tmp chown: /tmp: Operation not permitted

        Laptop anda~/kedai-api

        • Tiada tingkap terbuka

        Bekas (container)

        • Belum ada container

        Pek beku (image)

        • alpine:3.221 layer · 12.9MB
        • kedai-api:1.06 layer · 244MB
        • node:24-alpine4 layer · 244MB

        0 container (0 berjalan), 3 image, 0 loker.

        Ralat sebenar, maksud mudah. Read-only file system: penutupnya dimeterai. Operation not permitted: pisau itu, satu capability: Satu kuasa khas root, contohnya tukar pemilik fail. Buang yang aplikasi anda tak guna. (kuasa khas), sudah disimpan.

        Cuba

        Jalankan API dengan ketiga-tiga perisai. Image-nya sudah ada USER node. Tambah dua lagi.

        Laptop anda~/kedai-api

        • Tiada tingkap terbuka

        Bekas (container)

        • Belum ada container

        Pek beku (image)

        • alpine:3.221 layer · 12.9MB
        • kedai-api:1.06 layer · 244MB
        • node:24-alpine4 layer · 244MB

        0 container (0 berjalan), 3 image, 0 loker.

        Teka

        nginx mula sebagai root dan tulis fail cache dulu. Anda jalankannya dengan --read-only. Apa jadi?

        Pilih satu jawapan.

        Semak

        bash
        docker run --rm --read-only nginx:1.30-alpine
        …
        nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (30: Read-only file system)
        docker run -d --name web --read-only --tmpfs /var/cache/nginx --tmpfs /run nginx:1.30-alpine
        …
        docker ps --filter name=web --format '{{.Status}}'
        Up 2 seconds
        nginx dengan --read-only berhenti: mkdir /var/cache/nginx/client_temp gagal, Read-only file system. Dengan dua folder tmpfs ia jalan: Up 2 seconds.

        Pembaikannya: dua folder sementara yang kecil dalam memori, dengan --tmpfs. Yang lain kekal dimeterai.

        Anda berjaya!

        Kini anda boleh kunci container: bukan root, baca sahaja, tanpa kuasa lebih.

        Nak tahu lebih (pilihan)

        Secara lalai Docker kekalkan 14 capability, contohnya CHOWN dan NET_BIND_SERVICE. Tambah semula yang perlu sahaja: --cap-add CHOWN. --security-opt no-new-privileges halang program dapat kuasa lebih. Jangan guna --privileged, dan jangan mount soket Docker: kedua-duanya serahkan seluruh host. Compose ada user, read_only dan cap_drop.

        Latihan sebenar (pilihan), di komputer anda:

        Misi sebenar

        1. docker run --rm alpine:3.22 id
        2. docker run --rm --user 1000 --read-only --cap-drop ALL alpine:3.22 id

        0 daripada 3 langkah siap · Tanda anda disimpan.