【出错记录】Tomcat非root用户启动无法拥有权限读写文件

简介: 简单记录下,如有必要,将深入补充: 一、非root用户运行Tomcat及原因 由于项目中,为了安全需要,Tomcat将禁止以root形式启动,原因很简单,举个例子,一旦有人恶意将jsp文件透过某个别的漏洞传到你的服务器中,那么你的程序运行过程中,将会远端被别人恶意执行代码,轻则服务器被黑,重则通过这台跳板进入你的后台,病毒式的入侵到内网的其他机器(例如大量的Redis以及MongoDB置于内网时是不设置密码的),所以以非root的方式启动Tomcat对于商用的环境下,是必须的。

简单记录下,如有必要,将深入补充:

一、非root用户运行Tomcat及原因

由于项目中,为了安全需要,Tomcat将禁止以root形式启动,原因很简单,举个例子,一旦有人恶意将jsp文件透过某个别的漏洞传到你的服务器中,那么你的程序运行过程中,将会远端被别人恶意执行代码,轻则服务器被黑,重则通过这台跳板进入你的后台,病毒式的入侵到内网的其他机器(例如大量的Redis以及MongoDB置于内网时是不设置密码的),所以以非root的方式启动Tomcat对于商用的环境下,是必须的。

默认的情况下,Linux中的Tomcat都由bin目录下的catalina.sh执行,那么Tomcat的启动用户就由有权限启动Tomcat的运行命令的人:

./catalina.sh start

如果希望是非root用户启动,可以通过递归改变文件主以及文件所属的组获得执行权限

chown -R user1 ./apache-tomcat-xxx

即如果是以root权限启动的Tomcat服务,使用如下命令:

ps -ef|grep tomcat

查看到你的Tomcat以什么权限启动的,看到启动主为红线标注角色:

那么下面我使用非root用户启动下:

二、非root用户文件操作被禁止

我的问题是Web项目所有的一切功能正常使用,但是在一处与SpringMVC的MultipartFile文件接收的Controller报错如下:

Processing of multipart/form-data request failed. /usr/local/apache-tomcat-9.0.4/work/Catalina/localhost/EDoctor/upload_50259820_2122_4f77_af6d_17f1fd261a13_00000001.tmp (Permission denied)

以及在出错堆栈的打印中看到Permission denied和IOException其实本能想到是权限的问题,由于可以使用非root用户运行tomcat,但是现在重点是,Tomcat中存放tmp中间文件的目录到底在哪里?

三、解决方法

其实Tomcat中有一个work目录,其作用的话主要有下面两点:

  • jsp运行时都要先转换成servlet,tomcat容器启动时会在目录下的work目录中生成一系列的文件夹和.java文件和编译后的.class文件。
  • jsp最终转化为servlet,work的作用就是加快速度,如果jsp没有变化(依据时间戳)就不再重新编译。

可以看到大概意思是work是Tomcat的工作目录,一般我们注重权限以为是webapp目录下的权限问题,其实还有一个权限就是真正的中间文件生成的工作目录:

/usr/local/apache-tomcat-9.0.4/work/Catalina/localhost/

所以只需要将该文件的目录主修改为你想要的用户,用该用户启动Tomcat就不会出现问题了。

 四、总结

那么总结一下,大概就是Tomcat的用户权限问题需要格外关注$CATALINA_HOME/work/Catalina/localhost/目录下的文件主或组的权限问题

作者: letcafe

-------------------------------------------

个性签名:编程水太深,先会造轮子!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

目录
相关文章
|
机器学习/深度学习 监控 安全
|
前端开发 Java 应用服务中间件
《SpringBoot启动流程七》:源码分析SpringBoot如何内嵌并启动Tomcat服务器的?
《SpringBoot启动流程七》:源码分析SpringBoot如何内嵌并启动Tomcat服务器的?
434 0
《SpringBoot启动流程七》:源码分析SpringBoot如何内嵌并启动Tomcat服务器的?
|
Java 应用服务中间件 容器
springboot如何启动内置tomcat?(源码详解)
springboot如何启动内置tomcat?(源码详解)
springboot如何启动内置tomcat?(源码详解)
|
Java 应用服务中间件
IDEA的Web项目启动Tomcat出现404错误
IDEA的Web项目启动Tomcat出现404错误
547 0
IDEA的Web项目启动Tomcat出现404错误
|
应用服务中间件
创建tomcat的服务,删除服务,通过服务来启动项目
创建tomcat的服务,删除服务,通过服务来启动项目
181 0
创建tomcat的服务,删除服务,通过服务来启动项目
|
应用服务中间件
IEAD启动Tomcat控制台乱码问题
IEAD启动Tomcat控制台乱码问题
IEAD启动Tomcat控制台乱码问题
|
应用服务中间件 Shell
mac下载tomcat 8启动后无法使用
mac下载tomcat 8启动后无法使用
mac下载tomcat 8启动后无法使用
|
应用服务中间件 Shell 程序员
启动 Tomcat 应用服务器端口 8080 被占用排查思路及解决方式
启动 Tomcat 应用服务器端口 8080 被占用排查思路及解决方式
557 0
启动 Tomcat 应用服务器端口 8080 被占用排查思路及解决方式
|
Java 应用服务中间件 开发者
Tomcat 启动和关闭| 学习笔记
快速学习 Tomcat 启动和关闭,介绍了 Tomcat 启动和关闭系统机制, 以及在实际应用过程中如何使用。
Tomcat 启动和关闭| 学习笔记
|
应用服务中间件 Android开发
tomcat启动时报错ports are invalid,默认端口不要为-1
tomcat启动时报错ports are invalid,默认端口不要为-1
121 0