Bab 4. Kontrol akses dan autentikasi

Daftar Isi

4.1. Autentikasi Unix normal
4.2. Mengelola informasi akun dan kata sandi
4.3. Kata sandi yang baik
4.4. Membuat kata sandi terenkripsi
4.5. PAM dan NSS
4.5.1. Berkas konfigurasi yang diakses oleh PAM dan NSS
4.5.2. Manajemen sistem terpusat modern
4.5.3. "Mengapa GNU su tidak mendukung kelompok wheel"
4.5.4. Aturan kata sandi yang lebih ketat
4.6. Keamanan autentikasi
4.6.1. Kata sandi aman di Internet
4.6.2. Secure Shell
4.6.3. Langkah-langkah keamanan tambahan untuk Internet
4.6.4. Mengamankan kata sandi root
4.7. Kontrol akses lainnya
4.7.1. sudo
4.7.2. PolicyKit
4.7.3. Membatasi akses ke beberapa layanan server
4.7.4. Fitur keamanan Linux

Ketika seseorang (atau program) meminta akses ke sistem, otentikasi menegaskan identitas menjadi yang tepercaya.

[Awas] Awas

Kesalahan konfigurasi PAM dapat mengunci Anda keluar dari sistem Anda sendiri. Anda harus memiliki CD penyelamatan yang berguna atau mengatur partisi boot alternatif. Untuk memulihkan, boot sistem dengan mereka dan memperbaiki hal-hal dari sana.

Otentikasi Unix normal disediakan oleh modul pam_unix(8) di bawah PAM (Pluggable Authentication Modules). 3 berkas konfigurasi penting, dengan ":" yang memisah entri, adalah sebagai berikut.


"/etc/passwd" berisi yang berikut ini.

 ...
user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
 ...

Seperti yang dijelaskan dalam passwd(5), masing-masing entri yang dipisah ":" dari berkas ini berarti sebagai berikut.

  • Nama log masuk

  • Entri spesifikasi kata sandi

  • ID pengguna numerik

  • ID grup numerik

  • Nama pengguna atau kolom komentar

  • Direktori home milik pengguna

  • Interpreter perintah pengguna opsional

Entri kedua "/etc/passwd" digunakan untuk entri kata sandi terenkripsi. Setelah pengenalan "/etc/shadow", entri ini digunakan untuk entri spesifikasi kata sandi.


"/etc/shadow" berisi yang berikut.

 ...
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
 ...

Seperti yang dijelaskan dalam shadow(5), masing-masing entri yang dipisah ":" dari berkas ini berarti sebagai berikut.

  • Nama log masuk

  • Kata sandi terenkripsi ("$1$" di awal menunjukkan penggunaan enkripsi MD5. "*" menunjukkan tidak diizinkan login.)

  • Tanggal perubahan kata sandi terakhir, dinyatakan sebagai cacah hari sejak 1 Januari 1970

  • Berapa hari pengguna harus menunggu sebelum dia diizinkan untuk mengubah kata sandinya lagi

  • Cacah hari yang setelah itu pengguna harus mengubah kata sandinya

  • Cacah hari sebelum kata sandi akan kedaluwarsa di mana pengguna harus diperingatkan

  • Cacah hari setelah kata sandi kedaluwarsa di mana kata sandi masih harus diterima

  • Tanggal kedaluwarsa akun, dinyatakan sebagai cacah hari sejak 1 Januari 1970

"/etc/group" berisi yang berikut ini.

group1:x:20:user1,user2

Seperti yang dijelaskan dalam group(5), masing-masing entri yang dipisah ":" dari berkas ini berarti sebagai berikut.

  • Nama grup

  • Kata sandi terenkripsi (tidak benar-benar digunakan)

  • ID grup numerik

  • daftar nama pengguna yang dipisah ","

[Catatan] Catatan

"/etc/gshadow" menyediakan fungsi yang serupa dengan "/etc/shadow" untuk "/etc/group" namun tidak benar-benar digunakan.

[Catatan] Catatan

Keanggotaan grup pengguna yang sebenarnya dapat ditambahkan secara dinamis jika baris "auth optional pam_group.so" ditambahkan ke "/etc/pam.d/common-auth" dan menatanya dalam "/etc/security/group.conf". Lihat pam_group(8).

[Catatan] Catatan

Paket base-passwd berisi daftar otoritatif pengguna dan grup: "/usr/share/doc/base-passwd/users-and-groups.html".

Berikut adalah beberapa perintah penting untuk mengelola informasi akun.


Anda mungkin perlu memiliki hak istimewa root agar beberapa fungsi dapat bekerja. Lihat crypt(3) untuk enkripsi data dan kata sandi.

[Catatan] Catatan

