你说啥,我的Tomcat不安全?!

Posted 程序员架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你说啥,我的Tomcat不安全?!相关的知识,希望对你有一定的参考价值。


来源:程序员架构原创作品,转载请联系jb_quaner。

引子

在当今互联网大放异彩的背景下,网络安全就显得尤其重要,而Tomcat作为享誉世界的JSP/Servlet容器,他的安全问题不容小觑。


然而,对于Tomcat的安全问题总是得不到充分的重视,这种东西不是能运行起来就好,还必须是安全的,Tomcat的安全性倒是没有那么低,但是他的安全性性有一定的局限。


如果你是个处理安全问题的高手,你发现了Tomcat的bug,你应该怎么做呢?是发到CSDN、github等地方进行分享吗?千万不要这么做!因为这会让很多黑客第一时间看到并攻击Tomcat,到时候你就被成为了那帮流氓的帮凶。

从安装开始-Tomcat安装安全

Tomcat的发布版提供了Admin和Manager这两个应用,Tomcat的安全问题主要是由这两种安装方法带来的:


1. 通过压缩包解压来安装。那么Admin和Manager这两个应用是被禁止的,而且还是默认的,到时候没有一个账户可以登录,更别说访问了。


2. 通过Windows安装程序来安装。这种方式在安装的时候会提示创建一个账号来访问Admin和Manager这两个应用程序,问题又来了,这两个程序没有被禁止,也有一定的安全隐患。


那么,以上两种问题该怎么解决呢?


第一个问题:系统管理员可可以直接删除Admin和Manager这两个应用。


第二个问题:选择一个用户名和密码,最好把密码设置的巨复杂(自己记不住就放到一个加密的文件夹里,我就是用这个方式来管理多个账户的密码的);还可以修改默认的context,可以让非系统管理员无法更改Admin和Manager这两个应用。


Tomcat中默认应用的安全隐患

Tomcat默认安装应用有两个:isp-examples和Servelt-examples,这俩东西就是俩鸡肋,根本没啥用,就跟鞋子里的沙子一样硌脚,直接删除,这样可以提供Tomcat的安全性。


命令!命令!


在默认情况下,客户端通过连接Tomcat的特殊端口并发送shutdown字符序列,由于Tomcat对连接到Tomcat的客户端没有任何的认证机制,就会调用Tomcat的shutdown命令关闭Tomcat!


这叫做恶意关闭,为了避免这种情况,可以使用防火墙来组织未授权的用户连接,具体的方式是:把<TOMCAT_HOME>\conf\server.xml文件中的<Server port="8005" shutdown="SHUTDOWN">更改为<Server port="8007" shutdown="SHUTDOWN>,这样做的好处是攻击者就算是找到了端口也不一定能发送正确的字符序列。


密码!密码!


黑客比你想象得要强大的多,也要黑的多,一旦你的Tomcat被黑客控制,接下来就是破解你的密码,咋办呢?旧的不去,新的不来。


第一步,在Windows控制面板中创建一个新账号:

  1. 在控制面板中选择 “用户账户”

  2. 在“用户账户”里选择“创建一个新的账户”

  3. 然后在弹出的对话框中输入新的用户名

  4. 账户类型选择“创建用户”


第二步,用新的Tomcat账号来运行Tomcat:

  1. 在控制面板中想选择“管理工具”这个快捷方式

  2. 在“管理工具”页面中选择“服务”

  3. 在系统服务列表中双击Apache Tomcat选项,接着就会弹出属性框

  4. 选择“登录”就会弹出一个对话框

  5. 点击“此账户”

  6. 点击“浏览”

  7. 在“输入要选择的对象名称”中输入tomcat

  8. 点击“检查名称”

  9. 最后点击确定,重启一遍Tomcat。

Tomcat不用那么多的权限就能好好工作

我们玩手机就能发现,一个应用程序动不动就要我们开权限,甚至有的应用程序在你下载的时候就狮子大开口,其实要权限这件事情不是坏事,而是看你要什么权限了,所有的应用程序都要权限,有的是正当的,比如说访问内存,有的就不正当了,比如访问相册。


Tomcat只需要访问以下这些目录就够了:

  1. <TOMCAT_HOME>\bin

  2. <TOMCAT_HOME>\common

  3. <TOMCAT_HOME>\server

  4. <TOMCAT_HOME>\shared

  5. <TOMCAT_HOME>\webapps


在这里我说点题外话,目前Windows 的文件系统有三种:FAT16、FAT32、NTFS,其中NTFS是最安全的,NTFS是根据ACL思想构件的,ACL中包含了用户和组的列表和权限。


一般的,Windows系统允许用户访问文件系统中的大部分资源,对于Tomcat来说真有点多了,应该把电脑上每个盘都设置一下,我以C盘为例:


  1. 点击“我的电脑”后打开C盘

  2. 点击“属性”命令

  3. 再点击“安全”

  4. 点击“添加”,在弹出的对话框中输入“tomcat”并点击“检查名称”,点击确定

  5. 选中下拉列表右侧的复选框,把所有的权限都选择为“拒绝”

  6. 点击“高级”,选择“用在此显示的可以应用到子对象的项目替代所有的子对象的权限项目”后点击确定

  7. 如果弹出安全警告则点击“是”

  8. 最后,保存所有的操作;


然后把其他的盘也都这样设置就安全多了,这样做可以把Tomcat用户的所有权取消,那怎么能让tomcat用户运行tomcat呢?也就是说至少能够读取和执行JRE需要的文件:


  1. 打开用于运行Tomcat的JRE所在的目录

  2. 点击目录名选择“安全”

  3. 点击“删除”


安全性还能有进一步的提高,把everyone组从JRE的ACL中去掉同时把tomcat用户添加上,让他只有:“读取”、“列出文件夹目录”、“读取和执行”等权限。

