基于 CentOS 7 系统设置与优化

服务器迁移到 Vultr 东京机房,这次我们选择了 CentOS 7 x64 作为 VPS 的操作系统,因为我们认为它相比之前使用的 Ubuntu 16.04 x64 LTS 更适合我们。

跟其他系统(无论是服务器还是桌面操作系统)一样,在系统安装后,尤其是投入生产用途时,需要进行一系列的设置,主要是增加安全性。

本文主要进行的是 sshd 安全配置,包括限制 root 及设置普通用户,其主要目的也是为了增加 sshd 的安全性。

修改 root 密码

默认生成的 root 密码太过复杂,而且是明文显示在“Server Information”中的,我们需要更改一个容易记住且安全性高的密码,使用 root 登录并运行:

1
passwd

即可按提示设置 root 密码。

创建普通用户

root 权限过大,且 root 容易被作为攻击的突破口,故,我们需要再创建一个普通用户,用于替代 root 进行系统的日常管理操作。

我们使用以下命令创建新用户(用户名为“newbietech”,以下简称为“newbietech”):

1
adduser newbietech

使用以下命令,按提示为 newbietech 设置密码:

1
passwd newbietech

同时,我们使用以下命令,将 newbietech 加入“Wheel”组:

1
gpasswd -a newbietech wheel

当看到“Adding user newbietech to group wheel”时,表明 newbietech 已经添加至 Wheel 组,具备 sudo 权限,可以在必要时提权(需输入 newbietech 的密码确认),替代 root 进行某些操作。

sshd 安全配置

我们使用 SSH 登录的方式对 VPS 进行管理,这样 sshd 的安全配置便是确保系统安全的重要部分。

对 sshd 的安全配置,主要通过修改“/etc/ssh/sshd_config”文件实现。

我们可以通过以下命令对该文件进行修改:

1
vi /etc/ssh/sshd_config

而使用以下命令重启 sshd 服务使修改生效:

1
service sshd restart

对 sshd 的安全配置,也包括对其他配置文件的修改,我们强烈建议:

  • 在修改前注意保存配置文件;
  • 对多项功能进行修改时,逐项进行测试,通过一项后再进行下一项的修改。

修改 sshd 端口

sshd 的默认端口为“22”,我们将它改为其他端口,例如“10086”。

我们在“/etc/ssh/sshd_config”文件中添加“Port 10086”,如下图:

sshd - Port

保存退出,运行以下命令将“10086”端口添加至防火墙的开放规则中:

1
firewall-cmd --add-port 10086/tcp

再重启 sshd 服务使修改生效,即可使用新端口进行登录。

经测试使用新端口进行登录无异常之后,运行:

1
firewall-cmd --add-port 10086/tcp --permanent

使防火墙规则在重启系统之后依然生效。

使用 SSH v2 协议

SSH v1 协议已被证实存在缺陷,我们应使用安全性更高的 SSH v2 协议以提高安全性。

我们在“/etc/ssh/sshd_config”文件中添加“Protocol 2”,修改生效后,即可启用 SSH v2 协议的支持。

sshd - Protocol

限制 root 直接登录

我们在“/etc/ssh/sshd_config”文件中添加“PermitRootLogin no”,修改生效后,即可限制 root 直接登录。

sshd - PermitRootLogin

值得注意的是,配置生效后,我们不要急于退出当前 SSH 连接,新开一个终端,测试 root 是否已被禁止登录,而使用普通用户登录是否成功。一切经测试正常后,才能将当前 SSH 连接退出。

在进行配置文件的修改之前,对拟修改的文件先进行备份是个好习惯,因为这样可以在出现问题时及时回退到可用的版本。

使用密钥进行登录

先前在使用 Amazon ECS 的时候,我们就注意到,其官方的镜像将禁止 root 直接登录并使用密钥进行登录作为增强系统安全性的措施。

使用密钥登录,我们需要先创建密钥。

在 Linux 下,我们可以使用以下命令创建密钥:

1
ssh-keygen -t rsa -b 4096

根据提示,即可创建“id_rsa”和“id_rsa.pub”两个文件,前者为私钥,后者为公钥,均保存在“~/.ssh”目录下。

在 Windows 下,我们也可以使用 PuTTYGen 等工具创建密钥:

PuTTY - PuTTY Key Generator

我们可以点击“Generate”按钮按提示创建密钥对。

在 Linux 下生成的密钥,我们可以使用以下方法将公钥添加至“~/.ssh/authorized_keys”文件中并设置文件读写权限:

