![为什么 /var/mail 设置了 gid?](https://linux22.com/image/217489/%E4%B8%BA%E4%BB%80%E4%B9%88%20%2Fvar%2Fmail%20%E8%AE%BE%E7%BD%AE%E4%BA%86%20gid%EF%BC%9F.png)
我正在学习 UNIX 文件权限,我发现在我的 Ubuntu 系统上,/var/mail 设置了 setgid 位。为什么是这样?
$ ls /var/mail/ -dl
drwxrwsr-x 2 root mail 4096 Feb 23 05:57 /var/mail/
我正在读的这本书说:
当您有一组需要共享大量文件的用户时,Setgid 非常有用。让它们在具有 setgid 属性的公共目录中工作意味着将为新文件自动设置正确的组所有权,即使组中的人员不共享相同的主要组。
该描述听起来对 /var/mail 没有任何用处,因为用户不直接操作该目录。
在 /var/mail 中创建的文件最终以组所有者“mail”结束,但这不是已经发生了吗?只有“mail”可以在目录(和根目录)中创建新文件。
我能想到的唯一有用的情况是当系统管理员添加一个新的邮件帐户时sudo touch /var/mail/<user>
。该文件仍然具有“邮件”组所有者。
答案1
本地电子邮件不是仅由一项服务处理,而是由多项服务处理。除了实际的邮件传输代理(简称 MTA:通常是postfix
、exim
或sendmail
类似的)之外,还可以有邮件过滤/后处理实用程序(如旧的procmail
)、启用远程访问用户邮箱的服务(各种 POP 和 IMAP 服务)、邮件列表管理实用程序等等。
从历史上看,此类服务通常以 root 身份运行,因为它们需要能够访问每个用户的邮箱,并且邮箱只能由其所有者访问。但很快就发现,以 root 身份运行电子邮件系统是一大块容易被利用的代码。很多很多漏洞被发现并修复,但最终人们认识到以 root 身份运行邮件系统是一个坏主意。解决方案是创建组mail
,并将需要将邮件传送到用户邮箱的电子邮件服务的所有组件设置为该组。
但当时邮件相关工具的数量已经非常庞大,无法保证完美的转换。因此,作为保险,用户收件箱的父目录/var/mail/
也被设置为 setgid 邮件,以确保所有将邮件发送到用户收件箱的软件都会自动创建具有正确组的任何新收件箱。剩下的任务是修补或配置所有邮件传送程序,以便为用户的收件箱使用正确的 umask:当邮件系统以 root 身份运行时,他们可以使用 umask 077(用于权限-rw-------
),但在组mail
生效的情况下,umask-rw-rw----
需要007(权限)。但这是对现有要求的调整,而不是添加新的责任来执行正确的组,所以这是一个更简单的更改。
(当然,添加正确组的执行绝对是一个好主意 - 但是使/var/mail
setgidmail
使代码发生变化选修的而且不那么紧急。)
是的,大多数将邮件发送到用户收件箱的程序/var/mail/
都会自动为用户创建一个邮箱文件(如果该文件不存在) - 因此,在用户收到第一封传入电子邮件之前,让用户没有邮箱文件是完全有效的。
总而言之:/var/mail/
setgidmail
一方面是针对错误配置的邮件传送程序的保险政策,一方面是从电子邮件服务始终全面运行的黑暗时代过渡过来的历史遗留物root
。
答案2
在 /var/mail/ 中,各个文件都是投递用户的 uid。这允许任何用户能够在他们没有权限的目录中写入或读取自己 uid 的文件。如果不设置gid,用户就无法删除自己的邮件。
用户确实会读取和删除自己的邮件文件 - 参见 mutt。