【 本次配置架构】
【安全配置】
1.删除后台登录
在tomcat安装目录下的/conf文件下编辑tomcat-users.xml,删除里面带有标签的内容块,默认这部分是被注释了的。注释了任然会显示后台登录,需要彻底删除。
进入末行模式,也就是使用vim进去后,输入
:set nu #显示行号
:38,45d #删除38-45行的内容
就可以删除38-45行的数据,删除后重启tomcat,/bin下执行./shutdown,./startup
2.以tomcat服务账户启动tomcat
可以将/opt/tomcat换成你的安装目录
sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
上述命令创建了一个系统用户 tomcat
,并指定了其主目录为 /opt/tomcat
。
sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod +x /opt/tomcat/bin/*.sh
上述命令将 Tomcat 安装目录及其下所有文件和文件夹的所有权和权限赋予 tomcat
用户,并将 bin
目录下的所有 .sh
文件赋予执行权限。
sudo su - tomcat
cd /opt/tomcat/bin
./catalina.sh start
上述命令切换到 tomcat
用户,并启动 Tomcat。在 tomcat
用户身份下启动 Tomcat,可以确保 Tomcat 运行的安全性和稳定性。
或者
sudo -u tomcat /opt/tomcat/bin/catalina.sh start
#设置tomcat密码为tomcat
passwd tomcat后输入tomcat
#执行后你会发现无法切换到tomcat,/bin/false是默认的shell,因此无法切换
#需要执行以下命令修改后才能切换过去
sudo chsh -s /bin/bash tomcat
然后,您可以使用 su - tomcat
命令切换到 tomcat
用户的身份。
切换后执行./startup启动tomcat
ps -ef | grep tomcat可以验证tomcat是否以tomcat用户身份启动
3.禁用管理界面
在server.xml中注释如下几个地方,记得先备份。当然这只是参考,但最好就别碰,删除管理界面就可以了。
<!--
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
-->
...
<!--
</Service>
-->
<!--
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
-->
将 webapps/manager 和 webapps/host-manager 目录删除,可以连同examples,docs目录一块删除。
4.隐藏版本信息
解压catalina.jar
cd tomcat/lib
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
修改server.info行,修改相关的版本信息:server.info=Apache Tomcat
重新压缩catalina.jar
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
为了迷惑对方,可以设置一个小点的版本。
重启,可以通过telnet ip:8089 执行get head查看版本信息
5.定义错误页面
打开web.xml文件,新版的tomcat配置文件增加了很多配置,vim web.xml,末行模式输入:/web-app回车找到有关那一块,在上面添加如下内容
<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.html</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error.jsp</location>
</error-page>
以上状态码错误定义页面可以按需添加。
error.jsp可以如下:
<%@ page contentType="text/html;charset=GB2312"%><%@ page isErrorPage="true"%><html><head><title>错误页面</title></head><body>出错了:</p> 错误信息: <%= exception.getMessage() %><br>Stack Trace is : <pre><font color="red"><%java.io.CharArrayWriter cw = new java.io.CharArrayWriter();java.io.PrintWriter pw = new java.io.PrintWriter(cw,true);exception.printStackTrace(pw);out.println(cw.toString());%></font></pre></body></html>
错误页面放置于webapps下,也就是网站根目录下。
6.通讯加密,使用证书
使用jdk自带的keytool工具生成证书,涉及密码的地方使用tomcat
keytool -genkey -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/apache-tomcat-10.1.8/.keystore
将自签名证书导入到Tomcat的keystore中,您需要将证书导出为
.crt格式的文件
导出crt证书
keytool -export -alias tomcat -file ./mycert.crt -keystore ./.keystore
导出私钥,此时为.p12格式
keytool -importkeystore -srckeystore ./.keystore -destkeystore ./pkcs12keystore.p12 -deststoretype PKCS12 -srcalias tomcat
使用 OpenSSL 工具将 .p12 格式的文件转换为其他格式的私钥文件,例如 .key 格式的文件。
openssl pkcs12 -in ./pkcs12keystore.p12 -nocerts -nodes -out ./private.key
将ssl证书和私钥导入到防火墙,发现nginx配置文件报错,需要在Nginx中导入证书和私钥
先继续进行配置
配置tomcat燃起只能通过https访问
禁用HTTP连接端口
在server.xml文件中找到以下配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
将其注释掉或删除。
配置HTTPS连接端口
在server.xml文件中找到以下注释并取消注释:
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
This connector uses the NIO implementation that requires the JSSE
style configuration. When using the APR/native implementation, the
OpenSSL style configuration is required as described in the APR/native
documentation -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true"
sslProtocol="TLS"
keystoreFile="/path/to/keystore"
keystorePass="password"
clientAuth="false"
keyAlias="tomcat"
sslEnabledProtocols="TLSv1.2,TLSv1.3"/>
将其中的port
属性改为80或其他您想要使用的端口号,如下所示:
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="443" maxThreads="200" scheme="https" secure="true" sslProtocol="TLS" keystoreFile="/path/to/keystore" keystorePass="password" clientAuth="false" keyAlias="tomcat" sslEnabledProtocols="TLSv1.2,TLSv1.3"/>
对所有请求都强制使用HTTPS连接,您可以添加以下配置到web.xml文件中:
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
这样,当任何请求都匹配到/*时,客户端将被重定向到HTTPS连接。
访问后失败,需要重新配置server.xml
<Connector port="8088" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="/path/to/keystore" keystorePass="mystorepassword"
keyAlias="mycert" keyPass="mykeypassword"
clientAuth="false" sslProtocol="TLS"
keyType="RSA"
sslEnabledProtocols="TLSv1.2,TLSv1.3"
ciphers="TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256"
truststoreFile="/path/to/truststore" truststorePass="mytruststorepassword" />
由于需要truststore文件,我们根据之前的证书生成,所有的证书文件都保存在tomcat安装的根目录
keytool -import -trustcacerts -alias tomcat -file ./mycert.crt -keystore ./truststore
然后修改server.xml中内容为下面的内容
<Connector port="8088" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="/.keystore" keystorePass="tomcat"
keyAlias="tomcat" keyPass="tomcat"
clientAuth="false" sslProtocol="TLS"
keyType="RSA"
sslEnabledProtocols="TLSv1.2,TLSv1.3"
ciphers="TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256"
truststoreFile="/truststore" truststorePass="tomcat" />
使用Nginx -t 检查时报错:
2023/04/28 15:21:49 [emerg] 3432360#3432360: cannot load certificate “/usr/local/tomcat/mycert.crt”: PEM_read_bio_X509_AUX() failed (SSL: error:0480006C:PEM routines::no start line:Expecting: TRUSTED CERTIFICATE)
将mycert.crt转换为pem格式
openssl x509 -in mycert.crt -out mycert.pem -outform PEM
转换后在/etc/nginx/conf.d/default中配置
server {
listen 8070 ssl;
server_name www.domain;# 服务器地址或绑定域名
ssl_certificate /usr/local/tomcat/mycert.pem;
ssl_certificate_key /usr/local/tomcat/private.key;
error_page 404 /var/www/html/error.html;
error_page 500 /var/www/html/error.html;
error_page 502 /var/www/html/error.html;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 403;
}
location / { #
root /usr/local/tomcat/apache-tomcat-10.1.8/webapps;
index index.html index.htm index.jsp;
proxy_pass http://127.0.0.1:8088; # 配置反向代理的ip地址和端口号 【注:url地址需加上http:// 或 https://】
}
}
sudo service nginx restart
重启成功后waf上上传证书和私钥,提交成功
此时访问tomcat会出现私密连接提示
查看nginx日志,在结合GPT给的答案猜测是配置的ssl版本和加密不一致导致的问题修改nginx中的ssl版本和tomcat中配置的一样
配置完成后nginx -t检查没问题后重启nginx和tomcat
在nginx配置文件中有if的话后门要有空格。
配置到最后还是无法正常访问,哪里配置还有点问题,暂时就先不配了吧。后面配完反向代理后猜测可能是反向代理没配好导致的问题,配的匆忙,都是想到哪里配到哪里,所以容易出问题,大家在配置的时候一定要滤清思路。
暂时就先不配https了,以后有时间再配上,先恢复配置,用Http吧。
恢复配置文件,继续进行安全配置。
1.调整线程池大小
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200" minSpareThreads="20"/>
3.隐藏版本信息
隐藏版本信息还是建议去用最上面的方法,这里的方法可以尝试。
<Server server.xml="hidden">
<Service>
<Connector port="8088" protocol="HTTP/1.1" />
<Engine server.xml="hidden">
...
</Engine>
</Service>
</Server>
同时修改错误页面
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
tomcat 10.1.8默认目录为webapps/ROOT,所以项目文件也要传到这个目录下才能访问。想来前面的错误有可能我把这个ROOT目录给删除了造成的。
【温馨提示】
【网站搭建之配置tomcat】【网站搭建之配置nginx】【网站搭建之配置apache2】【waf和蜜罐安装】这四篇都是配置过程中边配边加的,所以不会连贯,建议大家安全配置在最后再来配,先配通反向代理,反向代理具体完整过程请看【网站搭建之配置nginx】中的无问题配置,也是最终的配置。