Cover

Linux 服务器的基本安全策略

· Life

撰写本文是在 2022 年 8 月 13 日决定的。本人 Q 群内群友经常有极其不规范的运维操作,令本人很是无语,为此写本文以避免诸位站长踩坑。

服务器选择

非网站运营者可跳过这部分,本段落不考虑服务无法使用 CDN 等反向代理服务的情况。

在如今的市场上,存在各式各样的云服务商。大有阿里云、腾讯云、AWS、Azure、GCP 等上市公司运营的云服务商,小有一个人对接机房或其它云服务商就可以运营的 IDC 服务(俗称 One Man IDC)。

多样的云服务商也造就了当前业界服务质量的参差不齐。作为数个服务的提供者和维护者,我个人趋向于寻求性价比与 SLA 的平衡点,即在保证不具有过高的成本、过低的性价比和过低的性能的同时保证具有较高的可靠性。

大型公有云

在这部分,我们将 “大型公有云” 定义为 “上市公司运营的公有云服务”。

排名依照市占率,市占率数据为 2021 年下半年数据

我们常见的公有云服务有很多,包括境内和境外:

我个人较为推荐使用大型公有云运行生产环境服务,因为大型公有云通常具有较好的稳定性、较高的技术能力、较快的客户服务效率和较多的福利。

大多数国内的大型公有云都有新用户优惠,可以以较低的价格购买较高配置的云服务器。大多数国外的大型公有云都提供免费额度,例如 AWS 的 12 个月试用期、Azure 的 200 美元额度和 DigitalOcean 的 100 美元额度。

公有云通常提供多样的服务,除去基本的弹性计算,还包括但不限于对象存储、CDN、SaaS、Kubernetes、容器镜像、容器仓库等,因此对于后续架构升级、架构扩展具有较高的优势。

需要注意的是,由于公有云通常选用较高质量的硬件,还对 SLA 有较高的要求,因此其售价也会较高。

私有云

部分集团企业和政府企业会使用私有云服务,即专为最终用户而创建且通常位于用户的防火墙内的云环境。 通常,大型公有云会提供多种私有云解决方案。

小型 IDC 服务商

由于云计算资源日益丰富,近些年的市场逐渐扩张,出现了不少小微企业、工作室或个人运营的 IDC 服务。

此类服务通常具有较少的维护人数和云资源,部分 IDC 服务商通过对接大型公有云或地方机房获取云计算资源,并进行销售。

小型 IDC 服务商的云计算资源通常不如大型公有云广泛,很多只提供虚拟专用服务器(VPS)服务,不具备较高的技术实力。

相对大型公有云,小型 IDC 具有更高的可能放弃服务(俗称跑路),通常我使用以下两种方式甄别中国大陆云服务商的可信度。

  1. 中国大陆注册公司要求登记注册资金,部分公司登记资金破百万但实缴为 0,即公司本身没有价值,公司开设无成本。

中国大陆对于增值电信服务商要求增值电信业务许可证,对于销售虚拟专用服务器则需要“互联网接入服务业务”和“互联网数据中心业务”的业务种类。可前往 电信业务市场综合管理信息系统 通过公司名查询其持有的许可证。

  1. 中国大陆对于开设在中国境内的网站要求进行ICP备案,可前往 ICP/IP 地址 / 域名信息备案管理系统 通过域名查询备案信息。

若一小型 IDC 服务商销售中国大陆地区的云服务器,但不持有任何中国大陆企业主体或许可证,建议自行斟酌其可信度。

个人不建议使用小型 IDC 服务商的云计算资源作为生产环境的承载。

服务器安全

服务器的安全和权限是站点安全的基础,而 Shell 安全则是服务器安全的基石。

通常我们通过 SSH 协议连接 Linux Terminal,并执行命令。其中,SSH 的安全是极其必要的。

登录方式

我建议不要在任何公网服务器的 SSH 服务端使用密码登录,请尽可能使用 SSH 密钥对而不是密码。

生成密钥对

我们在 Linux 服务器上通过 ssh-keygen 命令生成秘钥。

由于 ECDSA 加密具有更高的可靠性和更小的性能损耗,在本次教程中我们以此为演示。部分服务商不支持导入 ECDSA 秘钥,可依据思路替换为 RSA。

Image
ssh-keygen --help
Image
ssh-keygen -t ecdsa

