在 Debian 上,rsyslog 默认以 root 身份运行(由于 POSIX 兼容性)。它可以在启动后删除特权,但更干净的方法是以非特权用户身份启动。将 rsyslog 设置为以非特权用户身份运行的干净方法是什么? (哪个用户?)。在谷歌搜索时,我发现了start-stop-daemon,它显然可以使守护进程以非root身份启动。这是这样做的方法,还是有更好的方法?
答案1
从 4.1.1 开始,rsyslogd
提供了在启动后通过模拟另一个用户和/或组来删除权限的功能。
请注意,根据POSIX
标准,rsyslogd
如果存在必须绑定到下面的网络端口的侦听器,则始终需要以 root 身份启动1024
。例如,UDP监听器通常需要监听514
,因此rsyslogd
需要以root身份启动。
如果您不需要此功能,可以rsyslog
直接以普通用户身份启动。这可能是最安全的操作方式。但是,如果需要以 root 身份启动,则可以使用$PrivDropToGroup
和config 指令来指定初始化后应下降到的$PrivDropToUser
组和/或用户。rsyslogd
一旦发生这种情况,守护进程将在没有高权限的情况下运行(当然,这取决于您指定的用户帐户的权限)。
这一切都来自于rsyslog 维基,不再可用,但仍然可用档案馆
你应该读一下。
答案2
我在尝试以非特权用户身份运行 rsyslog 以从开发机器接收远程系统日志数据时发现了这个问题。假设其他人也有类似的用例,这是我发现的:
在 Ubuntu 14.04 上测试。
许多典型的 rsyslog 功能都需要 root,但不是全部。如果需要这样的功能,通常 rsyslog 会在自己的日志中抱怨。
例子有:
imuxsock
- 本地系统日志记录(无法打开/dev/log) - 您可以通过权限解决此问题 - 我不需要它imklog
- 内核日志记录 - 显然需要 root$FileOwner
- 即 chmod - 显然需要 root$ProveDropToUser/Group
- 访问控制台、广播消息 - 例如 xconsole 等,...
除此之外,只要网络模块使用非特权端口,它们就可以正常工作。此外,日志记录/假脱机目录必须可访问。值得注意的是 rsyslog.conf 似乎使用绝对路径。
rsyslog.conf 如下 - 我将进一步调整它以进行每个主机的日志记录,但这超出了范围:
#################
#### MODULES ####
#################
$ModLoad immark # provides --MARK-- message capability
# NOTE - listen on unprivileged port 2514
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 2514
# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 2514
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
# These may require root
#$FileOwner syslog
#$FileGroup adm
#$PrivDropToUser syslog
#$PrivDropToGroup syslog
#
# Where to place spool and state files
#
$WorkDirectory /home/user/rsyslog/spool
#
# Include all config files in /etc/rsyslog.d/
#
#$IncludeConfig /etc/rsyslog.d/*.conf
# Default rules for rsyslog.
#
# For more information see rsyslog.conf(5) and /etc/rsyslog.conf
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /home/user/rsyslog/log/auth.log
*.*;auth,authpriv.none -/home/user/rsyslog/log/syslog
cron.* /home/user/rsyslog/log/cron.log
daemon.* -/home/user/rsyslog/log/daemon.log
kern.* -/home/user/rsyslog/log/kern.log
user.* -/home/user/rsyslog/log/user.log
#
# Some "catch-all" log files.
#
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/home/user/rsyslog/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/home/user/rsyslog/log/messages
启动守护进程只需要将其指向您的自定义配置,并指定不同的 pid 文件以使其与系统 rsyslog 分开(并确保您具有写入权限)
$ rsyslogd -f rsyslog.conf -i ~/rsyslog/pid
确认其运行:
$ ps ux
user 24374 0.0 0.0 347632 1520 ? Ssl 10:18 0:00 rsyslogd -f rsyslog.conf -i /home/user/rsyslog/pid
$ tail ~/rsyslog/log/syslog
May 19 10:44:18 plutonium rsyslogd: [origin software="rsyslogd" swVersion="7.4.4" x-pid="26504" x-info="http://www.rsyslog.com"] start
答案3
在我的系统(Debian)上,rsyslog 由 /etc/init.d/rsyslog 启动,其中包含如下内容:
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
根据start-stop-daemon手册,我可以指定“--chuid”选项,这将使进程以另一个用户身份启动。
start-stop-daemon --start --chuid daemon --user daemon --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
因此,剩下的唯一问题是,什么是好的做法。我应该使用哪个用户?该用户将对我的 /var/log/ 具有写权限
答案4
您可以使用能力提升可执行文件的特定权限
setcap 'cap_dac_override,cap_chown,cap_syslog+epi' /usr/sbin/rsyslogd
这样它就可以作为普通用户运行所需的功能。您需要具有管理员权限才能将这些权限分配给可执行文件。
更新:如果应用程序在打开端口之前未请求该功能,则不起作用。