Tôi đang chạy sudo-1.8.6 trên CentOS 6.5. Câu hỏi của tôi rất đơn giản: Làm cách nào để ngăn SHELL lan truyền từ môi trường của người dùng sang môi trường sudo?
Thông thường mọi người đang đi theo một cách khác - họ muốn bảo tồn một biến môi trường. Tuy nhiên, tôi gặp sự cố khi người dùng của tôi "zabbix" có vỏ đang /sbin/nologin
cố chạy lệnh thông qua sudo. Sudo đang bảo tồn /sbin/nologin
để root không thể chạy subshells. (Cập nhật: Phần này là đúng, nhưng nó không phải là biến môi trường SHELL. Đó là giá trị shell đang được kéo từ / etc / passwd mới là vấn đề.)
Tôi bao gồm một bài kiểm tra minh họa vấn đề; đây không phải là trường hợp sử dụng trong thế giới thực của tôi mà chỉ đơn giản minh họa rằng SHELL của người dùng được bảo tồn. Tôi có một chương trình chạy như người dùng zabbix
. Nó gọi /usr/bin/sudo -u root /tmp/doit
(chương trình đang chạy như zabbix
một daemon, vì vậy /sbin/nologin
shell trong tệp mật khẩu không ngăn được nó). /tmp/doit
là một tập lệnh shell chỉ đơn giản là có:
#!/bin/sh
env > /tmp/outfile
(chế độ của nó là 755, rõ ràng). Trong outfile
tôi có thể thấy đó SHELL
là /sbin/nologin
. Tuy nhiên, tại thời điểm này, tập lệnh đang chạy dưới quyền root, thông qua sudo, vì vậy nó không nên có các biến môi trường của người dùng trước đó, phải không?
Đây là / etc / sudoers của tôi:
Mặc định Yêu cầu Mặc định! Mặc định luôn_set_home Mặc định env_reset Mặc định env_keep = "MÀU SẮC HIỂN THỊ HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" Mặc định env_keep + = "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Mặc định env_keep + = "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Mặc định env_keep + = "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Mặc định env_keep + = "LC_TIME LC_ALL NGÔN NGỮ LINGUAS _XKB_CHARSET XAUTHORITY" Mặc định safe_path = / sbin: / bin: / usr / sbin: / usr / bin: / usr / local / bin: / usr / local / sbin ## Cho phép root chạy bất kỳ lệnh nào ở bất cứ đâu root ALL = (ALL) ALL #includedir /etc/sudoers.d
Và đây là /etc/sudoers.d/zabbix
:
Mặc định: zabbix! Yêu cầu zabbix ALL = (root) NOPASSWD: / tmp / doit
Chỉnh sửa: Thêm một chút thông tin:
Quá trình chạy sudo là zabbix_agentd
, từ phần mềm giám sát Zabbix. Có một mục trong /etc/zabbix/zabbix_agentd.d/userparameter_disk.conf
tệp trông giống như:
UserParameter = example.disk.discovery, / usr / local / bin / zabbix_ston_discovery
/usr/local/bin/zabbix_raid_discovery
là một kịch bản Python. Tôi đã sửa đổi nó để làm điều này:
in sub process.checkDefput (['/ usr / bin / sudo', '-u', 'root', '/ tmp / doit'])
/tmp/doit
chỉ đơn giản là làm điều này:
#! / thùng / sh env >> / tmp / outfile
Tôi chạy phần sau trên máy chủ Zabbix của mình để chạy /usr/local/bin/zabbix_raid_discovery
tập lệnh:
zabbix_get -s client_hostname -k 'example.disk.discovery'
Sau đó, tôi kiểm tra /tmp/outfile
và tôi thấy:
SHELL = / sbin / nologin HẠN = linux NGƯỜI DÙNG = 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 NKT = / LANG = en_US.UTF-8 SHLVL = 1 SUDO_COMMAND = / tmp / doit TRANG CHỦ = / root ĐĂNG NHẬP = root SUDO_GID = 497 _ = / bin / env
SHELL
Dòng đó thực sự làm phiền tôi. Tệp được sở hữu bởi root, vì vậy tôi biết nó được tạo bởi người dùng root, nhưng shell là từ người dùng gọi ( zabbix
).
env_delete
, nhưng tôi đồng ý mấu chốt của vấn đề là hành vi mặc định của env_reset ...causes commands to be executed with a new, minimal environment.
Chúng tôi có một hệ thống linux với PAM, vì vậy theo trang man , The new environment contains the ... SHELL ... (variable)
. Như bạn có thể thấy từ /etc/sudoers
tập tin của tôi ở trên, chúng tôi không cho phép SHELL
trong env_keep
. Vì vậy SHELL
không nên bảo tồn; chúng ta nên có người dùng root SHELL
.
zabbix ALL=(root) NOPASSWD: /bin/env SHELL=/bin/sh /tmp/doit *
của mình /etc/sudoers/zabbix
và nó có vỏ phù hợp. Cảm ơn, bây giờ tôi có một cách giải quyết. Câu hỏi là, tại sao tôi cần phải bao gồm nó? Có vẻ nguy hiểm (và bị hỏng) khi vượt qua SHELL của người gọi nhưng tôi không thể tìm thấy nơi nào sudo được đặt để sửa đổi nó. Tôi đã chạy find /etc/sudoers /etc/sysconfig -type f -exec grep env_ {} \;
và tôi không tìm thấy cờ đỏ nào; /etc/sudoers
chứa env_
chuỗi duy nhất . Vì vậy, tôi không nghĩ rằng có một lá cờ sudoers can thiệp ...
sudo bash
nên bắt đầu một bash shell là root và nó PHẢI có biến SHELL được đặt thành giá trị từ / etc / password. Bạn báo cáo rằng SHELL đang được đặt thành (hoặc được bảo tồn là) /sbin/nologin
. Đó là một vấn đề bảo mật, shell bắt đầu bằng root không được kiểm soát bởi một biến môi trường được đặt bởi người dùng. Đó là điều bạn phải điều tra.
sudo env SHELL=/bin/sh sh
cung cấp lời nhắc với / bin / sh được đặt làm biến SHELL trong hệ thống của bạn không?