我在监控通过 Nagios + NRPE 安装到 Linux 机器的 CIFS(SMB)共享文件夹时遇到了一个非常奇怪的问题。
NRPE进程在专用用户下的Linux机器上运行nrpe
:
# systemctl status nrpe
nrpe.service - Nagios Remote Program Executor
Loaded: loaded (/usr/lib/systemd/system/nrpe.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2023-05-02 14:46:47 IDT; 20h ago
Docs: http://www.nagios.org/documentation
Process: 30216 ExecStopPost=/bin/rm -f /run/nrpe/nrpe.pid (code=exited, status=0/SUCCESS)
Main PID: 30218 (nrpe)
CGroup: /system.slice/nrpe.service
└─30218 /usr/sbin/nrpe -c /etc/nagios/nrpe.cfg -f
# ps -ef | grep nrpe
nrpe 30218 1 0 May02 ? 00:00:05 /usr/sbin/nrpe -c /etc/nagios/nrpe.cfg -f
监控命令在其配置文件中定义/etc/nagios/nrpe.cfg
如下:
command[check_backups_share]=/usr/lib64/nagios/plugins/check_disk -w 7% -c 5% -p /mnt/backups
nrpe
如果我以用户身份在所有机器上手动运行该命令,它会成功:
# sudo -u nrpe bash
bash-4.2$ /usr/lib64/nagios/plugins/check_disk -w 7% -c 5% -p /mnt/backups
DISK OK - free space: /mnt/backups 2571991 MiB (61.32% inode=-);| /mnt/backups=1622248MiB;3900643;3984528;0;4194240
然而如果我称它为远程从 Nagios 来看,它在一台机器上成功,但在另一台机器上失败:
$ /usr/local/nagios/libexec/check_nrpe -2 -H Machine01 -c check_backups_share
DISK OK - free space: /mnt/backups 2575536 MiB (61.40% inode=-);| /mnt/backups=1618703MiB;3900643;3984528;0;4194240
$ /usr/local/nagios/libexec/check_nrpe -2 -H Machine02 -c check_backups_share
DISK CRITICAL - /mnt/backups is not accessible: Permission denied
上的所有其他远程 NRPE 命令均Machine02
成功。此外,如果我卸载/mnt/backups
上的文件夹Machine02
,它也会成功(对于根文件系统)。但是当它被挂载时,我收到此Permission denied
错误。
该文件夹以相同的方式安装在所有计算机上,具有相同的凭据和选项。在/etc/fstab
文件中:
//Backups-Server/backups /mnt/backups cifs vers=3.0,credentials=/path/to/creds 0 0
所以:
- 所有凭证、权限、用户、组都相同;
- 在同一用户下的所有机器上本地执行的命令产生相同的结果;
- 但在远程执行时,它在一台机器上失败,抱怨权限问题,但在所有其他机器上都成功,
- 而执行
nrpe
进程在所有机器上都以相同的方式配置,并具有相同的权限。
那么这到底是什么呢?
更新:
已解决,见下文。
答案1
更新:
感谢@NikitaKipriyanov,问题解决了。
在以下位置找到多个条目/var/log/messages
:
[root@Machine02 /]# cat /var/log/messages | grep avc | grep check_disk
May 7 17:32:01 Machine02 kernel: type=1400 audit(1683469921.442:63546): avc: denied { getattr } for pid=20931 comm="check_disk" path="/mnt/backups" dev="cifs" ino=3458764513820542747 scontext=system_u:system_r:nrpe_t:s0 tcontext=system_u:object_r:cifs_t:s0 tclass=dir permissive=0
May 7 17:32:21 Machine02 kernel: type=1400 audit(1683469941.508:63549): avc: denied { getattr } for pid=20973 comm="check_disk" path="/mnt/backups" dev="cifs" ino=3458764513820542747 scontext=system_u:system_r:nrpe_t:s0 tcontext=system_u:object_r:cifs_t:s0 tclass=dir permissive=0
May 7 17:32:41 Machine02 kernel: type=1400 audit(1683469961.575:63552): avc: denied { getattr } for pid=21025 comm="check_disk" path="/mnt/backups" dev="cifs" ino=3458764513820542747 scontext=system_u:system_r:nrpe_t:s0 tcontext=system_u:object_r:cifs_t:s0 tclass=dir permissive=0
生成策略以避免此类拒绝:
[root@Machine02 /]# cat /var/log/messages | grep avc | grep check_disk | audit2allow -M check_disk_policy
这产生了两个文件:
check_disk_policy.pp
- 二进制check_disk_policy.te
- 文本,包含以下内容:
module nrpe 1.0;
require {
type nrpe_t;
type cifs_t;
class dir getattr;
}
#============= nrpe_t ==============
#!!!! The file '/mnt/backups' is mislabeled on your system.
#!!!! Fix with $ restorecon -R -v /mnt/backups
allow nrpe_t cifs_t:dir getattr;
运行restorecon -R -v /mnt/backups
并没有帮助,所以我加载了策略:
[root@Machine02 /]# semodule -i check_disk_policy.pp
之后错误消失了。据我了解,此策略允许标有 的进程nrpe_t
(该/usr/sbin/nrpe
进程及其产生的子进程,例如/usr/lib64/nagios/plugins/check_disk
)访问 CIFS 共享文件夹。