原文环境:CentOS7
需求:tomcat 里 web 应用创建的文件,放于指定目录下、提供给其他应用读取(比如 ftp、nginx)。
问题:丢到 tomcat 里的 web 应用,创建出来的文件或文件夹 others 没有读权限,比如:
drwxr-x--- 2 tomcat tomcat 4096 Jun 16 17:57 temp
-rw-r----- 1 tomcat tomcat 0 Jun 16 17:57 tempfile12
解决方法一:
直接在 web 应用创建文件/文件夹时、通过代码设定权限,比如 Java 里这个 stackoverflow 答案提到的 Files#setPosixFilePermissions 方法。
但是缺点也很明显:一个一个改太麻烦了。
解决方法二:
见识少、google 了很久才知道根本原因是 tomcat 启动脚本 catalina.sh 里的这一段:
# UMASK (Optional) Override Tomcat's default UMASK of 0027
# Set UMASK unless it has been overridden
if [ -z "$UMASK" ]; then
UMASK="0027"
fi
umask $UMASK123456
原来是当初看 tlcl 时一看很简单就忘记的 umask……就说怎么 tomcat 用户直接命令行 touch
或 mkdir
的文件权限就很宽松。
不想动 tomcat 的脚本,所以就在 tomcat 下的.bashrc 里加了这个 UMASK
变量:
export UMASK=0221
参考自这个 so 问题 Tomcat 8 change catalina.out permissions to be readable by all
解决方法三:
Linux 基本的权限控制仅可以对所属用户、所属组、其他用户进行的权限控制,而不能精确地控制每个用户的权限。ACL 规则就是用来解决这个问题的。
使用 ACL 规则,我们可以针对单一账户设置文件及目录的访问权限。
实验环境:
操作系统:CentOS Linux release 7.5.1804 (Core)
组:默认用户组
用户:test❌1010:1010::/home/test:/bin/bash
目录: /var/www/web/1.com
已设置 acl 规则的文件
设置 ACL 规则
命令基本用法
setfacl < 选项 > [规则] < 文件 >
-m 新增一条 ACL 规则
-x 删除一条 ACL 规则
-b 清空所有 ACL 规则
给某个目录添加 acl 规则:
setfacl -m u:qudao:x /var/www/web/1.com
为目录添加默认 ACL 规则
setfacl -m d:u:test1:rwx test_dir
设置好后 再对改用户对 /root 目录的访问进行限制
setfacl -m d:u:test1:x test_dir
搜索 linux 权限相关问题很容易看到有人提到 ACL(Access Control List),参考一些使用指南(比如 ArchLinux Wiki)、简单使用比如:
setfacl -Rdm "u::rwx,g::rwx,o::rx" upload/1
-m
:修改, -d
:继承 parent 目录权限,-R
:同样应用到 upload 的当前所有子文件(夹)
然后在 upload
文件夹下尝试创建文件,可以看到:
drwxrwxr-x+ 1 root root 8 Jul 5 16:55 temp
drwxrwxr-x+ 1 docker docker 8 Jul 5 16:55 temp2
-rw-rw-r--. 1 root root 0 Jul 5 16:55 tempfile
-rw-rw-r--. 1 docker docker 0 Jul 5 16:55 tempfile21234
- 子文件继承了
upload
的权限设定
参考这个 PDF PosixAccessControlInLinux:The umask has no effect if a default ACL exists / 设置了默认 ACL(-d)、umask 就不起效了。
- 新建的子目录也在 ACL 管理下(有
+
标记) - 文件默认没有 execute 权限
补充问题:
- umask 是进程相关的参数,linux 系统有 umask 设置(CentOS 在/etc/profile 里有一段)、但并没有
UMASK
这个变量(这个只是 tomcat 用到)。 - ACL 只是权限相关,并不能改变文件(夹)的用户和 group;后者可以看下 chown 的
s
bit。 - 看了前面的 PDF 和 wikipedia,感觉 ACL 也是挺复杂/宽泛的概念:比如 named user 是群组概念、不仅 file system 用还有网络 NACL、不限于 linux、windows 也有……也是挺搞不清的。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于