设置 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/svn
sudo 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的主要内容,如果未能解决你的问题,请参考以下文章