Bagaimana cara membuat sudo melindungi variabel lingkungan saya?

47

Menggunakan sudo 1.7.4p4 pada Solaris 5.10 dan sudo 1.6.7p5 pada RHEL4 u6 Saya tidak bisa melihat bagaimana cara melestarikan variabel lingkungan saya, misalnya $ PYTHONPATH. Saya telah menambahkan baris ini ke sudoers, tetapi tidak ada bedanya:

Defaults !env_reset

Apakah saya melakukan sesuatu yang salah, atau apakah instalasi sudo sama sekali tidak menghargai flag env_reset?

Sunting: Setidaknya pada Solaris, kami menemukan bahwa masalah ini tergantung pada shell! Shell root standar adalah Bourne, jika kita menjalankan bash di bawah sudo ( sudo bash),! Env_preset akan melestarikan lingkungan (termasuk PATH dan LD_LIBRARY_PATH). Ini adalah perilaku yang agak membingungkan yang harus saya katakan.

aknuds1
sumber
stackoverflow.com/questions/8633461/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

44

Gunakan dengan hati-hati, ada masalah keamanan dengan sudo dan variabel.

Dari man sudoerssaya temukan bahwa Anda harus menggunakan

Default env_reset
Default env_keep + = "PYTHONPATH OETERVARIABLE YETANOTHER"

Di Ubuntu, sudomempertahankan beberapa variabel. sudo -ilebih seperti masuk sebagai root dan kemudian menjalankan perintah. Keduanya mungkin tidak nyaman, yang pertama untuk sudo nano myfilemeninggalkan file yang dimiliki root di dalam rumah Anda dan yang terakhir untuk sudo -i nano myfileakan mencoba untuk membuka / root / myfile.


Lari

sudo printenv PATH

dan lihat apa yang memberi. Ini dia memberi

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

sebagai contoh. Sekarang jalankan sudo visudodan tambahkan baris

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

mengganti dengan apa yang Anda temukan sebelumnya. Tambahkan jalur baru ke sana jika Anda perlu.

Tentang perpustakaan:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Distribusi Linux membutuhkan banyak perhatian PATH, dan Anda harus benar-benar berhati-hati sebelum menggunakannya. Berhati-hatilah untuk menambahkan jalur seperti " ." atau /home/username, itu tidak aman.

Salah satu bahaya menambahkan jalur adalah membuka kemungkinan file pada jalur ini dieksekusi root, membuka jendela dalam keamanan sistem yang dapat dieksploitasi oleh perangkat lunak berbahaya. Mungkin ada bahaya lain. Pastikan Anda tahu apa yang Anda lakukan. Melewati sudolangkah-langkah keamanan dapat membuat Solaris Anda seaman Windows XP.

pengguna39559
sumber
Terima kasih untuk sarannya. Setidaknya pada Solaris, tampaknya env_keep hanya berfungsi sebagian, karena mengabaikan PATH dan LD_LIBRARY_PATH. Mungkin sudo dibangun dengan pengaturan yang membuatnya menolak untuk mempertahankan variabel "berbahaya"?
aknuds1
Apakah itu berfungsi dengan vairable lain, seperti AKNUDS? Anda juga dapat menjalankan sudo sudo -V (ya, dua kali sudo!) Dan lihat apa yang dikatakannya. Di sini solusi di atas berfungsi baik dengan PYTHONPATH, tetapi PATH benar-benar tampak istimewa. Masalah sebenarnya adalah dengan PATH. Di Ubuntu mereka membangun sudo yang dengan sengaja mengatur ulang PATH.
user39559
env_keep memelihara PYTHONPATH dan HOME untuk saya, jadi jelas ada beberapa penyaringan yang terjadi.
aknuds1
Dalam solusi yang direvisi, Anda menyarankan agar saya memasang kawat sudo PATH dengan memodifikasi secure_path, bukan? Saya rasa saya tidak ingin melakukan itu. Kami mungkin dekat dengan jawaban untuk pertanyaan saya; Saya pikir sudo dibangun untuk mengabaikan reset_env dan mengabaikan variabel seperti PATH dan LD_LIBRARY_PATH, ketika ditentukan dengan env_keep. Saya pikir saya bisa melakukannya tanpa melestarikan PATH / LD_LIBRARY_PATH di bawah sudo, itu bukan masalah besar, tetapi masih menarik untuk mengetahui mengapa itu tidak akan berhasil :)
aknuds1
Itu tidak akan berhasil karena sudopenulis berhati-hati mencegah Anda melakukannya. Anda tidak ingin perpustakaan jahat dimuat karena ditemukan di jalur yang digunakan oleh sudo. Jadi, itu sebabnya ini diatur ulang. Jika Anda mengkodekan hal-hal yang dimaksudkan untuk dijalankan oleh root, salin ke direktori sistem yang sesuai.
user39559
8

