Linux Ops
Referensi operasional Linux berdampingan untuk dua famili distribusi, mulai dari konfigurasi awal, pemasangan perkakas dan stack deployment, hingga penguatan keamanan berlapis dan pemrosesan log.
Identifikasi Sistem
Langkah paling awal sebelum tindakan lain: mengetahui distribusi dan versi yang digunakan. Seluruh keputusan terkait paket, firewall, dan MAC bergantung pada informasi ini.
Distro, versi, arsitektur
# Sumber kebenaran lintas-distro cat /etc/os-release hostnamectl # OS, kernel, virtualization, machine-id uname -srm # kernel + arsitektur (x86_64 / aarch64) arch # arsitektur saja
lsb_release -a # butuh paket lsb-release cat /etc/debian_version
cat /etc/redhat-release
rpm -E %{rhel} # angka major release (9, 10, ...)Inventaris sumber daya secara cepat
nproc # jumlah vCPU lscpu # detail CPU free -h # RAM + swap df -hT # disk + tipe filesystem lsblk -f # block device + UUID/FS ip -br a # ringkasan interface + IP uptime # load average + waktu hidup
Konfigurasi Awal Server
Urutan yang disarankan pada server baru: patch, pembuatan pengguna non-root, penetapan identitas host, sinkronisasi waktu, kunci SSH, kemudian swap.
Lakukan patch penuh terlebih dahulu
sudo apt update && sudo apt full-upgrade -y sudo apt autoremove --purge -y
sudo dnf upgrade --refresh -y sudo dnf autoremove -y
Membuat pengguna sudo non-root (hindari bekerja sebagai root)
sudo, sedangkan RHEL/Rocky menggunakan wheel.sudo adduser deploy # interaktif, set password sudo usermod -aG sudo deploy # grup admin = sudo # verifikasi: groups deploy
sudo adduser deploy sudo passwd deploy sudo usermod -aG wheel deploy # grup admin = wheel groups deploy
Hostname, timezone, locale
hostnamectl dan timedatectl identik pada kedua famili. Hanya pengaturan locale yang menempuh jalur berbeda.sudo hostnamectl set-hostname app01.example.com timedatectl set-timezone Asia/Jakarta timedatectl list-timezones | grep Asia # cari tz localectl status
sudo locale-gen en_US.UTF-8 sudo update-locale LANG=en_US.UTF-8
sudo localectl set-locale LANG=en_US.UTF-8 # paket langpacks bila perlu: sudo dnf install glibc-langpack-en
Sinkronisasi waktu (NTP)
systemd-timesyncd, sedangkan RHEL/Rocky menggunakan chrony. Waktu sistem yang tidak akurat dapat merusak TLS, autentikasi, dan korelasi log.sudo timedatectl set-ntp true timedatectl show-timesync --all
sudo dnf install -y chrony sudo systemctl enable --now chronyd chronyc sources -v chronyc tracking
Konfigurasi kunci SSH (dasar dari seluruh penguatan akses)
# Buat keypair (ed25519 lebih ringkas & modern dari RSA) ssh-keygen -t ed25519 -C "deploy@laptop" # Salin public key ke server ssh-copy-id deploy@SERVER_IP # manual: tempel isi ~/.ssh/id_ed25519.pub ke # ~/.ssh/authorized_keys di server
# Izin harus ketat atau sshd menolaknya diam-diam chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown -R "$USER":"$USER" ~/.ssh
Berkas swap (untuk VM tanpa partisi swap)
swappiness agar swap berfungsi sebagai cadangan, bukan jalur utama.sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # Persisten saat boot echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # Tuning sudo sysctl -w vm.swappiness=10 echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf
Manajemen Paket
Inti perbedaan harian terletak antara apt (dpkg) dan dnf (rpm). Konsepnya sama, namun perintahnya berbeda.
Memperbarui metadata, melakukan upgrade, dan memeriksa pembaruan
sudo apt update # refresh index sudo apt upgrade -y # upgrade aman (tak hapus paket) sudo apt full-upgrade -y # boleh hapus utk selesaikan deps apt list --upgradable
sudo dnf check-update # daftar yang bisa diupdate sudo dnf upgrade -y # upgrade semua sudo dnf upgrade --refresh -y # paksa refresh metadata
Memasang, menghapus, dan membersihkan paket
sudo apt install -y nginx git sudo apt remove nginx # sisakan config sudo apt purge nginx # hapus config juga sudo apt autoremove --purge # buang deps yatim
sudo dnf install -y nginx git sudo dnf remove nginx sudo dnf autoremove
Mencari paket dan memeriksa isinya
apt search nginx apt show nginx dpkg -l | grep nginx # paket terpasang dpkg -L nginx # file milik paket dpkg -S /usr/sbin/nginx # paket pemilik file ini
dnf search nginx dnf info nginx rpm -qa | grep nginx rpm -ql nginx # file milik paket dnf provides /usr/sbin/nginx # paket pemilik file ini
Repositori pihak ketiga dan kunci GPG
apt-key sudah tidak dianjurkan. Gunakan keyring per repositori dengan atribut signed-by= seperti pada contoh berikut.# Pola modern: simpan key terpisah, rujuk via signed-by curl -fsSL https://example.com/key.gpg \ | sudo gpg --dearmor -o /etc/apt/keyrings/vendor.gpg echo "deb [signed-by=/etc/apt/keyrings/vendor.gpg] \ https://repo.example.com stable main" \ | sudo tee /etc/apt/sources.list.d/vendor.list sudo apt update # PPA (khusus Ubuntu) sudo add-apt-repository ppa:ondrej/php
# Tambah repo sudo dnf install -y dnf-plugins-core sudo dnf config-manager --add-repo \ https://repo.example.com/vendor.repo sudo rpm --import https://example.com/key.gpg # EPEL: gudang paket tambahan wajib di RHEL/Rocky sudo dnf install -y epel-release # Buka repo CRB/PowerTools (deps EPEL sering butuh) sudo dnf config-manager --set-enabled crb
Riwayat, rollback, dan penguncian versi
dnf history undo dapat membatalkan transaksi. apt tidak memiliki mekanisme rollback transaksi yang setara.cat /var/log/apt/history.log sudo apt-mark hold nginx # kunci versi sudo apt-mark unhold nginx apt-mark showhold
dnf history sudo dnf history undo 42 # batalkan transaksi #42 sudo dnf install -y python3-dnf-plugin-versionlock sudo dnf versionlock add nginx dnf versionlock list
Perkakas Esensial
Toolchain build dan utilitas CLI harian. Perlu diperhatikan bahwa nama paket sering berbeda antarfamili.
Toolchain build dan pengembangan
build-essential dibandingkan grup "Development Tools".sudo apt install -y build-essential # = gcc, g++, make, libc-dev, dpkg-dev sudo apt install -y pkg-config autoconf automake
sudo dnf group install -y "Development Tools" # = gcc, gcc-c++, make, autoconf, automake, ... sudo dnf install -y pkgconf-pkg-config
Utilitas harian (perbedaan nama paket penting diketahui)
dig/nslookup berada pada paket dnsutils (deb) dan bind-utils (rhel). netstat/ifconfig berada pada net-tools (legacy; gunakan ss/ip).sudo apt install -y \ git curl wget vim tmux tree jq unzip \ htop ncdu rsync \ dnsutils netcat-openbsd net-tools
sudo dnf install -y \ git curl wget vim tmux tree jq unzip \ htop ncdu rsync \ bind-utils nmap-ncat net-tools # (htop/ncdu butuh EPEL aktif)
Jaringan
Perintah inspeksi seragam pada kedua famili, sedangkan konfigurasi sangat berbeda: netplan (Ubuntu server) dibandingkan NetworkManager/nmcli (RHEL).
Inspeksi (identik, perlu dikuasai)
ip a # alamat IP per interface ip r # tabel routing ss -tulpn # port listening + proses (ganti netstat) ss -s # ringkasan socket dig +short example.com # resolusi DNS curl -I https://site # cek header HTTP/status mtr example.com # traceroute + ping berkelanjutan
Konfigurasi IP statis
nmcli menjadi wajib. Kesalahan konfigurasi melalui jaringan dapat memutus akses; sediakan akses konsol sebagai cadangan.# /etc/netplan/01-static.yaml (YAML, indentasi spasi!)
network:
version: 2
ethernets:
eth0:
addresses: [192.168.1.50/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
sudo netplan try # uji 120s lalu rollback otomatis
sudo netplan applynmcli con show sudo nmcli con mod eth0 \ ipv4.addresses 192.168.1.50/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns "1.1.1.1 8.8.8.8" \ ipv4.method manual sudo nmcli con up eth0
Firewall (dua pendekatan berbeda)
sudo ufw allow OpenSSH # IZINKAN SSH DULU sudo ufw allow 80,443/tcp sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw enable sudo ufw status verbose sudo ufw delete allow 80/tcp
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service={http,https} --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
# zona aktif
sudo firewall-cmd --get-active-zones
# port langsung
sudo firewall-cmd --add-port=8080/tcp --permanentsystemd dan Service
Bagian ini identik pada Debian/Ubuntu dan RHEL/Rocky. Setelah dikuasai, pengetahuannya berlaku untuk seluruh distribusi.
Mengelola service
sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx sudo systemctl reload nginx # reload config tanpa downtime sudo systemctl enable --now nginx # enable + start sekaligus sudo systemctl disable nginx systemctl status nginx systemctl is-enabled nginx sudo systemctl daemon-reload # setelah ubah unit file sudo systemctl mask nginx # cegah start total
Inspeksi unit dan log (journalctl)
systemctl list-units --type=service --state=running systemctl --failed # service yang gagal journalctl -u nginx -f # follow log service journalctl -u nginx --since "1 hour ago" journalctl -b -p err # error sejak boot ini journalctl -k # pesan kernel (= dmesg) sudo journalctl --vacuum-time=7d # pangkas log >7 hari
Pengguna, Grup, dan Izin
Manajemen akun, sudo, dan model izin. Hampir seluruhnya identik antarfamili.
Akun dan grup
sudo useradd -m -s /bin/bash alice # -m buat home sudo passwd alice sudo usermod -aG docker alice # -a WAJIB (append, bukan replace) sudo userdel -r alice # -r hapus home id alice groups alice getent passwd alice
Sudo dan masa berlaku kata sandi
visudo yang memvalidasi sintaks. Kesalahan sintaks tanpa visudo dapat menonaktifkan sudo.sudo visudo # /etc/sudoers sudo visudo -f /etc/sudoers.d/deploy # lebih aman: drop-in # contoh isi drop-in: # deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart app sudo chage -l alice # lihat aging sudo chage -M 90 -W 7 alice # max 90 hari, warning 7 hari
Izin berkas, kepemilikan, dan ACL
chmod 640 file # rw- r-- --- chmod u+x,g-w file chown alice:devs file chmod -R g+rwX dir/ # X = +x hanya utk dir/file yg sudah exec # ACL (izin per-user di luar owner/group) setfacl -m u:bob:rwx file getfacl file # Special bits chmod 1777 /shared # sticky: hanya pemilik yang dapat menghapus filenya chmod 2775 /team # setgid: file mewarisi grup direktori
Stack Deployment
Perkakas deployment yang umum dibutuhkan. Banyak di antaranya (NVM, Composer, pyenv) dipasang melalui installer resmi sehingga identik pada semua distribusi. Perbedaan terletak pada runtime dasarnya (PHP, repositori Docker).
Node melalui NVM (installer lintas distribusi)
$HOME. Cocok untuk pengelolaan versi Node per pengguna atau per proyek.curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash # buka shell baru / source profil: source ~/.bashrc nvm install --lts # Node LTS terbaru nvm install 20 nvm use 20 nvm alias default 20 node -v && npm -v corepack enable # aktifkan pnpm/yarn modern
PHP + Composer
sudo add-apt-repository ppa:ondrej/php -y sudo apt update sudo apt install -y \ php8.3-cli php8.3-fpm php8.3-mbstring \ php8.3-xml php8.3-curl php8.3-mysql
sudo dnf install -y \ https://rpms.remirepo.net/enterprise/remi-release-9.rpm sudo dnf module reset php -y sudo dnf module enable php:remi-8.3 -y sudo dnf install -y \ php-cli php-fpm php-mbstring php-xml php-mysqlnd
php -r "copy('https://getcomposer.org/installer','composer-setup.php');"
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php
composer --versionPython melalui pyenv (untuk multiversi)
sudo apt install -y make build-essential libssl-dev \ zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \ libffi-dev liblzma-dev
sudo dnf install -y make gcc zlib-devel bzip2 bzip2-devel \ readline-devel sqlite sqlite-devel openssl-devel \ libffi-devel xz-devel
curl -fsSL https://pyenv.run | bash # tambah ke ~/.bashrc: # export PYENV_ROOT="$HOME/.pyenv" # command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" # eval "$(pyenv init -)" pyenv install 3.12.4 pyenv global 3.12.4
Container: Docker dan Podman
sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) \ signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu \ $(. /etc/os-release; echo $VERSION_CODENAME) stable" \ | sudo tee /etc/apt/sources.list.d/docker.list sudo apt update sudo apt install -y docker-ce docker-ce-cli \ containerd.io docker-compose-plugin sudo usermod -aG docker $USER # relogin agar berlaku
sudo dnf install -y podman podman-compose podman run --rm hello-world # alias supaya 'docker' = podman: echo 'alias docker=podman' >> ~/.bashrc # Atau Docker resmi: sudo dnf config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install -y docker-ce docker-ce-cli containerd.io sudo systemctl enable --now docker
Nginx (reverse proxy / web server)
sudo apt install -y nginx sudo systemctl enable --now nginx # config: /etc/nginx/sites-available/ -> symlink ke sites-enabled/ sudo nginx -t # uji config sebelum reload sudo systemctl reload nginx
sudo dnf install -y nginx sudo systemctl enable --now nginx # config: /etc/nginx/conf.d/*.conf sudo nginx -t sudo systemctl reload nginx # JANGAN lupa firewall + (SELinux: izinkan koneksi keluar) sudo setsebool -P httpd_can_network_connect 1
PostgreSQL
sudo apt install -y postgresql postgresql-contrib sudo systemctl enable --now postgresql sudo -u postgres psql # data dir: /var/lib/postgresql/<ver>/main
sudo dnf install -y postgresql-server postgresql-contrib sudo postgresql-setup --initdb # WAJIB di RHEL sudo systemctl enable --now postgresql sudo -u postgres psql # data dir: /var/lib/pgsql/data
Hardening L1: Baseline
Tindakan minimum yang harus diterapkan pada setiap server yang terekspos ke jaringan. Berisiko rendah dengan dampak besar.
Pembaruan keamanan otomatis
unattended-upgrades (Ubuntu) dan dnf-automatic (RHEL). Untuk server kritikal, batasi hanya pada patch keamanan dan jadwalkan reboot pada jendela waktu yang terkendali.sudo apt install -y unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # atur di /etc/apt/apt.conf.d/50unattended-upgrades sudo unattended-upgrade --dry-run -d
sudo dnf install -y dnf-automatic # di /etc/dnf/automatic.conf set: # upgrade_type = security # apply_updates = yes sudo systemctl enable --now dnf-automatic.timer
Penguatan SSHD
/etc/ssh/sshd_config.d/*.conf sebelum nilai default, sehingga tempatkan konfigurasi pengganti di sana. Uji dengan sshd -t dan buka sesi kedua sebelum memutus sesi pertama. Jangan menonaktifkan kata sandi sebelum autentikasi kunci terbukti berfungsi.# /etc/ssh/sshd_config.d/99-hardening.conf PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes KbdInteractiveAuthentication no PermitEmptyPasswords no MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 AllowUsers deploy sudo sshd -t # validasi (WAJIB) sudo systemctl restart ssh # deb: ssh | rhel: sshd # RHEL: sudo systemctl restart sshd
fail2ban (pencegah brute-force)
jail.local, dan hindari menyunting jail.conf karena akan ditimpa saat pembaruan.sudo apt install -y fail2ban sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # di jail.local aktifkan [sshd], set bantime/findtime/maxretry sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
sudo dnf install -y epel-release sudo dnf install -y fail2ban sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
Firewall default-deny dan penguncian akun root
sudo ufw default deny incoming sudo ufw allow OpenSSH sudo ufw enable sudo passwd -l root # kunci login password root
sudo firewall-cmd --set-default-zone=drop sudo firewall-cmd --add-service=ssh --permanent sudo firewall-cmd --reload sudo passwd -l root
Hardening L2: Menengah
Lapisan MAC, kernel, audit, dan kebijakan kata sandi. Pada bagian inilah perbedaan terbesar muncul: SELinux (RHEL) dibandingkan AppArmor (Ubuntu).
Mandatory Access Control (perbedaan paling besar)
setenforce 0 secara permanen atau SELINUX=disabled hanya karena terjadi masalah, sebab hal itu mengabaikan salah satu kontrol terbaik pada RHEL. Lakukan diagnosis terlebih dahulu melalui ausearch dan audit2allow, kemudian pasang policy yang sesuai. Ubuntu menggunakan AppArmor yang berbasis path dan lebih sederhana.sudo apt install -y apparmor-utils sudo aa-status # profil & mode sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx sudo aa-complain /path/to/profile # mode log-only # log pelanggaran: sudo journalctl -k | grep apparmor
sestatus # status & mode getenforce sudo setenforce 1 # Enforcing (runtime) # permanen: /etc/selinux/config -> SELINUX=enforcing # Diagnosa penolakan (cara benar, bukan dimatikan): sudo ausearch -m AVC -ts recent sudo ausearch -m AVC -ts recent | audit2allow -M mypol sudo semodule -i mypol.pp # Konteks file & boolean ls -Z /var/www sudo restorecon -Rv /var/www getsebool -a | grep httpd
Penguatan kernel melalui sysctl
/etc/sysctl.d/ agar persisten dan terorganisasi.# /etc/sysctl.d/99-hardening.conf net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.all.log_martians = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.tcp_syncookies = 1 net.ipv6.conf.all.accept_redirects = 0 kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.dmesg_restrict = 1 fs.protected_hardlinks = 1 fs.protected_symlinks = 1 fs.suid_dumpable = 0 sudo sysctl --system # muat semua drop-in
Audit daemon (auditd)
sudo apt install -y auditd audispd-plugins sudo systemctl enable --now auditd
# auditd biasanya sudah terpasang sudo systemctl enable --now auditd sudo dnf install -y audit
# /etc/audit/rules.d/hardening.rules -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/sudoers -p wa -k scope -w /var/log/auth.log -p wa -k auth # rhel: /var/log/secure -a always,exit -F arch=b64 -S execve -k exec sudo augenrules --load sudo ausearch -k identity
Kebijakan kata sandi dan login.defs
sudo apt install -y libpam-pwquality # /etc/security/pwquality.conf # minlen = 14 # minclass = 3 # aging default: /etc/login.defs (PASS_MAX_DAYS 90)
# pwquality sudah ada; kelola via authselect sudo authselect select sssd with-faillock --force # /etc/security/pwquality.conf -> minlen=14, minclass=3 # /etc/login.defs -> PASS_MAX_DAYS 90
Hardening L3: Lanjutan / CIS
Selaras dengan CIS Benchmark: integritas berkas, penguncian mount dan modul, lockout login, serta audit otomatis. Lakukan pengujian ketat karena bagian ini paling berpotensi mengganggu operasional.
Integritas berkas (AIDE)
sudo apt install -y aide sudo aideinit sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db sudo aide --check
sudo dnf install -y aide sudo aide --init sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz sudo aide --check
Lockdown mount: noexec/nosuid/nodev
noexec pada /tmp dapat merusak installer atau proses build yang menulis lalu mengeksekusi berkas di sana (misalnya sebagian langkah pip/npm/yum). Verifikasi pipeline terlebih dahulu.# /etc/fstab: partisi terpisah ideal; tmpfs sebagai alternatif: tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0 tmpfs /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0 # /var/tmp idealnya bind ke /tmp atau partisi sendiri sudo systemctl daemon-reload sudo mount -o remount /tmp mount | grep /tmp # verifikasi flag aktif
Blacklist filesystem dan modul yang tidak terpakai
# /etc/modprobe.d/cis-blacklist.conf install cramfs /bin/true install freevxfs /bin/true install jffs2 /bin/true install hfs /bin/true install hfsplus /bin/true install udf /bin/true install usb-storage /bin/true # blok mass-storage USB # nonaktifkan modul yg sudah termuat sudo modprobe -r cramfs 2>/dev/null || true
Lockout login (PAM faillock) dan banner
# Banner peringatan hukum echo "Authorized access only. Activity is monitored." \ | sudo tee /etc/issue /etc/issue.net # faillock: kunci akun setelah N kali gagal # RHEL: kelola via 'authselect ... with-faillock' # /etc/security/faillock.conf: # deny = 5 # unlock_time = 900 sudo faillock --user alice # lihat status sudo faillock --user alice --reset
Audit otomatis: Lynis dan OpenSCAP
# clone dari github lalu: sudo ./lynis audit system # laporan: /var/log/lynis.log + hardening index
sudo dnf install -y openscap-scanner scap-security-guide sudo oscap xccdf eval \ --profile cis \ --report report.html \ /usr/share/xml/scap/ssg/content/ssg-rl9-ds.xml
sudo apt install -y libopenscap8 ssg-debian # jalankan oscap dgn datastream Ubuntu yang sesuai oscap xccdf eval --profile cis_level1_server \ --report report.html <datastream.xml>
Log dan Troubleshooting
Ketika terjadi gangguan: journald seragam pada semua distribusi, namun lokasi log teks tradisional memiliki nama berkas yang berbeda.
Lokasi log yang berbeda
/var/log/auth.log (deb) dan /var/log/secure (rhel); syslog umum berada di /var/log/syslog (deb) dan /var/log/messages (rhel)./var/log/syslog # log sistem umum /var/log/auth.log # autentikasi / sudo / ssh /var/log/dpkg.log # transaksi paket
/var/log/messages # log sistem umum /var/log/secure # autentikasi / sudo / ssh /var/log/dnf.log # transaksi paket
Investigasi cepat (identik)
journalctl -p 3 -xb # error+ sejak boot ini, plus konteks journalctl --since "10 min ago" systemctl --failed # service mati dmesg -T | tail -50 # ring buffer kernel + timestamp last -a # login berhasil lastb # login GAGAL (butuh root) sudo du -xh / | sort -rh | head # pemakan disk terbesar sudo ss -tulpn # apa yang listening di port apa
Pemrosesan Teks & Log
Inti dari triase log dan forensik transaksi: menyaring baris, mengekstrak field, menghitung, dan mengubah teks. Mayoritas perintah identik pada semua distribusi; hanya pemasangan sebagian perkakas modern yang berbeda.
Memasang perkakas modern
jq tersedia pada repositori dasar atau EPEL.sudo apt install -y jq ripgrep
sudo dnf install -y epel-release sudo dnf install -y jq ripgrep
grep: penyaringan baris
grep "ERROR" app.log # baris yang memuat ERROR grep -i "timeout" app.log # abaikan besar/kecil huruf grep -n "RC 91" iso.log # sertakan nomor baris grep -c "0210" iso.log # hitung baris yang cocok grep -v "DEBUG" app.log # kebalikan: sembunyikan yang cocok grep -A3 -B1 "FATAL" app.log # 3 baris sesudah, 1 baris sebelum grep -E "RC (51|55|62)" iso.log # regex extended dengan OR grep -o "PAN=[0-9]*" iso.log # cetak hanya bagian yang cocok grep -rl "panic" /var/log # daftar file yang memuat pola
ripgrep (rg): alternatif cepat untuk dataset besar
rg "RC 91" iso.log rg -i "timeout" # cari rekursif di direktori saat ini rg -c "0200" *.log # hitung kemunculan per file rg -N "MTI=02\d\d" iso.log # regex, tanpa nomor baris rg -o "DE_0\d\d" iso.log # ekstrak token yang cocok saja
sed: substitusi dan pemilihan baris
sed -i mengubah file di tempat. Uji terlebih dahulu tanpa -i, atau gunakan sufiks cadangan seperti -i.bak.sed -n '10,20p' app.log # cetak baris 10 sampai 20 sed -n '/0200/p' iso.log # cetak baris yang cocok pola sed 's/\r$//' file.txt # buang CR (konversi CRLF ke LF) sed -i.bak 's/lama/baru/g' app.conf # ganti di tempat, simpan cadangan .bak sed '/^#/d;/^$/d' app.conf # hapus komentar dan baris kosong
awk: ekstraksi field dan agregasi
-F dan akses field melalui $1, $2, dan seterusnya.awk '{print $1, $4}' access.log # cetak kolom 1 dan 4
awk -F',' '{print $3}' data.csv # pemisah koma
awk -F'|' '$5=="0210"{print $0}' iso.log # filter berdasar nilai field
awk '{sum+=$2} END{print sum}' nums # jumlahkan kolom 2
awk -F'|' '{c[$6]++} END{for(k in c) print c[k], k}' iso.log
awk 'NR>1' data.csv # lewati baris header
awk '$9>=500' access.log # filter numerik pada kolom 9find dan xargs: operasi massal pada banyak file
-print0 bersama xargs -0 agar aman untuk nama file yang mengandung spasi.find /var/log -name "*.log" -mtime -1 # diubah kurang dari 1 hari find . -type f -size +100M # file lebih besar dari 100MB find /var/log -name "*.gz" | xargs zcat | grep "ERROR" find . -type f -print0 | xargs -0 grep -l "PAN"
jq: pemrosesan log JSON / terstruktur
jq '.' app.json # cetak rapi
jq '.transactions[] | .rc' log.json # ekstrak field dari array
jq -r '.[] | [.pan, .mti] | @tsv' log.json # output mentah, dipisah tab
jq 'select(.rc=="91")' events.json # filter berdasar nilai
jq 'group_by(.rc) | map({rc:.[0].rc, n:length})' events.json
tail -f app.log | jq -c 'select(.level=="error")' # saring aliran realtimeMemilah, menghitung, dan deduplikasi
cut -d',' -f1,3 data.csv # ambil kolom tertentu dari CSV sort file | uniq -c | sort -rn # frekuensi, urut dari terbanyak sort -u list.txt # baris unik wc -l file # hitung jumlah baris tr 'a-z' 'A-Z' < file # ubah ke huruf besar tr -d '\r' < dos.txt > unix.txt # buang CR paste -sd, file # gabung semua baris, dipisah koma
Membaca log terkompresi dan mengikuti aliran
tail -f ke grep, tambahkan --line-buffered agar keluaran tidak tertahan buffer.zcat app.log.1.gz | grep "ERROR" # baca gzip tanpa mengekstrak zgrep "RC 91" app.log.*.gz # grep langsung pada banyak .gz xzcat app.log.xz | less # baca arsip xz tail -n 200 -f app.log # 200 baris terakhir, lalu ikuti tail -f app.log | grep --line-buffered "0210" less +F app.log # mode ikuti di less (Ctrl-C lalu G untuk keluar)
Resep gabungan untuk forensik transaksi
# Distribusi response code (pemisah '|', kolom 6 = RC), urut terbanyak
awk -F'|' 'NR>1{c[$6]++} END{for(k in c) print c[k], k}' iso.log \
| sort -rn
# Jumlah PAN unik yang muncul pada MTI 0210
awk -F'|' '$1=="0210"{print $3}' iso.log | sort -u | wc -l
# Tinjau cepat baris bermasalah beserta nomor barisnya
grep -nE "RC (51|55|62|75)" iso.log | head
# Redaksi PAN sebelum membagikan sampel log
sed -E 's/([0-9]{6})[0-9]{6,9}([0-9]{4})/\1******\2/g' iso.log > redacted.log