SSD Nodes Learn
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-07-24

Cara menjalankan service tanpa user root

Menjalankan service sebagai root berisiko tinggi. Gunakan unprivileged user atau fitur DynamicUser pada systemd untuk menerapkan prinsip least privilege.

Mengapa tidak menjalankan semuanya sebagai root

Root dapat melakukan apa saja pada mesin: membaca setiap file, mengubah pengaturan apa pun, atau menghapus seluruh sistem. Saat Anda menjalankan layanan sebagai root, Anda memberikan semua kekuatan tersebut kepada layanan tersebut. Jika layanan memiliki bug yang dapat dieksploitasi penyerang, mereka tidak hanya mendapatkan layanan tersebut, mereka mendapatkan root, dan root adalah seluruh server. Menjalankan layanan sebagai pengguna tanpa hak istimewa (unprivileged user) membatasi kerusakan. Bug pada layanan yang berjalan sebagai akun terbatas hanya memberikan penyerang akses ke apa yang dapat dijangkau akun tersebut, yang seharusnya hampir tidak ada.

Ini adalah prinsip hak istimewa terendah (least privilege): berikan setiap bagian sistem akses yang tepat sesuai kebutuhan tugasnya, dan tidak lebih. Ini adalah kebiasaan paling efektif untuk membatasi radius dampak (blast radius) dari sebuah kompromi, dan pada server modern, penerapannya hampir tidak memerlukan biaya.

Akun khusus per layanan

Pendekatan klasik adalah membuat pengguna sistem terpisah untuk setiap layanan, yang hanya memiliki file layanan tersebut dan tidak dapat login. Akun sistem untuk aplikasi web mungkin terlihat seperti ini:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin appsvc

Setiap flag sangat penting. --system menjadikannya akun layanan, bukan login manusia. --no-create-home melewati pembuatan direktori home yang tidak diperlukan. --shell /usr/sbin/nologin berarti meskipun penyerang berhasil mendapatkan akun tersebut, mereka tidak dapat membuka shell dengannya. Akun tersebut hanya ada untuk memiliki sebuah proses dan file-filenya.

Kemudian berikan pengguna tersebut hanya file yang dibutuhkannya, dan tidak lebih:

sudo chown -R appsvc:appsvc /opt/myapp

Sekarang layanan tersebut membaca dan menulis ke direktorinya sendiri dan tidak memiliki kepentingan di tempat lain di disk. Jika layanan tersebut dieksploitasi, file yang dapat diubah penyerang terbatas pada /opt/myapp; akun tersebut masih dapat membaca apa pun yang dapat dibaca oleh publik (world-readable), tetapi tidak dapat memodifikasi sisa sistem.

Biarkan systemd menjalankannya sebagai pengguna tersebut

Setelah akun tersedia, instruksikan systemd untuk menjalankan layanan sebagai akun tersebut. Dalam unit file, satu baris melakukannya:

[Service]
ExecStart=/opt/myapp/bin/server
User=appsvc
Group=appsvc

User=appsvc berarti proses dimulai dengan hak istimewa terbatas akun tersebut, bukan root. Ini adalah cara standar dan umum untuk menjalankan aplikasi di bawah systemd, dan sangat disarankan untuk dilakukan pada setiap layanan yang Anda buat unit-nya.

Atau lewati akun sepenuhnya dengan DynamicUser

systemd dapat melangkah lebih jauh dengan membuatkan pengguna sementara untuk Anda, yang hanya ada selama layanan berjalan. Atur DynamicUser=yes dan Anda tidak perlu mengelola akun sama sekali:

[Service]
ExecStart=/opt/myapp/bin/server
DynamicUser=yes
StateDirectory=myapp

Saat mulai, systemd mengalokasikan user ID yang tidak terpakai; saat berhenti, systemd melepaskannya. Layanan tersebut juga mendapatkan /tmp pribadi, tampilan filesystem yang sebagian besar bersifat read-only, dan direktori state yang dapat ditulis di bawah /var/lib/myapp yang disiapkan oleh StateDirectory=. Untuk layanan mandiri yang hanya membutuhkan direktori state sendiri, DynamicUser=yes adalah cara termudah untuk mendapatkan isolasi yang kuat, karena tidak ada akun jangka panjang yang dapat menjadi target penyerang.

