Andrey Kopylov , direktur teknis kami, mencintai, secara aktif menggunakan dan mempromosikan Docker. Dalam artikel baru, ia berbicara tentang cara membuat pengguna di Docker. Benar bekerja dengan mereka, mengapa pengguna tidak dapat dibiarkan dengan hak akses root dan bagaimana menyelesaikan masalah ketidakcocokan pengidentifikasi di Dockerfile.
Semua proses dalam wadah akan berjalan sebagai root, kecuali ditentukan secara khusus. Tampaknya sangat nyaman, karena pengguna ini tidak memiliki batasan. Itulah sebabnya bekerja di bawah root salah dari sudut pandang keamanan. Jika pada komputer lokal tidak ada orang waras yang bekerja dengan hak root, maka banyak yang memulai proses di bawah root dalam wadah.
Selalu ada bug yang memungkinkan malware keluar dari wadah dan sampai ke komputer host. Dengan asumsi yang terburuk, kita harus memastikan bahwa proses dimulai di dalam wadah dari pengguna yang tidak memiliki hak apa pun pada mesin host.
Pembuatan Pengguna
Membuat pengguna di sebuah wadah tidak berbeda dengan membuatnya di distribusi Linux. Namun, untuk gambar dasar yang berbeda, tim dapat bervariasi.
Untuk distribusi berbasis debian di Dockerfile, Anda harus menambahkan:
RUN groupadd --gid 2000 node \ && useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Untuk alpine:
RUN addgroup -g 2000 node \ && adduser -u 2000 -G node -s /bin/sh -D node
Mulai proses dari pengguna
Untuk memulai semua proses selanjutnya dari pengguna dengan UID 2000, jalankan:
USER 2000
Untuk memulai semua proses selanjutnya dari simpul pengguna, jalankan:
USER node
Lebih detail dalam dokumentasi .
Mount volume
Saat memasang volume di dalam wadah, berikan pengguna kemampuan untuk membaca dan / atau menulis file. Untuk ini, UID (GID) dari pengguna dalam wadah dan pengguna di luar wadah yang memiliki hak akses yang sesuai untuk file harus sesuai. Dalam hal ini, nama pengguna tidak masalah.
Seringkali pada komputer Linux, pengguna UID dan GID adalah 1000. Pengidentifikasi ini ditugaskan untuk pengguna komputer pertama.
Mendapatkan pengenal Anda mudah:
id
Anda akan menerima informasi lengkap tentang pengguna Anda.
Ganti 2000 contoh dengan pengenal Anda dan semuanya akan baik-baik saja.
Tetapkan UID dan GID Pengguna
Jika pengguna dibuat sebelumnya, tetapi perlu untuk mengubah pengidentifikasi, maka Anda dapat melakukannya seperti ini:
RUN usermod -u 1000 node \ && groupmod -g 1000 node
Jika Anda menggunakan gambar alpine dasar, Anda harus menginstal paket bayangan:
RUN apk add âno-cache shadow
Melewati ID pengguna di dalam wadah saat membuat gambar
Jika pengidentifikasi Anda dan pengidentifikasi semua orang yang bekerja di proyek adalah sama, maka cukup tentukan pengidentifikasi ini di Dockerfile. Namun, seringkali pengidentifikasi pengguna tidak cocok.
Cara mewujudkan yang diinginkan tidak segera jelas. Bagi saya itu yang paling sulit dalam proses menguasai buruh pelabuhan. Banyak pengguna buruh pelabuhan tidak berpikir bahwa ada tahapan yang berbeda dalam kehidupan suatu gambar. Pertama, gambar dikumpulkan untuk ini menggunakan Dockerfile. Saat memulai sebuah wadah dari gambar Dockerfile, itu tidak lagi digunakan.
Penciptaan pengguna harus terjadi saat membangun gambar. Hal yang sama berlaku untuk definisi pengguna dari mana proses diluncurkan. Ini berarti bahwa kita harus mengoper UID (GID) entah bagaimana ke dalam wadah.
Arahan ENV dan ARG digunakan untuk menggunakan variabel eksternal di Dockerfile. Perbandingan rinci arahan ada di sini .
Dockerfile
ARG UID=1000 ARG GID=1000 ENV UID=${UID} ENV GID=${GID} RUN usermod -u $UID node \ && groupmod -g $GID node
Anda dapat memberikan argumen melalui komposisi buruh pelabuhan seperti ini:
buruh pelabuhan-menulis
build: context: ./src/backend args: UID: 1000 GID: 1000
PS Untuk menguasai semua trik buruh pelabuhan, tidak cukup membaca dokumentasi atau artikel. Anda perlu banyak berlatih, Anda perlu merasakan buruh pelabuhan.