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

Cara jalankan service tanpa akses root

Elakkan risiko keselamatan jika perkhidmatan digodam. Gunakan akaun unprivileged atau fungsi DynamicUser dalam systemd untuk mengehadkan akses sistem.

Mengapa tidak jalankan semua sebagai root

Root boleh melakukan apa sahaja pada mesin: membaca setiap fail, mengubah sebarang tetapan, atau memadam keseluruhan sistem. Apabila anda menjalankan perkhidmatan sebagai root, anda menyerahkan semua kuasa tersebut kepada perkhidmatan itu. Jika perkhidmatan mempunyai pepijat yang boleh dieksploitasi oleh penyerang, mereka bukan sahaja mendapat perkhidmatan tersebut, tetapi mereka mendapat root, dan root adalah keseluruhan pelayan. Menjalankan perkhidmatan sebagai pengguna tanpa keistimewaan (unprivileged user) mengehadkan kerosakan. Pepijat dalam perkhidmatan yang berjalan sebagai akaun terhad hanya memberikan penyerang apa yang boleh dicapai oleh akaun tersebut, yang sepatutnya hampir tiada.

Ini adalah prinsip keistimewaan paling rendah (principle of least privilege): berikan setiap bahagian sistem akses yang tepat yang diperlukan untuk menjalankan tugasnya, dan tiada lebih daripada itu. Ini adalah tabiat paling berkesan untuk mengehadkan radius letupan (blast radius) sesuatu pencerobohan, dan pada pelayan moden, ia hampir tidak memerlukan kos untuk dilaksanakan.

Akaun khusus bagi setiap perkhidmatan

Pendekatan klasik adalah dengan mencipta pengguna sistem yang berasingan untuk setiap perkhidmatan, iaitu pengguna yang hanya memiliki fail perkhidmatan tersebut dan tidak boleh log masuk. Akaun sistem untuk aplikasi web mungkin kelihatan seperti ini:

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

Setiap flag adalah penting. --system menjadikannya akaun perkhidmatan, bukan log masuk manusia. --no-create-home melangkau direktori home yang tidak diperlukan. --shell /usr/sbin/nologin bermaksud walaupun penyerang berjaya menguasai akaun tersebut, mereka tidak boleh membuka shell dengannya. Akaun tersebut wujud hanya untuk memiliki satu proses dan fail-failnya.

Kemudian berikan pengguna tersebut hanya fail yang diperlukan, dan tiada lebih:

sudo chown -R appsvc:appsvc /opt/myapp

Kini perkhidmatan membaca dan menulis dalam direktorinya sendiri dan tidak mempunyai kepentingan di mana-mana bahagian lain pada cakera. Jika ia dieksploitasi, fail yang boleh diubah oleh penyerang adalah terhad kepada /opt/myapp; akaun tersebut masih boleh membaca apa sahaja yang boleh dibaca oleh dunia (world-readable), tetapi ia tidak boleh mengubah bahagian sistem yang lain.

Biarkan systemd menjalankannya sebagai pengguna tersebut

Setelah akaun wujud, beritahu systemd untuk menjalankan perkhidmatan sebagai akaun tersebut. Dalam fail unit, satu baris sahaja sudah memadai:

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

User=appsvc bermaksud proses bermula dengan keistimewaan terhad akaun tersebut dan bukannya root. Ini adalah cara biasa dan standard untuk menjalankan aplikasi di bawah systemd, dan ia berbaloi untuk dilakukan bagi setiap perkhidmatan yang anda tulis unitnya.

Atau langkau akaun sepenuhnya dengan DynamicUser

systemd boleh melangkah lebih jauh dengan mencipta pengguna sementara untuk anda, yang wujud hanya semasa perkhidmatan berjalan. Tetapkan DynamicUser=yes dan anda tidak perlu menguruskan akaun sama sekali:

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

Semasa bermula, systemd memperuntukkan ID pengguna yang tidak digunakan; semasa berhenti, ia melepaskannya. Perkhidmatan juga mendapat /tmp peribadi, iaitu pandangan baca-sahaja bagi kebanyakan sistem fail, dan direktori keadaan (state directory) yang boleh ditulis di bawah /var/lib/myapp yang disediakan oleh StateDirectory=. Untuk perkhidmatan mandiri yang hanya memerlukan direktori keadaan sendiri, DynamicUser=yes adalah cara paling mudah untuk mendapatkan pengasingan yang kuat, kerana tiada akaun jangka panjang untuk disasarkan oleh penyerang.

