让你的 Linux 服务器更安全的方法
我运行几个Linux服务器;在家里的一个作为文件服务器,还有三个实时服务器分别用作站点、邮件、云储存。虽然我不用担心家里的服务器的安全问题,因为它不和外界对话,但是另外三个服务器始终需要维护。对于那些想运行自己的服务器的Linux新手,他们应该将一些观点牢记在心,就是本文将要给出的几个方法。
只安装你需要的
如果你准备运维一个服务器,你也许会这样想“我在 Linode有40GB的固态硬盘存储空间,所以我可以安装我想要的任何服务。”好吧,的确是这样:你的服务器的系统、软件什么的都可以安装在上面。但是也不能太想当然了。要知道即使是最“坚固”的服务器也能够被攻击的,往往是由于在服务器上使用未打补丁或者易受攻击的组件。
所以第一个原则是尽量精简你服务器,让它轻快些。只安装那些你真正需要的软件。如果存在不想要的软件,就要清除它们。软件少了,未打补丁的代码也会少的。在你安装任何软件包和依赖包之前,你应该阅读该软件的文档并只安装那些你需要的组件。
运行你需要的
第二个原则是只开启那些你需要的服务。许多发行版或者软件包也许已经在不同的端口开启了相应的服务。其实这会有一些安全风险,先打开终端运行下面这行命令:
[alert style="green"] netstat -npl [/alert]
输出的结果将会告诉你系统正在哪些端口运行哪些服务。如果你发现有你不想运行的服务,关闭这些服务吧。你也应该注意那些随系统启动运行的服务。你可以运行systemd来查看这些服务:
[alert style="green"] systemctl list-unit-files --type=service | grep enabled [/alert]
根据各自的系统,你会得到一个类似下图所示的输出。如果你发现任何不想运行的服务,可以运行systemctl命令来关闭:
[alert style="green"] systemctl disable service_name [/alert]
增加进入服务器的限制
就像你不会把自家门的钥匙给你认识的每一个人,你也不应该让你认识的人可以随便进入你的服务器。既然明确了这一原则,你就要对服务器增加一些进入的限制。然而请记住:做这些并不能阻止那些一门心思使你服务器瘫痪的人。我们做的只不过是增加服务器的安全级别以应对偶然的攻击。
不要以Root权限登陆
以root用户远程登陆服务器可不是什么好的习惯。我们将要禁止以root用户远程登陆服务器,在做这之前,我们要先创建一个有sudo权限的普通用户以便能够远程登陆服务器并且执行管理员权限。只要你用这个用户登陆服务器,你总能够在你需要时切换为root权限。如果你在系统上已经有了一个这样的用户,跳过下面这些步骤;否则,继续跟着我做。
不同发行版新建用户的方式有所不同,Red Hat/CentOS使用useradd命令,Ubuntu/Debian使用adduser命令。
在Fedora/CentOS上新建一个用户:
[alert style="green"] useradd swapnil [/alert]
接着为这个用户创建一个密码:
[alert style="green"] passwd swapnil [/alert]
然后会让你给该用户提供一个新密码。接着是赋予该用户sudo权限,运行命令:
[alert style="green"] EDITOR=nano visudo [/alert]
找到下面这一行(如下图):
[alert style="green"] # %wheel ALL=(ALL) ALL [/alert]
[alert style="green"] %wheel ALL=(ALL) ALL [/alert]
保存关闭文件。如果该用户不属于wheel组,你可以运行命令把其加入该组:
[alert style="green"] # usermod -aG wheel swapnil [/alert]
在Ubuntu上,你可以通过以下命令新建一个用户:
[alert style="green"] adduser swapnil [/alert]
然后系统会有一些问题,根据情况回答就可以了,比如为该用户创建新密码等。接着是赋予该用户sudo权限:
[alert style="green"] gpasswd -a swapnil sudo [/alert]
开启另一个终端并尝试用新建的用户登陆服务器,可以试着切换sudo权限去执行一些管理员权限。如果没什么问题,继续下一步。
禁止root登陆
我们将禁止root登陆,这意味着将没有人能以root用户远程登陆服务器。先打开sshd配置文件:
[alert style="green"] nano /etc/ssh/sshd_conf [/alert]
找到下面的注释行并取消注释:
[alert style="green"] #PermitRootLogin no [/alert]
保存关闭文件并重启服务:
[alert style="green"] service ssh restart [/alert]
另一个命令也可以:
[alert style="green"] systemctl restart sshd [/alert]
注意:先不要登出服务器。你需要先测试一下能否用新建用户成功地远程登陆服务器。开启另一个终端尝试用新建用户远程登陆服务器。这样做的目的是防止你被服务器“锁”在了外面。如果一切都正常,你可以安全地登出root身份了。
改变端口
另一个改动是改变sshd文件中的默认端口。这只不过好像是增加一些烟雾来保护你的服务器安全,并不是对服务器真的做了什么。就像是用很多一模一样的车去运送重要人物一样,这可以让意图不轨之人不知道他乘的是哪辆车。
打开sshd_config文件(这次用sudo权限,因为你已经不能再以root用户登陆服务器了,其实这样做也很方便。):
[alert style="green"] sudo nano /etc/ssh/sshd_conf [/alert]
找到下面注释行:
[alert style="green"] #Port 22 [/alert]
取消注释并选择一个端口,要确保选择的端口没有被系统的其它服务占用。你可以从Wikipedia介绍中了解到哪些是常用端口,并且应避免使用这些端口。我选择的端口是1977:
[alert style="green"] Port 1977 [/alert]
接着保存关闭文件并重启sshd服务。再次提醒,在登出服务器前,开启另一个终端并用以下命令尝试登陆服务器:
[alert style="green"] ssh -p{port_number}@server_IP [/alert]
具体如下:
[alert style="green"] ssh -p1977 swapnil@10.14.190.118 [/alert]
如果你成功登陆,说明已经设置好了。
无密码登陆
你能够通过无密码方式更简单地远程登陆服务器,并且通过关闭密码验证也可以增加一点安全级别。不过你也只能在生成ssh密钥的机器上登陆服务器了。
在个人机器上生成ssh密钥(如下图),使用如下命令:
[alert style="green"] ssh-keygen - t rsa [/alert]
通常会有一些问题,比如你可以默认密钥的位置,然后想一个难猜的密码口令。接着,你需要把生成的密钥复制到服务器上,使两个机器可以通过密钥进行交流。
[alert style="green"] cat ~/.ssh/id_rsa.pub | ssh -p 1977 swapnil@remote-server ";mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" [/alert]
现在试着开启另一个终端远程登陆服务器,如果一切顺利的话,你就不用再输入密码了。
这一步与其说是增加安全性倒不如说是为了方便,但你可以关闭服务器的密码验证服务来增加一点安全性。只需打开sshd_config文件,找到下面的注释行:
[alert style="green"] #PasswordAuthentication yes [/alert]
取消注释并把值设为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/
dddd