Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

1. 概述

自己搭建过网站的同学应该知道:网络攻击是常有的事,如:CGI工具、DDos工具、SQL注入、XSS攻击、CSRF攻击等等。这些网络轻则导致服务器宕机,重则入侵你的服务器系统,盗取或破坏服务器的数据。

网站安全建设,就是要对网站的网络攻击进行防护,提高网站的安全性,这是保证我们自建网站安全稳定运行的关键。下面就介绍一下网站安全建设的一些方法。

2. 环境说明

  • 博客框架: Hexo
  • 网站主题: Volantis
  • 评论系统: Disqus
  • 服务器: 阿里云ECS
  • 服务器系统: Ubuntu 24.04 LTS

3. 设置云服务器的安全防火墙

产品与服务 -> 云安全中心 -> 总览

这里能看到自己云服务器的安全评分和待处理风险项。

点击“立即处理”,按提示进行相关的操作。

4. 设置web服务器的安全配置

4.1. 防止信息暴露

  1. 删除服务器标识:防止泄露Nginx版本等信息。
1
2
3
# 在 /etc/nginx/nginx.conf 的http{}块中设置

server_tokens off; # 隐藏服务器版本号
  1. 禁止目录索引:防止Nginx在无默认文档时列出目录内容。
1
2
3
4
5
# 在自己站点的配置文件中设置

location / {
autoindex off; # 禁止目录索引
}

4.2. 限制访问

IP黑名单配置: blacklist.conf

1
2
3
4
5
6
# 拒绝以下黑名单IP的访问
deny 31.220.1.83; # 禁止 31.220.1.83
deny 197.58.33.0/24; # 禁止 197.58.33.*

# 允许其他IP访问
allow all;

引用 blacklist.conf 配置

1
2
3
4
5
6
# 在自己站点的配置文件重设置

location / {
# IP黑名单列表
include /etc/nginx/sites-available/blacklist.conf;
}

4.3. 防止DDoS攻击

  1. 限制请求速率
1
2
3
4
5
6
7
8
9
10
11
# 在 /etc/nginx/nginx.conf 的http{}块中设置
# 创建限速区,名字:req_limit,内存大小:10M,速率限制:每秒1个请求
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;

# 在自己站点的配置文件重设置
location / {
# 设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
limit_req zone=req_limit burst=5;
limit_req _log_level error;
limit_req_status 503;
}
  1. 限制并发连接数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在 /etc/nginx/nginx.conf 的http{}块中设置

# 创建连接数限制区:conn_limit_per_ip, 内存大小:10M
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
# 创建连接数限制区:conn_limit_per_server, 内存大小:10M
limit_conn_zone $server_name zone=conn_limit_per_server:10m;


# 在自己站点的配置文件重设置
location / {
# 每个IP地址同一时刻允许的最大连接数为
limit_conn conn_limit_per_ip 2;
# 每个server服务器同一时刻允许的最大连接数
limit_conn conn_limit_per_server 50;
}
  1. 限制下载速度
1
2
3
4
5
6
7
# 在自己站点的配置文件重设置
location / {
# 下载的前500k不限速
limit_rate_after 500k;
# 下载的最大速度
limit_rate 100k;
}

4.4. 防止爬虫抓取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 在自己站点的配置文件重设置

server {
#forbidden Scrapy
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
# 444 状态是直接由服务器中断连接,不会向客户端再返回任何消息
return 444;
}

#forbidden UA
if ($http_user_agent ~ "Bytespider|FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|python-requests|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {
return 444;
}
#forbidden not GET|HEAD|POST method access
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 403;
}
}

4.5. 防非法引用(防盗链)

1
2
3
4
5
6
location ~ \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked yourdomain.com *.yourdomain.com;
if ($invalid_referer) {
return 403; # 如果Referer不在允许范围内,返回403 Forbidden
}
}

4.6. 路径错误时跳转到404页面

1
2
3
4
5
# 在server模块中设置
# 404 配置
proxy_intercept_errors on;
fastcgi_intercept_errors on;
error_page 404 /404.html;
推荐阅读
博客建站5 - Nginx的安装和配置 博客建站5 - Nginx的安装和配置 博客建站2 - 选择网站服务器 博客建站2 - 选择网站服务器 博客建站6 - 域名解析 博客建站6 - 域名解析

评论