文章目录
引言
在这个网络攻击层出不穷的时代,保护您的VPS(虚拟私有服务器)服务器免受攻击是一个至关重要的任务。无论是运行一个小型业务网站、博客还是其他在线服务,一次成功的攻击都可能导致严重的数据损失、服务中断,甚至财务损失。
想象一下,辛苦经营的网站突然被黑客入侵,关键数据被窃取或者被恶意破坏,这将给您的业务带来何等巨大的冲击?又或者,你的VPS被黑客控制,成为了发送垃圾邮件或进行其他非法活动的工具,这将给您带来法律风险和声誉损害。
然而,通过采取一些简单而有效的安全措施,就可以大大降低被攻击的风险。本文将详细介绍如何加固VPS服务器,让它免受常见攻击手段的威胁。无论你是网络安全新手还是有一定经验,都将从这篇指南中获益匪浅。快来了解一下吧!
前期准备
如果你还没有域名,从喜欢的域名注册商购买一个域名,使用域名能够更方便的购买的VPS,购买完成后,我喜欢将域名由 Cloudflare 管理,至于为什么喜欢托管给 Cloudflare 管理,这里就不多展开讲解。你也可以这样做。
购买VPS
在本博客中,我不会详细介绍初始 VPS 购买过程,以及如何选购合适的 VPS,相信能看到此篇博客的朋友多多少少也对 VPS 有所了解,所以在此不再谈及选购过程。
本博客以 Digitalocean 作为VPS、Ubuntu 22.04 LTS 作为系统演示。
最后,建议先选择使用密码作为认证方法,以便可以以 root 用户身份登录服务器。 DigitalOcean 列出了应遵循的一些密码要求,以确保您创建安全的密码。稍后,将禁用 root 用户和基于密码的身份验证,并设置更安全的 SSH 密钥身份验证。但就目前而言,创建安全的根用户密码是访问服务器并开始安装的最快方法。
首次登录
VPS 新建完成后,点击查看实例详情,会看到分配的IP地址。首先通过 SSH 登录服务器。系统会要求输入在上一步中选择的密码。
ssh root@64.23.199.138
> ssh root@64.23.199.138 root@64.23.199.138's password: Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-67-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information disabled due to load higher than 1.0 Expanded Security Maintenance for Applications is not enabled. 17 updates can be applied immediately. 13 of these updates are standard security updates. To see these additional updates run: apt list --upgradable Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status The list of available updates is more than a week old. To check for new updates run: sudo apt update Last login: Thu Apr 4 09:12:03 2024 from 122.248.220.131 root@ubuntu-s-1vcpu-1gb-sfo3-01:~#
如果使用的是 Mac 或 Linux 操作系统,则应该能够通过默认终端应用程序完成所有这些操作。如果使用的是 Windows,则可以安装名为 Putty 或 xshell 的 SSH 软件。
设置主机名
现在已登录到服务器,让我们设置主机名和完全限定域名 (FQDN)。主机名应该是唯一的,有些人选择以天文物体命名他们的服务器。
正确设置主机名和 FQDN 将使将来连接到服务器变得更加容易,因为不必每次都记住 IP 地址。要设置主机名,请发出以下命令(根据选择的域名进行更改):
echo “do.uuzi.de” > /etc/hostname
hostname -F /etc/hostname
为了使用你的主机名连接到服务器,需要更新域名的 DNS 设置。登录 DNS 控制面板并创建新的 A 记录:
确保 A 记录与你在 Web 服务器上配置的主机名匹配,并且 Web 服务器的 IP 地址与你的域名关联。您可能需要等待一段时间才能传播 DNS 设置。
如果您使用 Cloudflare 作为 DNS,请确保关闭代理开关。
DNS 设置传播后,如果退出当前 SSH 会话,你应该能够使用新主机名连接到服务器。
ssh root@do.uuzi.de
> ssh root@do.uuzi.de root@do.uuzi.de's password: Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-67-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Thu Apr 4 09:23:47 UTC 2024 System load: 0.0 Users logged in: 0 Usage of /: 6.9% of 24.05GB IPv4 address for eth0: 64.23.199.138 Memory usage: 22% IPv4 address for eth0: 10.48.0.5 Swap usage: 0% IPv4 address for eth1: 10.124.0.2 Processes: 92 * Introducing Expanded Security Maintenance for Applications. Receive updates to over 25,000 software packages with your Ubuntu Pro subscription. Free for personal use. https://ubuntu.com/pro Expanded Security Maintenance for Applications is not enabled.
这样,我们就可以以域名的方式登录VPS,不用记忆难以记忆的IP地址。当前密码一定要记住,不然无法登录。
设置时区
设置时区
DigitalOcean 将默认将新服务器设置为与数据中心区域相同的时区。要设置服务器时区,可以配置tzdata
包。这将确保系统日志文件显示正确的日期和时间。以下命令将配置tzdata
包:
dpkg-reconfigure tzdata
将显示一个简单的 GUI,允许选择地理区域和时区:
完成后,新选择的时区将与当前时间和日期一起显示:
root@do:~# dpkg-reconfigure tzdata Current default time zone: 'Asia/Shanghai' Local time is now: Thu Apr 4 17:29:21 CST 2024. Universal Time is now: Thu Apr 4 09:29:21 UTC 2024.
安装软件更新
尽管刚刚配置了新服务器,但某些软件包可能已经过时。我们通过提取更新的软件包列表来确保使用的是最新的软件:
apt update
完成后,更新所有当前安装的软件包。系统将提示更新将占用多少空间。
apt upgrade -y
升级完成后,将显示哪些软件包已安装,以及系统不再需要哪些软件包。
apt autoremove
如果收到需要重新启动系统的消息,请运行以下命令:
reboot now
这将会与服务器断开连接。你需要等到服务器重新启动才能通过 SSH 再次连接。
自动安全更新
保持服务器软件更新以便修补软件漏洞至关重要。值得庆幸的是,Ubuntu 可以自动执行软件更新,保证服务器的安全。请务必记住,这种便利可能非常危险,建议仅启用安全更新。这将在发现新漏洞时自动修补它们。
在某些系统上,此功能可能会自动启用。如果没有,或者你不确定,请按照以下步骤操作:
第1步,安装unattended-upgrades
包:
apt install unattended-upgrades
第2步、创建所需的配置文件:
dpkg-reconfigure unattended-upgrades
你应该看到以下屏幕:
第3步,选择“是”并按Enter键。然后,编辑配置文件:
nano /etc/apt/apt.conf.d/50unattended-upgrades
第4步,确保允许安全源,并删除或注释掉所有其他源:
dpkg-reconfigure unattended-upgrades
// Automatically upgrade packages from these (origin:archive) pairs // // Note that in Ubuntu security updates may pull in new dependencies // from non-security sources (e.g. chromium). By allowing the release // pocket these get automatically pulled in. Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}"; "${distro_id}:${distro_codename}-security"; // Extended Security Maintenance; doesn't necessarily exist for // every release and this system may not have it installed, but if // available, the policy for updates is such that unattended-upgrades // should also install from here by default. "${distro_id}ESMApps:${distro_codename}-apps-security"; "${distro_id}ESM:${distro_codename}-infra-security"; // "${distro_id}:${distro_codename}-updates"; // "${distro_id}:${distro_codename}-proposed"; // "${distro_id}:${distro_codename}-backports"; };
你可能还希望配置系统是否应在更新生效时自动重新启动。默认行为是在安装更新后立即重新启动服务器,如果需要开在特定时间内进行重新启动,可以按照以下进行操作:
最后,在第 5 步中,设置自动更新运行的频率:
nano /etc/apt/apt.conf.d/20auto-upgrades
确保它 Unattended-Upgrade
在列表中。
APT::Periodic::Unattended-Upgrade “1”;
该数字表示以天为单位执行升级的频率。值为 1 将每天运行升级。
创建新用户
我们已经完成了 VPS 服务器基础知识和安全更新的配置。本教程的下一步是将新用户添加你的服务器。这样做有两个原因:
- 在本章后面,将禁用 root 用户的 SSH 访问,这意味着你需要另一个用户帐户才能访问您的服务器
- root 用户拥有非常广泛的权限,允许你执行具有潜在破坏性的命令。因此,建议创建一个具有更有限权限的新用户帐户以供日常使用。
这个新用户将被添加到该sudo
组中,以便可以执行需要更高权限的命令,但仅在需要时才执行。
首先,创建新用户:
adduser uuzi
系统将提示输入一些基本用户信息并选择密码。如前所述,此密码应该很复杂:
root@do:~# nano /etc/apt/apt.conf.d/20auto-upgrades root@do:~# adduser uuzi Adding user `uuzi' ... Adding new group `uuzi' (1000) ... Adding new user `uuzi' (1000) with group `uuzi' ... Creating home directory `/home/uuzi' ... Copying files from `/etc/skel' ... New password: Retype new password: passwd: password updated successfully Changing the user information for ashley Enter the new value, or press ENTER for the default Full Name []: uuzi Room Number []: 123 Work Phone []: 1008611 Home Phone []: 1001011 Other []: Is the information correct? [Y/n] y
接下来,需要将新用户添加到sudo
组中:
usermod -a -G sudo uuzi
现在,通过注销当前的 SSH 会话并启动一个新会话来确保新帐户可以登录:
logout
然后使用新帐户登录:
ssh uuzi@do.uuzi.de
> ssh uuzi@do.uuzi.de uuzi@do.uuzi.de's password: Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-101-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro System information as of Thu Apr 4 18:08:56 CST 2024 System load: 0.0 Users logged in: 0 Usage of /: 8.2% of 24.05GB IPv4 address for eth0: 64.23.199.138 Memory usage: 18% IPv4 address for eth0: 10.48.0.5 Swap usage: 0% IPv4 address for eth1: 10.124.0.2 Processes: 90 Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status
登录成功,说明以上步骤没问题。可以接着进行以下操作。
生成密钥对
此时,你的新用户就可以使用了。为了增强安全性,将添加公钥身份验证。我不会详细介绍如何创建 SSH 密钥对(DigitalOcean有一篇有关该过程的信息丰富的文章),但如果你还没有密钥对,请可以在服务器上输入以下命令:
ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
将“your_email@example.com”替换为可帮助你识别此 SSH 密钥的内容(不一定是电子邮件地址)。
你应该会收到一条消息,如下所示,只需按回车键即可接受默认位置。然后,系统会提示您输入密码(可选),这将要求您每次使用此密钥对登录时输入密码:
uuzi@do:~$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" Generating public/private rsa key pair. Enter file in which to save the key (/home/uuzi/.ssh/id_rsa): Created directory '/home/uuzi/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/uuzi/.ssh/id_rsa Your public key has been saved in /home/uuzi/.ssh/id_rsa.pub The key fingerprint is: SHA256:huBZqwbulS9lhFpG40XiJBoql3GT/Ho6ziQaYTi9g6I your_email@example.com The key's randomart image is: +---[RSA 4096]----+ |. o.=o. | |.o B=o. | |+ ooo=. | |oo .=+oo | |+.o+ooo S | |.=.o.o+. | |+ = *= | |o+ B+. | |E ..oo. | +----[SHA256]-----+
/home/uuzi/.ssh/id_rsa 是私钥文件的路径,/home/uuzi/.ssh/id_rsa.pub为公钥文件路径。
修改 ssh 配置文件,打开密钥验证:
sudo nano /etc/ssh/sshd_config
查找文本中:PubkeyAuthentication no,将此项中的 no 改为 yes。
重启 ssh,以生效该修改配置。
sudo systemctl restart sshd
将公钥文件复制到 authorized_keys 文件中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
保证密钥安全性,加上权限:
chmod 600 ~/.ssh/authorized_keys
下载私钥到本地
现在已经有了 SSH 密钥对,现在需要将私钥下载到本地。可以同过 FTP 工具下载私钥到本地。
将以上私钥下载到本地计算机。然后尝试通过此私钥链接服务器。正常情况可以通过此私钥链接服务器。
ssh -i ~/.ssh/id_rsa uuzi@64.23.199.138
> ssh -i ~/.ssh/id_rsa uuzi@64.23.199.138 Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-101-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro System information as of Thu Apr 4 20:17:42 CST 2024 System load: 0.0 Users logged in: 1 Usage of /: 8.2% of 24.05GB IPv4 address for eth0: 64.23.199.138 Memory usage: 20% IPv4 address for eth0: 10.48.0.5 Swap usage: 0% IPv4 address for eth1: 10.124.0.2 Processes: 105 Expanded Security Maintenance for Applications is not enabled.
SSH 配置
创建新用户后,是时候通过配置 SSH 进一步保护服务器了。您要做的第一件事是禁用 root 用户的 SSH 访问,这将不再使用 root 用户通过 SSH 登录服务器。使用 nano 打开 SSH 配置文件:
sudo nano /etc/ssh/sshd_config
找到显示为 的行PermitRootLogin yes
并将其更改为PermitRootLogin no
。按CTRL + X,然后按Y保存更改。为了使更改生效,您必须重新启动 SSH 服务:
sudo service ssh restart
现在,如果你退出当前的 SSH 会话并尝试与 root 用户连接,应该会收到权限被拒绝的错误消息。
> ssh root@do.uuzi.de root@do.uuzi.de's password: Permission denied, please try again.
确保 SSH 安全的最后一步是禁用用户使用密码登录。这可确保你需要 SSH 私钥才能登录服务器。请记住,如果丢失私钥,你将被锁定在服务器之外,因此请确保安全!大多数虚拟机服务器提供商(例如 DigitalOcean)确实有其他登录方式,但最好不要依赖这些方法:
sudo nano /etc/ssh/sshd_config
找到显示为 #PasswordAuthentication yes
并将其更改为PasswordAuthentication no
。按CTRL + X,然后按Y保存更改。必须再次重新启动 SSH 服务才能使更改生效。
sudo service ssh restart
现在,在注销服务器之前,应该测试新配置。为此,请打开一个新的终端窗口,而不关闭当前的 SSH 会话并尝试连接:
ssh uuzi@do.uuzi.de
你应该会成功登录到服务器。
简单的防火墙
防火墙通过阻止入站网络流量为服务器提供额外的安全传输层。我将演示iptables
防火墙,它是 Linux 中最常用的并且是默认安装的。为了简化向防火墙添加规则的过程,我喜欢使用一个名为ufw
的包,它代表 Uncomplicated Firewall。该ufw
软件包通常是默认安装的,但如果未安装,请使用以下命令安装
sudo apt install ufw
现在已拥有访问权限,ufw
可以开始添加规则,默认拒绝所有传入流量并允许所有传出流量。现在,添加 SSH (22)、HTTP (80) 和 HTTPS (443) 的端口:
sudo ufw allow ssh && sudo ufw allow http && sudo ufw allow https
要查看将添加到防火墙的规则,请输入以下命令:
sudo ufw show added
uuzi@do:~$ sudo ufw show added Added user rules (see 'ufw status' for running firewall): ufw allow 22/tcp ufw allow 80/tcp ufw allow 443
在启用防火墙规则之前,请确保 SSH 端口位于添加的规则列表中 – 否则,你将无法连接到您的服务器!默认端口为 22。如果一切看起来正确,请继续并启用配置:
sudo ufw enable
要确认新规则处于活动状态,请输入以下命令:
sudo ufw status verbose
你会看到默认情况下拒绝所有入站流量,但 IPv4 和 IPv6 的端口 22、80 和 443 除外,这对于大多数服务器来说是一个安全的做法。
uuzi@do:~$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere 443 ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6) 80/tcp (v6) ALLOW IN Anywhere (v6) 443 (v6) ALLOW IN Anywhere (v6)
Fail2ban
Fail2ban是一个与防火墙一起工作的工具。它的功能是监控对服务器的入侵尝试,并在一段时间内阻止违规主机。它通过将显示恶意活动的任何 IP 地址添加到你的防火墙规则中来实现此目的。强烈建议在将运行 WordPress 配置的服务器上安装 Fail2ban 之类的东西,以保护你的服务器,特别是如果你打算安装任何第三方插件。
默认情况下未安装 Fail2ban 程序,因此现在安装它:
sudo apt install fail2ban -y
默认配置应该足够了,在通过 SSH 尝试登录 6 次失败后,该配置将禁止主机 10 分钟。要确保fail2ban服务正在运行,请输入以下命令:
sudo service fail2ban start
任务完成!现在你拥有一个比较安全的平台来开始使用你的服务器,并已采取必要的步骤来防止未经授权的访问。但是,请务必记住,安全性是一个持续的过程,您应该牢记以下几点:
- 仅从可信来源安装所需的软件(例如,Nginx 或 Apache、PHP、MySQL/MariaDB)
- 定期安装软件更新和安全修复
- 使用1Password等工具强制执行强密码
- 考虑一下如果你被锁定,你将如何访问服务器
如果各位小伙伴在配置的过程中遇到问题,可以到 兔哥论坛 中交流讨论,我会针对每一篇博客,专门发布一篇帖子,用来交流。
如果你想及时收到关于兔哥博客更多内容,欢迎大家订阅电报频道:兔哥播报 和公共社区:兔哥论坛 。
牛逼得兔哥,很棒
😘