Menulis unit secara manual cukup rumit, dan pengaturan direktif pengamanan (hardening) adalah bagian yang paling penting. Generator dalam panduan layanan dan timer systemd dapat mengisi opsi-opsi ini untuk Anda agar unit tersebut benar sejak pertama kali.

Bagaimana ini berkaitan dengan bagian lainnya

Hak istimewa terendah adalah salah satu lapisan, dan ia bekerja bersama lapisan lainnya, bukan menggantikannya. firewall default-deny mengontrol apa yang dapat mencapai layanan; menjalankannya sebagai pengguna tanpa hak istimewa mengontrol apa yang dapat dilakukan layanan jika ditembus; dan SSH yang diperkuat menjaga penyerang agar tidak masuk ke mesin sejak awal. Tidak ada satu pun dari ini yang cukup, dan secara bersama-sama, ini berarti bug pada satu layanan tidak akan menjadi kompromi pada seluruh server.

Sebelum melanjutkan, jalankan daftar periksa pengamanan untuk seluruh mesin dan buat salinan personal untuk digunakan:

ToolVPS hardening checklist

FAQ

Mengapa saya tidak boleh menjalankan layanan sebagai root?

Karena root dapat melakukan apa saja pada mesin, layanan yang berjalan sebagai root yang dieksploitasi akan menyerahkan seluruh server kepada penyerang, bukan hanya layanan tersebut. Jalankan layanan sebagai akun terbatas tanpa hak istimewa untuk membatasi kerusakan pada apa pun yang dapat diakses akun tersebut. Gunakan root hanya untuk administrasi, dan jalankan setiap layanan yang berjalan terus-menerus sebagai pengguna terbatas.

Bagaimana cara membuat pengguna yang tidak dapat login?

Jalankan sudo useradd --system --no-create-home --shell /usr/sbin/nologin NAME. Shell nologin berarti akun tersebut tidak dapat membuka sesi interaktif meskipun kredensialnya dicuri, --system menandainya sebagai akun layanan, dan --no-create-home melewati pembuatan direktori home yang tidak diperlukan. Berikan kepemilikan hanya pada file miliknya sendiri dengan chown.

Apa itu systemd DynamicUser?

DynamicUser=yes memerintahkan systemd untuk membuat pengguna sementara untuk layanan yang hanya ada selama layanan tersebut berjalan, sehingga Anda tidak perlu mengelola akun jangka panjang. Ini juga memberikan layanan tersebut /tmp pribadi, tampilan filesystem yang sebagian besar bersifat read-only, dan direktori state yang terkelola. Ini adalah cara termudah untuk menjalankan layanan mandiri di bawah identitas sementara dengan hak istimewa rendah.

Apakah menjalankan sebagai pengguna non-root menggantikan firewall?

Tidak. Keduanya melindungi hal yang berbeda. Menjalankan sebagai pengguna tanpa hak istimewa membatasi apa yang dapat dilakukan layanan jika ditembus, sedangkan firewall membatasi apa yang dapat mencapai layanan tersebut. Gunakan keduanya, bersama dengan SSH yang diperkuat, agar setiap lapisan menutupi apa yang tidak dapat dilakukan oleh lapisan lainnya.

File apa yang harus dimiliki oleh pengguna layanan?

Hanya file yang benar-benar dibutuhkan oleh layanan, dan tidak lebih. Berikan akun tersebut kepemilikan atas direktori kerja dan datanya sendiri, dan biarkan semua hal lainnya dimiliki oleh root. Pola yang baik adalah sudo chown -R svc-app:svc-app /opt/svc-app untuk direktori aplikasi, sementara konfigurasi di bawah /etc tetap dimiliki oleh root dan hanya dapat dibaca oleh layanan. Tujuannya adalah jika proses tersebut terkompromi, file yang dapat diubah terbatas pada datanya sendiri, bukan sisa sistem.

#security#least-privilege#systemd#users#hardening#linux