1
2
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

如果系统中没有其他密钥,我们也可以将“id_rsa.pub”文件复制一份保存为“authorized_keys”,即:

1
2
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

我们在创建服务器实例时选择了“SSH Keys”,则 root 的主文件夹下包含密钥文件,但新创建的用户的主文件夹下不包含密钥文件,我们可以将 root 的密钥文件复制到其他用户的主文件夹下:

1
2
3
4
5
6
7
ls /home/							# 应可看到 newbietech 目录
ls -ah # 应可看到 .ssh 目录
ls .ssh/ # 应可看到 authorized_keys 文件
mkdir /home/newbietech/.ssh
cp .ssh/authorized_keys /home/newbietech/.ssh/
chown newbietech /home/newbietech/.ssh/authorized_keys
chmod 600 /home/newbietech/.ssh/authorized_keys

在 Windows 或其他环境下生成的密钥,我们可以创建“authorized_keys”文件并在编辑器中将公钥粘贴进来:

1
2
vi ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

上述过程还可以简单地通过“ssh-copy-id”脚本进行设置:

1
ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 10086 newbietech@newbietech-vultr-tokyo"

总之,只要可以实现将公钥添加至“~/.ssh/authorized_keys”文件中并设置文件读写权限的目的即可。

同时,我们修改“/etc/ssh/sshd_config”文件中相关的设置:

sshd - PubkeyAuthentiation

值得注意的是,我们需要将“StrictModes”设置为“no”,否则可能会出现“server refused our key”的情况,无法使用密钥进行登录。

配置生效后,即可使用密钥登录。

如果在 Windows 下使用 PuTTY 登录,则可能生产的私钥文件“id_rsa”不符合 PuTTY 所需的格式,需要使用 PuTTY Key Generator 进行转换:

PuTTY - PuTTY Key Generator

点击“Load”按钮加载已生成的私钥,再点击“Save private key”按钮,即可生成所需的“PPK私钥”供 PuTTY 登录使用:

PuTTY-Configuration

禁用密码登录

我们创建了密钥文件,用于登录系统,同时可以设置禁止密码登录:

sshd - PasswordAuthentication

配置生效后,我们在登录时不设置密钥文件,便无法登录系统了。

安装 fail2ban

如果我们在登录系统时看到诸如:

There were 666 failed login attempts since the last successful login.

这样的提示,则表明系统可能被攻击,我们可以安装 fail2ban 之类的工具来给系统提供一定的保护,防止系统被暴力攻破,也防止短时间内接受大量的请求,导致服务器负载过重从而影响正常的访问。

我们在配置 sshd 之前便已经安装了 fail2ban,以致在测试禁止 root 登录时出现数次登录失败,当前 IP 即被 fail2ban 禁止登录,最后不得不重启路由器以获取新的 IP 之后,才能正常登录系统。这表明,fail2ban 还是有一定的防护效果的。

小结

上述是较为常用的系统安全配置,除此之外,我们还有其他许多方式来保证系统的安全,例如:

  • 禁用部分用户/用户组;
  • 关闭部分系统服务;
  • 卸载不需要的软件包;
  • 关闭部分端口(甚至可以关闭所有的端口后仅开放需要开放的端口);
  • 设置仅接受指定的终端登录系统;
  • 安装防护/备份系统;
  • ……

然而,我们认为:我们只能在有限预算的前提下,尽可能地保证系统的安全,同时,在安全与效率中取得平衡

例如,我们使用了密钥方式登录系统,同时禁用了使用密码方式登录,可以有效降低因密码遗失造成的风险,但同时也损失了部分便利性,例如,我们在没有保存密钥的设备上,就无法登录系统,也就无法随时随地对系统进行登录维护。

另外,但如果我们没有为密钥设置密码,则可以实现免密码登录,在保证一定的安全性的同时,又享受着免密登录的便利。然而,在这种情况下,如果万一密钥文件泄露,对方如果知晓服务器的地址和用户名(尤其是 root,除了权限过大之外,几乎所有的系统都存在用户名为 root 的用户,自然成了攻击者的首选),便可直接使用密钥文件登录系统,这也是为什么我们认为必须禁用 root 登录的原因。

在我们所有的服务器中,均采用了密钥方式登录,同时禁用密码方式登录,也禁用了 root 登录。

我们在创建密钥文件时为密钥文件也设置了密码,以获得双重保护,这虽是以损失一定的便利性为代价的,只是我们认为值得。

PuTTY - Login