GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cirrus CLI menggunakan Podman untuk mencapai build tanpa root

Apa itu Cirrus CLI? Deskripsi berikut diambil dari deskripsi halaman GitHub Cirrus CLI:

Cirrus CLI adalah alat untuk menjalankan tugas kemas secara reproduktif di lingkungan apa pun. Paling umum, tugas Cirrus digunakan sebagai bagian dari alur kerja integrasi berkelanjutan tetapi juga dapat digunakan sebagai bagian dari proses pengembangan lokal sebagai pengganti hermetis skrip pembantu/Makefiles. Cirrus CLI menjalankan tugas Anda secara lokal dengan cara yang sama seperti yang dijalankan di CI atau di mesin rekan Anda. Kontainer yang tidak berubah memastikan tugas akan dieksekusi dengan cara yang sama bertahun-tahun dari sekarang terlepas dari versi paket apa yang akan Anda miliki secara lokal.

Cirrus CLI mendukung Docker sejak awal, tetapi memerlukan daemon container yang berjalan sebagai root dan menyediakan akses ke pengguna yang kurang memiliki hak istimewa terkadang bukanlah pilihan:Misalnya, saat membangun di mesin bersama, mengisolasi container bersarang, atau sekadar menjadi keamanan -sadar tentang apa yang berjalan di desktop Anda.

Dan meskipun Docker memperkenalkan mode rootless sekitar setahun yang lalu, pengalaman penggunanya saat ini kurang menurut kami, sebagian besar karena kemasan yang hilang dan riwayat Docker menjadi daemon. Podman, di sisi lain, dimulai sebagai mesin kontainer tanpa daemon, dan proses instalasinya mencakup hampir semua distro.

Selain itu, ketika menyelidiki Podman sebagai opsi tambahan untuk menjalankan tugas Cirrus, kami menyadari bahwa ini adalah langkah kecil untuk mengganggu monokultur perangkat lunak karena, pada akhirnya, kualitas perangkat lunaknya meningkat. Standar baru dan blok bangunan seperti proyek Rootless Containers muncul yang membuka jalan bagi masa depan perangkat lunak.

Kontainer tanpa root didukung oleh... ruang nama?

Ruang nama Linux adalah landasan terpenting dari apa yang membuat container bekerja di Linux. Mereka sangat khusus untuk Linux, sampai-sampai VM Linux yang terpisah diputar saat Anda menjalankan container di Windows dan macOS.

Ruang nama memungkinkan pemisahan sumber daya granular. Misalnya, jika suatu proses dilampirkan ke ruang nama PID tertentu, proses tersebut hanya melihat proses lain yang dilampirkan ke ruang nama yang sama. Atau jika sistem file FUSE dipasang ke root (/ ) saat berada di namespace mount yang terpisah, host tidak akan tiba-tiba mogok karena binari yang hilang.

Salah satu ruang nama tersulit adalah ruang nama pengguna. Ruang nama pengguna pada dasarnya memungkinkan seseorang untuk menjadi root di dalam ruang nama itu, tetapi muncul sebagai pengguna normal dari luar. Karena sebagian besar gambar container diharapkan berjalan sebagai root untuk operasi tertentu, mengimplementasikan ruang nama pengguna sangat penting untuk container tanpa root.

Mari kita lihat apa yang terjadi ketika banyak pengguna meluncurkan perintah build mereka menggunakan Docker tanpa ruang nama pengguna diaktifkan:

Saat mengamati ID proses ini dari host penampung, semua pekerjaan berjalan di bawah root, meskipun dimulai oleh pengguna yang berbeda. Hal yang sama berlaku untuk containerd . Dan meskipun Anda sebenarnya bisa melewatinya --userns-remap bendera, wadah akan tetap berjalan sebagai root dan akan menjadi satu titik kegagalan.

Hal-hal berjalan seperti itu dalam mode default karena mengimplementasikan container tanpa root bukanlah hal yang sepele.

Ruang nama pengguna itu sendiri mungkin merupakan salah satu konfigurasi paling kompleks untuk diterapkan dan menghasilkan banyak bug terkait keamanan. Beberapa distribusi seperti Debian bahkan memilih untuk menonaktifkannya secara default beberapa waktu lalu.

