互联网上的攻击和恶意软件与扫描几乎无处不在。你的每一个互联网上能探测访问到的服务器几乎无时无刻都在遭受各种扫描与攻击尝试。
所以,如果你有服务器是在网络中能够被访问到的,那你得学会好好保护你的Linux服务器。
我在这篇文章中提供了一些常见的方法,它能帮助你避免一些恶意扫描与漏洞尝试。
主要的一些点包括:
- 不使用远程登录默认的22端口
- 禁用ROOT用户远程登录
- 禁用SSH用户名密码登录,只允许密钥登录
- 不要使用软件或服务的默认端口
- 开启系统自带的防火墙,启用最小访问原则
- 保持系统经常性的更新
下面是针对每一点的具体解释与推荐做法
1. 不使用远程登录默认的22端口
为什么
对于服务器,我们几乎都是使用SSH进行远程登录操作。SSH的默认端口是22,这个是众所周知的。
所以,不要使用22默认的端口,很多扫描一天24小时就是不断的在扫描并尝试使用22端口进行登录。如果你的远程登录端口不是22,则意味着针对这一个点的扫描的可能性极大的减少了。
如何做
sshd的配置文件位于:/etc/ssh/sshd_config
修改这个文件
vim /etc/ssh/sshd_config
# 找到Port 22这一行,注释掉它,在它的下面添加新的一行记录
Port 12021
# 重启服务
sudo systemctl restart sshd
这样,你的远程端口就变为12021,而不是12021
ssh -p 12021 name@ip
这样,下次你在远程登录时,添加-p参数就好了。
效果
你要知道,22这个很容易知道,不是22这个则不太好猜测,就算是计算机不停的轮询猜测sshd的端口,这个范围也大大增加了。
而大多数情况下,对sshd的扫描都主要是针对22来的,因为不修改端口的情况太多了
2. 禁用ROOT用户远程登录
为什么
Root用户的权限太高了,无论什么情况下,都不应该允许Root远程登录,而是使用其它用户来允许远程登录。
如何做
找到sshd配置文件,/etc/ssh/sshd_config
vim /etc/ssh/sshd_config
找到,PermitRootLogin这样的字样及行
PermitRootLogin no
将这个值修改为no
# 重启服务
sudo systemctl restart sshd
当前,切记在禁用ROOT前,要新增了另一个用户以供远程登录
效果
有两个效果,其一,默认扫描很多情况下是使用ROOT用户来尝试登录,一旦Root不允许登录,则猜测用户名的难度大大增加。
而另一方面,就算是非root用户被攻破,如果你对这个用户的权限进行很好的控制,它造成的影响总相对会少一些。
3. 禁用远程用户名密码登录,取之以密钥登录
为什么
计算机通过轮询+猜测的方式来攻破总是非常有效的,网上的用户名密码库太多了,很多人的用户名密码对在互联网上早已泄露了。
对于服务器来说,与其想着如何强化密码,不如直接禁用掉密码登录,只支持密钥的方法来登录
如何做
# 如果你还没有ssh-key,你可以在本机先生成一个ssh-key以做使用
ssh-keygen -t rsa -C "your_email@example.com"
# 将你的key上传到服务器(此方法仅限你使用的是Linux或Mac系统,Win不适应命令)
ssh-copy-id -i ~/.ssh/id_rsa -p 12021 username@ip
然后修改/etc/ssh/sshd_config
vim /etc/ssh/sshd_config
#修改或添加以下配置
RSAAuthentication yes
PubkeyAuthentication yes
sudo systemctl restart sshd
最后,确认远程登录支持密钥登录后,禁用password登录
vim /etc/ssh/sshd_config
#修改或添加以下配置
PasswordAuthentication no
效果
完成这一步后,基本意味着互联网的用户名密码远程扫描式攻击基本就无效了。只要保护好你自己本机的私钥,通过SSH扫描攻击尝试基本就不存在了
4. 不要使用软件的默认端口
为什么
做过编程的人都知道,MySQL的端口端口是3306,Postgres的默认端口是5432
要知道,但凡是软件或服务,都可能会有漏洞。
恶意扫描会对常用软件,常用服务的端口进行尝试,特别是针对已知的存在漏洞的服务或软件,进行尝试。
很多人压根不会做任何修改,直接以默认端口来运行相应的服务。甚至更甚的,在正式环境不需要密码都能访问这些服务的现象也时有发生。
如何做
没有特别的方式,针对你服务器上的软件或服务,进行修改。每个软件或服务的修改方式并不一致。将其修改为非默认的端口。
还要特别注意,有些诸如Redis这样的,一定要设置用户名密码,不要密码都不要就能访问。
效果
还有那个原理,非默认端口不好猜测。换了端口,谁知道你的MySQL端口是什么呢?
这同样能极大的减少恶意软件的攻击与扫描。
事实上,大多数情况下,类似的服务不应该公开对外访问才是合理的。
5. 开启系统自带的防火墙,启用最小访问原则
为什么
Linux系统都有防火墙,比如Debian有ufw防火墙,CentOS有iptables等。
当然,云服务类似阿里或腾讯云是有默认的防火墙安全策略的。你首先可以设置这一层的策略。但似乎云服务的安全策略只针对公网访问才有限。
但这不能成为你让你的机器裸奔的理由。开启你的防火墙。
如何做
以Debian上的ufw为例
#安装
sudo apt update
sudo apt install ufw
#查看状态
sudo ufw status verbose
# 查看内置应用
sudo ufw app list
# 允许443
sudo ufw allow Nginx\ https
# 允许12021远程端口
sudo ufw allow 12021/tcp
#启用防火墙
sudo ufw enable
效果
这样,没有必要开放的端口不需要开放。这样当然能更少的避免恶意软件的攻击与扫描。
6. 保持系统经常性的更新
为什么
好吧,这是非常重要的一个点。
每天都可能有新的系统漏洞被发现,不同的系统,都会及时的发布更新补丁。你应该每天去更新你的系统,特别是安全性的补丁。
同样,不同的软件也会定时发布更新,修复安全漏洞或其它。
如何做
其实非常简单,每个系统几乎都提供了更新机制
# debian系
sudo apt update #更新最新信息
sudo apt upgrade #升级或安装新的补丁
效果
只要你做的及时,这样就能有效的防止新的漏洞
安全无小事
今年Amazon对国内跨境电商大规模的封店,其源头在于一个国内一个刷分及刷评论的elastic数据库被泄露,这个微小的安全事件,引发大量国内电商被封,对多公司来说,这种损失是难以估量的。
安全无小事,当然刷分或刷单这个事合不合理这一点撇开不论,如果我们能有效的保护我们的服务器及数据,学会保护我们的服务器及数据的安全,就能尽量避免类似的意外。
切记,安全无小事。