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
,在文件末尾添加:脚本大致如下,参照:群机器人配置说明 - 文档 - 企业微信开发者中心 4
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
申请并下载证书
- 注册并且登录 ZeroSSL
- 到 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 作者:秋未萌
- Author:风之旅人
- URL:https://www.hrmi.fun//article/VPS-Security
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!