[ Jika Anda melewatkannya: Prinsip keamanan dasar untuk container dan runtime container ]

Bagaimana Podman mengatasi kesulitan eksekusi tanpa akar

Memulai container tanpa hak akses root melibatkan beberapa kompromi dan solusi.

Misalnya, sebagai pengguna, saat Anda membuat ruang nama jaringan (yang seharusnya disertakan dengan ruang nama pengguna), Anda hanya mendapatkan lo antarmuka. Biasanya, mesin kontainer juga membuat veth memasangkan perangkat dan memindahkan salah satu ujungnya kembali ke host untuk menghubungkannya ke antarmuka jaringan atau jembatan nyata (untuk komunikasi antar-kontainer).

Namun, menghubungkan antarmuka di host mengharuskan Anda menjadi root di namespace host, jadi itu tidak mungkin. Podman mengatasinya dengan menggunakan slirp4netns, sebuah network stack yang merutekan paket-paket antara container dan monitor itu sendiri, daripada menggunakan fasilitas Kernel. Dengan demikian, tidak memerlukan hak pengguna super.

Karena kerumitan yang terlibat dengan ruang nama pengguna, Anda juga tidak dapat menggunakan sistem file tertentu yang biasanya tersedia untuk root host. Salah satu sistem file tersebut adalah OverlayFS, yang sangat membantu dengan menghilangkan duplikasi lapisan gambar kontainer dan meningkatkan pengalaman kontainer. Namun, seseorang masih dapat menggunakan FUSE. Tim Podman menerapkan fuse-overlayfs , yang digunakan jika diinstal, kembali ke mengekstrak konten gambar ke dalam direktori dengan mengorbankan kinerja.

Sekarang, jika kita menjalankan pekerjaan yang sama dengan yang kita jalankan sebelumnya, tetapi dengan Podman, hasilnya akan terlihat seperti ini:

Perhatikan bahwa tidak ada yang berjalan sebagai root sekarang, dan tidak ada satu titik kegagalan pun jika mesin kontainer mogok karena suatu alasan.

Mengintegrasikan dengan Podman

Saat Anda memulai build baru dengan cirrus run , ini memunculkan proses Podman di bawah kap dan berbicara dengannya melalui REST API, yang baru-baru ini diperkenalkan sebagai penerus Varlink API lama.

API itu sendiri sangat mirip dengan Docker Engine API, yang memungkinkan abstraksi bersih untuk kedua API dalam basis kode yang sama.

Sebenarnya, titik akhir Podman yang sama menawarkan lapisan kompatibilitas Docker Engine API, tetapi masih dalam proses pada saat penulisan.

Mengaktifkan Podman di CLI

Jika Anda belum menginstal Podman, ikuti instruksi untuk distribusi Linux Anda dan kemudian baca tutorial rootless.

CLI mendukung Podman versi 0.17.0 dan yang lebih baru. Anda dapat mengaktifkannya dengan meneruskan --container-backend=podman bendera:

cirrus run --container-backend=podman Lint

Perhatikan bahwa jika Anda tidak menginstal Docker di sistem Anda, Anda bahkan tidak perlu menentukan apa pun—semuanya bekerja secara otomatis.

[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]

Menutup

Build tanpa root adalah komponen penting dari penerapan container. Cirrus CLI bekerja dengan Podman untuk menyediakan fungsionalitas ini. Gunakan dua utilitas ini untuk mengelola dan mengamankan lingkungan container Anda dengan lebih baik.


Linux
  1. Mengapa Podman rootless tidak dapat menarik gambar saya?

  2. Apa yang terjadi di balik layar wadah Podman tanpa akar?

  3. Cara men-debug masalah dengan volume yang dipasang pada wadah tanpa akar

  1. Mengontrol akses ke Podman tanpa root untuk pengguna

  2. Cara menggunakan Podman di dalam Kubernetes

  3. Cara menggunakan Podman di dalam wadah

  1. Bagaimana GNOME menggunakan Git

  2. Cara Mengubah Nama Pengguna di Linux

  3. Bagaimana cara menambahkan pengguna ke wadah Docker?