为什么syslog是一个用户?

当我检查/var/log时,我发现了一些非常奇怪的东西。
me@me:~$ ls -lt /var/log |head -6 '
total 160368
-rw-r-----  1 syslog            adm              19919118 Jan 15 16:55 auth.log
-rw-r-----  1 syslog            adm             139702302 Jan 15 16:55 syslog
-rw-r-----  1 syslog            adm                191122 Jan 15 16:55 mail.log
-rw-r-----  1 syslog            adm               2210432 Jan 15 16:32 kern.log
-rw-r--r--  1 root              root              1741863 Jan 15 14:22 dpkg.log

注意到前四个日志文件的所有者是syslog。这很奇怪,因为我的系统上只有一个用户。
me@me~$ users
me

为什么一个文件名syslog可以是一个用户?

9我向您保证,在您的系统上不仅仅有一个用户。我知道您指的是“与账户和主目录相关的人类用户”,但是“用户”这个概念在所有系统中的含义更广泛。 - user459652
4有空的时候看看/etc/passwd文件。我数了一下,除了root用户外,还有36个角色用户。另外,试试man users命令——你对该命令的作用有个错误的假设。 - chrylis -cautiouslyoptimistic-
3个回答

这与访问您的系统的安全性和权限有关。
不仅仅是您自己的用户,还有很多其他用户,比如"root"、"daemon"、"bin"、"games"、"nobody"和"list"。
在您的系统上执行more /etc/passwd命令可以查看用户列表。您会看到很多行显示为"/usr/sbin/nologin",这意味着这些用户不能像您自己的用户一样登录使用。第三列是用户ID。所有ID低于1000的都是伪用户。第一个sudo用户(即安装系统的用户)默认为1000。
基本上,用户"syslog"被允许使用由"root"拥有的"/var/log/"目录。为了不降低目录的权限(即降低权限以便其他用户可以使用),创建了这个用户。
在Apache和MySQL中也是这样处理用户的(安装时会看到www-data用户和组以及MySQL用户和组),但它用于许多事情。有一个名为“dialout”的组,用于访问外部设备。将用户添加到此组以允许用户使用这些设备。否则,您将收到权限被拒绝的错误。它有两种方式:拒绝用户访问意味着将该用户从组中删除。

那个数字并不总是1000。我曾经在一些系统上工作过,这些系统的历史足够长,真实用户的ID从20开始。 - kasperd
3我知道,但Ubuntu总是从1000开始。例如,Redhat从500开始。 - Rinzwind
是的,但用户不一定是在本地创建的。在我的情况下,它们是通过NIS接收的,现在可能会使用LDAP。 - kasperd
1真实用户从20开始会严重破坏基于Debian的发行版。在基于Debian的系统中,UID 0-99是由Debian项目静态分配给特定用途的。 - Peter Green
很有趣,谢谢你,Rinzwind。我的系统有三个用户(包括root)的登录shell是/bin/bash;一个是/bin/sync;六个是/usr/sbin/nologin;还有21个是/bin/false - Paddy Landau
2@PaddyLandau /bin/false会在退出登录时不发出通知。nologin应该显示消息"This account is currently not available."(/etc/nologin.txt保存此通知)。 - Rinzwind
有趣的是,Rinzwind,我没有/etc/nologin.txt这个文件。但是它还是有效的! - Paddy Landau

syslog服务负责将内核和其他服务生成的日志消息写入各种日志文件、控制台和/或其他目标位置。该服务在其自己的特殊用户帐户下运行,许多其他服务也是如此。这是为了实现“最小权限原则”:
为了最大限度地减少受到被攻击者利用的已破坏或有缺陷服务(例如,一个服务存在漏洞,被攻击者利用,或者一个服务存在导致其执行随机不受欢迎操作的错误,或者一个恶意开发人员故意设计的执行恶意操作的服务)可能造成的影响,您希望每个服务只能访问其运行所需的内容,而不是其他内容。
在任何类Unix操作系统上(包括所有GNU/Linux发行版,如Ubuntu),您可以最简单地基于用户和组分配权限(主要是读取和/或写入某些文件或类似文件的设备节点的权限)。还有其他可能性,但通常设置起来更繁琐且容易出错,或者仅适用于特定环境。
所以,syslog服务在syslog用户帐户下运行。例如,如果攻击者能够让syslog服务执行他们告诉它执行的操作而不是应该执行的操作,那么syslog服务仍然受限制(由内核根据用户帐户强制执行,而不是由syslog软件本身强制执行,因为它已被入侵),只能写入日志文件(syslog用户具有写入权限的唯一文件)。因此,攻击者无法使用被入侵的syslog服务来更改同一台计算机上托管的网站或数据库的内容,因为相关文件只允许某个特定集合的其他(人类或系统)用户帐户进行写入,而不是syslog用户帐户。
为了造成比仅仅删除/修改日志文件和读取“公共”文件(对所有人都有“读取”权限)更大的伤害,攻击者首先需要利用第二个漏洞,无论是在内核中还是在某些以不同特权运行的软件中,这些软件的特权高于调用它的用户(setuid),从而获得额外的特权(特权提升)。
根据你使用的users命令,根据其手册页面显示的只是当前登录的用户。由于syslog用户是一个系统用户,它永远不会登录,因此它永远不会出现在这个列表中。你可以查看文件/etc/passwd或使用这里描述的其他方法来获取系统上所有(人员和系统)用户的列表。

因为syslog不是一个文件,它是系统使用的守护进程,用于将系统守护进程和应用程序消息(调试、错误、警告和信息)存储到文件中。
点击这里了解syslog的简要历史。
在其他发行版中,例如基于Red Hat Linux的发行版,系统的syslog输出存储在名为/var/log/messages的文件中。这取决于配置。
正如Rinzwind所说,出于安全原因,操作系统中的不同组件以特定用户身份运行,并且每个用户都有自己的权限。例如,syslog至少对/var/log文件夹具有写权限。
一个系统有许多服务,通常每个服务或一小组服务都有自己的用户。例如,apache get www-data|httpd|apache。通常这些守护用户不能获得Bash访问权限,以避免安全漏洞。