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.

00

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

keduanya
# Sumber kebenaran lintas-distro
cat /etc/os-release
hostnamectl                # OS, kernel, virtualization, machine-id
uname -srm                 # kernel + arsitektur (x86_64 / aarch64)
arch                       # arsitektur saja
deb/ubuntu
lsb_release -a             # butuh paket lsb-release
cat /etc/debian_version
rhel/rocky/alma
cat /etc/redhat-release
rpm -E %{rhel}             # angka major release (9, 10, ...)

Inventaris sumber daya secara cepat

keduanya
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
01

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

deb/ubuntu
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove --purge -y
rhel/rocky/alma
sudo dnf upgrade --refresh -y
sudo dnf autoremove -y

Membuat pengguna sudo non-root (hindari bekerja sebagai root)

deb/ubuntu
sudo adduser deploy                    # interaktif, set password
sudo usermod -aG sudo deploy           # grup admin = sudo
# verifikasi:
groups deploy
rhel/rocky/alma
sudo adduser deploy
sudo passwd deploy
sudo usermod -aG wheel deploy          # grup admin = wheel
groups deploy

Hostname, timezone, locale

keduanya
sudo hostnamectl set-hostname app01.example.com
timedatectl set-timezone Asia/Jakarta
timedatectl list-timezones | grep Asia   # cari tz
localectl status
deb/ubuntu
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8
rhel/rocky/alma
sudo localectl set-locale LANG=en_US.UTF-8
# paket langpacks bila perlu:
sudo dnf install glibc-langpack-en

Sinkronisasi waktu (NTP)

deb/ubuntu
sudo timedatectl set-ntp true
timedatectl show-timesync --all
rhel/rocky/alma
sudo dnf install -y chrony
sudo systemctl enable --now chronyd
chronyc sources -v
chronyc tracking

Konfigurasi kunci SSH (dasar dari seluruh penguatan akses)

di mesin klien
# 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 file 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)

keduanya
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
02

Manajemen Paket

Inti perbedaan harian terletak antara apt (dpkg) dan dnf (rpm). Konsepnya sama, namun perintahnya berbeda.

Memperbarui metadata, melakukan upgrade, dan memeriksa pembaruan

deb/ubuntu
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
rhel/rocky/alma
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

deb/ubuntu
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
rhel/rocky/alma
sudo dnf install -y nginx git
sudo dnf remove nginx
sudo dnf autoremove

Mencari paket dan memeriksa isinya

deb/ubuntu
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
rhel/rocky/alma
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

deb/ubuntu
# 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
rhel/rocky/alma
# 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

deb/ubuntu
cat /var/log/apt/history.log
sudo apt-mark hold nginx        # kunci versi
sudo apt-mark unhold nginx
apt-mark showhold
rhel/rocky/alma
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
03

Perkakas Esensial

Toolchain build dan utilitas CLI harian. Perlu diperhatikan bahwa nama paket sering berbeda antarfamili.

Toolchain build dan pengembangan

deb/ubuntu
sudo apt install -y build-essential
# = gcc, g++, make, libc-dev, dpkg-dev
sudo apt install -y pkg-config autoconf automake
rhel/rocky/alma
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)

deb/ubuntu
sudo apt install -y \
  git curl wget vim tmux tree jq unzip \
  htop ncdu rsync \
  dnsutils netcat-openbsd net-tools
rhel/rocky/alma
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)
04

Jaringan

Perintah inspeksi seragam pada kedua famili, sedangkan konfigurasi sangat berbeda: netplan (Ubuntu server) dibandingkan NetworkManager/nmcli (RHEL).

Inspeksi (identik, perlu dikuasai)

keduanya
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

deb/ubuntu (netplan)
# /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 apply
rhel/rocky/alma (nmcli)
nmcli 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)

deb/ubuntu (ufw)
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
rhel/rocky/alma (firewalld)
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 --permanent
05

systemd dan Service

Bagian ini identik pada Debian/Ubuntu dan RHEL/Rocky. Setelah dikuasai, pengetahuannya berlaku untuk seluruh distribusi.

Mengelola service

keduanya
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)

keduanya
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
06

Pengguna, Grup, dan Izin

Manajemen akun, sudo, dan model izin. Hampir seluruhnya identik antarfamili.

Akun dan grup

keduanya
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

keduanya
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

keduanya
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
07

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)

keduanya
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

deb/ubuntu (PHP)
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
rhel/rocky/alma (PHP)
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
Composer (sama)
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 --version

Python melalui pyenv (untuk multiversi)

deb/ubuntu (build deps)
sudo apt install -y make build-essential libssl-dev \
  zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \
  libffi-dev liblzma-dev
rhel/rocky/alma (build deps)
sudo dnf install -y make gcc zlib-devel bzip2 bzip2-devel \
  readline-devel sqlite sqlite-devel openssl-devel \
  libffi-devel xz-devel
pyenv (sama)
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

deb/ubuntu (Docker)
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
rhel/rocky/alma (Podman)
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)

deb/ubuntu
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
rhel/rocky/alma
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

deb/ubuntu
sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql
sudo -u postgres psql
# data dir: /var/lib/postgresql/<ver>/main
rhel/rocky/alma
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
08

Hardening L1: Baseline

Tindakan minimum yang harus diterapkan pada setiap server yang terekspos ke jaringan. Berisiko rendah dengan dampak besar.

Pembaruan keamanan otomatis

deb/ubuntu
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
rhel/rocky/alma
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

keduanya
# /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)

deb/ubuntu
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
rhel/rocky/alma
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

deb/ubuntu
sudo ufw default deny incoming
sudo ufw allow OpenSSH
sudo ufw enable
sudo passwd -l root        # kunci login password root
rhel/rocky/alma
sudo firewall-cmd --set-default-zone=drop
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload
sudo passwd -l root
09

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)

deb/ubuntu (AppArmor)
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
rhel/rocky/alma (SELinux)
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

keduanya
# /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)

deb/ubuntu
sudo apt install -y auditd audispd-plugins
sudo systemctl enable --now auditd
rhel/rocky/alma
# auditd biasanya sudah terpasang
sudo systemctl enable --now auditd
sudo dnf install -y audit
contoh rule (sama)
# /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

deb/ubuntu
sudo apt install -y libpam-pwquality
# /etc/security/pwquality.conf
#   minlen = 14
#   minclass = 3
# aging default: /etc/login.defs (PASS_MAX_DAYS 90)
rhel/rocky/alma
# 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
10

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)

deb/ubuntu
sudo apt install -y aide
sudo aideinit
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
sudo aide --check
rhel/rocky/alma
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

keduanya
# /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

keduanya
# /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

keduanya
# 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

Lynis (sama)
# clone dari github lalu:
sudo ./lynis audit system
# laporan: /var/log/lynis.log  + hardening index
rhel/rocky/alma (OpenSCAP)
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
deb/ubuntu (OpenSCAP)
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>
11

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

deb/ubuntu
/var/log/syslog        # log sistem umum
/var/log/auth.log      # autentikasi / sudo / ssh
/var/log/dpkg.log      # transaksi paket
rhel/rocky/alma
/var/log/messages      # log sistem umum
/var/log/secure        # autentikasi / sudo / ssh
/var/log/dnf.log       # transaksi paket

Investigasi cepat (identik)

keduanya
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
12

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

deb/ubuntu
sudo apt install -y jq ripgrep
rhel/rocky/alma
sudo dnf install -y epel-release
sudo dnf install -y jq ripgrep

grep: penyaringan baris

keduanya
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

keduanya
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

keduanya
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

keduanya
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 9

find dan xargs: operasi massal pada banyak file

keduanya
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

keduanya
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 realtime

Memilah, menghitung, dan deduplikasi

keduanya
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

keduanya
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

keduanya
# 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