su vs sudo -s vs sudo -i vs sudo bash

89

Apa perbedaan antara perintah berikut:

su
sudo -s
sudo -i
sudo bash

Saya tahu susaya perlu tahu kata sandi root, dan karena sudosaya harus ada di sudoersfile, tetapi sekali dieksekusi apa bedanya?

Saya tahu ada perbedaan antara sudan sudo -skarena direktori home saya adalah /rootsetelah saya jalankan su, tetapi direktori home saya tetap /home/mynamesetelah sudo -s. Tapi saya curiga ini hanyalah gejala dari perbedaan mendasar yang saya lewatkan.

Snitse
sumber
3
Saya lebih suka menggunakan sudo su - cara ini Anda tidak perlu kata sandi root, dan -memastikan direktori home diatur dengan benar.
Jens Timmerman

Jawaban:

114

Dengan su, Anda menjadi pengguna lain - root secara default, tetapi berpotensi menjadi pengguna lain. Jika Anda berkata su -, lingkungan Anda akan diganti dengan lingkungan login pengguna itu juga, sehingga apa yang Anda lihat tidak dapat dibedakan dengan masuk sebagai pengguna itu. Tidak ada cara sistem dapat mengatakan apa yang Anda lakukan sementara suke pengguna lain dari tindakan oleh pengguna itu ketika mereka login.

Hal-hal yang sangat berbeda dengan sudo:

  • Perintah yang Anda jalankan sudo dijalankan sebagai target pengguna - root secara default, tetapi dapat diubah dengan -u- tetapi mencatat perintah yang Anda jalankan melaluinya, menandai mereka dengan nama pengguna Anda sehingga kesalahan dapat diberikan sesudahnya. :)

  • sudosangat fleksibel. Anda dapat membatasi perintah yang diberikan pengguna atau grup pengguna untuk dijalankan, misalnya. Dengan su, semuanya atau tidak sama sekali.

    Fitur ini biasanya digunakan untuk mendefinisikan peran. Misalnya, Anda dapat mendefinisikan grup "cadangan" yang diizinkan untuk dijalankan dumpdan tar, masing-masing memerlukan akses root untuk mencadangkan disk sistem dengan benar.

    Saya menyebutkan ini di sini karena itu berarti Anda dapat memberi seseorang sudohak istimewa tanpa memberi mereka sudo -satau sudo bashkemampuan. Mereka hanya memiliki izin yang mereka butuhkan untuk melakukan pekerjaan mereka, sedangkan dengan sumereka telah menjalankan seluruh sistem. Anda harus berhati-hati dengan ini: jika Anda memberi seseorang kemampuan untuk mengatakan sudo vi, misalnya, mereka dapat keluar vidan secara efektif memiliki kekuatan yang sama dengan sudo -s.

  • Karena mengambil kata sandi sudoer dan bukannya kata sandi root, sudomengisolasi izin antara banyak sudoer.

    Ini menyelesaikan masalah administrasi dengan su, yaitu ketika kata sandi root berubah, semua orang yang harus mengetahuinya suharus diberitahu. sudomemungkinkan kata sandi sudoers berubah secara mandiri. Faktanya, adalah umum untuk mengunci kata sandi akun pengguna root pada suatu sistem dengan sudomemaksa semua tugas sysadmin dilakukan sudo. Dalam sebuah organisasi besar dengan banyak sudoer tepercaya, ini berarti ketika salah satu sysadmin pergi, Anda tidak perlu mengubah kata sandi root dan mendistribusikannya ke admin yang masih ada.

Perbedaan utama antara sudo bashdan sudo -sadalah -slebih pendek dan memungkinkan Anda memberikan perintah untuk dieksekusi di shell default pengguna Anda dalam beberapa cara:

  1. Anda bisa mengatakan sudo -s some-commandyang berjalan di some-commandbawah shell Anda. Ini pada dasarnya singkatan sudo $SHELL -c some-command.

  2. Sebagai gantinya, Anda dapat meneruskan perintah ke input standar shell sudo -s < my-shell-script. Anda bisa menggunakan ini dengan heredoc untuk mengirim beberapa perintah ke satu sudopanggilan, menghindari keharusan mengetik sudoberulang kali.

