为什么要做安全防护?
服务器(包括VPS,即虚拟专用服务器)是存储和处理数据的重要设备,它们通常承载着网站、应用程序、数据库等关键服务。
安全防护是一个庞大而复杂的课题。几乎所有的网站、应用、服务等基础设施都建立在 Linux
基础之上,其背后涉及巨大的经济利益和商业价值。以至于黑灰产有巨大的攻击动力,安全无小事,不仅是生活上的,还存在于互联网上。
服务器/VPS,与个人电脑不同,它24小时开机,拥有公网IP,意味着任何人都可能访问你的服务器。这相当于置身于安全攻防战场的第一线,直面各种潜在风险。
然而,由于知识和信息的不足,一些新手对安全问题的态度存在两极化:
- 有人觉得安全问题微不足道,与自己无关;
- 有人则感到十分重要,认为安全问题重于泰山;
对于前者 :安全无小事,尽量学习更多安全方面的信息,避免在遭受损失后才追悔莫及; 对于后者:不必过分紧张,我们的服务器不具有太高的价值,一般不容易成为高水平攻击的目标(攻击者也是需要成本的),通常需要面对的是一些自动化脚本的恶意扫描和登录尝试。
面对哪些风险?
安全防护底线的四要素:【IP 地址】+【端口】+【用户名】+【密码】
任何人知道这四个要素,都能登录你的服务器,或者针对你的服务器进行攻击。
分析:
- 【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法或者极难隐藏
- 【端口】:暴露的一些默认端口,例如:80、443、22等
- 【用户名】:如果使用默认的用户名,那么就是
root
- 【密码】:密码一般是后台随机生成或者是你自行设置的
如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了,这时会有几种情况:
- 如果你用了服务器管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全。
- 如果你为了好记、把密码改成了类似
123456
这种超弱的密码,破解你的服务器可谓不费吹灰之力。- 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说密码表,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码。
- 你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。
- 别忘了,购买服务器时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,一旦这些坏事发生,它们就会不可避免地与你产生关联。
一旦你的密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 root 控制权、安装部署恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网活动......)。
如果恶意脚本比较克制,其实可以做到相当的隐蔽性,而你一般也不会去观察留意 服务器 的登录记录、进程变化、CPU 占用变化、流量变化等指标,很难发现自己被黑了。直到你的服务商封禁你的账号、或者收到律师函、或者去警局喝茶为止。
所以,可以跟着下面的教程,来给我们的服务器做一些基础的安全防护(能杜绝大部分问题,除非有人特意针对你)。
安全防护
本文以 Debian
系统为例,Ubuntu
系统操作类似,CentOS
系统会有些不一样,请自行搜索相关内容。
强烈安利大家使用 Debian
或者 Ubuntu
系统,因为 CentOS
系统官方早都不维护了,会有很多漏洞。
推荐系统:Debian
> Ubuntu
>>>>> CentOS
更新包
任何涉及到安装的操作之前,先更新一下我们安装包的索引,可以的话,顺便更新一下软件。这本身也是安全的一部分,新的软件意味着更少的漏洞。
sql
apu update
apt upgrade
更改端口
一般我们的服务器登录端口都是 22
(部分厂商默认端口非 22
),当然也可以修改为其他端口。
bash
vim /etc/ssh/sshd_config
在打开的文件中找到 Port
这一项,并修改它的端口,Port
后面的数字就是 SSH
的端口,一般建议把它改成一个大于 1024
小于 65535
的整数(本文以 9999
为例)
yaml
# -------------- 其他配置 -------------------
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
Port 9999
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
# -------------- 其他配置 -------------------
如果这一行被注释了,那么解开注释修改即可
修改完毕保存后,重启 ssh
服务,使变更生效:
service sshd restart
如果测试新 端口 已经生效并且能正常登录,那么以后就可以用新配置的 端口 登录了,例如:
swift
ssh 用户名@服务器IP -p 9999
更改密码
密码分为两种:
- 密码登录
- 密钥登录
如果不想那么麻烦,其实用复杂密码 即可(如果想爆破 16
位数复杂密码,恐怕至少要花费数亿年,但是这些密码基本上无法记忆,手动输入也很麻烦,不过在常用设备上保存即可)
如果你的密码过于简单,那么你可以去下面网站,生成一个复杂的密码:
复制你生成的密码,服务器输入下面命令:
passwd
然后会让你输入新密码、确认密码,粘贴即可(注意:Linux 输入密码是不会显示的),修改成功后,就可以用新密码登录了。
除了密码,也可以用密钥登录,流程如下:
-
生成SSH密钥对: 在本地计算机上生成一对
SSH
密钥,其中包括私钥(通常保存在本地)和公钥(上传到服务器)。可以使用以下命令生成SSH
密钥:cssssh-keygen -t rsa -b 2048
在这个过程中,系统会询问你密钥的保存位置,默认为
~/.ssh/id_rsa
。 -
将公钥上传到服务器: 将生成的公钥复制到你希望进行
SSH
登录的目标服务器上。你可以使用以下命令将公钥上传到服务器:bashssh-copy-id user@hostname
或者,如果没有
ssh-copy-id
命令,你可以手动复制公钥内容到服务器的~/.ssh/authorized_keys
文件中:bashcat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >> ~/.ssh/authorized_keys'
注意:确保目标服务器的
~/.ssh
目录和authorized_keys
文件的权限设置正确。通常,这两者的权限应该是700
和600
,分别表示只有所有者具有读写执行权限。 -
测试SSH连接: 确保配置成功,通过SSH连接到服务器:
bashssh user@hostname
系统会提示你输入密钥密码,而不是服务器密码。如果一切设置正确,你应该能够成功连接到服务器。
-
禁用密码登录(可选): 一旦你确认密钥登录正常,你可以选择禁用密码登录以增加安全性。在
SSH
服务器/etc/ssh/sshd_config
配置文件中,将PasswordAuthentication
设置为no
,然后重启SSH
服务。bashPasswordAuthentication no
之后,记得重新启动SSH服务:
bashservice ssh restart
更改用户
首先你要理解, Linux
系统中的 root
,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦 root
账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。
设置步骤:
-
新增一个用户并设置登录密码,这里以
jyadmin
为例adduser jyadmin
执行命令后,根据提示操作即可。请务必设置一个用户密码,之后系统会询问你一些附加信息,可以无视,一路回车即可。
- 安装
sudo
功能(sudo
就是在关键时刻,让普通账户临时获得root
的权限)
bash
# Debain默认没有,Ubuntu自身应该是已经有安装的
apt update && apt install sudo
-
把
jyadmin
用户加入sudo
名单里,让他有资格借用 root 的权限visudo
在 User Privilege Specification
下加入一行 jyadmin ALL=(ALL) NOPASSWD: ALL
即可。
特别说明的是
NOPASSWD
这个设置,它的意思是jyadmin
用户临时使用root
权限时,不用额外输入密码。这与一般的安全建议相反。 之所以如此推荐,是因为很多新人不顾危险坚持使用root
账号就是因为用root
时不用重复输入密码、觉得轻松。"两害相权取其轻",我认为【直接用root
用户的风险】大于【使用sudo
时不用输密码的风险】,所以做了以上的建议。 如果你希望遵守传统习惯、每次使用sudo
时需要输入密码,那么这一行改成jyadmin ALL=(ALL:ALL) ALL
即可。
- 禁用
root
登录
bash
vim /etc/ssh/sshd_config
找到 PermitRootLogin Yes
这一项,然后把它后面的设定值改为 No
,保存退出即可。
重启 SSH
服务
service sshd restart
- 再次远程登录,
root
用户已经无法连接
用户名就要换成 jyadmin
了,密码用这个账号的密码
kotlin
ssh jyadmin@服务器IP -p 9999
防火墙设置
- 如果是国内的服务器,一般都有 安全组,可以无需设置防火墙,使用的时候放行所需端口即可。
- 如果是国外的服务器,没有安全组,默认端口全部放行,这时候就需要使用防火墙工具。
如果是 Debian
或者 Ubuntu
系统,可以使用 ufw
。
如果是 CentOS
系统,可以使用 firewalld
,强烈建议弃用 CentOS
系统,官方早已经不维护了,会有很多漏洞无法修复。
如果你使用 ufw
,又使用 Docker
,你会发现 Docker
不遵守 ufw
规则。
具体的 ufw
安装使用方式,以及解决 Docker
不遵守规则问题,可以看我的文章:Linux ufw(防火墙)使用指南,解决ufw和docker冲突问题,保护你的服务器/VPS
其他安全问题
还有就是建议大家定期备份数据,这样即使服务器被攻击、文件被删,也可以把损失降到最低,不要出现下面情况:
《你的数据我们已备份,请在 X 小时内支付 0.05 个比特币(BTC)到指定地址:xxxxxxxxx,否则,我们将删除您的数据且不可恢复!》
PS:我哭死,他竟然用 "您"。
至于服务器的备份方式,可以使用 rclone
工具进行备份,教程:Rclone数据同步&备份神器如何安装及常用的设置语法功能
上面说的都是服务器相关 的设置及安全问题。 如果搭建网站,也会有安全问题,比如 XSS
攻击,DDOS
攻击,CC
攻击。
具体可以参考文章:【网络安全】网站被攻击了怎么办?怎么防护DDOS、CC、XSS、ARP等攻击?
最后
通过以上的步骤,你的服务器已经获取了很大部分的安全保障,虽然称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了,后续我也会分享更多的网络安全知识!
再次警告大家:维护互联网安全,切勿攻击他人服务,同样保护好自己服务,共同建设安全可信的网络环境。