设置 Apache 用户的 umask

Posted

技术标签:

【中文标题】设置 Apache 用户的 umask【英文标题】:Setting the umask of the Apache user 【发布时间】:2010-09-30 12:22:09 【问题描述】:

我正在设置 LAMP 服务器,并希望将 Apache 的 umask 设置为 002,以便所有 Apache 创建的文件都设置了组写入权限位(因此同一组的成员可以覆盖文件)。

有人知道怎么做吗?我知道在Ubuntu上,你可以使用/etc/apache2/envvars文件来配置umask,但是服务器运行的是CentOS。

更新 这个问题与我刚才问的另一个问题(Linux users and groups for a LAMP server)有关。如果愿意,请使用最佳设置更新此其他问题,以便让开发人员用户在可以编辑 apache 用户创建的文件的服务器上。

【问题讨论】:

我在解决 Ubuntu 10.04 LTS 上的 apache 问题时来到这里。最初,添加 /etc/apache2/envvars 不起作用。执行“apt-get update”和“apt-get upgrade”后重新启动。它开始按预期工作。 (注意 apache 的版本现在列为“2.2.14-5ubuntu8.4”,恐怕我没有拉它以前的样子。)无论如何,如果您遇到问题,请尝试升级。 在 Ubuntu 上,我无法通过简单地使用 apache2ctl restart(或 apache2ctl graceful)重新启动它来使其工作。但是停止然后开始工作...service apache2 restart 也有效(service apache2 graceful 没有)。 【参考方案1】:

对于 CentOS 和其他 Red Hat 发行版,将 umask 设置添加到 /etc/sysconfig/httpd 并重新启动 apache。

[root ~]$ echo "umask 002" >> /etc/sysconfig/httpd [root ~]$ service httpd 重启

更多信息:Apache2 umask | MDLog:/sysadmin

对于 Debian 和 Ubuntu 系统,您可以类似地编辑 /etc/apache2/envvars

【讨论】:

谢谢,这对我有用。是否可以通过虚拟主机配置设置 umask? 不,您不能通过虚拟主机配置设置 apache 进程 umask。 在 Ubuntu 上,我无法通过使用apache2ctl restart(或apache2ctl graceful)简单地重新启动它来工作。但是停止然后开始工作...service apache2 restart 也有效(service apache2 graceful 没有)。 @MattB. 那是因为优雅并没有真正杀死主要的 apache 进程。它告诉所有分叉的孩子完成他们正在做的事情(满足您的最后一个请求)然后死亡。新的孩子是使用新的配置更改创建的。某些配置更改需要杀死并重新启动父级,而 umask 就是其中之一。我希望这是有道理的。 这在 Centos7.4 上不起作用,但洛蒂的回答确实如此,尽管这对我来说更有意义......【参考方案2】:

这是“CentOS 7 apache umask”在 Google 搜索结果中的第一个结果,所以我将分享在 CentOS 7 上完成这项工作所需要做的事情。

在 CentOS 7 中,echo "umask 002" >> /etc/sysconfig/httpd - 方法对我不起作用。

我确实通过创建文件夹 /etc/systemd/system/httpd.service.d 覆盖了 systemd 启动文件,并在那里创建了一个文件 umask.conf,其中包含以下行:

[Service]
UMask=0007

已启动,它对我有用。

【讨论】:

也适用于 Debain,除了路径应该是 /etc/systemd/system/apache2.service.d/override.conf UMask=0007 使用 owner=r/w、group=r/w 和 others=none 创建文件。对 owner=r/w、group=r/w 和 others=r 使用 Umask=0002,即对所有者或组成员使用读/写,对所有其他人使用只读。 UMask=0002 是正确的掩码,至少对我来说是这样。 apache 用户拥有的 httpd 服务创建具有 -rw-rw-r-- 权限的文件(例如 error.log、activity.log、debug.log 等)。添加到 apache 组的用户将拥有对这些文件的完全访问权限。【参考方案3】:

Apache 从其父进程(即启动 Apache 的进程)继承其 umask;这通常应该是/etc/init.d/ 脚本。因此,在该脚本中添加 umask 命令。

【讨论】:

完美。在带有 Apache 2 的 Debian 上运行良好(在这种情况下,要修改的脚本的名称是 /etc/init.d/apache2) 下面 Patrick Fisher 的回答给出了更好的建议,因为直接修改 apache init 脚本很危险 - 您的所有更改可能会在下次更新时丢失。 我应该将umask 准确地放在那个文件的哪个位置? 不幸的是,这是一个旧问题,已接受旧答案,在 Redhat/CentOS 7/8 中不起作用,它已放弃 /etc/init.d 结构。跨度> 【参考方案4】:

/etc/apache2/envvars 添加umask 命令 对我来说似乎不是一个好主意,不仅因为文件名(仅提及变量)而且还基于此评论在该文件中找到:

# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.

这表明 /etc/apache2/envvars 可能来自执行 Apache 相关任务的任何脚本,并且更改那些(事先未知的)脚本的 umask 是相当危险的。

另一方面,如果更改 Apache 的 umask 目标的想法是放宽 mod_dav 创建的文件的权限,您应该考虑 the DAV repository is considered private to Apache 并让其他进程访问这些文件可能会导致 various isses (including corruption) .

【讨论】:

【参考方案5】:

罗提/蜘蛛侠对 CentOS7 的回答:更改后不再“启动”,而是可以使用这些命令:

systemctl daemon-reload
service httpd restart

【讨论】:

当您尝试重新启动服务时,它会警告您由于系统配置的更改而需要重新加载守护进程。我所做的只是将警告消息的一部分复制并粘贴到命令行,然后再次重新启动,一切顺利。【参考方案6】:

在 Debian 中,为 Apache 设置 umask 的另一个位置是 /etc/default/apache2。只是这个文件末尾的这一行: umask 0002

【讨论】:

【参考方案7】:

可能想要做的是在您的 CGI 正在使用的目录上设置组粘滞位 (SetGID) 位:

chgrp mygroup dir chmod g+s dir

确保当你这样做时,(用户)apache 是在mygroup 组中(在/etc/group 中),所以它会有权限。 p>

这将使在此目录下创建的任何文件都将归与该目录相同的组所有。

这比为 apache 可能运行的每个 cgi 脚本设置全局 umask 更安全。

(这是 git-http-backend 通常从 Apache 运行的方式)。

【讨论】:

我仍然看不到如果没有umask,这将如何工作,考虑到 apache 通常 (755) 的默认文件创建模式会使文件无法按组写入。我不得不经常运行chmod g+w -R dir/ 这是一件很棒的事情,尤其是在开发人员一直在添加和删除文件的开发环境中。但是,仍然需要设置 umask。普通用户众所周知的解决方案是将命令添加到 /etc/profile 或 /etc/bashrc,但 apache 用户并不“正常”,因为它永远不会登录。【参考方案8】:

对于 Ubuntu,有工具 svnwrap

    安装sudo apt-get install subversion-tools 用 svnwrap 包装 svn 和 svnserve:sudo ln -s /usr/bin/svnwrap /usr/local/bin/svnsudo ln -s /usr/bin/svnwrap /usr/local/bin/svnserve

在此之后,所有使用 file://、svn+ssh:// 和 http:// 协议的 svn 操作都将使用 umask 002 完成

【讨论】:

【参考方案9】:

这里可能会有所帮助。

管理 rhel/centos 的文件权限

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/file-permissions-rhel8_configuring-basic-system-settings#displaying-the-umask_file-permissions-rhel8

# ls -lrt /etc/systemd/system/httpd.service.d/umask.conf
-rw-r--r-- 1 root root 21 Feb 25 10:19 /etc/systemd/system/httpd.service.d/umask.conf

# cat /etc/systemd/system/httpd.service.d/umask.conf
[Service]
UMask=0002

【讨论】:

【参考方案10】:

Luoti 的回答在 CentOS7 上对我有用。

不需要系统启动或重启。

当您使用命令 systemctl restart httpd 重新启动服务时,您可能会收到此警告

`Warning: httpd.service changed on disk. Run 'systemctl daemon-reload' to reload units`.

所以首先运行systemctl daemon-reload 命令然后systemctl restart httpd

【讨论】:

【参考方案11】:

通常不建议偏离“久经考验的真正 Apache 方式”。大量的时间和来之不易的经验已经用于选择这些东西。

【讨论】:

在传递该备忘录时一定已经睡着了 - 任何经过试验和测试方法的链接? @Maine,这不是 FUD。谷歌 umask 002 apache,任你挑选。 @Rob - 使用 002 的 umask 不会有问题,除非 apache 用户的主要组包含不受信任的用户(这将是一个糟糕的设置)或者 Apache 是具有不受信任用户的组的成员/ and/ 正在写入设置了 setgid 位的该组拥有的目录。此外,Apache 方式是 Unix 方式 - 使用最宽松的值创建文件,并让本地系统管理员使用 umask 确定适当的权限限制。因此,这是被误导的 FUD。 @RobWells,我同意。 “尝试了一些东西,它可以工作,但不知道为什么”会造成大多数安全问题。 *** 上到处都是这样的内容。 @ora-600 同意。务实的程序员称之为“巧合编程”!

以上是关于设置 Apache 用户的 umask的主要内容,如果未能解决你的问题,请参考以下文章

为 sftp 帐户设置 umask?

umask下设置linux系统文件与目录的默认权限

如何重写tomcat的umask

如何设置UNIX/Linux中新创建目录或文件的默认权限

umask使用方法

【umask】关于umask值及其对应的文件权限