前言
在建站等应用中,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允许使用密钥登录服务器,而密钥的安全系数显然远远高于密码(在量子计算机出来之前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[1]来代替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 #允许端口号段的连接
重启后生效。
使用容器化技术隔离不同服务
这里推荐使用Docker,可以一定程度上提高安全性[3]
其它
这里的一些技巧仅作列举,不叙述其操作,感兴趣的读者可以自行查找资料配置。
使用fail2ban防止爆破
使用knockd隐藏端口
设置IP白名单
使用跳板机登录服务器
使用SSH Tunnel在不暴露端口的情况下管理服务器
总结
服务器安全是个很复杂的话题,一篇博客很显然难以详尽叙述。这里只是一些基本的安全措施,可以在一定程度上保护服务器安全。
然而,人往往才是服务器最大的漏洞所在。永远对每一个操作保持谨慎,对陌生人存有基本的警惕,同时不要过于招摇防止招惹别人(被别人盯上了这些措施也不一定救的了你),才是服务器安全的关键所在。