您的位置:首页 > 运维架构 > Tomcat

[基线加固]常见中间件(Tomcat&Nginx&Apache)

2020-04-22 14:31 1106 查看

Tomcat安全基线加固

1.应按照不同的用户分配不同的账号,避免不同用户间共享账号。且应删除或锁定与设备运行、维护等工作无关的账号

无共享账号。各账号都可以登录Tomcat Web服务器为正常。

访问 http://ip:8080/manager/html管理页面,进行Tomcat服务器管理;修改tomcat/conf/tomcat-users.xml配置文件,删除与工作无关的帐号

参考配置:

修改 tomcat/conf/tomcat-users.xml 配置文件,修改或添加帐号。

<user username=”tomcat” password=” Manager!@34” roles=”manager”>

2.禁用超级用户启用tomcat。

ps -ef | grep tomcat

当前系统的 tomcat 进程启动身份非root用户。

3.对于采用静态口令认证技术的设备,口令长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类

在 tomcat/conf/tomcat-user.xml 配置文件中设置密码

<user username="tomcat" password="Manager!@34" roles="manager">

4.在设备权限配置能力内,根据用户的业务需要,配置其所需的最小权限

编辑 tomcat/conf/tomcat-user.xml 配置文件,修改用户角色权限。

授权 tomcat 具有远程管理权限:

<user username="tomcat" password="Manager!@34" roles="admin,manager">

Tomcat 用户角色分为:role1,tomcat,admin,manager 四种。

  • role1:具有读权限;
  • tomcat:具有读和运行权限;
  • admin:具有读、运行和写权限;
  • manager:具有远程管理权限。

注:Tomcat 6.0.18 版本只有 admin 和 manager 两种用户角色,且 admin用户具有 manager 管理权限。

5.设备应配置日志功能,对用户登录进行记录,记录内容包括用户登录使用的账号,登录是否成功,登录时间以及远程登录时,用户使用的IP地址.启用访问模块审计、错误信息日志功能

查看logs目录中相关日志文件内容,记录完整

检查server.xml文件,标签中日志功能注释符被删除。

参考配置:

编辑server.xml配置文件,在标签中增加记录日志功能将以下内容的注释标记< ! – -- >取消

<
valve classname="org.apache.catalina.valves.AccessLogValve"
Directory="logs" prefix="localhost_access_log." Suffix=".txt"
Pattern="common" resloveHosts="false"
/>

#各参数含义 :

classname: This MUST be set to org.apache.catalina.valves.AccessLogValve to use the default access log valve. &<60
Directory:日志文件放置的目录,在 tomcat 下面有个 logs 文件夹,那里面是专门放置日志文件的,也可以修改为其他路径;Prefix: 这个是日志文件的名称前缀,日志名称为localhost_access_log.2010-xx-xx.txt ,前面的前缀是:localhost_access_log
Suffix: 文件后缀名
Pattern: common 方式时,将记录访问源 IP、本地服务器 IP、记录日志服务器 IP、访问方式、发送字节数、本地接收端口、访问 URL 地址等相关信息在日志文件中
resolveHosts:值为 true 时,tomcat 会将这个服务器 IP 地址通过 DNS 转换为主机名,如果是 false,就直接写服务器 IP 地址

6.对于通过HTTP协议进行远程维护的设备,设备应支持使用HTTPS等加密协议

使用 https 方式登陆 tomcat 服务器页面,登陆成功。

参考配置:

①使用 JDK 自带的 keytool 工具生成一个证书

JAVA_HOME/bin/keytool -genkey –alias tomcat –keyalg RSA -keystore /path/to/my/keystore

②修改 tomcat/conf/server.xml 配置文件,更改为使用 https 方式,增加如下行:

Connector classname="org.apache.catalina.http.HttpConnector"
port="8443" minProcessors="5" maxprocessors="100"enableLookups="true"
acceptCount="10" debug="0"scheme="https" secure="true" >
Factory classname="org.apache.catalina.SSLServerSocketFactory"
clientAuth="false" keystoreFile="/path/to/my/keystore"
keystorePass=runway1@" protocol="TLS"/> /Connector>
#其中 keystorePass 的值为生成 keystore 时输入的密码

③重新启动 tomcat 服务