Pada sistem yang disiapkan dengan PAM dan NSS sebagai mesin salsa Debian, konten lokal "/etc/passwd", "/etc/group", dan "/etc/shadow" tidak dapat digunakan secara aktif oleh sistem. Perintah di atas berlaku bahkan di bawah lingkungan tersebut.

Saat membuat akun selama instalasi sistem Anda atau dengan perintah passwd(1), Anda harus memilih kata sandi yang baik yang terdiri dari setidaknya 6 hingga 8 karakter termasuk satu atau lebih karakter dari masing-masing set berikut sesuai dengan passwd(1).

  • Alfabet huruf kecil

  • Digit 0 sampai 9

  • Tanda baca

[Awas] Awas

Jangan memilih kata-kata yang bisa ditebak untuk kata sandi. Nama akun, nomor jaminan sosial, nomor telepon, alamat, ulang tahun, nama anggota keluarga atau hewan peliharaan Anda, kata-kata kamus, urutan karakter sederhana seperti "12345" atau "qwerty", ... Ini adalah pilihan yang buruk untuk kata sandi.

Ada alat independen untuk menghasilkan kata sandi terenkripsi dengan salt.


Sistem mirip Unix modern seperti sistem Debian menyediakan mekanisme PAM (Pluggable Authentication Modules) dan NSS (Name Service Switch) ke administrator sistem lokal untuk mengonfigurasi sistemnya. Peran ini dapat diringkas sebagai berikut.

  • PAM menawarkan mekanisme otentikasi fleksibel yang digunakan oleh perangkat lunak aplikasi sehingga melibatkan pertukaran data kata sandi.

  • NSS menawarkan mekanisme layanan nama fleksibel yang sering digunakan oleh pustaka standar C untuk mendapatkan nama pengguna dan grup untuk program seperti ls(1) dan id(1).

Sistem PAM dan NSS ini perlu dikonfigurasi secara konsisten.

Paket penting dari sistem PAM dan NSS adalah sebagai berikut.


  • "The Linux-PAM System Administrators' Guide" (Panduan Administrator Sistem Linux-PAM) dalam libpam-doc sangat penting untuk mempelajari konfigurasi PAM.

  • Bagian "System Databases and Name Service Switch" (Basis Data Sistem dan Sakelar Layanan Nama) di glibc-doc-reference sangat penting untuk mempelajari konfigurasi NSS.

[Catatan] Catatan

Anda dapat melihat daftar yang lebih luas dan terkini dengan perintah "aptitude search 'libpam-|libnss-'". Akronim NSS juga bisa berarti "Network Security Service" yang berbeda dari "Name Service Switch".

[Catatan] Catatan

PAM adalah cara paling dasar untuk menginisialisasi variabel lingkungan bagi setiap program dengan nilai baku seluruh sistem.

Di bawah systemd, paket libpam-systemd dipasang untuk mengelola login pengguna dengan mendaftarkan sesi pengguna dalam hirarki grup kontrol systemd untuk logind. Lihat systemd-logind(8), logind.conf(5), dan pam_systemd(8).

Berikut adalah beberapa berkas konfigurasi penting yang diakses oleh PAM dan NSS.


Pembatasan pemilihan kata sandi dilaksanakan oleh modul PAM, pam_unix(8) dan pam_cracklib(8). Mereka dapat dikonfigurasi oleh argumen mereka.

[Tip] Tip

Modul PAM menggunakan akhiran ".so" untuk nama berkas mereka.

Manajemen sistem terpusat modern dapat digelar memakai server Lightweight Directory Access Protocol (LDAP) terpusat untuk mengelola banyak sistem mirip Unix dan non-Unix di jaringan. Implementasi open source dari Lightweight Directory Access Protocol adalah Perangkat Lunak OpenLDAP.

Server LDAP menyediakan informasi akun melalui penggunaan PAM dan NSS dengan paket libpam-ldap dan libnss-ldap untuk sistem Debian. Beberapa tindakan diperlukan untuk mengaktifkan ini (Saya belum menggunakan penyiapan ini dan berikut ini adalah informasi sekunder murni. Silakan baca ini dalam konteks ini).

  • Anda menyiapkan server LDAP terpusat dengan menjalankan program seperti daemon LDAP yang berdiri sendiri, slapd(8).

  • Anda mengubah berkas konfigurasi PAM di direktori "/etc/pam.d/" untuk menggunakan "pam_ldap.so" alih-alih baku "pam_unix.so".

    • Debian menggunakan "/etc/pam_ldap.conf" sebagai berkas konfigurasi untuk libpam-ldap dan "/etc/pam_ldap.secret" sebagai berkas untuk menyimpan kata sandi root.

  • Anda mengubah konfigurasi NSS dalam berkas "/etc/nsswitch.conf" untuk menggunakan "ldap" alih-alih baku ("compat" atau "file").

    • Debian menggunakan "/etc/libnss-ldap.conf" sebagai berkas konfigurasi untuk libnss-ldap.

  • Anda harus membuat libpam-ldap untuk menggunakan koneksi SSL (atau TLS) bagi keamanan kata sandi.

  • Anda dapat membuat libnss-ldap menggunakan koneksi SSL (atau TLS) untuk memastikan integritas data dengan beban overhead jaringan LDAP.

  • Anda harus menjalankan nscd(8) secara lokal untuk menyinggahkan hasil pencarian LDAP agar mengurangi lalu lintas jaringan LDAP.

