跳至正文

VPS安全实操指南:如何避免黑客入侵并保障服务器安全

引言

在这个网络攻击层出不穷的时代,保护您的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 服务器基础知识和安全更新的配置。本教程的下一步是将新用户添加你的服务器。这样做有两个原因:

  1. 在本章后面,将禁用 root 用户的 SSH 访问,这意味着你需要另一个用户帐户才能访问您的服务器
  2. 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等工具强制执行强密码
  • 考虑一下如果你被锁定,你将如何访问服务器

如果各位小伙伴在配置的过程中遇到问题,可以到 兔哥论坛 中交流讨论,我会针对每一篇博客,专门发布一篇帖子,用来交流。

如果你想及时收到关于兔哥博客更多内容,欢迎大家订阅电报频道:兔哥播报  和公共社区:兔哥论坛 。

《VPS安全实操指南:如何避免黑客入侵并保障服务器安全》有2个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注