7.使用HTTP协议的设备,更改tomcat服务器默认端口。

①修改 tomcat/conf/server.xml 配置文件,更改默认管理端口到非默认端口8080

<Connector
port="xx" maxHttpHeaderSize="8192" maxThreads="150"
minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="300" disableUploadTimeout="true" />

②重启 tomcat 服务

8.Tomcat错误页面重定向

URL地址栏中输入http://ip:8800/manager12345让页面报错,直接指向指定错误页面

参考配置:

1.配置 tomcat/conf/web.xml 文件,在最后一行之前加入以下内容:

<error-page>
<error-code>404</error-code>
<location>/noFile.htm</location>
</error-page>

#第一个之间的配置实现了将404未找到jsp网页的错误导向
#noFile.htm页面,也可以用类似方法添加其他的错误代码导向页面,如 403,500 等。

……………
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/ error.jsp</location>
</error-page>

#第二个 之间的配置实现了当 jsp 网页出现java.lang.NullPointerException
#异常时,转向error.jsp错误页面,还需要在jsp网页中加入以下内容:

<%@ page errorPage="/error.jsp" %>

#典型的 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>

#当出现NullPointerException异常时tomcat会把网页导入到error.jsp,且会打印出错误信息

8.禁止tomcat列表显示文件

直接访问 http://ip:8080/webadd。当WEB目录中没有默认首页如index.html,index.jsp等文件时,不会列出目录内容。

参考配置:

编辑tomcat/conf/web.xml配置文件:

<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>

#把true改成false。
重新启动tomcat服务。按照配置可能会导致CVE-2017-12615(PUT 方法任意写文件)漏洞。所以还需要做以下配置禁用危险方法:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>

9.修改系统 Banner 信息

修改 catalina.jar 中 Serverinfo.properties 文件中的以下参数(修改以掩饰真实版本信息):

server.build=<BuildDate>
server.number=X

10.根据机器性能和业务需求,设置最大最小连接数。

编辑 server.xml 文件,样例如下:

<Connector port="8080"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
acceptCount="100"
/>
  • maxThreads=“150” 表示最多同时处理 150 个连接
  • minSpareThreads="25"表示即使没有人使用也开这么多空线程等待
  • maxSpareThreads=“75” 表示如果最多可以空 75 个线程
  • acceptCount=“100” 当同时连接的人数达到 maxThreads 时,还可以接收排队的连接,超过这个连接的则直接返回拒绝连接

11.禁用PUT、DELETE等危险的HTTP 方法

检查web.xml文件中配置 org.apache.catalina.servlets.DefaultServlet 的

<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>

12.禁用manager功能

将 webapps下manager文件移除到非$CATALINA_HOME/server/webapps目录;

13.对于具备字符交互界面的设备,应支持定时账户自动登出。登出后用户需再次登录才能进入系统

编辑 tomcat/conf/server.xml配置文件,修改为:

connectionTimeout=180;
<Connector
port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75"、 enableLookups="false" redirectPort="8443"
acceptCount="100" connectionTimeout="300" disableUploadTimeout="true"
/>

Nginx安全基线加固

1.启用日志功能。设备应配置日志功能,对错误日志、访问日志进行记录。用户登录进行记录,记录内容包括用户登录使用的账号,登录是否成功,登录时间,以及远程登录时,用户使用的 IP 地址

cat /usr/local/nginx/conf/nginx.conf

将 error_log 前的“#”去掉,记录错误日志将access_log 前的“#”去掉,记录访问日志(2)设置 access_log,修改配置文件如下:

log_format formatname '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent "$http_referer" '
' "$http_user_agent" "$http_x_forwarded_for"'; access_log
logs/access.log formantname;
#formatname 是设置配置文件格式的名称

2.限制 IP 访问,对网站或敏感目录的访问 IP 进行限制

cat /usr/local/nginx/conf/nginx.conf

具体设置如下,配置完成后重新启动nginx服务:

location / {
deny 192.168.1.1; #拒绝 IP
allow 192.168.1.0/24; #允许 IP
allow 10.1.1.0/16; #允许 IP
deny all; #拒绝其他所有 IP
}

3.控制超时时间,提高服务器性能,降低客户端的等待时间

cat /usr/local/nginx/conf/nginx.conf

具体设置如下,配置完成后重新启动nginx服务

  • client_body_timeout 10; #设置客户端请求主体读取超时时间
  • client_header_timeout 10;#设置客户端请求头读取超时时间
  • keepalive_timeout 5 5; #第一个参数指定客户端连接保持活动的超时时 间,第二个参数是可选的,它指定了消息头保持活动的有效时间
  • send_timeout 10; #指定响应客户端的超时时间

4.限制客户端下载速度,保证服务器负载正常

cat /usr/local/nginx/conf/nginx.conf

具体设置如下(根据业务进行并发数、速度限制具体数值)

limit_zone one $binary_remote_addr 10m;
server
{
listen 80;
server_name down.xxx.com;
index index.html index.htm index.php;
root /usr/local/xxx;
#Zone limit;
location / {
limit_conn one 1;
limit_rate 20k;
} ………
}

5.卸载不需要的 nginx 模块, 最大限度地将nginx 加载的模块最小化

./configure --help | less    #检查需要禁用的模块

#如果要禁用 autoindex 和 SSI 模块,命令如下:

./configure --without-http_autoindex_module --without-http_ssi_module
make
make install

6.防止其他网站盗链本网站资源

cat /usr/local/nginx/conf/nginx.conf

具体设置如下,配置完成后重新启动nginx服务:

location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
valid_referers none blocked server_names *.xxx.com
http://localhost baidu.com;
if ($invalid_referer) {
rewrite ^/ ;
# return 403;
}
}

7.自定义 nginx 返回的错误信息

cat src/http/ngx_http_special_response.c #定制错误信息

配置如下(配置完成后需要重启nginx),当访问出错时,返回自定义的错误页面

## messages with just a carriage return.
static char ngx_http_error_400_page[] = CRLF;
static char ngx_http_error_404_page[] = CRLF;
static char ngx_http_error_413_page[] = CRLF;
static char ngx_http_error_502_page[] = CRLF;
static char ngx_http_error_504_page[] = CRLF

8.修改 nginx 服务信息头内容,隐藏 nginx 版本信息

修改 nginx 解压路径/src/http/ngx_http_header_filter_module.c 文件的第 48和 49 行内容,自定义头信息:

static char ngx_http_server_string[] = "Server:XXXXX.com" CRLF;
static char ngx_http_server_full_string[] = "Server:XXXXX.com" CRLF;

添加如下代码到 nginx.conf 配置文件,禁止错误页面中显示 nginx 版本号:

server_tokens off

Apache安全基线加固

1.严格控制Apache主目录的访问权限,非超级用户不能修改该目录中的内容。

非超级用户不能修改apache主目录中的内容

参考配置:

cat httpd.conf
# 返回如:Server Root /usr/local/apache

2.严格设置配置文件和日志文件的权限,防止未授权访问

ls -l /etc/httpd/conf/httpd.conf
ls -l /var/log/httpd

参考配置:

chmod 600 /etc/httpd/conf/httpd.conf # 设置配置文件为属主可读写,其他用户无权限;
chmod 644 /var/log/httpd/*.log #设置日志文件为属主可读写,其他用户只读权限

3.设备应配置日志功能,对运行错误、用户访问等进行记录,记录内容包括时间,用户使用的IP地址等内容

cat httpd.conf  | grep -i errorlog

编辑 httpd.conf 配置文件,设置日志记录文件、记录内容、记录格式

LogLevel notice #日志的级别
ErrorLog /.../logs/error_log #日志的保存位置(错误日志)
#  访问日志:
LogFormat "%h %l %u %t \"%r\" %>s %b "%{Accept}i\"    \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog    /.../logs/access_log combined (访问日志)
ErrorLog    指令设置错误日志文件名和位置。错误日志是最重要的日志文件,Apache httpd 将在这个文件中存放诊断信息和处理请求中出现的错误。    若要将错误日志送到 Syslog,则设置:ErrorLog syslog。
CustomLog    指令指定了保存日志文件的具体位置以及日志的格式。访问日志中会记录服务器所处理的所有请求。
LogFormat 设置日志格式,建议设置为combined 格式。
LogLevel用于调整记录在错误日志中的信息的详细程度建议设置为notice

4.对于通过HTTP协议进行远程维护的设备,设备应支持使用HTTPS等加密协议

采用https协议加密

rpm -q mod_ssl

5.禁用PUT、DELETE等危险的HTTP方法

查看 httpd.conf 文件,检查如下内容,只允许get/post方法:

参考配置:

<LimitExcept GET POST >
Deny from all
</LimitExcept>

6.禁止Apache访问Web目录之外的任何文件

编辑 httpd.conf 配置文件

<Directory />
Order Deny,Allow Deny from all
</Directory>

设置可访问目录,/web为网站根目录

<Directory /web>
Order Allow,Deny Allow from all
</Directory>

8.禁止Apache列表显示文件

访问http://ip/xxx。当WEB目录中没有默认首页如index.html文件时不会列出目录内容

参考配置:

编辑 httpd.conf 配置文件

<Directory "/web">
Options Indexes FollowSymLinks    #删掉Indexes AllowOverride None
Order allow,deny Allow from all
</Directory>

将Options Indexes FollowSymLinks中的Indexes去掉,就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html 文件时,就显示目录结构。

9.Apache错误页面重定向

URL地址栏中输入http://ip/xxxxxxx指向错误页面。

参考配置:

#修改 httpd.conf 配置文件:ErrorDocument 400 /custom400.html
ErrorDocument 401 /custom401.html
ErrorDocument 403 /custom403.html
ErrorDocument 404 /custom404.html
ErrorDocument 405 /custom405.html
ErrorDocument 500 /custom500.html
#Customxxx.html 为要设置的错误页面。

10.根据业务需要,合理设置session时间,防止拒绝服务攻击

检查httpd.conf配置文件是否设置等参数KeepAliveTimeout

参考配置:

  1. 编辑 httpd.conf 配置文件,
Timeout 10             #客户端与服务器端建立连接前的时间间隔
KeepAlive On KeepAliveTimeout 15   #限制每个 session 的保持时间是 15秒

注:建议值,具体的设定需要根据业务实际情况而定。

11.隐藏Apache的版本号及其它敏感信息。

修改 httpd.conf 配置文件:

ServerSignature Off
ServerTokens Prod

12.关闭TRACE,防止TRACE方法被访问者恶意利用

修改配置文件httpd.conf,添加

TraceEnable Off

注:适用于 Apache 2.0 以上版本

13.如果服务器上不需要运行CGI程序,建议禁用CGI。

修改配置文件,把 cgi-bin 目录的配置和模块都注释掉。

#LoadModule cgi_module modules/mod_cgi.so
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#<Directory "/var/www/cgi-bin">
# AllowOverride None
# Options None
# Order allow,deny
# Allow from all
#</Directory>

14.服务器有多个IP地址时,只监听提供服务的IP地址

cat /etc/httpd/conf/httpd.conf|grep Listen

#查看是否绑定IP地址。
15.升级解决高危漏洞

根据apache安装路径使用命令行查看版本情况。如

#与需要的版本进行对比 apachectl –v

查看最新的 apache 版本:http://httpd.apache.org/download.cgi

16.更改Apache服务器非公众服务默认端口

修改 httpd.conf 配置文件,更改默认端口到 xx 端口(不常见端口)

Listen x.x.x.x:xx 端口

17.删除缺省安装的无用文件

#无用文件目录
/usr/local/apache2/htdocs/     #缺省 HTML 文件
/usr/local/apache2/cgi-bin/    #缺省的 CGI 脚本
/usr/local/apache2/manual      #Apache 说明文件
/path/to/httpd-2.2.4*          # 源代码文件

18.根据机器性能和业务需求,设置最大最小连接数

ps -ef |grep httpd |wc –l    #检查现在的连接数

使用 httpd –l 检查 Apache 的工作模式,如列出 prefork.c,则进行下列操作,修改 httpd.conf 文件找到:

<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 1000
</IfModule>
#MaxClients 1500  需要的连接数,如 1500
#ServerLimit 1500   连接数大于 256 需设置此项

修改完中间件配置文件都需要重启该服务:

  • 点赞
  • 收藏
  • 分享
  • 文章举报
汉皇重色思倾国 发布了12 篇原创文章 · 获赞 0 · 访问量 303 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: