Perintah su Linux: beralih pengguna dan shell login

su adalah alat yang digunakan untuk menjalankan shell atau perintah dengan ID pengguna dan grup alternatif. Jika tidak ada pengguna yang ditentukan, biasanya ditujukan ke root, dan menggunakan su --login user beralih ke lingkungan yang mirip dengan masuk langsung sebagai pengguna tersebut.

su user sederhana mempertahankan direktori kerja saat ini dan sebagian variabel lingkungan, yang dapat bercampur dengan pengaturan pengguna lain. Untuk pergantian akun interaktif, su --login user biasanya digunakan, dan jika tujuannya hanya untuk menjalankan satu perintah administratif, sebaiknya pertimbangkan terlebih dahulu apakah sudo berbasis kebijakan lebih tepat.

Apa itu perintah su?

su adalah singkatan dari substitute user and group ID, dan menjalankan perintah menggunakan ID pengguna dan grup alternatif. Jika nama pengguna tidak diberikan, su mencoba memulai shell interaktif sebagai akun root.

su dari util-linux melakukan autentikasi, serta manajemen akun dan sesi melalui PAM (Pluggable Authentication Modules). Kata sandi yang diperlukan, apakah hanya grup tertentu yang bisa menggunakan su, dan di mana upaya login dicatat, dapat berbeda tergantung pada PAM distribusi dan pengaturan keamanan.

Artikel ini didasarkan pada implementasi util-linux, yang banyak digunakan di Linux. Perilaku yang tepat dan file konfigurasi spesifik sistem dapat ditemukan di halaman manual su resmi util-linux.

Sintaks Dasar dan Pergantian Akun

Sintaks berikut adalah pola; ganti placeholder dengan akun dan opsi yang sebenarnya.

su [options] [-] [user [arguments...]]

Jika tidak ada pengguna yang ditentukan, ia akan mencoba beralih ke akun root.

su

Ketika dijalankan oleh pengguna biasa, biasanya akan meminta kata sandi dari akun root target. Jika akun root terkunci atau kebijakan PAM tidak mengizinkannya, berpindah akun tidak bisa dilakukan meskipun kata sandi pengguna yang benar diketahui.

Untuk beralih ke pengguna tertentu, tentukan nama akun. Akun deploy dalam contoh harus ada dan Anda harus diizinkan menggunakannya; ganti dengan akun yang sesuai.

su deploy

Untuk kembali ke shell semula, jalankan exit di shell yang telah dipindahkan atau tekan Ctrl+D.

exit

Perbedaan antara su dan su --login

Kategori su user su --login user
direktori kerja pertahankan direktori saat ini pindah ke direktori home pengguna target
variabel lingkungan hanya sebagian diubah dan mungkin bercampur dengan lingkungan yang ada sebagian besar dibersihkan untuk menyiapkan lingkungan login pengguna target
PATH Terpengaruh oleh pengaturan sistem dan PAM Inisialisasi agar sesuai dengan lingkungan login target
Metode startup shell Shell interaktif standar Mulai sebagai login shell
Situasi yang disarankan Dimaksudkan untuk kasus terbatas di mana retensi lingkungan diinginkan Pengalihan pengguna interaktif normal

Manual util-linux menyarankan penggunaan --login untuk menghindari efek samping dari lingkungan campuran. Bentuk pendek - memiliki makna yang sama.

su --login deploy
su - deploy

Perubahan dalam lingkungan shell login

Membersihkan sebagian besar variabel lingkungan yang ada

su --login dari util-linux membersihkan lingkungan yang ada kecuali TERM, COLORTERM, NO_COLOR, dan variabel yang diizinkan secara eksplisit. Kemudian menginisialisasi HOME, SHELL, USER, LOGNAME, dan PATH berdasarkan pengguna target.

Lingkungan akhir juga dapat mencerminkan nilai yang ditambahkan atau diubah oleh modul PAM, sehingga tidak boleh diasumsikan sama persis di seluruh distribusi.

Pindah ke direktori home pengguna target

--login memulai shell login setelah pindah ke direktori home pengguna target. Setelah beralih, Anda dapat memeriksa pengguna, home, dan direktori kerja dengan perintah berikut.

id
printf '%s\n' "$HOME"
pwd

Perubahan file inisialisasi shell

Shell login membaca file inisialisasi untuk login sesuai dengan aturan shell yang digunakan. Untuk Bash, hal ini dapat dipengaruhi oleh pengaturan sistem dan pengguna seperti /etc/profile dan ~/.bash_profile. Periksa manual shell target dan pengaturan akun untuk urutan yang sebenarnya.

Opsi su yang sering digunakan