Menulis unit secara manual adalah rumit, dan mendapatkan arahan pengukuhan (hardening) yang betul adalah bahagian yang paling penting. Penjana dalam panduan perkhidmatan dan pemasa systemd boleh mengisi pilihan ini untuk anda supaya unit tersebut betul pada percubaan pertama.

Bagaimana ini sesuai dengan bahagian lain

Keistimewaan paling rendah adalah satu lapisan, dan ia berfungsi bersama lapisan lain dan bukannya menggantikannya. firewall default-deny mengawal apa yang boleh sampai ke perkhidmatan; menjalankannya sebagai pengguna tanpa keistimewaan mengawal apa yang boleh dilakukan oleh perkhidmatan jika ia diceroboh; dan SSH yang diperkukuh menghalang penyerang daripada memasuki mesin tersebut dari awal lagi. Tiada satu pun daripada ini yang mencukupi, dan secara bersama-sama, ia bermaksud pepijat dalam satu perkhidmatan tidak akan menjadi pencerobohan terhadap keseluruhan pelayan.

Sebelum anda meneruskan, jalankan senarai semak pengukuhan untuk keseluruhan mesin dan jana salinan peribadi untuk rujukan anda:

ToolVPS hardening checklist

FAQ

Mengapa saya tidak patut menjalankan perkhidmatan sebagai root?

Kerana root boleh melakukan apa sahaja pada mesin, perkhidmatan yang berjalan sebagai root yang dieksploitasi akan menyerahkan keseluruhan pelayan kepada penyerang, bukan sekadar perkhidmatan tersebut. Menjalankan perkhidmatan sebagai akaun terhad yang tanpa keistimewaan mengehadkan kerosakan kepada apa sahaja yang boleh dicapai oleh akaun tersebut. Simpan root untuk pentadbiran, dan jalankan setiap perkhidmatan jangka panjang sebagai pengguna yang dihadkan.

Bagaimanakah saya mencipta pengguna yang tidak boleh log masuk?

Jalankan sudo useradd --system --no-create-home --shell /usr/sbin/nologin NAME. Shell nologin bermaksud akaun tersebut tidak boleh membuka sesi interaktif walaupun kredentialnya dicuri, --system menandakannya sebagai akaun perkhidmatan, dan --no-create-home melangkau direktori home yang tidak diperlukan. Berikan pemilikan hanya untuk failnya sendiri dengan chown.

Apakah itu systemd DynamicUser?

DynamicUser=yes memberitahu systemd untuk mencipta pengguna sementara bagi perkhidmatan yang wujud hanya semasa ia berjalan, jadi anda tidak perlu menguruskan akaun jangka panjang. Ia juga memberikan perkhidmatan /tmp peribadi, iaitu pandangan sistem fail yang sebahagian besarnya adalah baca-sahaja, dan direktori keadaan yang diuruskan. Ia adalah cara paling mudah untuk menjalankan perkhidmatan mandiri di bawah identiti sementara yang mempunyai keistimewaan rendah.

Adakah menjalankan sebagai pengguna bukan-root menggantikan firewall?

Tidak. Ia melindungi perkara yang berbeza. Menjalankan sebagai pengguna tanpa keistimewaan mengehadkan apa yang boleh dilakukan oleh perkhidmatan jika ia diceroboh, manakala firewall mengehadkan apa yang boleh sampai ke perkhidmatan tersebut. Gunakan kedua-duanya, bersama dengan SSH yang diperkukuh, supaya setiap lapisan melindungi apa yang tidak dapat dilindungi oleh lapisan lain.

Fail apakah yang patut dimiliki oleh pengguna perkhidmatan?

Hanya fail yang benar-benar diperlukan oleh perkhidmatan, dan tiada lebih daripada itu. Berikan akaun tersebut pemilikan bagi direktori kerja dan datanya sendiri, dan biarkan semua yang lain dimiliki oleh root. Corak yang baik adalah sudo chown -R svc-app:svc-app /opt/svc-app untuk direktori aplikasi, manakala konfigurasi di bawah /etc kekal dimiliki oleh root dan hanya boleh dibaca oleh perkhidmatan. Matlamatnya adalah jika proses tersebut diceroboh, fail yang boleh diubahnya terhad kepada datanya sendiri, bukan bahagian sistem yang lain.

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