https://zh.wikipedia.org/wiki/Apache_Tomcat

这次演示环境

CentOS7 x86_64 ip: 192.168.3.64

tomcat部署php项目Tomcat 平安安排实战指南 Node.js

Apache Tomcat/8.5.24 建议大家利用较新版的稳定版本

0x02 首先,在正式支配Tomcat之前,须要先来准备好jdk环境,由于毕竟底层还是在靠java来处理,以是必须要先得有java的运行环境才行,实在,在实际生产环境中,也可以单独利用jre,不过个人以为这和安全的关系并不大,试想,如果你手里都已经拿到了一个可以运行java的环境了,我在本地用对应版本的jdk编译好了再丢上运行也是一样,防不住啥,太泛泛

# useradd -u 301 tomcat

# passwd tomcat

# chown -R tomcat:tomcat /usr/local/tomcat/

# chown -R tomcat:tomcat /usr/local/jdk/

# ll /usr/local/jdk/ /usr/local/tomcat/

# su - tomcat

$ /usr/local/tomcat/bin/catalina.sh start

$ netstat -tulnp

$ cat /usr/local/tomcat/logs/catalina.out 启动过程中如果有什么问题可以去该日志

0x04 理解Tomcat的基本目录构造

# tree -L 1 /usr/local/tomcat/

/usr/local/tomcat/

├── bin 紧张用来放置各种tomcat做事管理脚本

├── conf 用于存放Tomcat做事的各种配置文件

├── lib 此目录用于存放Tomcat的核心类库文件

├── LICENSE

├── logs 紧张用于放置Tomcat的启动和访问日志文件

├── NOTICE

├── RELEASE-NOTES

├── RUNNING.txt

├── temp 存放一些缓存临时数据的目录

├── webapps 默认的站点根目录

└── work 把jsp代码转换为java代码[class]文件时的存放目录,这便是为什么访问速率极快的缘故原由之一,只需编译一次,后续直接访问`缓存`

0x05 理解Tomcat各个配置文件的紧张功用

# tree -L 1 /usr/local/tomcat/conf/

/usr/local/tomcat/conf/

├── Catalina

├── catalina.policy 当带上-security选项启动tomcat时,会自动读取并运用该文件中的策略配置

├── catalina.properties 有关Tomcat内部各种类加载器的一些配置

├── context.xml 此处的context.xml是浸染于域全局的,一样平常情形下,每个站点目录下都应有一个context.xml文件,用于定义会话管理器,JDBC等

├── jaspic-providers.xml

├── jaspic-providers.xsd

├── logging.properties 指定不同类日志的格式

├── server.xml tomcat主配置文件

├── tomcat-users.xml 用于tomcat web管理端认证的配置文件

├── tomcat-users.xsd

└── web.xml 站点被支配时利用的默认支配配置项

0x05 深入理解tomcat的运作细节及常用组件

大略回顾Tomcat的基本运作细节

-> 此处,以要求 http://www.rootkit.org:8080/demo/index.jsp 为例

-> 首先,客户端来要求www.rootkit.org的8080端口,恰好被监听于此的Http Connector所捕获

-> 随后,Connector会把该要求交给它所在的Service中的Engine去处理并等待Engine回应

-> 当Engine拿到这个要求后,会自动根据要求中的www.rootkit.org这个域名来匹配到它内部属于哪个Host,然后直接丢给那个Host

-> 当要求到达指定的Host时,Host会自动匹配出Path为/demo所在的Context

-> 之后,对应Context会拿到/index.jsp要求,再到映射表中找出对应的Servlet类去处理,如,布局HttpServletRequest和HttpServletResponse工具

-> Context会把处理好之后的HttpServletResponse工具返回给Host

-> Host再把HttpServletResponse工具返回给Engine

-> 末了,Engine把HttpServletResponse工具返回对应的Connector,至此,一次相对完全的Tomcat要求相应过程就基本完成了

关于上述提到的各个组件功用简介

Server 一个Server即对应一个Tomcat实例,实际中机器性能好的情形下,建议直接分成多实例,不建议用它自带的虚拟主机,虚拟主机之间对性能影响较大

Service 常日由一个Engine以及一个或多个Connector组成

Connector 紧张便是用来监听指定端口,然后把指定端口的要求都交给Engine

Engine 实在便是实际的处理引擎,下面可以同时配置多个虚拟主机,它自身会根据域名来匹配到对应的虚拟主机

Host 即虚拟主机,一个Host即一个虚拟主机

Context Context在创建的时候会根据配置文件$CATALINA_HOME/conf/web.xml

和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类,当Context收到要求时

将到自己的映射表 [mapping table]中探求相匹配的Servlet类,如果找到,则实行该类,并回该当要求

tomcat 主配置文件构造大致如下

<Server>

<Service>

<Connector/>

