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/nologin
mencoba menjalankan perintah melalui sudo. Sudo menjaga /sbin/nologin
agar 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 zabbix
adalah daemon, jadi /sbin/nologin
shell di file kata sandi tidak mencegahnya). /tmp/doit
adalah skrip shell yang hanya memiliki:
#!/bin/sh
env > /tmp/outfile
(Modenya adalah 755, jelas). Dalam outfile
Saya dapat melihat bahwa SHELL
adalah /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.conf
file yang terlihat seperti:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_raid_discovery
/usr/local/bin/zabbix_raid_discovery
adalah 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_discovery
skrip:
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 SHELL
garis 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/sudoers
file saya di atas, kami tidak mengizinkan SHELL
di env_keep
. Jadi SHELL
seharusnya tidak dilestarikan; kita harus memiliki pengguna root SHELL
.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
ke /etc/sudoers/zabbix
file 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/sudoers
hanya berisi env_
string. Jadi saya tidak berpikir ada bendera sudo yang mengganggu ...
sudo bash
harus 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 sh
memberikan prompt dengan / bin / sh yang ditetapkan sebagai variabel SHELL di sistem Anda?