我去,Tomcat还有安全域

安全域(Realm)是Tomcat的内置功能,他在org.apache .catalina.Realm接口中申明了一组用户名、口令和所有的关联角色。


其实Realm不是安全域的意思,而是域的意思,域是一个存储用户名、密码以及和用户名相联系的角色的“数据库”。


MemoryRealm域(内存域)


主要负责从XML文件中初始化存储在内存对象集合的访问认证信息,把这些信息标识为内存中的系列java对象的集合,该XML文件为<TOMCAT_HOME>/conf/tomcat-user.xml,其中tomcat-user.xml用于定义用户信息的文件,换句话说就是:一个用户是否有权力访问受保护的资源必须是由tomcat-user.xml说了算,其中定义了多个不同用户和他们所属的组。


这是tomcat-user.xml:

<?xmlversion="1.0" encoding="UTF-8"><tomcat-users><!--定义多个用户角色--> <role rolename=“manager”/> <role rolename=“tomcat”/> <role rolename=“admin”/> <role rolename=“role”/><!--定义多个用户以及相应的密码和所属角色--> <user username="both" password="tomcat" roles="tomcat,role"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="admin" password="tomcat" roles="admmin,tomcat"/> <user username="role" password="tomcat" roles="role"/></tomcat-users>


内存域创建步骤:


  1. 定义用户信息,修改tomcat-user.xml为文件

  2.  server.xml文件中添加Realm组件:

<Realm className="org.apache.catalina.realm.MemoryRealm"/>


内存域咋干活呢?


  1. 当Tomcat第一次启动的时候,他从用户文件装载了所有定义的用户以及他们的相关信息,Tomcat重新启动之前,这个文件中的 数据 更改不会被识别出来。

  2. 当一个用户第一次尝试访问被保护的资源时,Tomcat会调用这个Realm的authenticate()函数实现。

  3. 一旦用户被认证过,这个用户以及相关的角色在登录期间被高速缓存(cached)在Tomcat中,被缓存的用户在会话系列之间不被保存和再存储。


JDBCRealm域


JDBC域是通过JDBC驱动来访问存放在数据库中的安全验证信息的安全认证方式,由于每次查询数据库是根据需要进行的,改变了数据库中的用户的信息很快就会认证中体现出来,所以JDBC域的配置灵活度高。


这对用户数据库有一定的要求:

  1. 必须要有一个表格,表格中每一行必须包含一个该Realm所能识别的合法用户;

  2. 该表格至少包括两列:用户登录名和用户登录密码


我以mysql为例:


第一步:创建数据库并使用:

create database authority;use authority;


第二步:创建用户表:

create table users( 'user_name'varchar(15) not null default; 'role_name'varchar(15) nto null default; Primary Key ('user_name','role_name'));


第三步:创建用户角色表:

create table user_roles( 'user_name'varchar(15) not null default; 'role_pass'varchar(15) nto null default; Primary Key ('user_name'));


第四步:添加用户以及其他用户角色:

insert into 'user'values('test1','000000');insert into 'user'values('test2','000000');insert into 'user_roles'values('test1','test_admin');insert into 'user'values('test2','test_gueat');


然后在<TOMCAT_HOME>\bin目录中执行:

mysqldump authority <authority.sql -uroot-pmysql>


下面就是配置JDBC Realm


把MySQL数据库的驱动程序复制到<TOMCAT_HOME>/common/lib目录下,具体配置的文件是在TomcatConfig应用配置文件或者是server.xml文件。


在Context元素中添加:

<Realm className="org.apache.catalina.realm.JDBCRealm"debug="99" driverName="com.mysql.jdbc.Driver""connectionURL="jdbc:mysql://localhost/authority" connectionName="root" connectionPassword="123" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/>


JDBCRealm同样也有自己的运作规则:


  1. 当一个用户尝试访问被保护的资源时,Tomcat会call这个Realm的authenticate()函数。

  2. 如果用户被认证,用户及其相关角色会在这个用户的登录期间被高速缓存在Tomcat 中。


再补充一点,Tomcat是不会管理user和user_roles表格中的信息的,这是应用程序的事情。


DataSourceRealm域


DataSource域与JDBC域非常相似,DataSource域使用JNDI DataSource资源来访问数据库。


配置DataSource域:

  1. 创建包含用户表的数据库。

  2. 把数据库的驱动程序复制到<TOMCAT_HOME>/common/lib目录下。

  3. 配置数据源。

  4. 应用配置文件或者在server.xml文件中配置DataSourcerRealm。


<Realm className="org.apache.catalina.realm.DataSource Realm"debug="99" DataSourceName="jdbc/usertest" userTable="user" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/>


关于作者:

笔名立体的萌,是个工作还不到一年就辞职考研的的菜鸟,上学学习的是java,但是工作用的是C#,C#用途远远没有java范围广,再加上java是我的母语,所以很像回归java,不仅仅是提升技术能力,也有往大数据等高端领域发展的想法。

请作者吃糖

你说啥,我的Tomcat不安全?!


个人网址:https://blog.csdn.net/weixin_46107282

声明:本文为 程序员架构 原创投稿,未经允许请勿转载。


以上是关于你说啥,我的Tomcat不安全?!的主要内容,如果未能解决你的问题,请参考以下文章

各位大神,我的eclipse为啥安装不了,JDK总是提示说啥DLL?我之前安装过俩次都成功了,

jsp页面被tomcat引擎运行的时候组装成java片段,但是这些java片段怎么没有main方法作为程序的入口啊?

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

Tomcat和Netty,到底谁更快?一篇给你说个明白

面试官:你说 HashMap 线程不安全,它为啥不安全呢?

总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?