[基线加固]常见中间件(tomcat&nginx&apache)
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 管理权限。
查看logs目录中相关日志文件内容,记录完整
检查server.xml文件,<HOST>标签中日志功能注释符被删除。
参考配置:
编辑server.xml配置文件,在<HOST>标签中增加记录日志功能将以下内容的注释标记< ! -- -- >取消
<
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错误页面重定向
参考配置:
1.配置 tomcat/conf/web.xml 文件,在最后</web-app>一行之前加入以下内容:
<error-page>
<error-code>404</error-code>
<location>/noFile.htm</location>
</error-page>
# 第一个<error-page></error-page>之间的配置实现了将404未找到jsp网页的错误导向
#noFile.htm页面,也可以用类似方法添加其他的错误代码导向页面,如 403,500 等。……………
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/ error.jsp</location>
</error-page>
#第二个 <error-page></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:8800/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 的<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
12.禁用manager功能
$CATALINA_HOME/server/webapps/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安全基线加固
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
具体设置如下(根据业务进行并发数、速度限制具体数值),配置完成后重新启动nginx服务:
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 ^/ [img]http://www.xxx.com/images/default/logo.gif[/img];
# return 403;
}
}
7.自定义 nginx 返回的错误信息
cat src/http/ngx_http_special_response.c #定制错误信息
配置如下(配置完成后需要重启nginx),当访问出错时,返回自定义的错误页面
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
local/apache 返回如:Server Root /usr/
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 #设置日志文件为属主可读写,其他用户只读权限
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方法:
参考配置:
cat http.conf
<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错误页面重定向
参考配置:
#修改 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 目录的配置和模块都注释掉。
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 文件找到:
prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 1000
</IfModule>
#MaxClients 1500 需要的连接数,如 1500
#ServerLimit 1500 连接数大于 256 需设置此项
修改完中间件配置文件都需要重启该服务: