[基线加固]常见中间件(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 管理权限。
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
参考配置:
- 编辑 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 需设置此项
修改完中间件配置文件都需要重启该服务:
- 点赞
- 收藏
- 分享
- 文章举报
- 常见的nginx,apache反代用户请求至tomcat主机的实现方法
- (nginx|apache)+tomcat 几种常见的代理实现方式及连接类型(connector type) 推荐
- nginx,apache,tomcat常见web服务器性能调优
- 常见服务器Apache/Tomcat/JBOSS/Jetty/Nginx区别与对比
- 搭建Nginx与tomcat整合,用Nginx代替apache
- nginx+tomcat使用apache的FtpClient上传图片时由于多线程问题导致的文件大小为0的问题
- Nginx与Apache、Tomcat、Resin动静分离的配置
- Tomcat与Apache或Nginx的集群负载均衡设置及Sersync同步应用(3)
- 坚持#第270天~tomcat2(Nginx+Tomcat、Nginx+Apache) 、nagios监控
- tomcat与nginx、Apache整合
- Tomcat与Nginx、Apache结合的相关实践
- nginx 、apache、tomcat自定义返回错误页面配置
- 实例详解tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡 推荐
- 说说nginx,iis,apache,tomcat
- (总结)Nginx与Apache、Tomcat、Resin动静分离核心配置
- 在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件
- 关于Apache/Tomcat/JBOSS/Neginx/lighttpd/Jetty等一些常见服务器的区别比较和理解
- 配置apache和nginx的tomcat负载均衡
- 关于Apache/Tomcat/JBOSS/Neginx/lighttpd/Jetty等一些常见服务器的区别比较
- Apache nginx Tomcat对比