Mengotak-atik sudoersharus dilakukan dengan hati-hati, seperti yang orang lain katakan.

Pendekatan yang lebih sederhana untuk kasus yang lebih sederhana ketika ada variabel lingkungan tertentu yang ingin Anda pertahankan adalah dengan hanya melewati variabel lingkungan yang Anda inginkan secara langsung melalui sudo (ini ditampilkan seperti [VAR=value]dalam bantuan cmdline sudo).

Lihat contoh kecil ini di mana saya juga mendemonstrasikannya untuk lebih dari satu variabel.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Untuk PYTHONPATHcontoh asli dalam pertanyaan, gunakan saja yang berikut:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Membuat alias untuk hal semacam ini sangat berguna. Seperti itu:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'
Russ
sumber
1
mungkin bagus untuk membuatnya - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - lalu gunakan sudopy some_script.py
Able Mac
@ AmbleMac Anda benar. Itu kesalahan ... Saya akan memperbaikinya. Terima kasih!
Russ
3

Defaults !env_resetPenampilan Anda OK, dengan asumsi Anda tidak juga memanggil sudo dengan -Eopsi tersebut.

Anda dapat mencoba menghapus entri itu sepenuhnya.

Sudahkah Anda memverifikasi bahwa Anda mengedit file sudoers yang benar? Saya menduga itu bisa /etc/sudoersatau /usr/local/etc/sudoerstergantung pada bagaimana itu diinstal. Apakah Anda mengeditnya menggunakan visudo?

Bagaimana Anda menjalankan sudo? sudo python, sudo su, sudo su -, sudo -s, Sesuatu yang lain? Hanya sudo pythondan sudo suakan melestarikan lingkungan Anda.

Apa yang env | grep PYTHONPATHdikatakan? Jika tidak ada, pastikan PYTHONPATH diekspor dengan menjalankan export PYTHONPATHdan mencoba lagi.

Apa yang sudo env | grep PYTHONPATHdikatakan? Jika mencetak nilai yang diharapkan, maka yang lain menimpa nilai PYTHONPATH Anda. Mungkin root .bashrc atau .bash_profile atau file konfigurasi sistem.

Mikel
sumber
1
Saya cukup yakin saya mengedit sudoer yang benar, dengan awalan instalasi yang sesuai dengan sudo. Saya menjalankan sudo sebagai "sudo su". Sayangnya, saya harus kembali kepada Anda, dalam beberapa hari ini, sesuai dengan saran Anda yang lain. Terima kasih!
aknuds1
1
Coba ubah pengaturan yang tidak penting seperti editoratau passpromptuntuk melihat apakah Anda memiliki file yang benar. Atau gunakan strace, dtrace, truss, atau sejenisnya dan lihat file apa yang dibuka.
Mikel
env | grep PYTHONPATH sebagai pengguna saya mencetak nilai yang diharapkan, di bawah sudo bagaimanapun, tidak ada yang dicetak. Mengedit sudoers, saya dapat memastikan bahwa PYTHONPATH dipertahankan dengan memodifikasi "env_keep". Namun, env_keep tidak akan melindungi PATH atau LD_LIBRARY_PATH. Saya kira sudo memiliki batasan keamanan untuk tidak mempertahankan variabel seperti PATH dan LD_LIBRARY_PATH? Pengaturan build-time mungkin?
aknuds1
1
! env_reset diabaikan sejauh yang saya tahu, tapi saya bisa mengecek besok. Saya yakin env_delete tidak disetel, tetapi saya juga bisa memeriksanya.
aknuds1
1
Saya telah mengkonfirmasi bahwa! Env_reset diabaikan dan env_delete tidak disetel.
aknuds1
-1

Menurut dokumentasi Ubuntu untuk LD_LIBRARY_PATH :

Anda harus menggunakan file konfigurasi /etc/ld.so.conf.d/*.conf

Kemudian:

  1. Tambahkan ld.sofile konfigurasi /etc/ld.so.conf.d/dengan path file AndaLD_LIBRARY_PATH

  2. Perbarui cache dengan:

    sudo ldconfig -v
    
OlPo
sumber
Bagus, tetapi pertanyaannya bukan tentang Ubuntu. Petunjuk: Lain kali lihat tag di bawah pertanyaan.
DavidPostill