Bagaimana saya bisa menggunakan buruh pelabuhan tanpa sudo?

767

Pada halaman dokumentasi Docker, semua perintah contoh ditampilkan tanpa sudo, seperti ini:

docker ps

Di Ubuntu, biner disebut docker.io. Itu juga tidak bekerja tanpa sudo:

sudo docker.io ps

Bagaimana saya bisa mengkonfigurasi Docker sehingga saya tidak perlu awalan setiap perintah Docker dengan sudo?

Flimm
sumber
1
Jangan lupa untuk mengaktifkan ufw;)
Rinzwind
2
Di Ubuntu 14.04 ada juga 'buruh pelabuhan' biner.
anatoly techtonik
@anatolytechtonik Saya juga menggunakan 'buruh pelabuhan' alih-alih 'buruh pelabuhan.io' di Ubuntu 14.04 LTS
Nabin
2
Instalasi yang disarankan bukan docker dalam repo ubuntu default; sebagai gantinya, instruksi di sini ( docs.docker.com/engine/installation/linux/ubuntulinux ), merekomendasikan menggunakan repo buruh pelabuhan. Hapus semua barang buruh pelabuhan yang ada, dan pastikan Anda mendapatkannya dari sumber yang tepat: apt-cache policy docker-engine(apt url seharusnya dari dockerproject.org)
michael
2
Bagaimana dengan alias :? Dengan begitu, Anda masih menggunakan sudo, dengan perlindungan kata sandi. alias docker = "sudo docker"
Andrej Panjkov

Jawaban:

1136

Berita bagus: buruh pelabuhan baru (versi 19.03 (saat ini sedang dalam percobaan)) akan dapat menjalankan rootless meniadakan masalah yang dapat terjadi menggunakan pengguna root. Tidak perlu lagi mengacaukan izin, root, dan apa pun yang mungkin membuka mesin Anda ketika Anda tidak menginginkannya.

Video tentang ini dari [DockerCon 2019] Hardening Docker daemon dengan mode Rootless

Beberapa Peringatan terhadap mode Docker tak menentu

Insinyur Docker mengatakan mode tidak menentu tidak dapat dianggap sebagai pengganti rangkaian lengkap fitur engine Docker. Beberapa batasan untuk mode tidak menentu meliputi:

  • kontrol sumber daya cgroups, profil keamanan apparmor, pos pemeriksaan / pengembalian, jaringan overlay dll. tidak berfungsi pada mode tidak menentu.
  • Mengekspos port dari kontainer saat ini membutuhkan proses bantuan socat manual.
  • Hanya distro berbasis Ubuntu yang mendukung overlay sistem file dalam mode tanpa akar.
  • Mode tanpa akar saat ini hanya disediakan untuk bangunan malam yang mungkin tidak stabil seperti biasanya.

Pada docker 19.3 ini sudah usang (dan lebih berbahaya dari yang seharusnya):

The pengguna buruh pelabuhan telah mengatakan tentang hal itu:

Memberikan akses non-root

Daemon docker selalu berjalan sebagai pengguna root, dan karena Docker versi 0.5.2, daemon docker mengikat ke soket Unix alih-alih port TCP. Secara default, soket Unix dimiliki oleh root pengguna, jadi, secara default, Anda dapat mengaksesnya dengan sudo.

Mulai dalam versi 0.5.3, jika Anda (atau pemasang Docker Anda) membuat grup Unix yang disebut buruh pelabuhan dan menambahkan pengguna ke dalamnya, maka daemon buruh pelabuhan akan membuat kepemilikan soket Unix dibaca / dapat ditulis oleh grup buruh pelabuhan ketika daemon dimulai . Daemon buruh pelabuhan harus selalu dijalankan sebagai pengguna root, tetapi jika Anda menjalankan klien buruh pelabuhan sebagai pengguna dalam grup buruh pelabuhan maka Anda tidak perlu menambahkan sudo ke semua perintah klien. Pada 0.9.0, Anda dapat menentukan bahwa grup selain buruh pelabuhan harus memiliki soket Unix dengan opsi -G.

Peringatan: Grup buruh pelabuhan (atau grup yang ditentukan dengan -G) setara dengan root; lihat detail Docker Daemon Attack Surface dan blogpost ini tentang Mengapa kami tidak membiarkan pengguna non-root menjalankan Docker di CentOS, Fedora, atau RHEL (terima kasih michael-n).

Dalam rilis terbaru dari mode tak menentu eksperimental di GitHub , insinyur menyebutkan mode tak menentu memungkinkan menjalankan dockerd sebagai pengguna yang tidak terjangkau, menggunakan user_namespaces (7), mount_namespaces (7), network_namespaces (7).

Pengguna perlu menjalankan dockerd-rootless.sh alih-alih dockerd.

$ dockerd-rootless.sh --experimental

Karena mode Rootless bersifat eksperimental, pengguna harus selalu menjalankan dockerd-rootless.sh dengan –experimental.


Penting untuk dibaca: langkah-langkah pasca-instalasi untuk Linux (ini juga menghubungkan ke rincian Docker Daemon Attack Surface ).

Kelola Docker sebagai pengguna non-root

Daemon docker mengikat ke soket Unix, bukan port TCP. Secara default, soket Unix dimiliki oleh root pengguna dan pengguna lain hanya dapat mengaksesnya menggunakan sudo. Daemon buruh pelabuhan selalu berjalan sebagai pengguna root.

Jika Anda tidak ingin menggunakan sudo ketika Anda menggunakan perintah buruh pelabuhan, buat grup Unix yang disebut buruh pelabuhan dan tambahkan pengguna ke dalamnya. Ketika daemon docker dimulai, itu membuat kepemilikan soket Unix terbaca / dapat ditulis oleh grup buruh pelabuhan.


  • Tambahkan grup buruh pelabuhan jika belum ada:

    sudo groupadd docker
    
  • Tambahkan pengguna yang terhubung "$ USER" ke grup buruh pelabuhan. Ubah nama pengguna agar cocok dengan pengguna pilihan Anda jika Anda tidak ingin menggunakan pengguna Anda saat ini:

    sudo gpasswd -a $USER docker
    
  • Entah lakukan newgrp dockeratau keluar / masuk untuk mengaktifkan perubahan ke grup.

  • Anda dapat gunakan

    docker run hello-world
    

    untuk memeriksa apakah Anda dapat menjalankan buruh pelabuhan tanpa sudo.

Rinzwind
sumber
3
Ya, tetapi setiap proses istimewa membuka potensi untuk dieksploitasi. Apakah docker mengaitkan itu jauh ke dalam sistem operasi untuk benar-benar mengamanatkan tingkat keistimewaan itu?
matt
3
newgrp dockertidak bekerja untuk saya, saya harus keluar.
lolmaus - Andrey Mikhaylov
43
Perlu ditunjukkan bahwa ini memberi pengguna akses root yang tidak dibatasi dan tidak dilindungi kata sandi . Lihat detail kerentanan di sini
Chris Foster
2
Anda TIDAK perlu me-restart daemon buruh pelabuhan agar perubahan ini terjadi !! cukup minta pengguna yang baru saja Anda tambahkan logout lalu kembali
Tommy
4
Jika Anda menggunakan docker login, Anda mungkin menemukan bahwa .dockerfolder yang dibuat di folder rumah Anda, milik root. dengan demikian Anda akan menemukan peringatan ini ketika menjalankan perintah buruh pelabuhan: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Saya membuat saya pengguna .dockerfolder diakses tanpa sudo seperti: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. yang chgrptampaknya tidak membantu meskipun, jadi mungkin saya hanya harus merekomendasikan langkah chown.
Birchlabs
202

Untuk menjalankan perintah buruh pelabuhan tanpa sudo, Anda perlu menambahkan pengguna Anda (yang memiliki hak akses root) ke grup buruh pelabuhan. Untuk ini jalankan perintah berikut:

 sudo usermod -aG docker $USER

Sekarang, minta pengguna logout lalu login lagi. Solusi ini dijelaskan dengan baik di sini dengan proses instalasi yang tepat.

Rohini Choudhary
sumber
14
setelah menambahkan pengguna ke grup, jalankan perintah ini: sg group_name -c "bash"
madjardi
4
Anda tidak perlu memulai ulang OS untuk perubahan ini terjadi! Itu akan mengebom semua kontainer berjalan! Biarkan saja pengguna yang baru saja Anda tambahkan logout.
Tommy
5
Bagaimana perintah itu berbeda dengan "sudo gpasswd -a $ {USER} docker" di jawaban lain? Jika sama sekali ...
Ashley Aitken
9
Bisakah Anda menambahkan peringatan yang diberikan oleh dokumen: "Kelompok buruh pelabuhan [...] setara dengan root", sehingga orang memiliki kesempatan untuk memikirkannya
Murmel
2
Efek yang sama dengan jawaban 2 tahun yang lebih tua diterima, tetapi tanpa peringatan tentang risiko keamanan
Gert van den Berg
57

Mekanisme di mana menambahkan pengguna ke grup dockermemberikan izin untuk menjalankan buruh pelabuhan adalah untuk mendapatkan akses ke soket buruh pelabuhan di /var/run/docker.sock. Jika sistem file yang berisi /var/runtelah dipasang dengan ACL diaktifkan, ini juga dapat dicapai melalui ACL.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Saya hanya menyertakan ini untuk kelengkapan.

Secara umum, saya merekomendasikan untuk menghindari ACL setiap kali alternatif yang baik berdasarkan kelompok tersedia: Lebih baik jika hak istimewa dalam suatu sistem dapat dipahami dengan melihat keanggotaan grup saja. Harus memindai sistem file untuk entri ACL untuk memahami hak istimewa sistem adalah beban tambahan untuk audit keamanan.

Peringatan 1 : Ini memiliki rootkesetaraan yang sama dengan menambahkan usernameke dockergrup. Anda masih dapat memulai sebuah wadah dengan cara yang memiliki rootakses ke sistem file host.

Peringatan 2 : ACL secara signifikan lebih sulit untuk audit keamanan daripada keamanan berbasis grup. Mungkin hindari ACL jika memungkinkan saat Anda dapat menggunakan grup sebagai gantinya, setidaknya di lingkungan yang relevan dengan audit.

Christian Hujer
sumber
5
Ini bekerja pada 16,04
edib
Inilah yang saya butuhkan, jawaban lain, mengharuskan pengguna untuk memiliki izin root. Terima kasih banyak!
Mrinal Saurabh
1
Cara yang jauh lebih baik. Docker grup setara dengan root dan itu selalu merupakan tanda bahaya. Dan saya tidak melihat adanya kerugian untuk mengambil kepemilikan dari file yang satu ini.
Xerus
5
@ Xerus jika saya mengerti dengan benar, siapa pun yang dapat menulis ke soket ini bisa mendapatkan hak istimewa yang setara dengan root juga . Jadi memberi seseorang akses ke soket ini melalui ACL memiliki efek keamanan yang sama dengan menambahkan orang itu ke grup buruh pelabuhan.
Paŭlo Ebermann
1
Bekerja di Linux Mint 19 untuk saya. Terima kasih.
Kami adalah Borg