让你的 Linux 服务器更安全的方法

By -

我运行几个Linux服务器;在家里的一个作为文件服务器,还有三个实时服务器分别用作站点、邮件、云储存。虽然我不用担心家里的服务器的安全问题,因为它不和外界对话,但是另外三个服务器始终需要维护。对于那些想运行自己的服务器的Linux新手,他们应该将一些观点牢记在心,就是本文将要给出的几个方法。

只安装你需要的

如果你准备运维一个服务器,你也许会这样想“我在 Linode有40GB的固态硬盘存储空间,所以我可以安装我想要的任何服务。”好吧,的确是这样:你的服务器的系统、软件什么的都可以安装在上面。但是也不能太想当然了。要知道即使是最“坚固”的服务器也能够被攻击的,往往是由于在服务器上使用未打补丁或者易受攻击的组件。

所以第一个原则是尽量精简你服务器,让它轻快些。只安装那些你真正需要的软件。如果存在不想要的软件,就要清除它们。软件少了,未打补丁的代码也会少的。在你安装任何软件包和依赖包之前,你应该阅读该软件的文档并只安装那些你需要的组件。

运行你需要的

第二个原则是只开启那些你需要的服务。许多发行版或者软件包也许已经在不同的端口开启了相应的服务。其实这会有一些安全风险,先打开终端运行下面这行命令:

netstat -npl

输出的结果将会告诉你系统正在哪些端口运行哪些服务。如果你发现有你不想运行的服务,关闭这些服务吧。你也应该注意那些随系统启动运行的服务。你可以运行systemd来查看这些服务:

systemctl list-unit-files –type=service | grep enabled

根据各自的系统,你会得到一个类似下图所示的输出。如果你发现任何不想运行的服务,可以运行systemctl命令来关闭:

systemctl disable service_name

running-services-1

增加进入服务器的限制

就像你不会把自家门的钥匙给你认识的每一个人,你也不应该让你认识的人可以随便进入你的服务器。既然明确了这一原则,你就要对服务器增加一些进入的限制。然而请记住:做这些并不能阻止那些一门心思使你服务器瘫痪的人。我们做的只不过是增加服务器的安全级别以应对偶然的攻击。

不要以Root权限登陆

以root用户远程登陆服务器可不是什么好的习惯。我们将要禁止以root用户远程登陆服务器,在做这之前,我们要先创建一个有sudo权限的普通用户以便能够远程登陆服务器并且执行管理员权限。只要你用这个用户登陆服务器,你总能够在你需要时切换为root权限。如果你在系统上已经有了一个这样的用户,跳过下面这些步骤;否则,继续跟着我做。

不同发行版新建用户的方式有所不同,Red Hat/CentOS使用useradd命令,Ubuntu/Debian使用adduser命令。

在Fedora/CentOS上新建一个用户:

useradd swapnil

接着为这个用户创建一个密码:

passwd swapnil

然后会让你给该用户提供一个新密码。接着是赋予该用户sudo权限,运行命令:

EDITOR=nano visudo

找到下面这一行(如下图):

# %wheel ALL=(ALL) ALL

sudo-wheel-2取消这一行的注释(#表示注释,删除#表示取消注释):

%wheel ALL=(ALL) ALL

保存关闭文件。如果该用户不属于wheel组,你可以运行命令把其加入该组:

# usermod -aG wheel swapnil

在Ubuntu上,你可以通过以下命令新建一个用户:

adduser swapnil

然后系统会有一些问题,根据情况回答就可以了,比如为该用户创建新密码等。接着是赋予该用户sudo权限:

gpasswd -a swapnil sudo

开启另一个终端并尝试用新建的用户登陆服务器,可以试着切换sudo权限去执行一些管理员权限。如果没什么问题,继续下一步。

禁止root登陆

我们将禁止root登陆,这意味着将没有人能以root用户远程登陆服务器。先打开sshd配置文件:

nano /etc/ssh/sshd_conf

找到下面的注释行并取消注释:

#PermitRootLogin no

保存关闭文件并重启服务:

service ssh restart

另一个命令也可以:

systemctl restart sshd

注意:先不要登出服务器。你需要先测试一下能否用新建用户成功地远程登陆服务器。开启另一个终端尝试用新建用户远程登陆服务器。这样做的目的是防止你被服务器“锁”在了外面。如果一切都正常,你可以安全地登出root身份了。

改变端口

另一个改动是改变sshd文件中的默认端口。这只不过好像是增加一些烟雾来保护你的服务器安全,并不是对服务器真的做了什么。就像是用很多一模一样的车去运送重要人物一样,这可以让意图不轨之人不知道他乘的是哪辆车。

打开sshd_config文件(这次用sudo权限,因为你已经不能再以root用户登陆服务器了,其实这样做也很方便。):

sudo nano /etc/ssh/sshd_conf

找到下面注释行:

#Port 22

取消注释并选择一个端口,要确保选择的端口没有被系统的其它服务占用。你可以从Wikipedia介绍中了解到哪些是常用端口,并且应避免使用这些端口。我选择的端口是1977:

Port 1977

接着保存关闭文件并重启sshd服务。再次提醒,在登出服务器前,开启另一个终端并用以下命令尝试登陆服务器:

ssh -p{port_number}@server_IP

具体如下:

ssh -p1977 swapnil@10.14.190.118

如果你成功登陆,说明已经设置好了。

无密码登陆

你能够通过无密码方式更简单地远程登陆服务器,并且通过关闭密码验证也可以增加一点安全级别。不过你也只能在生成ssh密钥的机器上登陆服务器了。

在个人机器上生成ssh密钥(如下图),使用如下命令:

ssh-keygen – t rsa

ssh-key-3

通常会有一些问题,比如你可以默认密钥的位置,然后想一个难猜的密码口令。接着,你需要把生成的密钥复制到服务器上,使两个机器可以通过密钥进行交流。

cat ~/.ssh/id_rsa.pub | ssh -p 1977 swapnil@remote-server “;mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys”

现在试着开启另一个终端远程登陆服务器,如果一切顺利的话,你就不用再输入密码了。

这一步与其说是增加安全性倒不如说是为了方便,但你可以关闭服务器的密码验证服务来增加一点安全性。只需打开sshd_config文件,找到下面的注释行:

#PasswordAuthentication yes

取消注释并把值设为no,保存并关闭,然后重启sshd服务。记住,不要关闭当前的连接终端,开启另一个终端测试登陆(再次确定登陆不需要密码)。

这个设置会使得你只能在生成ssh密钥的机器上远程登陆服务器。如果你需要经常从不同的机器登陆服务器,就不必使用这种方法了。

结语

有一些基本概念告诉那些尝试运行自己服务器的新人,牢记骇客始终比我们想得深想得远,他们以寻找系统漏洞并攻击服务器为乐。因此,最好养成定期备份服务器的习惯,我建议你在服务器变动前后做备份。万一你的服务器哪天瘫痪了,你还可以从备份中重新恢复起来。

原文链接:http://www.linux.com/learn/tutorials/843903-how-to-make-your-linux-server-more-secure/

译文链接:http://www.linuxstory.org/four-ways-to-make-your-linux-server-more-security/

lijunlhc

1 Comment to 让你的 Linux 服务器更安全的方法

发表评论

电子邮件地址不会被公开。