其中,我们可以通过 -t 参数指定加密方法,通过 -b 参数指定加密位数。

个人习惯在 RSA 秘钥使用 4096 bits,在 ECDSA 秘钥使用 521 bits。

ssh-keygen -t ecdsa -b 521 # 生成SSH,路径使用默认即可

此时,~/.ssh/id_ecdsa 为私钥, ~/.ssh/id_ecdsa.pub 为公钥

配置密钥

请先将 ~/.ssh/id_ecdsa 路径的私钥复制到本地。

cp ~/.ssh/id_ecdsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

配置 SSH 服务

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup # 备份
vi /etc/ssh/sshd_config

按 i 进入编辑模式并替换内容:

# 去除注释
LogLevel INFO
MaxAuthTries 3
MaxSessions 5
PubkeyAuthentication yes
PasswordAuthentication no
ClientAliveInterval 600
ClientAliveCountMax 3
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

# 添加新行
Protocol 2

按 esc 退出编辑模式,并输入 :wq 保存内容。

在重启之前,请务必确保有一个现有的 SSH 连接正在运行,以防彻底无法连接到服务器!

而后我们需要重启 SSH 服务:

# RHEL / CentOS
systemctl restart sshd
# Debian / Ubuntu
service sshd restart

配置连接

此处使用 XShell 举例:

在 工具 - 用户密钥管理者 中导入上文要求复制到本地的私钥

Image

导入私钥

Image

XShell Session

针对服务器的 Session 进行修改即可。

随后,不要关闭保留的连接,重新双击 Session 文件进行连接,如果能够成功连接则为无误。

关于端口

更改 SSH 端口并无必要,能够成功破解 ECDSA 和 RSA 算法几乎没有可能性。

使用习惯

私钥安全

请不要将私钥上传到任何公开的网络平台,例如 GitHub、QQ 群文件、云盘等,这都是极其不安全的!

私钥是唯一的,丢失私钥意味着你无法打开服务器(可 VNC 重置),泄露私钥意味着你的服务器将承受极大的安全风险。

用户

请尽可能不要使用 Root 登录 SSH。

你可以在 /etc/ssh/sshd_config 中设置 PermitRootLogin no 以避免直接通过Root登录。

为非 Root 用户设置私钥的方法与上述大致相同。

网络环境

对于较大的企业,更好的选择应当是在内网设立鉴权服务器和 SSH 跳板机 [ref] 即通过一台暴露给外网的服务器的 SSH 客户端连接内网服务器的 SSH 服务端 [/ref]。

Zero Trust 思想同样适用于系统层。

端口

建议关闭所有不需要使用的端口。

可参考文章:

关于面板程序

观点仅适用于生产环境,非生产环境请随意选择。

选择面板程序请遵循以下原则

  1. 如果你能够熟练地使用 Linux 系统,精通服务器运维,请不要使用面板程序。
  2. 如果你了解 Nginx 的基本配置文件写法,且单服务器对应单个站点,请不要使用面板程序。
  3. 如果你不需要运行 Web 程序,请不要使用面板程序。
  4. 如果你的业务主要为互联网相关,请不要使用面板程序。
  5. 如果你实在要用面板,请一定选择宝塔面板或 CPanel。

面板程序具有优点,同时也具有缺点。

  • 优点:
    • 简单快捷(开发环境可以使用,但我更推荐 JetBrains IDE 的内置部署流程)。
    • 多站点维护方便。
    • 图形化操作(适合新手)。
  • 缺点:
    • 具有一定的资源占用,小机器不推荐。
    • 宝塔面板等国内的面板程序会向其服务器上传你的服务器相关信息,且强制实名。
    • 具有出现重大 0day 漏洞的可能性(参考宝塔 pma 删库事件)。
    • 多少有点 Bug。

最主要的问题在于,一旦一个面板程序出现 Bug,那几乎所有使用者都会受到极大的影响。

且国内面板必定会上传你的服务器相关信息和站点信息,公安找上门不是不可能的事。

鸣谢

没有以下两位人才,本文必将不会被创作。

  • @Bruce 宝塔的忠诚追随者,看了我站全部文章但啥都没学到
  • @HenryJiu 密码登录 SSH 的坚定拥护者

纯属整活,以上两位都是群友兼博主的好朋友~

感谢群友的提议,让我更好地完善本文内容。

Comments

Send Comments

Markdown supported. Please keep comments clean.