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

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

原文环境: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 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    947 引用 • 943 回帖
  • Tomcat

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 635 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 464 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 525 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    26 引用 • 196 回帖 • 16 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 350 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 490 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    197 引用 • 540 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 80 关注
  • gRpc
    11 引用 • 9 回帖 • 73 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 3 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    34 引用 • 150 回帖 • 1 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 18 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 532 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 2 关注
  • 音乐

    你听到信仰的声音了么?

    61 引用 • 511 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 3 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 66 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2036 回帖 • 1 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 2 关注
  • BND

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

    107 引用 • 1281 回帖 • 36 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖 • 1 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