Lihat dokumentasi di pam_ldap.conf(5) dan "/usr/share/doc/libpam-doc/html/" yang ditawarkan oleh paket libpam-doc dan "info libc 'Name Service Switch'" yang ditawarkan oleh paket glibc-doc.

Demikian pula, Anda dapat mengatur sistem terpusat alternatif dengan metode lain.

[Catatan] Catatan

Informasi di sini mungkin tidak cukup untuk kebutuhan keamanan Anda tetapi itu mestinya menjadi awal yang baik.

Program Secure Shell (SSH) menyediakan komunikasi terenkripsi yang aman antara dua host yang tidak tepercaya melalui jaringan yang tidak aman dengan otentikasi yang aman. Ini terdiri dari klien OpenSSH, ssh(1), dan daemon OpenSSH, sshd(8). SSH ini dapat digunakan untuk membungkus komunikasi protokol yang tidak aman seperti POP dan X dengan aman melalui Internet dengan fitur penerusan port.

Klien mencoba mengautentikasi dirinya sendiri menggunakan autentikasi berbasis host, otentikasi kunci publik, otentikasi challenge-response, atau autentikasi kata sandi. Penggunaan otentikasi kunci publik memungkinkan login tanpa kata sandi jarak jauh. Lihat Bagian 6.3, “Server dan utilitas akses jarak jauh (SSH)”.

Untuk mencegah orang mengakses mesin Anda dengan hak istimewa root, Anda perlu membuat tindakan berikut.

  • Mencegah akses fisik ke hard disk

  • Mengunci UEFI/BIOS dan mencegah boot dari media lepasan

  • Mengatur kata sandi untuk sesi interaktif GRUB

  • Mengunci menu GRUB dari penyuntingan

Dengan akses fisik ke hard disk, mengatur ulang kata sandi relatif mudah dengan langkah-langkah berikut.

  1. Pindahkan hard disk ke PC dengan CD UEFI/BIOS yang dapat di-boot.

  2. Mem-boot sistem dengan media penyelamatan (boot disk Debian, CD Knoppix, CD GRUB, …).

  3. Kait partisi root dengan akses baca/tulis.

  4. Sunting "/etc/passwd" di partisi root dan jadikan entri kedua untuk akun root kosong.

Jika Anda memiliki akses sunting ke entri menu GRUB (lihat Bagian 3.1.2, “Tahap 2: boot loader”) untuk grub-rescue-pc pada waktu boot, bahkan lebih mudah dengan langkah-langkah berikut.

  1. Boot sistem dengan parameter kernel berubah menjadi sesuatu seperti "root=/dev/hda6 rw init=/bin/sh".

  2. Sunting "/etc/passwd" dan jadikan entri kedua untuk akun root kosong.

  3. Boot ulang sistem.

Shell root sistem sekarang dapat diakses tanpa kata sandi.

[Catatan] Catatan

Setelah seseorang memiliki akses root shell, ia dapat mengakses semuanya di sistem dan mengatur ulang kata sandi apa pun pada sistem. Lebih lanjut, ia dapat mengkompromikan kata sandi untuk semua akun pengguna menggunakan alat cracking kata sandi brute force seperti paket john dan crack (lihat Bagian 9.5.11, “Pemeriksaan keamanan dan integritas sistem”). Kata sandi yang tertebak ini dapat menyebabkan kompromi sistem lain.

Satu-satunya solusi perangkat lunak yang masuk akal untuk menghindari semua masalah ini adalah dengan menggunakan partisi root terenkripsi perangkat lunak (atau partisi "/etc") menggunakan dm-crypt dan initramfs (lihat Bagian 9.9, “Tips enkripsi data”). Namun Anda selalu membutuhkan kata sandi untuk mem-boot sistem.

Ada kontrol akses ke sistem selain otentikasi berbasis kata sandi dan izin berkas.

[Catatan] Catatan

Lihat Bagian 9.4.15, “Tombol Alt-SysRq” untuk membatasi fitur secure attention key (SAK) kernel.

sudo(8) adalah program yang dirancang untuk memungkinkan sysadmin untuk memberikan hak istimewa root terbatas kepada pengguna dan mencatat log aktivitas root. sudo hanya membutuhkan kata sandi pengguna biasa. Pasang paket sudo dan aktifkan dengan mengatur opsi di "/etc/sudoers". Lihat contoh konfigurasi di "/usr/share/doc/sudo/examples/sudoers" dan Bagian 1.1.12, “konfigurasi sudo”.

Penggunaan sudo saya untuk sistem pengguna tunggal (lihat Bagian 1.1.12, “konfigurasi sudo”) bertujuan untuk melindungi diri dari kebodohan saya sendiri. Secara pribadi, saya menganggap menggunakan sudo alternatif yang lebih baik daripada menggunakan sistem dari akun root sepanjang waktu. Misalnya, berikut ini mengubah pemilik "suatu_berkas" menjadi "namaku".

$ sudo chown my_name some_file

Tentu saja jika Anda tahu kata sandi root (seperti yang dilakukan pengguna Debian yang dipasang sendiri), perintah apa pun dapat dijalankan di bawah root dari akun pengguna mana pun menggunakan "su -c".

PolicyKit adalah komponen sistem operasi untuk mengendalikan hak istimewa di seluruh sistem dalam sistem operasi mirip Unix.

Aplikasi GUI yang lebih baru tidak dirancang untuk berjalan sebagai proses istimewa. Mereka berbicara dengan proses istimewa melalui PolicyKit untuk melakukan operasi administratif.

PolicyKit membatasi operasi tersebut ke akun pengguna milik grup sudo pada sistem Debian.

Lihat polkit(8).

Untuk keamanan sistem, adalah ide yang baik untuk menonaktifkan sebanyak mungkin program server. Ini menjadi penting untuk server jaringan. Memiliki server yang tidak digunakan, diaktifkan baik secara langsung sebagai daemon atau melalui program super-server, dianggap sebagai risiko keamanan.

Banyak program, seperti sshd(8), menggunakan kontrol akses berbasis PAM. Ada banyak cara untuk membatasi akses ke beberapa layanan server.

Lihat Bagian 3.5, “Manajemen sistem”, Bagian 4.5.1, “Berkas konfigurasi yang diakses oleh PAM dan NSS”, dan Bagian 5.6, “Infrastruktur netfilter”.

[Tip] Tip

Layanan Sun RPC harus aktif untuk NFS dan program berbasis RPC lainnya.

[Tip] Tip

Jika Anda mengalami masalah akses jarak jauh dalam sistem Debian baru-baru ini, jadikan komentar saja baris konfigurasi yang menyinggung seperti "ALL: PARANOID" di "/etc/hosts.deny" jika ada. (Tetapi Anda harus berhati-hati terhadap risiko keamanan yang terlibat dengan tindakan semacam ini.)

Kernel Linux telah berevolusi dan mendukung fitur keamanan yang tidak ditemukan dalam implementasi UNIX tradisional.

Linux mendukung atribut extended yang memperluas atribut UNIX tradisional (lihat xattr(7)).

Linux membagi hak istimewa yang secara tradisional terkait dengan superuser menjadi unit-unit yang berbeda, yang dikenal sebagai capabilities(7), yang dapat diaktifkan dan dinonaktifkan secara independen. Kapabilitas adalah atribut per-thread sejak kernel versi 2.2.

Kerangka Kerja Linux Security Module (LSM) menyediakan mekanisme untuk berbagai pemeriksaan keamanan yang akan di-hook oleh ekstensi kernel baru. Misalnya:

Karena ekstensi ini dapat memperketat model hak istimewa lebih ketat daripada kebijakan model keamanan mirip-Unix biasa, bahkan kekuatan root dapat dibatasi. Anda disarankan untuk membaca dokumen kerangka kerja Linux Security Module (LSM) di kernel.org.

namespaces Linux membungkus sumber daya sistem global dalam abstraksi yang membuatnya tampak pada proses dalam namespace bahwa mereka memiliki instansi terisolasi mereka sendiri dari sumber daya global. Perubahan pada sumber daya global terlihat oleh proses lain yang merupakan anggota ruang nama, tetapi tidak terlihat oleh proses lain. Sejak kernel versi 5.6, ada 8 jenis namespace (lihat namespaces(7), unshare(1), nsenter(1)).

Pada Debian 11 Bullseye (2021), Debian menggunakan hirarki cgroup terpadu (alias cgroups-v2).

Contoh penggunaan namespaces dengan cgroup untuk mengisolasi proses mereka dan untuk memungkinkan kontrol sumber daya adalah:

Fungsi-fungsi ini tidak dapat direalisasikan oleh Bagian 4.1, “Autentikasi Unix normal”. Topik-topik tingkat lanjut ini sebagian besar di luar cakupan untuk dokumen pengantar ini.