vlambda博客
学习文章列表

[基线加固]常见中间件(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!@34roles=”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;<Connectorport="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_loglogs/access.log formantname;#formatname 是设置配置文件格式的名称

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

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

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

location / {deny 192.168.1.1; #拒绝 IPallow 192.168.1.0/24; #允许 IPallow 10.1.1.0/16; #允许 IPdeny 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_modulemakemake 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.comhttp://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),当访问出错时,返回自定义的错误页面

## 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.confls -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\"" combinedCustomLog /.../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 NoneOrder 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 目录的配置和模块都注释掉。

#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>

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 8MinSpareServers 5MaxSpareServers 20MaxClients 150MaxRequestsPerChild 1000</IfModule>#MaxClients 1500 需要的连接数,如 1500#ServerLimit 1500 连接数大于 256 需设置此项

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