51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

服务器/VPS安全防护策略,保护好你的小鸡!

为什么要做安全防护? {#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%81%9A%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%EF%BC%9F}

服务器(包括VPS,即虚拟专用服务器)是存储和处理数据的重要设备,它们通常承载着网站、应用程序、数据库等关键服务。

安全防护是一个庞大而复杂的课题。几乎所有的网站、应用、服务等基础设施都建立在 Linux 基础之上,其背后涉及巨大的经济利益和商业价值。以至于黑灰产有巨大的攻击动力,安全无小事,不仅是生活上的,还存在于互联网上。

服务器/VPS,与个人电脑不同,它24小时开机,拥有公网IP,意味着任何人都可能访问你的服务器。这相当于置身于安全攻防战场的第一线,直面各种潜在风险。

然而,由于知识和信息的不足,一些新手对安全问题的态度存在两极化:

  • 有人觉得安全问题微不足道,与自己无关;
  • 有人则感到十分重要,认为安全问题重于泰山;

对于前者 :安全无小事,尽量学习更多安全方面的信息,避免在遭受损失后才追悔莫及;
对于后者:不必过分紧张,我们的服务器不具有太高的价值,一般不容易成为高水平攻击的目标(攻击者也是需要成本的),通常需要面对的是一些自动化脚本的恶意扫描和登录尝试。

面对哪些风险? {#%E9%9D%A2%E5%AF%B9%E5%93%AA%E4%BA%9B%E9%A3%8E%E9%99%A9%EF%BC%9F}

安全防护底线的四要素:【IP 地址】+【端口】+【用户名】+【密码】

任何人知道这四个要素,都能登录你的服务器,或者针对你的服务器进行攻击。

分析:

  1. 【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法或者极难隐藏
  2. 【端口】:暴露的一些默认端口,例如:80、443、22等
  3. 【用户名】:如果使用默认的用户名,那么就是 root
  4. 【密码】:密码一般是后台随机生成或者是你自行设置的

如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了,这时会有几种情况:

  1. 如果你用了服务器管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全。
  2. 如果你为了好记、把密码改成了类似 123456 这种超弱的密码,破解你的服务器可谓不费吹灰之力。
  3. 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说密码表,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码。
  4. 你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。
  5. 别忘了,购买服务器时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,一旦这些坏事发生,它们就会不可避免地与你产生关联。

一旦你的密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 root 控制权、安装部署恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网活动...)。

如果恶意脚本比较克制,其实可以做到相当的隐蔽性,而你一般也不会去观察留意 服务器 的登录记录、进程变化、CPU 占用变化、流量变化等指标,很难发现自己被黑了。直到你的服务商封禁你的账号、或者收到律师函、或者去警局喝茶为止。

所以,可以跟着下面的教程,来给我们的服务器做一些基础的安全防护(能杜绝大部分问题,除非有人特意针对你)。

安全防护 {#%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4}

本文以 Debian 系统为例,Ubuntu 系统操作类似,CentOS 系统会有些不一样,请自行搜索相关内容。

强烈安利大家使用 Debian 或者 Ubuntu 系统,因为 CentOS 系统官方早都不维护了,会有很多漏洞。

推荐系统:Debian > Ubuntu >>>>> CentOS

更新包 {#%E6%9B%B4%E6%96%B0%E5%8C%85}

任何涉及到安装的操作之前,先更新一下我们安装包的索引,可以的话,顺便更新一下软件。这本身也是安全的一部分,新的软件意味着更少的漏洞。

apu update
`apt upgrade
`

更改端口 {#%E6%9B%B4%E6%94%B9%E7%AB%AF%E5%8F%A3}

一般我们的服务器登录端口都是 22 (部分厂商默认端口非 22),当然也可以修改为其他端口。

vim /etc/ssh/sshd_config

在打开的文件中找到 Port 这一项,并修改它的端口,Port 后面的数字就是 SSH 的端口,一般建议把它改成一个大于 1024 小于 65535 的整数(本文以 9999 为例)

# -------------- 其他配置 -------------------
# 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


如果测试新 端口 已经生效并且能正常登录,那么以后就可以用新配置的 端口 登录了,例如:

ssh 用户名@服务器IP -p 9999

更改密码 {#%E6%9B%B4%E6%94%B9%E5%AF%86%E7%A0%81}

密码分为两种:

  • 密码登录
  • 密钥登录

如果不想那么麻烦,其实用复杂密码 即可(如果想爆破 16 位数复杂密码,恐怕至少要花费数亿年,但是这些密码基本上无法记忆,手动输入也很麻烦,不过在常用设备上保存即可)

如果你的密码过于简单,那么你可以去下面网站,生成一个复杂的密码:

复制你生成的密码,服务器输入下面命令:

passwd

然后会让你输入新密码、确认密码,粘贴即可(注意:Linux 输入密码是不会显示的),修改成功后,就可以用新密码登录了。

除了密码,也可以用密钥登录,流程如下:

  1. 生成SSH密钥对:
    在本地计算机上生成一对 SSH 密钥,其中包括私钥(通常保存在本地)和公钥(上传到服务器)。可以使用以下命令生成 SSH 密钥:

    ssh-keygen -t rsa -b 2048
    

    在这个过程中,系统会询问你密钥的保存位置,默认为 ~/.ssh/id_rsa

  2. 将公钥上传到服务器:
    将生成的公钥复制到你希望进行 SSH 登录的目标服务器上。你可以使用以下命令将公钥上传到服务器:

    ssh-copy-id user@hostname
    

    或者,如果没有ssh-copy-id命令,你可以手动复制公钥内容到服务器的~/.ssh/authorized_keys文件中:

    cat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >> ~/.ssh/authorized_keys'
    

    注意:确保目标服务器的 ~/.ssh 目录和 authorized_keys 文件的权限设置正确。通常,这两者的权限应该是 700600,分别表示只有所有者具有读写执行权限。

  3. 测试SSH连接:
    确保配置成功,通过SSH连接到服务器:

    ssh user@hostname
    

    系统会提示你输入密钥密码,而不是服务器密码。如果一切设置正确,你应该能够成功连接到服务器。

  4. 禁用密码登录(可选):
    一旦你确认密钥登录正常,你可以选择禁用密码登录以增加安全性。在 SSH 服务器 /etc/ssh/sshd_config 配置文件中,将 PasswordAuthentication 设置为no,然后重启 SSH 服务。

    PasswordAuthentication no
    

    之后,记得重新启动SSH服务:

    service ssh restart
    

更改用户 {#%E6%9B%B4%E6%94%B9%E7%94%A8%E6%88%B7}

首先你要理解, Linux 系统中的 root,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦 root 账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。

设置步骤

  1. 新增一个用户并设置登录密码,这里以 jyadmin 为例

    adduser jyadmin

执行命令后,根据提示操作即可。请务必设置一个用户密码,之后系统会询问你一些附加信息,可以无视,一路回车即可。

  1. 安装 sudo 功能(sudo 就是在关键时刻,让普通账户临时获得 root 的权限)

    Debain默认没有,Ubuntu自身应该是已经有安装的

    apt update && apt install sudo

  2. 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 即可。

  1. 禁用 root 登录

    vim /etc/ssh/sshd_config

找到 PermitRootLogin Yes 这一项,然后把它后面的设定值改为 No ,保存退出即可。

重启 SSH 服务

service sshd restart


  1. 再次远程登录,root 用户已经无法连接

用户名就要换成 jyadmin 了,密码用这个账号的密码

ssh jyadmin@服务器IP -p 9999

防火墙设置 {#%E9%98%B2%E7%81%AB%E5%A2%99%E8%AE%BE%E7%BD%AE}

  • 如果是国内的服务器,一般都有 安全组,可以无需设置防火墙,使用的时候放行所需端口即可。
  • 如果是国外的服务器,没有安全组,默认端口全部放行,这时候就需要使用防火墙工具。

如果是 Debian 或者 Ubuntu 系统,可以使用 ufw

如果是 CentOS 系统,可以使用 firewalld,强烈建议弃用 CentOS 系统,官方早已经不维护了,会有很多漏洞无法修复。

如果你使用 ufw,又使用 Docker,你会发现 Docker 不遵守 ufw 规则。

具体的 ufw 安装使用方式,以及解决 Docker 不遵守规则问题,可以看我的文章:Linux ufw(防火墙)使用指南,解决ufw和docker冲突问题,保护你的服务器/VPS

其他安全问题 {#%E5%85%B6%E4%BB%96%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98}

还有就是建议大家定期备份数据,这样即使服务器被攻击、文件被删,也可以把损失降到最低,不要出现下面情况:

《你的数据我们已备份,请在 X 小时内支付 0.05 个比特币(BTC)到指定地址:xxxxxxxxx,否则,我们将删除您的数据且不可恢复!》

PS:我哭死,他竟然用 "您"。

至于服务器的备份方式,可以使用 rclone 工具进行备份,教程:Rclone数据同步&备份神器如何安装及常用的设置语法功能

上面说的都是服务器相关 的设置及安全问题。
如果搭建网站,也会有安全问题,比如 XSS 攻击,DDOS 攻击,CC 攻击。

具体可以参考文章:【网络安全】网站被攻击了怎么办?怎么防护DDOS、CC、XSS、ARP等攻击?

最后 {#%E6%9C%80%E5%90%8E}

通过以上的步骤,你的服务器已经获取了很大部分的安全保障,虽然称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了,后续我也会分享更多的网络安全知识

再次警告大家:维护互联网安全,切勿攻击他人服务,同样保护好自己服务,共同建设安全可信的网络环境。

参考文章:https://blog.laoda.de/archives/how-to-secure-a-linux-server/index.html

视频链接 {#%E8%A7%86%E9%A2%91%E9%93%BE%E6%8E%A5}

赞(4)
未经允许不得转载:工具盒子 » 服务器/VPS安全防护策略,保护好你的小鸡!