Kedua perilaku tersebut bersifat opsional. Jauh lebih umum, Anda memberi -ssendiri, jadi itu hanya menjalankan shell pengguna Anda secara interaktif. Dalam mode itu, ini berbeda dari sudo bashyang mungkin menjalankan shell yang berbeda dari bash, karena terlihat pertama di SHELLvariabel lingkungan, dan kemudian jika itu tidak disetel, pada pengaturan shell login pengguna Anda, biasanya di /etc/passwd.

Shell dijalankan dengan sudo -smewarisi lingkungan pengguna Anda saat ini. Jika yang Anda inginkan sebenarnya adalah lingkungan yang bersih, seperti yang Anda dapatkan setelah masuk, yang Anda inginkan adalah sudo -ipenambahan yang relatif baru sudo. Secara kasar, sudo -iadalah untuk sudo -ssebagai su -adalah untuk su: itu me-reset semua tetapi variabel lingkungan kunci dan menyuruhmu kembali ke direktori home pengguna Anda. Jika Anda juga tidak memberikan perintah untuk dijalankan di bawah shell itu melalui input standar atau sudo -i some-command, itu akan menjalankan shell itu sebagai shell login interaktif, sehingga skrip startup shell pengguna Anda (mis. .bash_profile) Dijalankan kembali.

Semua ini membuat sudo -ijauh lebih aman daripada sudo -s. Mengapa? Karena jika seseorang dapat memodifikasi lingkungan Anda sebelumnya sudo -s, itu dapat menyebabkan perintah yang tidak diinginkan dijalankan. Kasus yang paling jelas adalah modifikasi SHELL, tetapi juga bisa terjadi secara kurang langsung, seperti melalui PAGERjika Anda mengatakannya di man foobawah sudo -s.

Anda mungkin berkata, "Jika mereka dapat memodifikasi PAGER, mereka dapat memodifikasi PATH, dan kemudian mereka bisa mengganti sudoprogram jahat ," tetapi seseorang yang cukup paranoid dapat mengatakan /usr/bin/sudo /bin/bashuntuk menghindari jebakan itu. Anda mungkin tidak begitu paranoid sehingga Anda juga menghindari jebakan dalam semua variabel lingkungan rentan lainnya . Apakah Anda juga ingat untuk memeriksa EDITOR, misalnya, sebelum menjalankan perintah VCS ? Demikianlah sudo -i.

Karena sudo -ijuga mengubah direktori kerja Anda menjadi direktori home pengguna Anda, Anda mungkin masih ingin menggunakannya sudo -suntuk situasi-situasi di mana Anda tahu Anda ingin tetap berada di direktori yang sama dengan cdketika Anda berlari sudo. Ini masih aman untuk sudo -idan cdkembali ke tempat Anda, meskipun.

Warren Young
sumber
2
Apa yang Anda maksud dengan 'shell out of vi'?
crisron
11
@crisron: Dari dalam vi, ketik :shdan tekan Enter. Sekarang Anda berada di sub-shell, dengan semua hak istimewa dari viproses yang menelurkan shell itu. Jika viberjalan dengan hak akses root, begitu juga shell. Atau, Anda dapat menjalankan sesuatu selain dari shell via :!cmd, membaca output dari perintah ke dalam edit buffer via :r !cmd, dll. Jika semua itu dikunci, Makefiletarget adalah skrip shell, dan Vim memiliki :makeperintah, yang secara efektif memungkinkan Anda menjalankan shell sewenang-wenang skrip dari dalam editor. Kemungkinan untuk kerusakan terlalu besar untuk ditangguhkan oleh kotak komentar ini.
Warren Young
2
jika seseorang dapat menaruh bash palsu di PATH Anda maka seseorang itu dapat menempatkan sudo palsu di PATH Anda. untuk benar-benar yakin kamu harus memanggil sudo menggunakan path lengkap:/usr/bin/sudo
lesmana
1
@lesmana: Saya sudah membahasnya dalam sebuah edit; pada dasarnya, PATHitu bukan satu-satunya masalah.
Warren Young
6
Penjelasan yang bagus; sakit kepala hebat membacanya.
lobi
27

Dari pos ubuntuforums yang saya buat beberapa waktu lalu:

Pertimbangkan eksperimen berikut:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Inilah perbedaan yang saya temukan:

Dengan sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Dengan sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Perhatikan perbedaannya $HOME. Menjadi root dan $HOMEmengatur ke rumah pengguna biasa dapat menyebabkan masalah. Misalnya, jika Anda menjalankan aplikasi grafis, pengguna normal ~/.Xauthoritydapat ditimpa oleh root. Ini menyebabkan masalah pengguna normal di kemudian hari seperti tidak dapat menjalankan aplikasi grafis tertentu melalui cron.

Untuk meringkas:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games mungkin ditetapkan oleh /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Intinya adalah sudo -iperintah yang tepat untuk dijalankan ketika Anda menginginkan shell root yang tidak ternodai oleh lingkungan pengguna.

unutbu
sumber
1
Seberapa lingkungan 'tercemar' tergantung pada konfigurasi sudo(dalam /etc/sudoersdan file terkait) juga. Pengaturan konfigurasi seperti always_set_home, env_reset, env_keep, env_checkdan env_reset, dan ini dapat bervariasi tergantung pada pengguna dan perintah. Lihat bagian 'Lingkungan perintah' dan PILIHAN SUDOERS dari halaman sudoers (5) .
Curt J. Sampson
Secara pribadi, saya menggunakan sudo -Hsketika saya ingin lingkungan yang tidak ternoda oleh pengaturan saya, karena saya menggunakan zsh dan semua akun aplikasi yang mungkin saya ubah untuk menggunakan bash. Ini membiarkan sejumlah variabel lingkungan lewat tanpa gangguan, tetapi saya biasanya menemukan variabel yang penting ditimpa oleh /etc/profile.d/*.
Ed Grimm
7

su( s witch u ser atau s ubstitute u ser) memungkinkan Anda beralih pengguna. supada dasarnya memulai contoh shell lain dengan hak istimewa dari pengguna yang dituju. Secara default itu mengalihkan Anda ke rootpengguna, jika kami ingin beralih pengguna tertentu kami harus melewati pengguna sebagai berikut:

$ su bob  # switches to bob (requires bob's password)

su -berarti variabel lingkungan akan diatur ulang ke root dan suberarti variabel lingkungan sebagai pengguna lama.

misalnya: direktori home root jika Anda menggunakan su -atau direktori home pengguna lama jika Anda menggunakannya su.

sudo ( s uper u ser jangan ) adalah utilitas baris perintah yang memungkinkan pengguna untuk menjalankan program dengan hak keamanan pengguna lain, secara default adalah superuser yaitu root. Ini menggunakan file config /etc/sudoersyang mencantumkan pengguna mana yang memiliki hak untuk tindakan tertentu

sudo harus dibaca sebagai / ˈsuːduː / . sintaks sudo commandyaitu s penyihir u ser dan melakukan perintah ini.

  • susetara dengan sudo -idan mensimulasikan login ke akun root. Direktori kerja Anda akan /root, dan itu akan membaca root .profiledll. Prompt akan berubah dari $ ke #, menunjukkan Anda memiliki akses root.

  • sudo -s meluncurkan shell sebagai root, tetapi tidak mengubah direktori kerja Anda.

  • sudo bash di mana bashperintah untuk dijalankan sudo. Perintah ini berjalan bashsebagai pengguna super.

  • Menggunakan sudodapat mencatat semua yang dilakukan seseorang.
  • Penggunaan sudomencegah pengguna harus mengetahui kata sandi root.
  • Menggunakan sudokita dapat membatasi perintah yang diizinkan untuk dijalankan.
Premraj
sumber