Lazy loaded image
技术分享
VPS基本安全措施
00 min
2024-11-27
2024-12-9
type
status
date
slug
summary
tags
category
icon
password

精简版

创建非 root 账户

使用以下命令创建一个具有提权能力的账户:
给这个用户设置一个至少为 16 位的随机密码:

禁用 root SSH 密码登陆

进行如下设置:
之后重启 SSH 服务生效:

修改 SSH 端口号

登上去第一件事就是改SSHD的 端口并修改防火墙,22全是猜密码的请求。
正常情况下,直接通过sudo vim /etc/ssh/sshd_config修改SSH端口,然后再使用sudo systemctl restart ssh.service重启SSH服务应用更改是可行的。
但是在Ubuntu 22.10 或更高版本中各位可能发现这是无效的,各位会发现SSH服务在重启后依然监听原端口。因为在Ubuntu 22.10 或更高版本中,ssh 默认通过套接字激活。
在 Ubuntu 22.10、Ubuntu 23.04 和 Ubuntu 23.10 中进行修改的方法是:
listen.conf的参考配置为:
在 Ubuntu 24.04 中进行修改的方法是:
如果不在乎通过套接字激活节省的内存,可以通过以下命令恢复到非套接字激活:

Fail2ban 防暴力破解 SSH

执行以下命令安装 Fail2ban:
官方推荐的做法是利用 jail.local 来进行自定义设置:
可以参照以下配置文件来进行自己的配置(记得删注释):

通知服务器SSH登录

以防偷家不知道
可以通过 PAM 模块在每次ssh登录时触发脚本来实现。
编辑/etc/pam.d/sshd,在文件末尾添加:
2024年11月26日注:修复了示例脚本的一些问题。
请根据自己的用例替换api及调用方式。

【严格】使用绝对路径运行命令

使用绝对路径可以精准指定要运行的程序或文件,可避免因环境变量被篡改等原因误执行潜在的恶意程序。

使用密钥登录

如果 VPS 厂商提供了 SSH 密钥绑定功能,可以忽略本节内容并按照 VPS 厂商提供的方法绑定。
在 powershell 中运行:
直接使用默认的密钥路径即可。密码可以留空,也可以设置。
然后我们在 VPS 上编辑 SSH 授权密钥文件:
之后打开 C:\Users<user>/.ssh/id_ed25519.pub,复制其内容并粘贴过去。
执行以下命令编辑 SSH 配置文件:
进行如下设置:
之后重启 SSH 服务生效:

启用 UFW 防火墙

如果 VPS 厂商提供了防火墙功能,且没有复杂的需求,可以忽略本节内容并使用 VPS 厂商提供的防火墙。
在正式启用 UFW 之前,我们需要先设置规则。我们首先来设置 UFW 的默认行为:
我们可以通过以下命令查看 UFW 当前生效的规则:
我们可以通过以下命令允许或拒绝某端口的传入/传出流量(部分以 22、80、443 端口为例):
我们可以通过以下命令删除生效的规则:
在确定所有规则均成功设置后,通过以下命令启动 \ 关闭 \ 重启 UFW
启动防火墙前务必保证 22 端口(或者其他 SSH 端口)被放行。
如果需要重置规则,请使用:
重置规则前务必保证 UFW 处于关闭状态。
本人建议仅放行正在使用的端口,比如22、80、443。

限定SSH登录IP

如果拥有动态公网IP且厂商支持通过接口修改防火墙规则,可以直接使用厂商的接口。
若没有公网IP,可忽略此条。

保证软件更新

日常更新系统

建议定期登录 VPS 运行sudo apt update && sudo apt upgrade来保证 VPS 内所有软件包均为最新。Ubuntu 默认会每天自动安装系统的安全更新,所以说这个频率没必要太勤。

隐藏公网 IP

隐藏公网IP并不是所有VPS使用者的共同安全需求

防止 SSL 证书泄露 IP

申请并下载证书

  • 到 Dashboard 1 找到 Create SSL Certificate,点击 New Certificate 蓝色按钮
  • 在 Enter Domains 处输入源站 IP
  • 其实过期也无妨,总之不让 censys 扫描到真正的域名证书就可以。因此选择 90 天证书
  • CSR & Contat 保持不变
  • 验证域名的办法选择 HTTP File Upload
    • 使用 NGINX 的话,如果你保持原先设置不变,即 /etc/nginx/sites-available/default 不变就没问题。当然,如果你改变了,记得保留 server {listen 80; root /var/www/html;} 就可以
    • 然后下载 Auth File,并且把它上传到 /var/www/html/.well-known/pki-validation。如果没有文件夹,就新建,记得让 NGINX 有权访问这些文件,否则还是会失败
    • 按照提示,点击一下.txt 文件是不是可以访问。成功的话,就验证好了

配置证书并且设置禁止 IP 80/433 的 HTTP 访问

  • 下载 .zip 文件,解压它。解压好的文件夹里面有好申请到的证书
  • 将 ca_bundle.crt 和 certificate.crt 合并,方法是用 notepad3 或者 vsode 等可靠的编辑器打开 certificate.crt。然后把 ca_bundle.crt 内容复制进去。格式是:
  • 上传合并好的文件和 private.key
  • 上传证书到一个 Nginx 有权限的文件夹,咱放在 /etc/nginx/ip-certificate/
  • 设置 /etc/nginx/sites-available/default 文件。参考设置如下:
服务器后台输入 nginx -t 检查是否有误,正确即可 sudo systemctl restart nginx 重启。
直接输入 IP 作为网址检查是不是连接后立刻变成空白页

Nginx 1.19.4 之后的新方法

如果各位的 Nginx 版本大于等于 1.19.4,可以直接使用 ssl_reject_handshake 配置项,通过简单的配置就能拒绝所有未匹配到域名的 TLS 握手:
如果出现如nginx: [emerg] unknown directive “ssl_reject_handshake”的报错,首先请检查nginx版本是否大于等于1.19.4。ssl_reject_handshake on; 在nginx 1.19.4 主线版加入。
如果是通过源代码编译安装的,请确认ngx_http_ssl_module模块是否启用。 该模块不是默认构建的,需要通过 --with-http_ssl_module 配置参数来启用。

迈向全面容器化

善用容器化技术进行隔离

UFW管不了Docker的解决方案(推荐)

以docker compose为例: 1. 对于数据库或者redis之类仅在应用内使用的服务: • 仅在容器内部网络内开放,compose拉起时会创建一个名为第一个服务名_default的bridge,可以用docker network ls查看。 • 容器默认对该内部网络开放所有端口。 • 同一网络内的其他容器可以通过容器名和端口访问该服务。 • 没有加入该网络的容器无法访问任何端口。 • 对于仅在内部网络中暴露端口的服务,无需在 ports 下指定任何映射 2. 对于需要进行反代的服务: • 仅在127.0.0.1监听即可防止外部端口访问,在对应容器处使用 ports: - 127.0.0.1:端口:端口 3. 对于需要外部直接访问端口的服务: • 直接使用 ports: - 端口:端口

引用

  • 如何避免证书泄露源站 IP 作者:秋未萌
上一篇
电视盒子+CoreElec打造家庭媒体中心
下一篇
无感刷新 Token