Opsi Fungsi Penggunaan dan perhatian
-, -l, --login Beralih ke lingkungan shell login Umumnya disarankan untuk pergantian interaktif
-c command, --command command Mengirimkan satu perintah ke shell Harus memeriksa penanda kutip dan status keluar
-s shell, --shell shell Menentukan shell yang akan dijalankan Dalam akun shell terbatas, mungkin diabaikan jika pemanggil bukan root
-m, -p, --preserve-environment Pertahankan lingkungan saat ini sebanyak mungkin Diabaikan saat digunakan dengan --login, gunakan dengan hati-hati untuk keamanan
-w list, --whitelist-environment list Pertahankan variabel lingkungan tertentu saat berganti login Dipisahkan dengan koma, kecuali variabel akun inti
-P, --pty Buat terminal pseudo terpisah dalam sesi Membuat pseudoterminal terpisah untuk mengurangi risiko berbagi terminal secara langsung
-g group Tentukan grup default Hanya pengguna root yang bisa menggunakan
-G group Tentukan grup sekunder Hanya pengguna root yang bisa menggunakan dan dapat diulang

Jalankan satu perintah sebagai pengguna lain

Jalankan satu perintah dengan -c

Jika Anda tidak perlu tetap berada di shell interaktif, Anda dapat mengirim perintah ke shell pengguna target dengan -c.

su -c 'id' deploy

Saat perintah selesai, su juga akan berhenti dan kembali ke shell asli. Karena string perintah diinterpretasikan ulang oleh shell target, berhati-hatilah dengan tanda kutip, ekspansi variabel, dan waktu pengalihan.

Menjalankan perintah dalam lingkungan login

Untuk menjalankan perintah dalam lingkungan login dan direktori rumah pengguna target, gunakan --login bersama-sama.

su --login -c 'pwd; id' deploy

Kedua perintah yang dihubungkan dengan titik koma dijalankan di dalam shell pengguna target. Jangan langsung melewatkan string yang dibuat secara dinamis dengan hak istimewa yang ditinggikan jika string tersebut mencakup input eksternal, karena ini berisiko menyebabkan injeksi perintah.

Memeriksa status keluar dari perintah

su umumnya mengembalikan status keluar dari perintah yang dijalankan. Dalam implementasi util-linux, ia mengembalikan 126 jika perintah tidak dapat dijalankan, 127 jika perintah tidak ditemukan, dan 1 untuk kesalahan umum sebelum eksekusi perintah.

su -c '/usr/local/bin/check-job' deploy
status=$?
printf 'exit=%s\n' "$status"

Dalam otomatisasi, periksa status keluar selain output. Jalur /usr/local/bin/check-job adalah contoh; ganti dengan program yang benar-benar tersedia.

Menangani Shell dan Akun Terbatas

Shell Default dari Pengguna Target

Kecuali ditentukan lain, shell yang diatur dalam entri passwd akun target umumnya digunakan, dan jika tidak ada, secara default menggunakan /bin/sh. Saat memeriksa informasi akun, jangan sembarangan mengubah seluruh /etc/passwd; sebaliknya, query seperti berikut.

getent passwd deploy

Menentukan Shell dengan -s

Anda dapat menentukan shell yang berbeda dengan -s.

su -s /bin/sh -c 'id' deploy

Jika shell akun target adalah shell terbatas yang tidak tercantum di /etc/shells, shell yang ditentukan oleh pengguna biasa bisa diabaikan. Hanya karena root bisa melewati batasan tidak berarti aman membuka shell interaktif untuk akun layanan.

Menghormati Tujuan Akun Layanan

Akun dengan nologin atau false yang diatur sebagai shell mereka kemungkinan tidak dimaksudkan untuk login interaktif. Jika Anda perlu bekerja dengan akun semacam itu, jalankan hanya perintah yang diperlukan dan periksa terlebih dahulu apakah ada perintah manajemen yang disediakan oleh layanan atau jika fitur systemd tersedia.

Gunakan pelestarian variabel lingkungan dengan hati-hati

Arti dari --preserve-environment

Opsi --preserve-environment mempertahankan lingkungan saat ini tanpa mengatur ulang HOME, SHELL, USER, atau LOGNAME. Ini akan diabaikan jika ditentukan bersama dengan --login.

su --preserve-environment deploy

Kecuali dalam kasus khusus di mana pengaturan pengguna pemanggil harus diteruskan apa adanya, mencampur lingkungan rumah dan eksekusi akun target dapat menyebabkan kepemilikan berkas atau perubahan konfigurasi yang tidak terduga.

Hanya izinkan variabel yang diperlukan

Dalam util-linux, Anda dapat mempertahankan hanya variabel yang diperlukan dengan menggabungkan --login dan --whitelist-environment.

su --login --whitelist-environment=LANG,LC_ALL deploy

HOME, SHELL, USER, LOGNAME, dan PATH dikecualikan dari daftar putih. Variabel locale juga dapat mempengaruhi perilaku program, jadi hanya teruskan nilai yang benar-benar diperlukan.

Perbedaan antara su dan sudo

Kategori su sudo
Tujuan Utama Jalankan shell atau perintah sebagai pengguna lain Jalankan perintah sebagai pengguna lain yang diizinkan oleh kebijakan
Otentikasi Umum Kata sandi pengguna target Kata sandi pengguna yang memanggil
Cakupan hak akses Lanjutkan menggunakan hak istimewa akun target di shell yang dialihkan Dapat dibatasi dengan perintah dan kondisi yang diizinkan
Audit dan pelacakan Fokus pada catatan pergantian sesi, dan pelacakan perintah internal memerlukan pelacakan terpisah Permintaan eksekusi dapat dicatat melalui plugin kebijakan/log
Situasi yang sesuai Jika akun target membutuhkan lingkungan interaktif Menjalankan satu perintah administratif atau hak istimewa minimum per peran

Metode otentikasi dan pencatatan dapat bervariasi menurut PAM dan kebijakan, jadi tabel di atas adalah perbandingan umum. Jika hanya perintah root yang diperlukan, sudo, yang dapat membatasi hak istimewa per perintah, seringkali lebih sesuai daripada su, yang berbagi kata sandi akun. Untuk penggunaan rinci, lihat panduan sudo dan konfigurasi sudoers.

Alasan tidak beralih ke akun root

Akun root mungkin terkunci

Beberapa distribusi menonaktifkan login dengan kata sandi untuk akun root secara default dan menggunakan administrasi melalui sudo. Dalam kasus ini, memasukkan kata sandi pengguna saat ini di su - tidak akan berhasil.

Jika pengguna memiliki hak istimewa sudo dan kebijakan mengizinkannya, shell root bergaya login dapat dibuka sebagai berikut, tetapi jika hanya perintah tertentu yang diperlukan, lebih aman menggunakan sudo command daripada shell administrator.

sudo -i

PAM atau kebijakan grup mungkin memberlakukan pembatasan

Kebijakan di /etc/pam.d/su dapat membatasi penggunaan su untuk kelompok tertentu atau memberlakukan persyaratan otentikasi tambahan. Jangan secara sembarangan melemahkan pengaturan PAM untuk mendapatkan hak istimewa; sebaliknya, berikan administrator sistem dengan tugas yang diperlukan dan akun target.

Mungkin ada masalah dengan status akun target.

Pergantian mungkin gagal karena akun kedaluwarsa, terkunci, direktori home salah, shell terbatas, atau izin file. Jika Anda seorang administrator, periksa penyebabnya dengan getent passwd user, alat manajemen akun, dan log otentikasi.

Saat root menjalankan sebagai pengguna lain

runuser mungkin lebih cocok untuk otomatisasi

Manual util-linux merekomendasikan runuser saat dijalankan sebagai pengguna lain dari proses dengan hak istimewa tinggi atau skrip root. runuser bukan set-user-ID, tidak memerlukan otentikasi kata sandi, dan menggunakan konfigurasi PAM terpisah.

runuser -u backup -- /usr/local/bin/backup-job

Akun backup dan program dalam contoh harus ada; pastikan targetnya sebelum menjalankan. Manual runuser menjelaskan opsinya. runuser adalah alat administratif yang digunakan oleh root, jadi ini bukan perintah untuk pengguna biasa agar memperoleh hak istimewa sebagai pengganti sudo.

Jika sesi PAM tidak diperlukan, pertimbangkan kembali tujuannya

Jika Anda hanya perlu mengubah ID pengguna/grup dan atribut izin untuk menjalankan sebuah program dan sesi PAM tidak diperlukan, util-linux juga menyarankan setpriv sebagai alternatif. Alat ini langsung mengelola hak istimewa dan atribut keamanan, jadi sebaiknya hanya digunakan oleh administrator yang memahami pengaturan pengguna, grup, grup tambahan, dan kemampuan secara tepat.

Pisahkan sesi dengan terminal semu

Pemisahan sesi dengan --pty

--pty membuat terminal semu terpisah antara sesi asli dan sesi target, dan su menyalurkan input dan output. Ini dapat meningkatkan keamanan dengan mencegah kedua sesi berbagi terminal yang sama secara langsung dalam sesi interaktif.

su --pty --login deploy

Bukan sesi login systemd penuh

Bahkan ketika menggunakan su --login, itu tidak membuat sesi login baru yang sepenuhnya nyata dari perspektif systemd-logind. Jika Anda membutuhkan tugas yang memerlukan layanan pengguna, kursi (seats), atau batas sesi, Anda harus mempertimbangkan alat yang sesuai untuk tujuan tersebut, seperti systemd-run atau machinectl, dengan memeriksa opsi dan hak yang sesuai.

Tindakan pengamanan

  • Jangan membagikan kata sandi root atau kata sandi pengguna lain dengan beberapa orang.
  • Jangan meletakkan kata sandi di baris perintah, riwayat shell, skrip, atau pipa.
  • Jangan biarkan shell root terbuka lebih lama dari yang diperlukan; gunakan exit segera setelah menyelesaikan pekerjaan.
  • Segera setelah melakukan switch, periksa id, pwd, dan HOME untuk menghindari kebingungan antara pengguna dan jalur.
  • Untuk perintah yang dijalankan dengan hak istimewa yang lebih tinggi, pertama tinjau opsi, jalur target, dan hasil dari ekspansi wildcard.
  • Jangan menganggap log disimpan; sebaliknya, periksa pengaturan dan kebijakan retensi aktual dari PAM, jurnal, dan log autentikasi.

Perintah yang dijalankan setelah membuka shell root dengan su terpisah dari catatan autentikasi su itu sendiri. Jika audit per perintah diperlukan, sebaiknya dirancang bersamaan dengan audit shell, pencatatan terpusat, atau metode seperti sudo yang menyediakan kebijakan per perintah.

Masalah umum dan solusi

Gejala Kemungkinan penyebab Cara memeriksa
Authentication failure Kesalahan kata sandi target, akun terkunci, atau batasan PAM Periksa akun target dan kebijakan/log otentikasi
Tidak dapat menemukan perintah setelah beralih PATH pengguna target berbeda Periksa command -v dan printf '%s\n' "$PATH"
Direktori home tidak berubah Gunakan su user tanpa opsi login Gunakan su --login user
Pengaturan pengguna tampaknya bercampur Gunakan su reguler yang sebagian mempertahankan lingkungan yang ada Periksa env, HOME, USER
Shell yang ditentukan tidak berjalan Shell terbatas atau pembatasan izin panggilan Periksa getent passwd dan /etc/shells

Pertanyaan yang Sering Diajukan

Password siapa yang Anda masukkan untuk su?

Umumnya, Anda memasukkan password pengguna target yang ingin Anda alihkan. Namun, jika root menjalankannya atau kebijakan PAM menggunakan metode autentikasi yang berbeda, perilakunya bisa bervariasi. Tidak menampilkan karakter saat kata sandi dimasukkan adalah hal yang normal.

Apa bedanya antara su dan su -?

su menjalankan shell root sambil mempertahankan direktori saat ini dan sebagian lingkungan. su - berpindah ke home root dan menyiapkan lingkungan login. Dalam util-linux, bentuk login disarankan untuk mengurangi pencampuran lingkungan.

Bagaimana cara memeriksa pengguna saat ini setelah beralih dengan su?

id berguna untuk memeriksa baik pengguna dan grup nyata maupun efektif secara bersamaan. Jika Anda hanya memerlukan nama pengguna sederhana, Anda dapat menggunakan whoami, tetapi untuk memeriksa grup tambahan, id memberikan lebih banyak informasi.

Apakah boleh menempatkan kata sandi su dalam skrip?

Tidak. Kata sandi bisa terekspos di file, informasi proses, atau log. Jika otomatisasi dilakukan sebagai root, buat metode menggunakan runuser yang terbatas. Jika ini untuk eskalasi hak istimewa sebagai pengguna biasa, buat cara yang tidak menyematkan kata sandi, seperti menggunakan aturan sudoers hak minimal atau layanan khusus untuk tugas tersebut.

Ringkasan

Untuk pergantian akun interaktif umum, Anda bisa menggunakan su --login user, dan untuk satu perintah, su -c 'command' user. su user yang sederhana dapat mencampur lingkungan, jadi sebaiknya periksa id, HOME, dan pwd setelah pergantian.

Jika tujuannya adalah untuk menjalankan hanya satu perintah root, sudo, yang menyediakan kontrol dan audit izin per-perintah, mungkin lebih tepat. Saat menjalankan sebagai pengguna lain dalam otomatisasi root, pertimbangkan runuser. Anda juga dapat memeriksa alat dasar terkait bersama-sama dalam daftar perintah yang umum digunakan di Linux (bahasa Inggris).