服务器安全一直是个挺重要的事儿,但对于我们这些小站长来说,专业能力不如运维人员,对 Linux 操作系统也没那么熟悉,更别说去读取分析日志提前填补问题了。在个人精力与专业能力之间势必有个选择,总结了目前对服务器安全所做的努力,尽可能防止因为个人原因导致的漏洞问题。

当然我毕竟不是专业人员,所提出的观点也仅仅代表我的个人观点,此篇分类是为 杂谈

一、云服务商

这里以腾讯云举例,当你在云服务商购买了服务器/轻量服务器后,除开操作系统本身,服务商的控制台能够提供这几项关键能力:①重置账户密码;②密钥的绑定;③防火墙控制。

① 重置账户密码

重置密码是必须的,毕竟执行 sudo 类命令时,或需要输入当前用户的密码,密码这里建议在常用密码基础上进行个别位的变形,比如将服务器地域和常用密码掺和在一起输入,当然其实这个意义不是很大。

② 密钥的绑定

原则上密钥不应该共用,实际上共用同一套密钥方便很多。所以实际点的建议是在 创建密钥 时输入安全密码,以及加密算法使用 ed25519,如果是 RSA 算法则需要为 4096 位。

甚至,你还可以登录服务器,将腾讯云自己的 SSH 密钥删除(位于默认用户的 ~/ssh/authorized_keys 中);同时关闭一键登录功能、卸载 自动化助手云监控 BaradAgent/Sgagent 插件。

③ 防火墙控制

正所谓做的越多,错的越多,所以尽可能的减少端口的开放,比如我自己的服务器只开放了两个端口:用来 Https 访问的 443 端口和用来进行终端连接的 SSH 端口,像 80 端口这类不加密访问的还是趁早埋了吧。

同时防火墙除了能做端口限制外,还可以用来屏蔽指定地址的访问:比如 Censys 的扫描,直接将它的 IP 段屏蔽,拒绝连接:Can I opt out of Censys scans;再比如,如果你像我一样毫不在意境外的访问流量,而当你在日志里找到了有个 138.246.56.96 的 IP 在对你的服务器做扫描时,可以直接拒绝它整个范围的连接:138.246.0.0/16(德国 慕尼黑大学网段)。

二、应用控制

如上文所说,我对外开通了用于 SSH 和 Https 的端口,所以就是围绕着这两个对外开放的端口,尽可能的减少对方的入侵渠道,越少越难越好。

① SSH 应用

相较来说,此点最好解决,核心是 禁止密码登录、只允许密钥登录、更换默认端口,这三点可以在配置文件中完成,注:Ubuntu 默认不允许 root 用户的密码登录,但是可以用密钥去登。

/etc/ssh/sshd_config
# 禁止密码登录
PasswordAuthentication no

# 允许密钥登录
PubkeyAuthentication yes

# 修改端口
Port 2022

② Web 应用

监听 443 端口的位 Nginx,涉及了从域名到地址、再到各类响应状态等的处理。

(1)DNS 阶段

首先我们的理想状态是你通过域名找不到我服务器的真实 IP,备案的话可以使用国内的 CDN 服务,没备案时可以使用 Cloudflare 的代理服务,这两者都可以达到隐藏真实服务器地址的目的。

如果你依旧像我一样没心没肺毫不在乎访问体验,那么 DNS 阶段可以设置成仅解析境内服务。以 DNSPod 举例,如果你购买了专业版,可以单独新增一条解析线路为云厂商(阿里云、华为云、京东云、青云、亚马逊云等),地址为 127.0.0.1 的解析,让那些请求自个儿玩去吧。

(2)直接访问

2.1 拒绝默认域名访问

假设对方知道了你的 IP,但是不知道这个服务器部署了什么网站。如果没有设置默认站点,对方可以通过一个垃圾域名落到你某个站点上,所以第一步拒绝默认域名访问:

拒绝 SSL 请求,返回状态码 444
server {
server_name _;
listen 80 default_server;
listen 443 ssl http2 default_server;
ssl_reject_handshake on;
return 444;
}
额外你还可以对具体的网站校验 host
if ($host != 'inkss.cn'){
return 444;
}

2.2 拒绝非 CDN 请求访问

如果对方即知道 IP 又知道域名,可以做到直接通过本地 hosts 绕过 CDN 进行访问。我们可以在 CDN 面板中的回源设置里添加一个只有你知道的请求头和值,然后在网站配置中对其判断,不符合就返回 444。

只有携带这个请求头才放行
# 私有请求头校验 X-Check
if ($http_x-check != 'helloworld') {
return 444;
}

(3)避免抛出错误信息

避免直接把错误信息展现给用户,不知道的永远是最好的,可以在网站的配置中重定向 5XX 错误。

5XX,444 有请
error_page 500 501 502 503 504 505  =444 @blackhole;
location @blackhole {
return 444;
}

(4)对关键地址进行一个简单的加密

比如 Typecho 博客的后台登录页,直接利用宝塔面板的访问限制功能,对 /admin/ 路径加密,授权通过访问打开页面,否则 401 Unauthorized。

(5)部署 Web 防火墙

无论你是使用宝塔面板的防火墙还是 ModSecurity 防火墙,请务必开启一个。

(6)拉黑无意义的 UA

具体情况具体分析,我的拉黑比较激进,包含下列内容的 User-Agent 均被我拉黑了:

一概拉黑
*nmap*|*NMAP*|*HTTrack*|*sqlmap*|*Java*|*zgrab*
*Python*|*python*|*curl*l*Curl*|*wget|*Wget*
*MJ12bot*|*a Palo Alto*|*ltx71*|*censys*
*Go-http-client*|*CensysInspect*
*toutiao*|*Barkrowler*|*AhrefsBot*

三、其他

面板

事实上我少开放了一个用于访问宝塔的端口,因为直接用 Nginx 反代访问啦。

数据库

没有必要开放数据库端口,使用 SSH 隧道访问,保持数据库本地连接即可。

评论