<Engine>

<Host>

<Context></Context>

</Host>

</Engine>

</Service>

<Service>

...

</Service>

</Server>

0x06 一个标准的 Java web 目录构造,如下

0x07 如何快速纯手工在Tomcat中自定义一个基于域名的虚拟主机,还是那句话,实际中机器性能够的情形下,建议用tomcat多实例,不建议用虚拟主机

先准备好站点所需的各种目录,务必要严格按照上面的java web标准来

# mkdir /data/{javaweb,logs} -p

# chown -R tomcat:tomcat /data/

$ su - tomcat

$ cd /data/javaweb/

$ mkdir secapp/{lib,classes,WEB-INF,META-INF} -p

$ vi secapp/index.jsp

<html>

<body>

<br>

<center><h1>This is a Tomcat Server 8.x </h1>

<br><h2>Now time is: <%=new java.util.Date()%></h2></center>

</body>

</html>

再到tomcat主配置文件中添加Host标签段,记得禁用自动支配和自动解war包

$ vi /usr/local/tomcat/conf/server.xml

<Host name=\公众www.sec.org\公众 appBase=\公众/data/javaweb/secapp\公众 autoDeploy=\"大众false\"大众 unpackWARs=\公众true\公众>

<Context path=\公众\"大众 docBase=\"大众.\公众 debug=\公众0\公众 />

<Valve className=\"大众org.apache.catalina.valves.AccessLogValve\"大众 directory=\"大众/data/logs\公众

prefix=\公众www.sec.org_access_log\"大众 suffix=\"大众.txt\"大众

pattern=\"大众%h %l %u %t \"大众%r\"大众 %s %b\"大众 />

</Host>

$ /usr/local/tomcat/bin/catalina.sh stop

$ cd /usr/local/tomcat/ 重启前最好把下面两个目录中的内容清空,防止缓存作祟

$ rm -fr ./temp/

$ rm -fr ./work/

$ /usr/local/tomcat/bin/catalina.sh start

$ cat /usr/local/tomcat/logs/catalina.out查看tomcat启动日志,一样平常来这儿都是为了看报错

$ tail -f /data/logs/www.sec.org_access_log.2017-12-17.txt

$ tree /usr/local/tomcat/work/

0x08 配置Tomcat的web端管理功能,此功能比较危险,随意马虎被人跑到管理账号密码,直接进来即可支配webshell,如非必须,建议删除

$ vi /usr/local/tomcat/conf/tomcat-users.xml

<role rolename=\公众manager-gui\公众/>

<role rolename=\公众admin-gui\"大众/>

<user username=\"大众tomcat\公众 password=\"大众tomcat\"大众 roles=\"大众manager-gui,admin-gui\"大众/> 让tomcat同时运用于两个角色

$ /usr/local/tomcat/bin/catalina.sh start 修正完配置后重启tomcat

$ /usr/local/tomcat/bin/catalina.sh stop

0x09 修正管理端口及用于关闭做事的字符串,默认为8005,SHUTDOWN,实际中,一样平常也不会用这种办法来关闭tomcat,以是,可以把关闭字符串设的更长更随机一些,不过,好在最新版本tomcat默认只监听在127.0.0.1,以是对此项不必太过紧张

$ vi /usr/local/tomcat/conf/server.xml

<Server port=\"大众9301\公众 shutdown=\"大众a8HelEd45fm43LseDF\"大众>

0x10 修正AJP协议通信端口,实在你可以直接把该项注释掉,由于绝大多数情形下我们都只会利用http协议进行反向代理,而不会用AJP协议

$ vi /usr/local/tomcat/conf/server.xml

<!-- <Connector port=\公众8010\"大众 protocol=\"大众AJP/1.3\"大众 redirectPort=\公众8443\公众 />-->

0x11 禁止tomcat目录遍历,将param-value标签中的值改为false,实在默认便是禁止的,只不过为了保险,还是须要再确认一下

$ vi /usr/local/tomcat/conf/web.xml

<init-param>

<param-name>listings</param-name>

<param-value>false</param-value> <!-- false即表示禁止目录遍历 -->

</init-param>

<welcome-file-list> <!-- 设置主页索引文件 -->

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>demo.jsp</welcome-file>

</welcome-file-list>

0x12 隐蔽做事器版本信息,为了能一定程度上防止被人用0day批量打,我们须要将tomcat的详细版本轻微隐蔽下,比如,在涌现403,404,500这样的状态码时,就很随意马虎会暴露我们web做事器的详细版本,当然,你也可以直接把指定的状态码重定向到指定的页面上

$ cd /usr/local/tomcat/lib/

$ unzip catalina.jar

$ cd org/apache/catalina/util/

$ vi ServerInfo.properties

server.info=Microsoft-IIS/7.5

server.number=7.5

server.built=Nov 27 2017 13:05:30 UTC

$ cd /usr/local/tomcat/lib/

$ jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties

$ /usr/local/tomcat/bin/catalina.sh stop

$ /usr/local/tomcat/bin/catalina.sh start

0x13 修正http相应头中的server字段名称,只须要在http连接器中添加指定的server属性即可

$ vi /usr/local/tomcat/conf/server.xml

<Connector port=\"大众8080\"大众 protocol=\"大众HTTP/1.1\"大众

connectionTimeout=\"大众20000\公众

redirectPort=\"大众8443\公众 server=\"大众Microsoft-IIS/7.5\"大众 />

0x14 最好把所有Host组件中的自动支配选项全部关掉

$ vi /usr/local/tomcat/conf/server.xml

<Host name=\"大众www.sec.org\"大众 appBase=\公众/data/javaweb/secapp\"大众 autoDeploy=\"大众false\"大众 unpackWARs=\"大众true\"大众>

0x15 如果我们是在前面利用apache或者nginx做的反向代理,也可通过限定特定ip的办法来访问,如下,表示仅许可192.168.3.0/24这个内网段来访问

$ vi /usr/local/tomcat/conf/server.xml

<Host>

...

<Context path=\"大众\公众 docBase=\公众.\公众 debug=\公众0\"大众 />

<Valve className=\公众org.apache.catalina.valves.RemoteAddrValve\"大众 allow=\"大众192.168.4.\公众 deny=\"大众...\"大众 />

...

</Host>

0x16 限定其他用户对tomcat各种做事管理工具的利用

$ chmod -R 744 /usr/local/tomcat/bin/

0x17 配置更加详细的访问日志格式,方便后续做入侵审查,如添加记录 user-agent,referer 字段数据

$ vi /usr/local/tomcat/conf/server.xml

<Valve className=\"大众org.apache.catalina.valves.AccessLogValve\"大众 directory=\"大众/data/logs\公众

prefix=\"大众www.sec.org_access_log\"大众 suffix=\"大众.txt\公众

pattern=\"大众%h %l %u %t \"大众%r\"大众 %s %b %{Referer}i %{User-Agent}i %D\公众 resolveHosts=\"大众false\"大众 />

0x18 关于Tomcat 7.x 版本,你可能还须要手工去禁用一些危险峻求方法,将readonly的值设为true,即禁止DELETE及PUT方法,如下,不过在新版中,默认就处于禁用状态,无需关心

$ vi /usr/local/tomcat/conf/web.xml

<init-param>

<param-name>readonly</param-name>

<param-value>true</param-value>

</init-param>

0x19 必要情形下,可直接禁用tomcat供应的默认web管理端,防止入侵者用此办法支配webshell,此处采取的禁用办法只是把原来web管理真个文件都重新放到别的目录中,而后再到主配置文件中去注释掉默认的locahost所对应的host组件,末了重启tomcat即可,话说回来,status可以留着,由于可能后续还要靠此来监控jvm的一些性能参数,大家还是酌情而定吧

$ cd /usr/local/tomcat/webapps/

$ mkdir tmp

$ mv docs/ examples/ host-manager/ manager/ ROOT/ ./tmp/

<!--

<Host name=\"大众localhost\"大众 appBase=\"大众webapps\公众

unpackWARs=\"大众true\"大众 autoDeploy=\"大众true\公众>

-->

<!--

<Valve className=\"大众org.apache.catalina.valves.AccessLogValve\"大众 directory=\公众logs\公众

prefix=\公众localhost_access_log\"大众 suffix=\"大众.txt\"大众

pattern=\"大众%h %l %u %t \公众%r\"大众 %s %b\公众 />

</Host>

-->

0x20 末了,时常去关注tomcat官方发布的一些高危漏洞补丁,tomcat 8.x 已经相比拟较稳定了,以是也建议大家,务必在稳定的条件下利用更新一点的版本

后话:

由于关注的点不同,以是肯定有所偏颇,此处还是旨在防入侵,至于针对jvm的各种性能优化,后续有机会我们再单独解释,由于tomcat险些都不会直接面向用户,大多都是通过反向代理的办法来供应做事的,其余,java自身的安全性和性能采取编译的办法来运行都要优于php,以是,针对tomcat的安全并没有像nginx或者apache压力那么大,而且由于tomcat是在后端,也相比拟较好掌握,虽然它到现在对java的一些类库支持的还不是很完全,但那些对我们而言暂时无需关心,以上支配仅供参考,并不完全,后续还会不断更新,大家可根据自己的实际业务需求再做进更进一步调整,关于java对渗透的功用,比如,免杀…想必大家也都非常熟习了,这里就不多说了,更多其它内容,也非常欢迎大家来一起私信互换 ^_^

注:本文为原创文章,未经容许禁止转载