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
).
sumber
sudo env SHELL=/bin/sh sh
memberikan prompt dengan / bin / sh yang ditetapkan sebagai variabel SHELL di sistem Anda?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 manualThe new environment contains the ... SHELL ... (variable)
,. Seperti yang Anda lihat dari/etc/sudoers
file saya di atas, kami tidak mengizinkanSHELL
dienv_keep
. JadiSHELL
seharusnya tidak dilestarikan; kita harus memiliki pengguna rootSHELL
.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 berlarifind /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
dan tidak menemukan bendera merah;/etc/sudoers
hanya berisienv_
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.Jawaban:
Maka jawabannya adalah yang
sudo
memiliki bug. Pertama, solusinya: Saya menempatkan ini di/etc/sudoers.d/zabbix file
:dan sekarang sub-perintah dipanggil dari
zabbix_raid_discovery
kantor.Sebuah tambalan untuk memperbaiki ini ada di sudo 1.8.15. Dari pengelola, Todd Miller:
sumber
Provide default values for $SHELL, $TERM and $PATH if not set.
adalah:... if not set.
. Nilai apa pun yang ditetapkan akan disimpan oleh sudo. Siapa yang mengatur SHELL?Pertanyaannya adalah tentang di mana saya pikir masalahnya, tetapi ternyata masalahnya bukan apa yang terjadi pada variabel SHELL, tetapi apa yang sebenarnya dilakukan sudo. Sebagai contoh:
Sejauh ini bagus. ... tapi masalahnya adalah sudo menggunakan cangkang penelepon alih-alih callee, bertentangan dengan dokumen. Memang, jika saya mengganti shell saya dengan mengedit / etc / passwd, Anda dapat melihat bahwa sudo mengikuti shell dari penelepon dan tidak
SHELL
:Saya tidak dapat menggunakan
sudo -i
karena saya tidak ingin mensimulasikan login awal.sudo -s
akan bekerja, selama saya memiliki perintah yang tepat dalam file sudoers. Namun, perilaku yang diharapkan (seperti tercermin dalam halaman manual: "The new environment contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables
") adalah agar shell menjadi milik callee. Jika Anda melihatPATH
,HOME
,LOGNAME
, danUSER
variabel untuk sudo env Anda akan melihat hal-hal root.SHELL
harus menjadi shell root juga.sumber