秋实-Allenyou的小窝

稻花香里说丰年,听取WA声一片

【教程】浅谈Linux服务器的一些基础安全技巧

2023/1/18

本文最后修改于 443 天前,请注意文章内容的时效性。

前言

在建站等应用中,Linux 服务器有着可观的市场占有率。但仍有很大一部分服务器主没有正确进行安全配置,导致服务器处于极大被攻击风险中。本文简述了 Linux 服务器的一些基础安全技巧。

关于 Linux 服务器的安全性

由于各类 Linux 发行版在桌面端的市场占有率比较低,以 Linux 发行版用户(下文简称 Linux 用户)为主要目标的病毒相较针对 Windows 用户的病毒少见。因此,部分 Linux 用户产生了如下错误认知:

  • Linux 不会中病毒
  • Linux 很安全
  • Linux 不需要注意安全配置

但显然,以上认知都与事实相去甚远。事实上,Linux 发行版安全性并不高于 Windows,只是大部分 Windows 用户并没有正确配置、使用微软设计的权限系统和安全保护措施,导致 Windows 桌面端/未合理配置的 Windows Server 服务器安全性过低。而以各类运行 Linux 发行版的设备,特别是具有公网 IP 的 Linux 服务器的各类攻击从未停止,在此我贴出一张我服务器遭受到的端口扫描日志:

服务器遭受的扫描

因此,为 Linux 服务器配置一些安全措施仍然是有必要的。

一些声明

本文仅为我个人的一些经验总结,并不能保证在所有情况下均可保证安全,主要目的是预防一些“广撒网”式的攻击以及阻拦一些 xxs 的骚扰,并非在遭受大规模攻击时用作防御(当然,这些基础安全措施也是很必要的,但只有这些大概不够)

本文所述仅适用于 Linux 服务器,对于 Windows 服务器并不适用。

本文均以 Ubuntu Server 系统为操作环境,其它发行版请自行更改部分操作。

基础篇

不要使用 root 用户

大部分 VPS 提供商在服务器创建后会为用户提供一个 root 用户密码,以供用户通过 ssh 连接服务器。但在实际使用过程中,直接使用 root 登录服务器是极为危险的。一方面,root 用户在系统内有几乎最高权限(开启 SELinux 等其它安全措施的情况另算),一旦 root 用户权限被盗取将造成极大损失;另一方面,在 root 用户下,各大 Linux 发行版自带的一些防误操作的提示会失效,或在一些危险操作时不再要求用户确认,增大误操作的风险(rm -rf /*这种就不用说了吧)。因此,拿到服务器的第一件事应该是建立一个普通账户,并且使用普通账户登录服务器进行日常管理,在需要使用 root 权限时使用sudo代替。下面的命令可以做到这一点:

useradd username -G sudo -m -s /bin/bash
passwd username

同时,修改/etc/sudoers文件也可以达到限制用户以 root 权限运行的命令的效果,进一步提高安全性。

最后,可以修改/etc/ssh/sshd_config文件,禁用 root 用户登录,将对应项修改为

PermitRootLogin no

保存并重启 sshd 即可禁用 root 用户登录。

使用低权限用户运行服务器软件

事实上,大部分发行版默认安装的 nginx 等服务器软件都是以单独用户运行的。(如 nginx 常用 www、www-data、nginx 等用户运行),配合 Linux 的权限系统可有效防止服务器软件漏洞导致的服务器整体被攻破。

如 nginx 可以在 nginx.conf 中将配置修改为(此处假定已经创建用户为 nginx,用户组为 nginx):

user nginx nginx;

同时,记得将对应账户的默认 shell 改为/sbin/nologin并且配置好权限,防止出现其它问题。

修改 ssh 端口

一般来说,ssh 默认使用 22 端口,但很多攻击者会在公网上扫描开放 22 端口的服务器并通过弱口令爆破方式试图入侵。这种情况下,将 ssh 端口修改为一个不常用端口可以有效降低遭遇此类攻击的可能性。

编辑/etc/ssh/sshd_config文件,将对应项修改为

Port 端口号

保存并重启 sshd 即可修改端口号。

如果同时使用了防火墙,需要提前放通相应端口,否则可能在重启 sshd 后无法连接服务器。

进阶篇

使用密钥登录服务器并禁用密码登录

sshd 允许使用密钥登录服务器,而密钥的安全系数显然远远高于密码(在量子计算机出来之前 RSA/椭圆曲线加密算法的安全性毋庸置疑)。因此,使用密钥登录服务器并禁用密码登录可以减少服务器因密码被爆破而遭到入侵的可能性。同时,密钥登录还可以省去每次输入密码的繁琐偷个懒谁不喜欢呢

在启用密钥登录之前,需要先在本地生成密钥对。如果你使用各种 SSH 客户端请查阅文档,以下仅简略叙述 Linux 发行版直接在终端中使用 ssh/Windows 下使用 Git Bash 的操作方法。

本地Shell 中输入ssh-keygen命令生成密钥对,此时会出现如下提示:

allenyou@MyPC:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/allenyou/.ssh/id_rsa):[此处设置密钥文件保存的位置,一般默认即可(ssh默认使用用户家目录下.ssh/id_rsa.pub的公钥和.ssh/id_rsa的私钥,储存在其他位置需要修改ssh的配置)]
Created directory '/home/allenyou/.ssh'.
Enter passphrase (empty for no passphrase):[此处输入密钥的密码,如果设置了那么每次使用密钥时都会要求输入密码,不设置可以直接按回车留空]
Enter same passphrase again:[此处再次输入密钥的密码,同上,不设置可以直接按回车留空]
Your identification has been saved in /home/allenyou/.ssh/id_rsa(私钥文件的地址,需要妥善保管不能泄露)
Your public key has been saved in /home/allenyou/.ssh/id_rsa.pub(公钥文件的地址)
The key fingerprint is:
SHA256:[此处应该是密钥的SHA256指纹] allenyou@MyPC
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
allenyou@CVM34848:~$

接着,将对应公钥文件中的内容复制到服务器上对应用户家目录下.ssh/authorized_keys文件中(如果不存在请创建,并且修改.ssh目录权限为700.ssh/authorized_keys文件权限为600)。

当然,你也可以直接在本地使用下面的命令(其实就是将 ssh 连接服务器命令中的ssh换成了ssh-copy-id):

ssh-copy-id 用户名@服务器地址

输入服务器用户密码即可完成公钥的复制。

之后,编辑服务器/etc/ssh/sshd_config文件,将对应项修改为

PubkeyAuthentication yes
PasswordAuthentication no

保存并重启 sshd 即可禁用密码登录并启用密钥登录。

在禁用密码登录前可以先仅打开密钥登录,测试能正常登录后再禁用密码登录,防止无法连接服务器。

千万不要泄露私钥文件的内容!!!

使用防火墙封禁端口

Linux 服务器的一大安全威胁就是各类端口扫描。因此,使用防火墙将危险端口封禁,只开放服务所需端口(如 HTTP/HTTPS 的80/443端口)是较为彻底的做法。

现在 Linux 发行版中常用的防火墙是 iptables,但其强大的功能也增加了配置的复杂度。因此我们可以使用 ufw 来代替 iptables 简化防火墙配置。

ufw 的后端其实就是 iptables

在 Ubuntu Sever 中,已经内置了 ufw。这里直接使用下列命令进行配置(需要 root 权限,此处省略 sudo):

ufw enable #启用防火墙
ufw reset #清空规则
ufw default deny incoming #设置默认阻止入站
ufw default allow outgoing #设置默认放行出站
ufw allow 端口号 #允许指定端口所有连接
ufw allow 端口号/tcp #只允许指定端口的 tcp 连接
ufw allow 端口号 1:端口号 2 #允许端口号段的连接

重启后生效。

记得放通 ssh 端口,否则可能无法连接服务器。

有用户反映 ufw 可能与 docker 存在冲突,docker 配置的规则可能导致 ufw 配置的规则不生效。

使用容器化技术隔离不同服务

这里推荐使用 Docker,可以一定程度上提高安全性

Docker 不是虚拟机,所以安全性有限,但总比不隔离好

其它

这里的一些技巧仅作列举,不叙述其操作,感兴趣的读者可以自行查找资料配置。

使用 fail2ban 防止爆破

使用 knockd 隐藏端口

设置 IP 白名单

使用跳板机登录服务器

使用 SSH Tunnel 在不暴露端口的情况下管理服务器

总结

服务器安全是个很复杂的话题,一篇博客很显然难以详尽叙述。这里只是一些基本的安全措施,可以在一定程度上保护服务器安全。

然而,人往往才是服务器最大的漏洞所在。永远对每一个操作保持谨慎,对陌生人存有基本的警惕,同时不要过于招摇防止招惹别人(被别人盯上了这些措施也不一定救的了你),才是服务器安全的关键所在。

参考资料

【教程】浅谈Linux服务器的一些基础安全技巧

https://www.allenyou.wang/post/9

本文作者

秋实-Allenyou

授权协议

CC BY-NC-SA 4.0