Pengaturan awal server Ubuntu: 9 langkah untuk memulai di server Ubuntu yang baru dipasang

Lingkungan ujiKeluarga DebianUbuntu 24.04.5 LTSakun root · pengguna biasa
Pekerjaan pengaturan awal server Ubuntu sudah diperiksa

Saat mendapat server baru, Anda menjalankan pengaturan awal server Ubuntu sekali sebelum memasang layanan apa pun. Di server Ubuntu 24.04 yang dibuat di DigitalOcean, kami terhubung sebagai root lalu mengatur secara berurutan mulai dari pembaruan paket, pengguna sudo, login dengan kunci, firewall, zona waktu, pembaruan keamanan otomatis, hingga swap, dan memastikan pengaturan tetap ada setelah reboot.

Kotak hasil di bawah adalah keluaran dari menjalankan perintah dengan urutan ini. IP server 203.0.113.10 adalah nilai contoh, dan pengguna biasa yang baru dibuat diberi nama deploy.

🎯 Poin penting
Pembaruan paket dan pemeriksaan perlu tidaknya reboot
sudo diaktifkan untuk pengguna biasa deploy
deploy (login dengan kunci diperiksa), lalu root (login diblokir)
ufw hanya mengizinkan SSH, 80, dan 443
Perubahan zona waktu dan pemeriksaan pembaruan keamanan otomatis
File swap 2GB dan pengaturan yang tetap ada setelah reboot
Prasyarat
Koneksiroot: kunci SSH untuk terhubung dan server Ubuntu 24.04

1️⃣ Pembaruan paket Ubuntu

Server yang baru dibuat pun sudah punya pembaruan yang menunggu dipasang. Setelah mengunduh daftar paket yang baru, periksa dulu apa yang akan berubah sebelum benar-benar memasang sesuatu.

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

Perintah apt-get di bawah dijalankan setelah nilai ini diatur lebih dulu. Dengan nilai ini, tidak muncul jendela yang menanyakan pengaturan selama pemasangan paket dan jawaban bawaan langsung diterapkan.

apt-get update
Hit:1 http://mirrors.digitalocean.com/ubuntu noble InRelease
Hit:2 http://mirrors.digitalocean.com/ubuntu noble-updates InRelease
Hit:3 http://mirrors.digitalocean.com/ubuntu noble-backports InRelease
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Reading package lists...

🔲 apt-get -s upgrade

apt-get -s upgrade
Calculating upgrade...
The following upgrades have been deferred due to phasing:
  libsqlite3-0
The following packages will be upgraded:
  apt apt-transport-https apt-utils bind9-dnsutils bind9-host bind9-libs
  cloud-init distro-info-data gir1.2-glib-2.0 git git-man libapt-pkg6.0t64
  libbrotli1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data liblzma5
  libmspack0t64 libpcre2-8-0 python3-jwt python3-twisted tmux
  ubuntu-pro-client ubuntu-pro-client-l10n xz-utils zlib1g
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

Opsi -s adalah simulasi yang hanya menghitung hasilnya tanpa memasang apa pun. Di server ini ada 26 paket yang akan ditingkatkan, dan libsqlite3-0 tidak ikut dalam peningkatan kali ini karena [deferred due to phasing]. Jumlah paket berbeda di setiap server tergantung waktu server dibuat dan image yang dipakai.

🔲 apt-get -y upgrade

apt-get -y upgrade
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 15.4 MB of archives.
After this operation, 398 kB of additional disk space will be used.

Setelah pemasangan selesai, daftar layanan yang dijalankan ulang muncul berikutnya.

Running kernel seems to be up-to-date.

Restarting services...
 /etc/needrestart/restart.d/systemd-manager
 systemctl restart cron.service fwupd.service multipathd.service packagekit.service polkit.service ssh.service systemd-journald.service systemd-networkd.service systemd-resolved.service systemd-timesyncd.service systemd-udevd.service udisks2.service

Service restarts being deferred:
 systemctl restart ModemManager.service
 /etc/needrestart/restart.d/dbus.service
 systemctl restart systemd-logind.service
 systemctl restart unattended-upgrades.service

Saat pembaruan yang memerlukan reboot terpasang, file /var/run/reboot-required akan dibuat. Kali ini muncul [Running kernel seems to be up-to-date.] dan file itu tidak dibuat, jadi kami lanjut ke langkah berikutnya tanpa reboot.

2️⃣ Menambah pengguna Ubuntu dan hak sudo

Pekerjaan sehari-hari dilakukan dengan pengguna biasa, dan hanya perintah administrasi yang dijalankan dengan sudo. sudo menaikkan hak akses dengan kata sandi Anda sendiri, bukan kata sandi root, sehingga tercatat siapa yang menjalankan perintah apa.

