以非特权用户身份启动 rsyslog

以非特权用户身份启动 rsyslog

在 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

这样它就可以作为普通用户运行所需的功能。您需要具有管理员权限才能将这些权限分配给可执行文件。

更新:如果应用程序在打开端口之前未请求该功能,则不起作用。

相关内容