tomcat 创建的文件权限和 linux umask、acl

本贴最后更新于 1744 天前,其中的信息可能已经时移俗易

原文环境: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 用户直接命令行 touchmkdir 的文件权限就很宽松。
不想动 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 权限

补充问题:

  1. umask 是进程相关的参数,linux 系统有 umask 设置(CentOS 在/etc/profile 里有一段)、但并没有 UMASK 这个变量(这个只是 tomcat 用到)。
  2. ACL 只是权限相关,并不能改变文件(夹)的用户和 group;后者可以看下 chown 的 s bit
  3. 看了前面的 PDF 和 wikipedia,感觉 ACL 也是挺复杂/宽泛的概念:比如 named user 是群组概念、不仅 file system 用还有网络 NACL、不限于 linux、windows 也有……也是挺搞不清的。

参考链接

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    954 引用 • 944 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 9 关注
1 操作
zhaozhizheng 在 2020-08-18 10:19:15 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
zhaozhizheng
没有人会关心你付出过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或者鄙夷 北京

推荐标签 标签

  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 728 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 2 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 1 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    438 引用 • 1238 回帖 • 588 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • Anytype
    3 引用 • 31 回帖 • 27 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 521 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 18 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 285 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    44 引用 • 208 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 12 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1282 回帖
  • Visio
    1 引用 • 2 回帖 • 2 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 818 回帖 • 1 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 49 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖 • 2 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    954 引用 • 944 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