Setiap berkas dan direktori baru lahir dengan izin yang bukan kebetulan, melainkan hasil perhitungan sistem dari satu nilai yang disebut umask (user file-creation mode mask). Topik ini membahas cara membaca nilai umask sesi yang sedang berjalan, rumus yang mengubahnya menjadi izin nyata, cara mengubahnya beserta batasan wewenangnya, dan tempat nilai tersebut ditetapkan pada sebuah sistem. Setelah menyelesaikannya, izin berkas baru dapat diprediksi tanpa menebak, dan kebutuhan seperti berkas kerja tim atau berkas rahasia dapat dipenuhi dengan menyetel umask, bukan dengan chmod berulang-ulang.
Nilai umask dan izin berkas baru#
Perintah umask adalah bawaan shell yang menampilkan atau mengatur masker pembuatan berkas untuk sesi tersebut. Nilai ini menjadi properti proses shell dan diwariskan ke setiap proses turunannya, sehingga semua berkas yang dibuat dari satu terminal mengikuti aturan yang sama.
# nilai umask sesi saat ini
umask0002Sistem latihan ini menerapkan nilai 002, salah satu dari dua nilai bawaan yang paling umum dijumpai, yaitu 002 dan 022. Pengaruhnya dapat dilihat langsung dengan membuat berkas dan direktori baru, lalu membaca izinnya.
# folder kerja
mkdir -p /tmp/kerja-umask
cd /tmp/kerja-umask
rm -rf catatan.txt arsip
touch catatan.txt
mkdir arsip
stat -c '%A %a %n' catatan.txt arsip-rw-rw-r-- 664 catatan.txt
drwxrwxr-x 775 arsipDengan umask 002, berkas baru mendapat mode 664 sehingga dapat ditulis pemilik dan grup, sedangkan direktori baru mendapat 775. Kolaborasi dalam satu grup menjadi lancar sejak berkas dibuat. Itulah alasan banyak instalasi Debian memakai 002 untuk akun dengan grup pribadinya sendiri. Nilai yang sama juga menjelaskan mengapa berkas yang dibuat lewat editor teks dan berkas yang dibuat lewat skrip dapat berbeda izinnya pada dua mesin yang berbeda. Editor mengikuti umask sesi yang menjalankannya, dan sesi itu mewarisi nilai dari proses login masing-masing mesin.
Rumus mode bawaan#
Kernel tidak menerapkan umask sebagai pengurangan angka biasa, melainkan sebagai operasi bit. Mode akhir adalah hasil operasi AND antara nilai dasar dan kebalikan (complement) umask, dengan dasar 666 untuk berkas dan 777 untuk direktori. Perhitungan berikut mereproduksinya dengan aritmetika bash.
# mode bawaan = nilai dasar AND kebalikan umask
printf 'berkas 666 & ~002 = %o\n' $((8#666 & ~8#002))
printf 'direktori 777 & ~002 = %o\n' $((8#777 & ~8#002))berkas 666 & ~002 = 664
direktori 777 & ~002 = 775Rumus ini membawa dua konsekuensi penting. Pertama, umask hanya dapat menghapus bit, tidak pernah menambah. Kedua, nilai dasar untuk berkas adalah 666 dan bukan 777, sehingga berkas baru tidak pernah lahir dengan bit eksekusi, sekalipun umasknya 000.
Bit eksekusi harus diberikan kemudian lewat chmod karena hanya pemilik atau root yang boleh menandai sebuah berkas sebagai program. Sifat satu arah ini menjadikan umask alat yang konservatif, dan itulah tujuan desainnya. Perhitungan yang sama dapat diperiksa dengan bobot r = 4, w = 2, dan x = 1 dari topik model izin. Digit 6 berarti rw- karena 4 + 2, dan digit 4 berarti r-- karena 4 saja.
Mengubah nilai umask#
Perintah umask menerima nilai oktal untuk mengganti masker sesi, dan opsi -S menampilkan bentuk simboliknya. Nilai 022 adalah pilihan klasik yang menutup izin menulis bagi grup dan other, sehingga hanya pemilik yang dapat mengubah berkas.
# mengubah umask menjadi 022 untuk sesi ini
umask 022
rm -rf laporan.txt arsip-laporan
touch laporan.txt
mkdir arsip-laporan
stat -c '%A %a %n' laporan.txt arsip-laporan
# bentuk simbolik dari umask yang sama
umask -S-rw-r--r-- 644 laporan.txt
drwxr-xr-x 755 arsip-laporan
u=rwx,g=rx,o=rxNilai 027 memberi kompromi lain, yaitu grup masih dapat membaca, sedangkan other ditutup sepenuhnya. Pola ini cocok untuk berkas proyek yang boleh dilihat tim, tetapi tidak boleh bocor keluar grup. Nilai yang belum disebut adalah 077, yaitu pilihan untuk berkas paling privat, karena berkas baru lahir dengan mode 600 dan direktori baru dengan 700. Baris umask 077 yang ditulis pada ~/.profile membuat seluruh sesi login pengguna tersebut memakai nilai itu, sehingga perilaku privat menjadi bawaan dan bukan langkah tambahan yang mudah terlupa.
# umask 027 untuk berkas yang ditutup dari pihak lain
umask 027
rm -rf rahasia.txt proyek-rahasia
touch rahasia.txt
mkdir proyek-rahasia
stat -c '%A %a %n' rahasia.txt proyek-rahasia-rw-r----- 640 rahasia.txt
drwxr-x--- 750 proyek-rahasiaTempat nilai umask ditetapkan#
Nilai yang tampil ketika terminal dibuka bukan bawaan kernel, melainkan hasil konfigurasi yang berlapis. Proses login menetapkan umask awal sesi menurut konfigurasi distro. Pada Ubuntu dan Debian, nilai itu umumnya datang dari berkas profil seperti /etc/profile dan ~/.profile, dari baris UMASK pada /etc/login.defs, atau dari modul PAM bernama pam_umask yang membaca preferensi per pengguna. Kernel sendiri memberi setiap proses baru umask yang sama dengan proses induknya, sehingga nilai tersebut terbawa dari proses ke proses sampai ada proses yang menetapkannya secara eksplisit.
Pengetahuan ini memiliki penerapan langsung pada skrip shell. Skrip yang menulis berkas rahasia memanggil umask 077 di awal, sehingga seluruh berkas yang dibuat skrip itu lahir dengan mode 600 tanpa satu pun panggilan chmod. Sebaliknya, layanan yang dikelola systemd menetapkan nilainya lewat opsi UMask= pada berkas unitnya, karena layanan tidak melewati shell login. Memahami letak penetapan ini menjelaskan mengapa dua mesin dengan perintah yang sama dapat menghasilkan izin berkas yang berbeda.
Kesalahan umum#
- Mengira mengubah umask akan memperbaiki berkas lama. Umask hanya memengaruhi berkas yang akan dibuat, sedangkan berkas yang sudah ada membutuhkan
chmod, baik manual maupun rekursif. - Menafsirkan angka umask yang lebih besar sebagai izin yang lebih luas. Arahnya justru terbalik, karena umask adalah masker yang menghapus bit. Nilai 077 menghasilkan berkas paling tertutup, sedangkan 000 membuat hasilnya sama dengan nilai dasar, yaitu paling terbuka.
- Mengharapkan berkas baru lahir dengan bit eksekusi. Nilai dasar berkas adalah 666 tanpa bit eksekusi, sehingga umask mana pun tidak dapat memberinya, dan bit tersebut harus ditambahkan dengan
chmod. - Menulis skrip yang membuat berkas sensitif tanpa mengatur umask. Berkas yang dibuat di antara proses lain mewarisi umask sesi yang menjalankannya, sehingga
umask 077di awal skrip lebih dapat diandalkan daripada mengandalkan lingkungan tempat skrip dipanggil.
Ringkasan#
- Umask adalah masker per proses yang menentukan izin awal berkas dan direktori baru, dengan dasar 666 untuk berkas dan 777 untuk direktori yang diberi AND dengan kebalikan umask.
- Umask hanya dapat menghapus bit izin, tidak pernah menambah, sehingga berkas baru tidak pernah lahir dengan bit eksekusi.
- Nilai 002 menghasilkan berkas 664 dan direktori 775, nilai 022 menghasilkan 644 dan 755, sedangkan 027 menghasilkan 640 dan 750.
- Perubahan umask berlaku untuk sesi saat ini dan proses turunannya saja, sedangkan nilai awal sesi login ditetapkan konfigurasi sistem seperti profil shell,
/etc/login.defs, ataupam_umask.
Referensi#
- umask(2) — Linux man-pages project — Panggilan sistem umask dan pewarisan masker antarproses.
- pam_umask(8) — Ubuntu manpages — Modul PAM yang menetapkan umask saat sesi dibuat.
- bash(1) — Ubuntu manpages — Dokumentasi bawaan shell umask beserta opsi -p dan -S.