Saya menjalankan sudo-1.8.6 pada CentOS 6.5. Pertanyaan saya sangat sederhana: Bagaimana cara mencegah SHELL dari merambat dari lingkungan pengguna ke lingkungan sudo?
Biasanya orang pergi ke arah lain - mereka ingin melestarikan variabel lingkungan. Namun, saya mengalami masalah ketika pengguna saya "zabbix" yang shellnya /sbin/nologinmencoba menjalankan perintah melalui sudo. Sudo menjaga /sbin/nologinagar root tidak bisa menjalankan subshell. (Pembaruan: Bagian ini benar, tetapi itu bukan variabel lingkungan SHELL. Ini adalah nilai shell yang ditarik dari / etc / passwd yang menjadi masalah.)
Saya menyertakan tes yang menggambarkan masalah; ini bukan kasus penggunaan dunia nyata saya tetapi hanya menggambarkan bahwa pemanggil SHELL pengguna dipertahankan. Saya memiliki program yang berjalan sebagai pengguna zabbix. Itu panggilan /usr/bin/sudo -u root /tmp/doit(pemrograman berjalan seperti zabbixadalah daemon, jadi /sbin/nologinshell di file kata sandi tidak mencegahnya). /tmp/doitadalah skrip shell yang hanya memiliki:
#!/bin/sh
env > /tmp/outfile
(Modenya adalah 755, jelas). Dalam outfileSaya dapat melihat bahwa SHELLadalah /sbin/nologin. Namun, pada titik ini skrip berjalan sebagai root, melalui sudo, jadi seharusnya tidak memiliki variabel lingkungan pengguna sebelumnya, kan?
Inilah saya / etc / sudoers:
Persyaratan default kecil Default! Visiblepw Default selalu always_set_home Default env_reset Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" Default env_keep + = "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Default env_keep + = "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Defaults env_keep + = "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Defaults env_keep + = "LC_TIME LC_ALL LANGING LINGUAS _XKB_CHARSET XAUTHORITY" Secure_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin ## Izinkan root untuk menjalankan perintah apa pun di mana saja root ALL = (ALL) ALL #includedir /etc/sudoers.d
Dan ini milik saya /etc/sudoers.d/zabbix:
Default: zabbix! Requiretty zabbix ALL = (root) NOPASSWD: / tmp / doit
Sunting: Sedikit informasi lebih lanjut:
Proses menjalankan sudo adalah zabbix_agentd, dari perangkat lunak pemantauan Zabbix. Ada entri dalam /etc/zabbix/zabbix_agentd.d/userparameter_disk.conffile yang terlihat seperti:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discoveryadalah skrip Python. Saya telah memodifikasinya untuk melakukan ini:
print subprocess.check_output (['/ usr / bin / sudo', '-u', 'root', '/ tmp / doit'])
/tmp/doit cukup lakukan ini:
#! / bin / sh env >> / tmp / outfile
Saya menjalankan yang berikut ini di server Zabbix saya untuk menjalankan /usr/local/bin/zabbix_raid_discoveryskrip:
zabbix_get -s client_hostname -k 'example.disk.discovery'
Lalu saya periksa /tmp/outfile, dan saya melihat:
SHELL = / sbin / nologin JANGKA = linux USER = root SUDO_USER = zabbix SUDO_UID = 497 USERNAME = root PATH = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin MAIL = / var / mail / root PWD = / LANG = en_US.UTF-8 SHLVL = 1 SUDO_COMMAND = / tmp / doit HOME = / root LOGNAME = root SUDO_GID = 497 _ = / bin / env
Itu SHELLgaris benar-benar mengganggu saya. File ini dimiliki oleh root, jadi saya tahu itu sedang dibuat oleh pengguna root, tetapi shell dari pemanggil pengguna ( zabbix).
env_delete, tapi saya setuju inti masalahnya adalah bahwa perilaku default env_reset ...causes commands to be executed with a new, minimal environment.Kami memiliki sistem linux dengan PAM, jadi menurut halaman manual The new environment contains the ... SHELL ... (variable),. Seperti yang Anda lihat dari /etc/sudoersfile saya di atas, kami tidak mengizinkan SHELLdi env_keep. Jadi SHELLseharusnya tidak dilestarikan; kita harus memiliki pengguna root SHELL.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *ke /etc/sudoers/zabbixfile saya , dan memiliki shell yang tepat. Terima kasih, saya sekarang punya solusi. Pertanyaannya adalah, mengapa saya harus memasukkannya? Tampaknya berbahaya (dan rusak) untuk melewati SHELL penelepon tetapi saya tidak dapat menemukan tempat di mana sudo diatur untuk memodifikasinya. Saya telah berlari find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;dan tidak menemukan bendera merah; /etc/sudoershanya berisi env_string. Jadi saya tidak berpikir ada bendera sudo yang mengganggu ...
sudo bashharus memulai bash shell sebagai root dan HARUS memiliki variabel SHELL yang disetel ke nilai dari / etc / password. Anda melaporkan bahwa SHELL diatur ke (atau dipertahankan sebagai) /sbin/nologin. Itu adalah masalah keamanan, shell yang dimulai oleh root tidak boleh dikontrol oleh variabel lingkungan yang ditetapkan oleh pengguna. Itu adalah sesuatu yang harus Anda selidiki.
sudo env SHELL=/bin/sh shmemberikan prompt dengan / bin / sh yang ditetapkan sebagai variabel SHELL di sistem Anda?