Kuasai izin file, manajemen pengguna dan grup, dan praktik keamanan terbaik. Pengetahuan penting untuk administrasi sistem dan DevOps.

Di Episode 1, kami belajar bahwa Linux adalah multi-pengguna dan multi-tasking. Di Episode 2, kami mengeksplorasi bagaimana kernel mengisolasi proses menggunakan namespaces dan cgroups.
Sekarang kami menyelam ke salah satu fitur Linux yang paling penting: izin dan kontrol akses. Di sinilah keamanan terjadi.
Izin Linux menentukan:
Baik Anda mengelola server produksi, menerapkan aplikasi, atau hanya menggunakan Linux, memahami izin adalah keharusan. Izin yang salah konfigurasi adalah salah satu kerentanan keamanan paling umum.
Dalam episode ini, kami akan menguasai:
Pada akhirnya, Anda akan memahami cara mengamankan sistem Linux Anda dan mengapa izin penting.
Pengguna adalah identitas di sistem Linux. Setiap pengguna memiliki:
alice, bob)/home/alice)/bin/bash)/etc/shadow)Pengguna adalah fondasi keamanan Linux. Setiap proses berjalan sebagai pengguna tertentu, dan izin ditegakkan berdasarkan identitas pengguna.
Grup adalah kumpulan pengguna. Grup memungkinkan Anda untuk:
Setiap grup memiliki:
developers, admins)Pengguna dapat termasuk dalam beberapa grup. Grup utama diatur ketika pengguna dibuat; grup tambahan bersifat tambahan.
Pengguna root (UID 0) adalah superuser dengan privilege unlimited:
Root sangat kuat tetapi berbahaya. Kesalahan sebagai root dapat menghancurkan sistem. Itulah mengapa prinsip least privilege penting: gunakan root hanya jika diperlukan.
Pengguna Biasa (UID >= 1000)
Pengguna Sistem (UID < 1000)
Anda dapat melihat pengguna sistem di /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
nginx:x:33:33:nginx:/var/www:/usr/sbin/nologin
mysql:x:105:111:MySQL Server:/var/lib/mysql:/bin/false
alice:x:1000:1000:Alice User:/home/alice:/bin/bashPerhatikan bahwa pengguna sistem memiliki /usr/sbin/nologin atau /bin/false sebagai shell mereka—mereka tidak dapat login secara interaktif.
# Buat pengguna baru
sudo useradd -m -s /bin/bash alice
# Buat pengguna dengan UID tertentu
sudo useradd -m -u 1500 -s /bin/bash bob
# Buat pengguna sistem (tanpa direktori home, tanpa login)
sudo useradd -r -s /usr/sbin/nologin appuser
# Atur password untuk pengguna
sudo passwd alice
# Buat pengguna dengan direktori home dan shell dalam satu perintah
sudo adduser alice # Interaktif, lebih user-friendly# Buat grup baru
sudo groupadd developers
# Buat grup dengan GID tertentu
sudo groupadd -g 2000 admins
# Buat grup sistem
sudo groupadd -r appgroup# Tambahkan pengguna ke grup
sudo usermod -aG developers alice
# Tambahkan pengguna ke beberapa grup
sudo usermod -aG developers,admins alice
# Lihat grup untuk pengguna
groups alice
# Lihat semua anggota grup
getent group developersImportant
Gunakan -aG (tambahkan ke grup) bukan -G (ganti grup). Menggunakan -G tanpa -a menghapus pengguna dari semua grup lain.
# Ubah direktori home pengguna
sudo usermod -d /home/newhome alice
# Ubah shell pengguna
sudo usermod -s /bin/zsh alice
# Ubah UID pengguna
sudo usermod -u 2000 alice
# Kunci akun pengguna
sudo usermod -L alice
# Buka kunci akun pengguna
sudo usermod -U alice# Hapus pengguna (simpan direktori home)
sudo userdel alice
# Hapus pengguna dan direktori home
sudo userdel -r alice
# Hapus grup
sudo groupdel developers
# Hapus pengguna dari grup
sudo deluser alice developers# Lihat semua pengguna
cat /etc/passwd
# Lihat semua grup
cat /etc/group
# Lihat detail pengguna
id alice
# Lihat pengguna saat ini
whoami
# Lihat semua pengguna yang login
w
# Lihat grup pengguna
groups aliceSetiap file dan direktori di Linux memiliki tiga jenis izin:
Izin ini berlaku untuk tiga kategori:
Ketika Anda menjalankan ls -l, Anda melihat izin seperti ini:
-rw-r--r-- 1 alice developers 1024 Feb 20 10:30 file.txt
drwxr-xr-x 2 alice developers 4096 Feb 20 10:30 mydir/Memecah -rw-r--r--:
- rw- r-- r--
| | | |
| | | +-- Other: read only (r--)
| | +------ Group: read only (r--)
| +---------- Owner: read and write (rw-)
+------------ File type: - = regular file, d = directory, l = symlinkIzin juga dapat direpresentasikan sebagai angka oktal:
Setiap kategori izin adalah jumlah izinnya:
7 = 4 + 2 + 1 = rwx (read, write, execute)
6 = 4 + 2 + 0 = rw- (read, write)
5 = 4 + 0 + 1 = r-x (read, execute)
4 = 4 + 0 + 0 = r-- (read only)
0 = 0 + 0 + 0 = --- (no permissions)Jadi 755 berarti:
Owner (biasanya pembuat) memiliki kontrol paling banyak. Izin owner adalah tiga karakter pertama setelah jenis file.
-rw-r--r-- alice developers file.txt
^^^
Owner permissions: read and writePengguna dalam grup file memiliki izin yang ditunjukkan di tiga karakter tengah.
-rw-r--r-- alice developers file.txt
^^^
Group permissions: read onlySemua orang lain memiliki izin yang ditunjukkan di tiga karakter terakhir.
-rw-r--r-- alice developers file.txt
^^^
Other permissions: read onlyPerintah chmod mengubah izin. Notasi simbolik dapat dibaca manusia:
# Tambahkan izin execute untuk owner
chmod u+x script.sh
# Hapus izin write untuk grup
chmod g-w file.txt
# Tambahkan izin read untuk other
chmod o+r file.txt
# Atur izin tepat untuk owner
chmod u=rwx file.txt
# Tambahkan execute untuk semua
chmod +x script.sh
# Hapus semua izin untuk other
chmod o= file.txtNotasi numerik lebih cepat untuk menetapkan izin yang tepat:
# Atur ke 755 (rwxr-xr-x)
chmod 755 script.sh
# Atur ke 644 (rw-r--r--)
chmod 644 file.txt
# Atur ke 600 (rw-------)
chmod 600 secret.txt
# Atur ke 777 (rwxrwxrwx) - TIDAK DIREKOMENDASIKAN
chmod 777 file.txt# Ubah izin secara rekursif
chmod -R 755 mydir/
# Ubah hanya file (bukan direktori)
find mydir -type f -exec chmod 644 {} \;
# Ubah hanya direktori (bukan file)
find mydir -type d -exec chmod 755 {} \;Ketika Anda membuat file, izin default ditentukan oleh umask. Umask dikurangi dari izin default:
Dengan umask 0022:
# Lihat umask saat ini
umask
# Atur umask untuk sesi saat ini
umask 0077
# Atur umask secara permanen (tambahkan ke ~/.bashrc)
echo "umask 0077" >> ~/.bashrcPerintah chown mengubah kepemilikan file:
# Ubah owner
sudo chown alice file.txt
# Ubah owner dan grup
sudo chown alice:developers file.txt
# Ubah hanya grup
sudo chown :developers file.txt
# Ubah owner secara rekursif
sudo chown -R alice mydir/
# Ubah owner dan grup secara rekursif
sudo chown -R alice:developers mydir/Perintah chgrp mengubah hanya grup:
# Ubah grup
sudo chgrp developers file.txt
# Ubah grup secara rekursif
sudo chgrp -R developers mydir/Ketika mengubah kepemilikan secara rekursif, berhati-hatilah:
# Ubah kepemilikan semua file di direktori
sudo chown -R alice:developers /var/www/myapp
# Ubah kepemilikan tetapi pertahankan symlinks
sudo chown -R -h alice:developers /var/www/myapp
# Ubah kepemilikan file saja (bukan direktori)
find /var/www/myapp -type f -exec sudo chown alice:developers {} \;Selain read, write, dan execute dasar, Linux memiliki tiga izin khusus:
Ketika setuid diatur pada file executable, program berjalan sebagai owner file, bukan pengguna yang menjalankannya.
Representasi numerik: 4 (ditambahkan ke digit pertama)
-rwsr-xr-x (4755)
^
Setuid bitKasus penggunaan: Program yang memerlukan privilege yang ditinggikan
# Perintah passwd berjalan sebagai root bahkan ketika dijalankan oleh pengguna biasa
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Feb 20 10:30 /usr/bin/passwd
# Atur setuid
chmod u+s /usr/bin/myprogram
chmod 4755 /usr/bin/myprogramPeringatan keamanan: Program setuid adalah vektor serangan umum. Hanya gunakan jika diperlukan.
Ketika setgid diatur pada file executable, program berjalan sebagai grup file. Ketika diatur pada direktori, file baru yang dibuat di direktori itu mewarisi grup direktori.
Representasi numerik: 2 (ditambahkan ke digit pertama)
-rwxr-sr-x (2755)
^
Setgid bitKasus penggunaan: Direktori bersama di mana file harus termasuk dalam grup tertentu
# Buat direktori bersama
mkdir /var/shared
sudo chown root:developers /var/shared
sudo chmod g+s /var/shared
# File baru yang dibuat di sini akan termasuk dalam grup 'developers'
touch /var/shared/file.txt
ls -l /var/shared/file.txt
-rw-r--r-- 1 alice developers 0 Feb 20 10:30 file.txtKetika sticky bit diatur pada direktori, hanya owner file (atau root) yang dapat menghapus file di direktori itu, bahkan jika orang lain memiliki izin write.
Representasi numerik: 1 (ditambahkan ke digit pertama)
drwxrwxrwt (1777)
^
Sticky bitKasus penggunaan: Direktori sementara bersama seperti /tmp
# Atur sticky bit
chmod o+t /tmp
chmod 1777 /tmp
# Sekarang hanya owner file yang dapat menghapus file mereka
ls -ld /tmp
drwxrwxrwt 10 root root 4096 Feb 20 10:30 /tmp# Atur setuid
chmod u+s /usr/bin/myprogram
chmod 4755 /usr/bin/myprogram
# Atur setgid
chmod g+s /var/shared
chmod 2755 /var/shared
# Atur sticky bit
chmod o+t /tmp
chmod 1777 /tmp
# Hapus izin khusus
chmod u-s /usr/bin/myprogram
chmod g-s /var/shared
chmod o-t /tmpACLs (Access Control Lists) menyediakan kontrol izin yang lebih granular di luar model owner/group/other dasar. Mereka memungkinkan Anda memberikan izin tertentu kepada pengguna atau grup tertentu.
Kasus penggunaan: Ketika Anda perlu memberikan izin kepada beberapa pengguna tanpa membuat grup, atau ketika izin tidak sesuai dengan model standar.
# Berikan izin read kepada pengguna tertentu
setfacl -m u:alice:r file.txt
# Berikan read dan write kepada pengguna tertentu
setfacl -m u:alice:rw file.txt
# Berikan izin kepada grup
setfacl -m g:developers:rx file.txt
# Atur ACL default untuk file baru di direktori
setfacl -d -m u:alice:rw mydir/
# Hapus ACL tertentu
setfacl -x u:alice file.txt
# Hapus semua ACLs
setfacl -b file.txt# Lihat ACLs untuk file
getfacl file.txt
# Lihat ACLs secara rekursif
getfacl -R mydir/Skenario 1: Beberapa pengembang memerlukan akses ke direktori proyek
# Alih-alih membuat grup, gunakan ACLs
setfacl -m u:alice:rwx /var/www/project
setfacl -m u:bob:rwx /var/www/project
setfacl -m u:charlie:rx /var/www/project # Read-only untuk charlieSkenario 2: Direktori log bersama di mana layanan berbeda memerlukan akses
setfacl -m u:nginx:rw /var/log/shared
setfacl -m u:mysql:rw /var/log/shared
setfacl -m u:postgres:rw /var/log/sharedsudo (superuser do) memungkinkan pengguna yang berwenang menjalankan perintah sebagai pengguna lain (biasanya root) tanpa mengetahui password root. Ini adalah cara aman untuk melakukan tugas administratif.
Mengapa sudo alih-alih login root?
File sudoers (/etc/sudoers) mengontrol siapa yang dapat menggunakan sudo dan apa yang dapat mereka lakukan. Selalu edit dengan visudo, bukan editor biasa:
# Edit file sudoers (selalu gunakan visudo)
sudo visudo
# Tambahkan pengguna ke sudoers (akses sudo penuh)
# Tambahkan baris ini ke /etc/sudoers:
alice ALL=(ALL) ALL
# Izinkan perintah tertentu tanpa password
# Tambahkan baris ini:
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl
# Izinkan grup untuk menggunakan sudo
%developers ALL=(ALL) ALLSintaks sudoers: user HOST=(runuser) COMMAND
user: Username atau grup (awali dengan % untuk grup)HOST: Host mana ini berlaku (biasanya ALL)runuser: Pengguna mana untuk menjalankan sebagai (biasanya ALL)COMMAND: Perintah mana yang diizinkan (biasanya ALL)# Jalankan perintah sebagai root
sudo systemctl restart nginx
# Jalankan perintah sebagai pengguna tertentu
sudo -u alice whoami
# Jalankan perintah sebagai root dengan variabel lingkungan
sudo -E mycommand
# Daftar izin sudo untuk pengguna saat ini
sudo -l
# Edit file sebagai root
sudo nano /etc/nginx/nginx.conf
# Jalankan shell interaktif sebagai root
sudo -i/var/log/auth.log untuk perintah sudoContoh: Konfigurasi sudoers yang aman
# Izinkan tim pengembang untuk restart layanan
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart mysql
# Izinkan tim ops akses sudo penuh
%ops ALL=(ALL) ALL
# Memerlukan password untuk perintah sensitif
alice ALL=(ALL) /usr/bin/passwd, /usr/bin/useradd, /usr/bin/userdelUntuk aplikasi web yang dilayani oleh nginx:
# Web root dimiliki oleh root, dapat dibaca oleh nginx
sudo chown root:root /var/www/myapp
sudo chmod 755 /var/www/myapp
# File aplikasi dapat dibaca oleh nginx
sudo chown root:root /var/www/myapp/index.php
sudo chmod 644 /var/www/myapp/index.php
# Direktori yang dapat ditulis untuk upload
sudo chown nginx:nginx /var/www/myapp/uploads
sudo chmod 755 /var/www/myapp/uploads
# File konfigurasi hanya dapat dibaca oleh root
sudo chown root:root /var/www/myapp/config.php
sudo chmod 600 /var/www/myapp/config.phpUntuk aplikasi tipikal:
# Direktori aplikasi
chmod 755 /opt/myapp
# Kode sumber (dapat dibaca oleh pengguna app)
chown appuser:appuser /opt/myapp/src
chmod 755 /opt/myapp/src
# Konfigurasi (hanya dapat dibaca oleh pengguna app)
chown appuser:appuser /opt/myapp/config
chmod 700 /opt/myapp/config
# Log (dapat ditulis oleh pengguna app)
chown appuser:appuser /var/log/myapp
chmod 755 /var/log/myapp# Direktori log
sudo chown root:root /var/log/myapp
sudo chmod 755 /var/log/myapp
# File log (dapat dibaca oleh root dan pengguna app)
sudo chown appuser:root /var/log/myapp/app.log
sudo chmod 640 /var/log/myapp/app.log# Konfigurasi sensitif (hanya dapat dibaca oleh owner)
sudo chown root:root /etc/myapp/database.conf
sudo chmod 600 /etc/myapp/database.conf
# Konfigurasi umum (dapat dibaca oleh semua)
sudo chown root:root /etc/myapp/app.conf
sudo chmod 644 /etc/myapp/app.confKesalahan: Menetapkan izin ke 777 (rwxrwxrwx) untuk "memperbaiki" masalah izin
# JANGAN LAKUKAN INI
chmod 777 /var/www/myapp
chmod 777 /etc/config.confMengapa itu buruk:
Cara menghindarinya: Pahami izin apa yang benar-benar diperlukan dan atur dengan tepat.
Kesalahan: File dimiliki oleh pengguna yang salah, menyebabkan error permission denied
# File aplikasi dimiliki oleh root alih-alih pengguna app
ls -l /var/www/myapp/index.php
-rw-r--r-- 1 root root 1024 Feb 20 10:30 index.php
# nginx tidak dapat menulis ke direktori uploads
ls -ld /var/www/myapp/uploads
drwxr-xr-x 2 root root 4096 Feb 20 10:30 uploadsCara menghindarinya: Pastikan file dimiliki oleh pengguna/grup yang benar untuk aplikasi.
Kesalahan: Membuat file dengan izin default yang terlalu permisif
# umask default membuat file yang dapat dibaca dunia
umask
0022
# File baru adalah 644 (rw-r--r--)
touch secret.txt
ls -l secret.txt
-rw-r--r-- 1 alice alice 0 Feb 20 10:30 secret.txtCara menghindarinya: Atur umask yang sesuai untuk operasi sensitif.
Kesalahan: Mengizinkan pengguna menjalankan perintah apa pun dengan sudo
# JANGAN LAKUKAN INI
alice ALL=(ALL) ALL
# Lebih baik: Perintah tertentu
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginxMengapa itu buruk: Pengguna dapat menjalankan perintah apa pun sebagai root, termasuk yang berbahaya.
Cara menghindarinya: Berikan hanya izin sudo yang diperlukan untuk perintah tertentu.
Berikan pengguna dan proses hanya izin minimum yang mereka butuhkan:
# Baik: Izin minimal
-rw------- 1 appuser appuser config.conf
drwxr-xr-x 2 appuser appuser /opt/myapp
# Buruk: Terlalu permisif
-rw-rw-rw- 1 appuser appuser config.conf
drwxrwxrwx 2 appuser appuser /opt/myappSecara berkala periksa masalah izin:
# Temukan file yang dapat ditulis dunia
find / -type f -perm -002 2>/dev/null
# Temukan file sensitif yang dapat dibaca dunia
find /etc -type f -perm -004 2>/dev/null
# Temukan file setuid
find / -type f -perm -4000 2>/dev/null
# Temukan file yang dimiliki oleh pengguna yang dihapus
find / -nouser 2>/dev/nullGunakan alat untuk mendeteksi perubahan izin yang tidak sah:
# Pantau perubahan file dengan auditd
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
# Lihat log audit
sudo ausearch -k passwd_changesKetika membuat file sensitif:
# Buat file dengan izin yang ketat
touch secret.txt
chmod 600 secret.txt
# Atau gunakan umask
umask 0077
touch secret.txt # Akan menjadi 600
# Untuk direktori
mkdir -p secure_dir
chmod 700 secure_dirGunakan setuid ketika pengguna biasa perlu menjalankan perintah istimewa:
# passwd perlu memodifikasi /etc/shadow (hanya root)
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Feb 20 10:30 /usr/bin/passwd
# ping memerlukan akses raw socket (hanya root)
ls -l /usr/bin/ping
-rwsr-xr-x 1 root root 64424 Feb 20 10:30 /usr/bin/pingKapan menggunakan: Hanya untuk utilitas sistem terpercaya yang benar-benar memerlukan privilege yang ditinggikan.
Gunakan setgid ketika file yang dibuat di direktori harus termasuk dalam grup tertentu:
# Direktori proyek bersama
mkdir /var/projects/myproject
chown root:developers /var/projects/myproject
chmod g+s /var/projects/myproject
# File baru secara otomatis termasuk dalam grup 'developers'
touch /var/projects/myproject/file.txt
ls -l /var/projects/myproject/file.txt
-rw-r--r-- 1 alice developers 0 Feb 20 10:30 file.txtKapan menggunakan: Direktori bersama di mana kepemilikan grup yang konsisten penting.
Gunakan ACLs ketika izin standar tidak sesuai:
# Beberapa pengguna memerlukan izin berbeda
setfacl -m u:alice:rwx /var/shared
setfacl -m u:bob:rx /var/shared
setfacl -m u:charlie:rw /var/sharedKapan menggunakan: Persyaratan izin kompleks yang tidak sesuai dengan model owner/group/other.
Memahami izin sangat penting untuk keamanan Linux. Setiap insiden produksi yang melibatkan "permission denied" atau "permission too open" dapat dilacak kembali ke konsep-konsep ini.
Siap untuk episode berikutnya? Lanjutkan dengan Episode 4: Fondasi Shell & Bash untuk menguasai shell dan memulai perjalanan Anda ke bash scripting.