🔲 adduser deploy

adduser deploy
info: Adding user `deploy' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `deploy' (1000) ...
info: Adding new user `deploy' (1000) with group `deploy (1000)' ...
info: Creating home directory `/home/deploy' ...
info: Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for deploy
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] Y
info: Adding new user `deploy' to supplemental / extra groups `users' ...
info: Adding user `deploy' to group `users' ...

adduser adalah pembungkus useradd; alat ini membuat folder home dan grup, lalu menanyakan kata sandi dan informasi pengguna secara berurutan. Kata sandi tidak tampil di layar saat diketik, dan informasi seperti nama dan nomor telepon bisa dikosongkan dengan Enter.

🔲 usermod -aG sudo deploy

usermod -aG sudo deploy
groups deploy
deploy : deploy sudo users

🔲 su

Pengguna di grup sudo dapat menjalankan perintah administrasi dengan sudo. Beralihlah ke akun deploy dengan su dan periksa hak aksesnya.

su - deploy
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
whoami
deploy
sudo whoami
[sudo] password for deploy: 
root
exit

Dengan sudo, kata sandi deploy akan ditanyakan, dan jika benar, perintah dijalankan dengan hak akses root.

3️⃣ Mendaftarkan kunci SSH untuk pengguna baru

Pada awalnya kunci SSH hanya terdaftar untuk root, jadi login dengan kunci belum bisa untuk deploy. Salin authorized_keys milik root ke folder home deploy.

🔲 install -o deploy -g deploy

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
ls -la /home/deploy/.ssh
total 12
drwx------ 2 deploy deploy 4096 Nov  5 11:48 .
drwxr-x--- 3 deploy deploy 4096 Nov  5 11:48 ..
-rw------- 1 deploy deploy  100 Nov  5 11:48 authorized_keys

install membuat folder, menyalin file, dan mengatur pemilik serta izin sekaligus. sshd memeriksa izin dan pemilik file pengguna sebelum menerima login (StrictModes), jadi atur folder .ssh ke 700 dan authorized_keys ke 600.

🔲 ssh deploy@203.0.113.10

Jangan tutup jendela root yang sedang terbuka; periksa dulu di jendela terminal baru apakah Anda bisa terhubung sebagai deploy.

ssh deploy@203.0.113.10
whoami
deploy
🧭 Urutan pengaturan agar akses tidak terkunci
Diagram penjelasan
🧭 Langkah
🔑① Salin kunciKunci root ke deploy
➜
🪟② Cek di jendela baruJendela root tetap terbuka
➜
⛔③ Blokir login rootPermitRootLogin no
➜
🪟④ Cek di jendela baruAkses deploy tetap jalan
✅⑤ Izinkan SSHufw allow OpenSSH
➜
🧱⑥ Aktifkan ufwHanya port yang diizinkan terbuka
➜
🪟⑦ Cek di jendela baruAkses tetap jalan
Salin authorized_keys milik root ke folder home deploy.
Jangan tutup jendela root yang sedang terbuka; periksa di jendela terminal baru apakah login dengan kunci berhasil sebagai deploy.
Blokir login root hanya setelah akses deploy dipastikan. Jika tidak bisa terhubung di jendela baru, kembalikan perubahan di jendela yang dibiarkan terbuka.
Setelah memuat ulang pengaturan SSH, periksa di jendela baru apakah akses deploy masih berjalan.
Sebelum mengaktifkan firewall, tambahkan dulu aturan yang mengizinkan SSH.
Begitu diaktifkan, semua koneksi yang tidak diizinkan akan diblokir, jadi aturan yang mengizinkan SSH harus sudah ada lebih dulu.
Setelah mengaktifkan firewall, periksa di jendela baru apakah Anda bisa terhubung lagi sebagai deploy.

4️⃣ Memblokir login root SSH

Di Ubuntu 24.04, baris Include di bagian atas sshd_config memuat file di folder /etc/ssh/sshd_config.d/ lebih dulu, dan untuk pengaturan yang sama berlaku nilai yang dibaca pertama. Karena itu, sebelum mengubah pengaturan, periksa dulu nilai yang berlaku sekarang dan file tempat nilai itu berada.

