Web安全运维规范
Web安全运维规范
1 Web服务配置
1.1 Nginx安全配置
隐藏nginx服务及其版本
#方式1:
#vi nginx-1.9.11/src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: LTWS" ; #修改处
#修改nginx_http_header_filter_module
#vi nginx-1.9.11/src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"<center> NGINX_VER </center>"
"<hr><center> http://www.weiyigeek.com</center>"
"</body>"
"</html>"
;
static u_char ngx_http_error_tail[] =
"<hr><center>LTWS</center>"
"</body>"
"</html>"
;
#设置响应头版本版本
#vim src/core/nginx.h
#define NGINX_VERSION "secWaf" #可以改成你要的版本号
#define NGINX_VER X "1.1" NGINX_VERSION #改成你的服务名称`
设置成功后验证:
低权限用户运行服务
应配置非root低权限用户来运行nginx服务,设置如下建立Nginx用户组和用户,采用user指令指运行用户。 加固方法:
groupadd nginxweb;
useradd -M -g nginxweb -s /sbin/nologin nginxweb
#nginx.conf 中配置 或者编译 的时候指定
#nginx 安装编译参数--user=nginx --group=nginx
user nginxweb
配置SSL及其会话复用
我们应该为提供的站点配置Secure Sockets Layer Protocol (SSL协议),配置其是为了数据传输的安全,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
server {
# 开启 SSL 与 http2 支持
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 开启SSL,如果想http 与 https 公用一个配置则可以将其注释( the "ssl" directive is deprecated )
# ssl on;
# 配置证书链与证书密钥
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/weiyigeek.top.key;
# ssl会话复用超时时间以及会话复用缓存大小
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
......
}
限制SSL协议与加密套件
不应使用不安全SSLv2、SSLv3协议即以下和存在脆弱性的加密套件(ciphers), 我们应该使用较新的TLS协议也应该优于旧的,并使用安全的加密套件。
# 兼容性较为通用的SSL协议与加密算法套件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;
# 浏览器客户端自动协商加密套件(为了兼容性)
ssl_prefer_server_ciphers on;
拦截垃圾信息
HTTP Referrer Spam是垃圾信息发送者用来提高他们正在尝试推广的网站的互联网搜索引擎排名一种技术,如果他们的垃圾信息链接显示在访问日志中,并且这些日志被搜索引擎扫描,则会对网站排名产生不利影响。 加固方法:
if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ){
return 403;
}
恶意扫描拦截
当恶意攻击者采用扫描器进行扫描时候利用use-agent判断是否是常用的工具扫描以及特定的版本,是则返回错误或者重定向;
# 封杀各种user-agent
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan|nessus|wvs" ) {
return 403;
}
if ($http_user_agent ~* "" ) {
return 403;
}
# 封杀特定的文件扩展名比如.bak以及目录;
location ~* \.(bak|swp|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;
}
location /(admin|phpadmin|status) { deny all; }
禁用WebDAV
Nginx支持webdav,虽然默认情况下不会编译。如果使用webdav,则应该在Nginx策略中禁用此规则。 加固方法: dav_methods 应设置为off
禁用Nginx状态模块
当访问一个特制的URL时,如”../nginx.status”,stub_status模块提供一个简短的Nginx服务器状态摘要,大多数情况下不应启用此模块。 加固方法:nginx.conf文件中stub_status不应设置为:on
关闭默认错误页上的Nginx版本号
如果在浏览器中出现Nginx自动生成的错误消息,默认情况下会包含Nginx的版本号,这些信息可以被攻击者用来帮助他们发现服务器的潜在漏洞 加固方法: 关闭”Server”响应头中输出的Nginx版本号将server_tokens应设置为:off
server_tokens off
设置client_body_timeout超时
client_body_timeout设置请求体(request body)的读超时时间。仅当在一次readstep中,没有得到请求体,就会设为超时。超时后Nginx返回HTTP状态码408(Request timed out)。 加固方法:nginx.conf文件中client_body_timeout应设置为:10
设置client_header_timeout
client_header_timeout设置等待client发送一个请求头的超时时间(例如:GET / HTTP/1.1)。仅当在一次read中没有收到请求头,才会设为超时。超时后Nginx返回HTTP状态码408(Request timed out)。 加固方法:nginx.conf文件中client_header_timeout应设置为:10
设置keepalive_timeout超时
keepalive_timeout设置与client的keep-alive连接超时时间。服务器将会在这个时间后关闭连接。 加固方法:nginx.conf文件中keepalive_timeout应设置为:55
设置send_timeout超时
send_timeout设置客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,Nginx就会关闭连接。 加固方法:nginx.conf文件中send_timeout应设置为:10
Nginx可用的方法应限制为GET, HEAD, POST
GET和POST是Internet上最常用的方法。Web服务器方法在RFC 2616中定义禁用不需要实现的可用方法。 加固方法:
#nginx.conf文件中应存在
if ($request_method !~ ^(GET|HEAD|POST)$ )
控制并发连接limit_zone slimits
limit_zone 配置项限制来自客户端的同时连接数。通过此模块可以从一个地址限制分配会话的同时连接数量或特殊情况。 加固方法:nginx.conf文件中limit_zone应设置为:slimits $binary_remote_addr 5m
# 设定保存各个键(例如$binary_remote_addr)状态的共享内存空间的参数,zone=空间名字:大小大小的计算与变量有关
limit_conn_zone $binary_remote_addr zone=ops:10m;
控制并发连接limit_conn slimits
该配置项控制一个会话同时连接的最大数量,即限制来自单个IP地址的连接数量。 加固方法:nginx.conf 文件中 limit_conn 应设置为: slimits 5
# 表示同一IP同一时间只允许10个连接
limit_conn ops 5;
主机防webshell跨目录浏览以及列目录
加固方法: a.在nginx.conf里把每个虚拟主机站点请求端口给区别开 b.为每个站点建一个conf,并进行配置 c.修改php-fpm启动脚本 d.启动服务
#在main-http-server段中设置开启或者关闭(对于需要列目录的则开启,否则默认是关闭的)
autoindex off
文件名解析漏洞php_info,加入fcgi.conf即可
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}
访问权限控制nginx
加固方法:
#nginx.conf
location ~ ^/script/ {
auth_basic "welcome to weiyigeek.github.io";
auth_basic_user_file /var/www/test/script/.htpasswd;
}
#建立htpasswd密码进行认证
mkdir /var/www/test/script
perl -e "print crypt('baidu.eud',"n");"
nnUygd3RSf3u6
echo 'nginx:nnUygd3RSf3u6' > /var/www/test/script/.htpasswd
/usr/local/nginx/sbin/nginx -s reload
异常状态返回200隐藏URL
解决办法:
server{
listen 80;
server_name weiyigeek.top;
index index.html index.htm index.php;
root /data/web;
error_page 404 =200 /404.jpg;
}
安全模块的选择
# 安全检测模块选择
http_sub_module
http_stub_status_module
xss-nginx-module
with-http_ssl_module
记录访问者真实IP
描述后端获取Proxy后的真实Client的IP获取需要安装--with-http_realip_module,然后后端程序采用JAVA(request.getAttribute("X-Real-IP"))进行获取;
set_real_ip_from 100.0.0.0/8;#(这里是已知的代理ip)
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 代理转发
location / {
proxy_pass http://weiyigeek.top
}
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $Real $http_x_forwarded_for;
if ( $Real ~ (\d+)\.(\d+)\.(\d+)\.(\d+),(.*) ){
set $Real $1.$2.$3.$4;
}
proxy_set_header X-Real-IP $remote_addr;
#区别
$proxy_add_x_forwarded_for #较下面多一个$remote_addr的(只能获取到与服务器本身直连的上层请求ip)
$http_x_forwarded_for
#日志获取
$http_x_real_ip|$remote_addr #前提条件是cdn 那边也设置了X-forward否则获取的是cdn的ip
地区访问响应措施
描述: 如果要使用geoip地区选择,我们需要再nginx编译时加入 --with-http_geoip_module 编译参数。
# 例如,访问者IP地址不为中国或者美国的都返回403。
if ( $geoip_country_code !~ ^(CN|US)$ ) {
return 403;
}
资源防盗链设置
描述: 为了防止外部站点引用我们的静态资源,我们需要设置那些域名可以访问我们的静态资源。
# none : "Referer" 来源头部为空的情况
# blocked : "Referer" 来源头部不为空
# server_names : "Referer"来源头部包含当前的server_names(当前域名)
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked weiyigeek.top server_names ~\.google\. ~\.baidu\.; #这是可以盗链的域名或IP地址,一般情况可以把google,baidu,sogou,soso,bing,feedsky,zhuaxia,photozero等域名放进来
if ($invalid_referer) {
#这样设置能够防盗链,不断地302重定向很多次,可能会加重服务器的负担,所以不建议这么做,除非有单独的图片服务器支持
return 403; # 或者返回 403 错误代码 或者 JSON 字符串
# 返回json
add_header Content-Type 'application/json; charset=utf-8';
return 200 "{'msg':'valid'}";
# 本地目录重写
rewrite ^/.*.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
# 重写远程URL
rewrite ^/ https://www.weiyigeek.top/picture/images/details-image-1.jpg;
}
}
常规安全响应头配置
描述: 下面收集了Web服务中常规的安全响应头, 它可以保证不受到某些攻击,建议在指定的 server{} 代码块进行配置。
# HSTS (ngx_http_headers_module is required) 应该只使用 HTTPS 而不是使用 HTTP 通信
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;
# XXS-Protection
add_header X-XSS-Protection "1; mode=block";
# MIME 模拟探测
add_header X-Content-Type-Options nosniff;
# Frame 安全控制
add_header X-Frame-Options ALLOW-FROM music.163.com;
# Spider Robots 爬取策略限制
add_header X-Robots-Tag none;
# CORS 跨域设置
add_header Access-Control-Allow-Origin '*.weiyigeek.top';
add_header Access-Control-Allow-Methods 'GET';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
# CSP
# 现在让我们允许自托管 scripts、images、CSS、fonts 和 AJAX,以及 jQuery CDN 托管脚本和 Google Analytics 的内容:
Content-Security-Policy: default-src 'none'; script-src 'self' https://code.jquery.com https://www.google-analytics.com; img-src 'self' https://www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self';
防止非所属域名解析到服务器
描述: 为了防止某些未备案的域名或者恶意镜像站域名绑定到我们服务器上, 导致服务器被警告关停,将会对业务或者SEO排名以及企业形象造成影响,我们可以通过如下方式进行防范。
server {
listen 80 default_server;
server_name 82.156.18.253;
# 禁止搜索引擎收录IP
add_header X-Robots-Tag 'noindex,noarchive,nosnippet';
location ^~ / {
# IP地址访问强制301跳转
if ( $host = 82.156.18.253 ){
return 301 https://www.weiyigeek.top/index.html;
}
# 请求host非指定域名时返回json
if ( $host !~* weiyigeek\.top ) {
add_header Content-Type 'application/json; charset=utf-8';
return 200 '{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":"请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}';
# return 301 https://space.bilibili.com/385802642;
}
}
...
}
执行结果:
$ curl -I 82.156.18.253
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 11 Apr 2022 12:15:02 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://www.weiyigeek.top/index.html
X-Robots-Tag: noindex,noarchive,nosnippet
$ curl --insecure -I https://82.156.18.253
HTTP/2 301
server: nginx
date: Mon, 11 Apr 2022 12:15:24 GMT
content-type: text/html
content-length: 162
location: https://www.weiyigeek.top/index.html
x-robots-tag: noindex,noarchive,nosnippet
$ curl weiyigeek.cn
{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":"请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}
限制指定客户端地址访问
描述: 有时你的网站可能只需要被某一IP或者IP段的地址请求访问,那么非白名单中的地址访问将被阻止访问, 我们可以如下配置;
location / {
allow 12.97.167.194;
allow 12.33.1.2;
allow 12.152.49.4;
deny all;
}
1.2 Tomcat安全配置
开启访问日志
编辑/conf//server.xml文件,取消注释下列代码:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
启用访问日志功能,重启 Tomcat 服务后,在logs文件夹中就可以看到访问日志。
修改默认访问端口
修改 conf/server.xml 文件把默认的 8080 访问端口改成其它端口。
禁止列出目录
防止外部直接访问目录时由于找不到默认页面,而列出目录下的文件的情况,编辑conf/web.xml 文件: 将listings改成false或值改为false。
删除文档和示例程序
删除 webapps 目录下的 docs、examples、manager、ROOT、host-manager 文件夹。
修改运行内存大小
编辑配置文件 bin/catalina.sh JAVA_OPTS=‘-Xms512m -Xmx512m’ 说明:按需更改 -Xms【初始化内存大小】 -Xmx【可以使用的最大内存】
2 数据传输加密
配置web服务支持https访问。
基于 SSL 证书,可将站点由 HTTP(Hypertext Transfer Protocol)切换到 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),即基于安全套接字层(SSL)进行安全数据传输的加密版 HTTP 协议。
2.1 HTTPS作用
https优势 | 说明 |
---|---|
防劫持、防篡改、防监听 | 使用 SSL 证书实现网站、移动 App、Web API 等应用的 HTTPS 协议化后,HTTPS 将对用户与服务端间的数据交互进行加密,从而实现传输数据的防劫持、防篡改、防监听。 |
提升网站搜索排名(SEO) | 使用 SSL 证书实现网站的 HTTPS 协议化后,更利于搜索引擎对其信任,使网站在收录速度上更快,搜索结果中的排名更高,提升网站可信度。 |
提升网站的访问流量(PV) | 使用 SSL 证书实现网站的 HTTPS 协议化后,可以强化网站在用户侧的身份可信程度,使网站用户能更安心地访问网站,提升网站的访问流量。 |
杜绝钓鱼网站 | HTTPS 地址栏绿色图标可以帮助用户识别出钓鱼网站,保障用户和企业的利益不受损害,增强用户信任。 |
2.2 SSL证书类型
证书类型 | 类型说明 |
---|---|
自签名 | 不是由受信任的 CA 机构来签发的 SSL证书,没有经过权威的第三方的验证,有效期不限,缺少额外验证和漏洞支持。适用于测试环境、内网环境等场景。 |
CA机构颁发 | 由受信任的CA机构签发的域名型(DV)免费证书,经过权威第三方验证,定期更新,安全性更高。 |
CA机构颁发免费证书 | 由受信任的CA机构签发的免费证书,绑定单域名,有数量限制。 |
CA机构颁发付费证书 | 包含域名型(DV)、企业型(OV)、增强型(EV)证书,支持多域名、泛域名、通配符多域名绑定,审核严格,安全性高。 |
2.3 HTTPS配置
SSL证书申请
向数字证书授权机构(CA)提交证书申请,一般通过公有云或其他代理商(腾讯云、亚洲诚信等)提交申请,可以申请免费或付费证书。
https配置
示例说明在Linux系统下Nginx配置证书的方式(其他web服务器根据其官方文档配置即可):
1.前提条件
- 已申请并下载ssl证书
- nginx已加载http_ssl_module模块
- 以hos.mediway.cn域名配置为例
2.将已获取到的 hos.mediway.cn_bundle.crt 证书文件和 hos.mediway.cn.key 私钥文件从本地目录拷贝到 Nginx 服务器的 /usr/local/nginx/conf 目录(此处为 Nginx 默认安装目录,请根据实际情况操作)下;
3.编辑 Nginx 根目录下的 conf/nginx.conf 文件,配置域名和证书文件路径名称,如下图:
4.重载nginx:nginx -s reload
5.访问验证
3 Web应用防火墙
Web 应用防火墙(Web Application Firewall,WAF)是一款基于 AI 的 Web 业务运营风险防护方案。通过 AI+规则双引擎识别恶意流量,保护网站安全,提高 Web 站点的安全性和可靠性。通过 BOT 行为分析,防御恶意访问行为,保护网站核心业务安全和数据安全。
3.1 WAF主要功能
攻击分类 | 攻击描述 |
---|---|
SQL 注入攻击 | 在网站实现上,对于输入参数过滤不严,导致 SQL 数据库的内容被非法获取。 |
XSS 攻击 | 当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据,或者使用可以创建 HTML 或 JavaScript 的浏览器 API 更新现有的网页时,会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。 |
恶意扫描 | 检测网站是否被恶意扫描。 |
核心文件非法访问 | 检测某些配置文件、数据库文件及参数数据,是否被随意下载。 |
开源组件漏洞攻击 | 常见 Web 开源组件漏洞产生的攻击行为。 |
命令注入攻击 | 注入攻击的一种,包含 Shell 命令注入,PHP 代码注入,Java 代码注入等,若被攻击者成功利用,可导致网站执行攻击者注入的代码。 |
WEB 应用漏洞攻击 | Web 应用程序的安全性(在 Web 服务器上运行的 Java、 ActiveX、PHP、ASP 代码的安全)。 |
XXE 攻击 | 由于 XML 处理器在 XML 文件中存在外部实体引用。攻击者可利用外部实体窃取使用 URI 文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。 |
木马后门攻击 | 检测木马传播过程或木马上传后与控制端通信行为。 |
文件上传攻击 | 当上传文件伪装成正常后缀的恶意脚本时,攻击者可借助本地文件包含漏洞执行该文件。 |
其他漏洞攻击 | 由于Web 服务器本身安全和其他软件配置安全或漏洞引起的攻击。 |
不合规协议 | HTTP 协议参数,头部请求参数异常。 |
3.2 WAF配置
各公有云及安全厂商提供的WAF产品,配置方式可能不同,具体参考各厂商官方文档。 下图是腾讯云WAF产品配置示例页面: