云计算极大地改变了服务器应用场景,许多平台都提供免费的 linux 云服务器,你可以在几分钟内通过这些平台部署一台 Linux 服务器。
不过,作为云服务器,也有弊端。因为它是在互联网上可见的,所以一旦你启动了一台新服务器,黑客便会通过脚本自动扫描错误的配置或者漏洞。
所以,在安装完 Linux 系统后,还需要做一些安全相关的配置,以提升系统的安全性。
下面是一张使用 Fail2ban 工具查看系统信息的截图:
如上图所示,有 212 次失败的登录尝试和 6 个被阻止的 IP 地址,这些都是未经授权的人或脚本对系统进行的入侵。
所以,对系统做一些安全的配置是十分有必要的。如下我们总结了一些在安装 Linux 系统后建议采取的措施。
root 用户具有最高权限,但是我们并不是所有工作都需要使用 root 用户。
同时,几乎所有 Linux 系统中都有 root 用户,所以攻击者通常会使用 root 用户名来尝试登录系统。
所以,在平时工作中最好以非 root 用户登录,且 ssh 禁用远程访问的 root 登录。
那么怎么添加用户呢?我们在先前的文章中介绍过添加用户的方法,大家可以参考:使用 useradd 命令在 Linux 中添加新用户
添加用户可使用 root 用户登录系统,然后使用 useradd 命令添加新用户,如下所示:
useradd <username>
使用 passwd 命令为新添加的用户设置密码:
passwd <username>
如果需要使用 ssh 远程登录系统,且需要执行 root 权限的活动,那么所使用的登录账户需要具有 sudo 权限。
在 Ubuntu 和 centos 中创建 sudo 用户的过程是相似的,但是 sudo 用户组是不同的。
首先以 root 身份登录系统。
在 CentOS 和 Red Hat 上,wheel 组是具有 sudo 权限的用户组,可以使用 usermod 命令将用户添加到该用户组中。
usermod -aG wheel <username>
Ubuntu 使用 sudo 用户组来管理 sudo 用户:
usermod -aG sudo <username>
为 ssh 启用基于密钥的身份验证非常重要,这样当我们禁用基于密码的身份验证时,它就可以正常工作。
暴力破解或者盗取密码是入侵者获取系统访问权限的常用方式,如果我们禁用基于密码的 ssh 登录,采用基于密钥的 ssh 连接,那么攻击者就无法根据用户名和密码访问服务器了。
启用 ssh 后,需要做的就是在个人计算机上生成 ssh 密钥,有了 ssh 密钥,就需要为非 root 用户将公钥添加到服务器的 authorized_keys 中。
在系统启用防火墙之前,应确保让其允许 ssh,要不然就无法通过 ssh 访问系统。
关于防火墙,Ubuntu 使用 ufw(Uncomplicated Firewall),CentOS 和 Red Hat 使用 firewalld。
在 CentOS 和 Red Hat 中,使用 firewall-cmd 命令:
sudo firewall-cmd --znotallow=public --add-service=ssh --permanent
在 Ubuntu 中,使用 uwf 命令:
sudo ufw allow ssh
迄今为止,防火墙仍是系统安全的一道屏障,在 CentOS 和 Red Hat 中,启用 firewalld systemd 服务:
sudo systemctl start firewalld
sudo systemctl enable firewalld
在 Ubuntu 中,使用如下命令:
sudo ufw enable
攻击者可以通过运行服务的软件中的漏洞来危害服务器。banner 会显示正在运行的 OpenSSH 或操作系统版本的信息。所以我们需要设置 ssh 不显示 banner。
在 CentOS 和 Red Hat 中默认就是不显示 banner,所以关于这点不需要做额外的工作。但是在 Ubuntu 中,需要使用如下命令来禁用 banner:
sudo echo "DebianBanner no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf
经常会有系统管理员通过 ssh 转发来加密可能传递的明文信息,如果你不用的话,应该将其关闭。攻击者可能会使用转发来加密信息,所以你很难查看,或者使用授权的端口和服务获取可能被阻止传递的信息。
在 CentOS 或 Red Hat 中,将如下内容添加到 /etc/ssh/sshd_config 中:
DisableForwarding yes
在 Ubuntu 中,添加 DisableForwarding yes 到 10-my-sshd-settings.conf 文件中,如下:
sudo echo "DisableForwarding yes" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf
几乎每个 Linux 系统中都有 root 用户,允许其登录 ssh 是比较危险的。
在 CentOS 或 Red Hat 中,在文件 /etc/ssh/sshd_config 中找到 PermitRootLogin yes,将其改为:
PermitRootLogin no
Ubuntu 中,在10-my-sshd-settings.conf 文件中添加 PermitRootLogin no:
sudo echo "PermitRootLogin no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf
在禁用 ssh 密码验证之前,首先需要按照第 3 点中所属配置和测试了基于密钥的身份验证。
我们在先前的文章中介绍过如何禁用基于密码的 ssh 身份验证,可参考:如何禁止使用密码通过 ssh 连接远程服务器
CentOS 或 Red Hat 中,在文件 /etc/ssh/sshd_config 中找到 PasswordAuthentication yes,将其改为:
PasswordAuthentication no
在 Ubuntu 中,在文件 10-my-sshd-settings.conf 中添加内容 PasswordAuthentication no:
sudo echo "PasswordAuthentication no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf
rhosts 与 rsh 相关联,rsh 是一种被 secure shell 取代的遗留协议。如果用户试图创建恶意 rhosts 文件,此设置将忽略它。
CentOS 或 Red Hat 系统中,在文件 /etc/ssh/sshd_config 中找到 #IgnoreRhosts yes 将前面的#删掉(即注释打开):
IgnoreRhosts yes
Ubuntu 中,在文件 10-my-sshd-settings.conf 中添加 IgnoreRhosts yes:
sudo echo "IgnoreRhosts yes" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf
Fail2ban会监视已配置服务(如SSH)的日志文件,并阻止恶意用户的IP地址在设定的时间内多次尝试后连接到您的服务器。
例如,如果攻击者在三小时内进行了5次以上的失败尝试,他的IP地址将被封锁12小时。
Fail2ban 也可以配置为保护其他服务,例如由 Nginx web 服务器或 Apache web 服务器支持的网站。
如前所述,如果漏洞比较多,带有漏洞的过时服务可能会让攻击者进入你的服务器,甚至无需登录!快速应用安全更新以降低此风险至关重要。
Ubuntu 会默认启用自动安全更新,所以无需执行更新操作。
要在 CentOS 和 Red Hat 上配置自动更新,需要安装一个名为 dnf-automatic 的应用程序,并使用以下命令为其启用计时器:
sudo dnf upgrade
sudo dnf install dnf-automatic -y
sudo systemctl enable --now dnf-automatic.timer
然后通过如下命令来检查一下:
sudo systemctl status dnf-automatic.timer