/etc/ssh└─ sshd_config  di bagian atas: Include /etc/ssh/sshd_config.d/*.conf   ├─ ① sshd_config.d/50-cloud-init.conf         PasswordAuthentication no   ├─ ② sshd_config.d/60-cloudimg-settings.conf  PasswordAuthentication no   └─ ③ sshd_config baris 42                     PermitRootLogin yes → no

🔲 sshd -T

sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin yes
passwordauthentication no
sudo grep -rn 'PasswordAuthentication' /etc/ssh/sshd_config.d/
/etc/ssh/sshd_config.d/60-cloudimg-settings.conf:1:PasswordAuthentication no
/etc/ssh/sshd_config.d/50-cloud-init.conf:1:PasswordAuthentication no

Login dengan kata sandi sudah dimatikan di dua file dalam sshd_config.d, jadi yang perlu diubah hanya satu baris login root di file utama.

🔲 sed -i PermitRootLogin

sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin yes
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin no

🔲 systemctl reload ssh

sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no

sshd -t memeriksa sintaks pengaturan, dan jika tidak ada yang tampil berarti tidak ada kesalahan. Setelah memuat ulang, pastikan di jendela baru bahwa akses deploy masih berjalan, lalu coba terhubung sebagai root dan lihat bahwa aksesnya ditolak.

ssh root@203.0.113.10
root@203.0.113.10: Permission denied (publickey).

Meskipun kuncinya benar, Anda tidak bisa masuk sebagai root; pekerjaan administrasi dilakukan dengan terhubung sebagai deploy dan memakai sudo.

5️⃣ Firewall Ubuntu ufw

ufw adalah alat firewall bawaan Ubuntu, tetapi pada awalnya dalam keadaan mati. Begitu diaktifkan, semua koneksi yang tidak diizinkan akan diblokir, jadi tambahkan dulu aturan yang mengizinkan SSH lalu aktifkan paling akhir.

sudo ufw status verbose
Status: inactive

🔲 ufw allow OpenSSH

sudo ufw app list
Available applications:
  OpenSSH
sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
sudo ufw allow 80/tcp
Rules updated
Rules updated (v6)
sudo ufw allow 443/tcp
Rules updated
Rules updated (v6)
sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp

OpenSSH adalah profil yang membuka port 22, sedangkan 80 dan 443 adalah port yang dipakai web server. Aturan ditambahkan untuk IPv4 dan IPv6 sekaligus.

🔲 ufw enable

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             

Koneksi masuk diblokir secara bawaan, hanya tiga port yang diizinkan yang terbuka, dan firewall juga aktif saat booting. Setelah diaktifkan, terhubung lagi sebagai deploy di jendela baru dan periksa nomor aturannya.

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443/tcp                    ALLOW IN    Anywhere                  
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)             
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)             

6️⃣ Pengaturan zona waktu Ubuntu

Zona waktu awalnya adalah Etc/UTC. Untuk menyesuaikan waktu log dan tugas terjadwal dengan wilayah server, server yang dibuat di wilayah Singapura ini diatur ke Asia/Singapore.

timedatectl
               Local time: Thu 2026-11-05 12:00:31 UTC
           Universal time: Thu 2026-11-05 12:00:31 UTC
                 RTC time: Thu 2026-11-05 12:00:31
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

🔲 timedatectl list-timezones

timedatectl list-timezones | grep Singapore
Asia/Singapore

🔲 timedatectl set-timezone

sudo timedatectl set-timezone Asia/Singapore
timedatectl
               Local time: Thu 2026-11-05 20:00:32 +08
           Universal time: Thu 2026-11-05 12:00:32 UTC
                 RTC time: Thu 2026-11-05 12:00:32
                Time zone: Asia/Singapore (+08, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Yang berubah hanya baris Local time dan Time zone; sinkronisasi jam (NTP) dan waktu UTC tetap sama.

7️⃣ unattended upgrades: pembaruan keamanan otomatis

Ubuntu memasang pembaruan keamanan secara otomatis dengan paket unattended-upgrades, dan paket ini sudah terpasang dan aktif sejak awal. Karena itu, pada langkah ini Anda memeriksa apakah paket ini aktif dan apa yang dipasangnya secara otomatis.

🔲 dpkg-query -W

dpkg-query -W unattended-upgrades
unattended-upgrades	2.9.1+nmu4ubuntu1
systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timer
enabled
enabled
enabled

🔲 cat 20auto-upgrades

cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Angka 1 pada kedua nilai berarti sekali sehari, dan jika diubah menjadi 0, pembaruan otomatis akan mati. Apa yang dipasang ditentukan oleh file 50unattended-upgrades.

grep -vE '^[[:space:]]*(//|$)' /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
	"${distro_id}:${distro_codename}";
	"${distro_id}:${distro_codename}-security";
	"${distro_id}ESMApps:${distro_codename}-apps-security";
	"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::DevRelease "auto";

Di antara sumber yang diizinkan ada -security tetapi tidak ada -updates, jadi pembaruan biasa tidak dipasang otomatis dan hanya pembaruan keamanan yang dipasang. Untuk menerima pembaruan biasa secara otomatis juga, hapus tanda komentar pada baris -updates di file ini.

🔲 unattended-upgrade

sudo unattended-upgrade --dry-run --debug
Starting unattended upgrades script
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-security

Ini dua baris terakhir dari eksekusi yang sama.

No packages found that can be upgraded unattended and no pending auto-removals
The list of kept packages can't be calculated in dry-run mode.

--dry-run hanya menghitung apa yang akan dilakukan pembaruan otomatis tanpa memasang apa pun. Karena pembaruan paket sudah dilakukan, hasilnya menunjukkan tidak ada paket yang perlu dipasang otomatis. Catatan eksekusi sebenarnya tersimpan di folder /var/log/unattended-upgrades/.

sudo ls -l /var/log/unattended-upgrades/
total 32
-rw-r--r-- 1 root root     0 Nov  5 20:00 unattended-upgrades-dpkg.log
-rw-r--r-- 1 root root     0 Nov  5 17:34 unattended-upgrades-shutdown.log
-rw-r--r-- 1 root root 29093 Nov  5 20:04 unattended-upgrades.log

8️⃣ Pengaturan memori swap Ubuntu

Server ini memiliki memori 1GB dan pada awalnya tidak punya swap. Sebelum memasang aplikasi, buat file swap 2GB dan daftarkan ke /etc/fstab agar tetap aktif setelah reboot.

free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       161Mi       4.0Mi       631Mi       633Mi
Swap:             0B          0B          0B
df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        24G  2.0G   22G   9% /

🔲 fallocate -l 2G /swapfile

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
ls -lh /swapfile
-rw------- 1 root root 2.0G Nov  5 20:04 /swapfile

🔲 mkswap /swapfile

sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387

🔲 swapon /swapfile

sudo swapon /swapfile
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       160Mi       4.0Mi       632Mi       632Mi
Swap:          2.0Gi          0B       2.0Gi

🔲 tee -a /etc/fstab

swapon hanya mengaktifkannya untuk saat ini; agar tetap aktif setelah reboot, tambahkan satu baris ke fstab.

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/swapfile none swap sw 0 0

9️⃣ Pemeriksaan pengaturan awal server Ubuntu

Setelah Anda memastikan pengaturan tetap ada setelah reboot, pengaturan awal Ubuntu selesai.

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

Setelah reboot, terhubung lagi sebagai deploy.

uptime -p
up 2 minutes
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             
timedatectl | head -n 4
               Local time: Thu 2026-11-05 20:06:35 +08
           Universal time: Thu 2026-11-05 12:06:35 UTC
                 RTC time: Thu 2026-11-05 12:06:35
                Time zone: Asia/Singapore (+08, +0800)
systemctl is-active unattended-upgrades ssh.socket
active
active

Swap, pengaturan SSH, firewall, zona waktu, dan pembaruan otomatis semuanya sama seperti sebelum reboot. Berikutnya, aplikasi Node.js dipasang di server ini dengan PM2 dan Nginx.

🔢 FAQ & Konten yang Direkomendasikan

Tidak apa-apa dibiarkan. Paket yang tertinggal karena [deferred due to phasing] adalah pembaruan yang sedang dirilis bertahap. Ubuntu awalnya merilis sebagian pembaruan hanya ke sebagian server, lalu jika tidak ada masalah, memperluas rilisnya ke semua server. Pembaruan keamanan tidak dirilis bertahap, dan paket yang tertinggal akan ikut dipasang pada peningkatan berikutnya setelah cakupan rilis diperluas.

Tugas pembaruan otomatis berjalan sekali sehari, dan dua timer apt-daily.timer dan apt-daily-upgrade.timer menjalankannya dengan penundaan acak dari waktu yang ditentukan. Di server ini, jadwal berikutnya untuk apt-daily-upgrade.timer adalah keesokan harinya pukul 06:27:59 (+08). Jika server mati dan melewatkan waktu itu, tugas bisa langsung berjalan saat booting berikutnya, sehingga tugas apt kadang menunggu sebentar tepat setelah booting.

Dengan pengaturan bawaan, tidak. Nilai bawaan Automatic-Reboot di 50unattended-upgrades adalah false, dan di pengaturan server ini baris itu juga tidak diaktifkan. Saat pembaruan yang memerlukan reboot terpasang, file /var/run/reboot-required akan dibuat, jadi lakukan reboot sendiri saat file itu ada.

ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Buktikan bahwa Anda manusia: 2   +   4   =