Contents

低成本运维你的 Linux(肉鸡)。Low Cost Maintenance of Your Linux

背景

现在国内各大小公司工作的程序员们,有些公司有专门的运维守着机器,有些则是由开发人员自己在兼职运维。

此间可谓人生百态,各种乱象丛生。

  • root 密码乱丢,谁都可以 rm -rf /*,直接从跑路快进到进局子的。

  • 也有自欺欺人法,做了用户区分,但是人人都有 root 权限的,形同虚设,还是任何人都可以删库跑路。

  • 还有,不是所有人都有 root 权限,但是服务用的是 root 用户在跑的,一旦服务程序有安全漏洞,直接这台机器所有数据祭天,或者沦为肉鸡。

财大气粗的公司自然更重视自己的数据安全,会有更专业的人在管理机器,但是小公司可能下一秒就要死了,你跟他说这台服务器有重大的风险,这时候很可能不知道谁先上天。他们眼里要的是,业绩,业绩,还是业绩。小活下去,先谋生存再谋发展。

之所以各位看官没有听说这些事故,是因为

  • 小公司价值小,不足以推动内鬼犯事,出了事也没有很大的社会影响力以引起关注,
  • 大公司就算出了事,家丑不可外扬,很少会爆出来。(其实很小概率,因为一般有专职的运维。)

但是这里要说的是,一旦出事,基本是火葬场级别的。

这里需要注意的是,这个世界并不是只有大厂的,高并发的,高价值的业务,还存在着大量平常,中低价值的业务,这些业务也是赚钱的,也需要被重视,被保护。

“没有中小企业的发展,就没有整个经济的进步。” —— 乔布斯

“小企业是经济的血液,大企业是经济的骨骼。” —— 沃伦·巴菲特

from ChatGPT

目标

那如何低成本的避免服务器出现重大的事故,也就是在没有专职的运维的情况下,运维好你的 Linux 系统服务器?

也就是做到以下具体的这几点:

  1. 对所有人采用最小信任,做好权限隔离;
  2. 跑在同一机器上的服务做到相互隔离;
  3. 对所有操作都做到可溯源;
  4. 定期对系统进行备份;

可选方案

  1. 为每一个需要上机器操作的用户创建一个用户

    sudo adduser test
    

    接下来就是添加该用户的密钥,禁止其使用密码进行 SSH 登录(应该禁止所有人使用密码进行 SSH 登录)。

    要设置 Linux 禁止某个用户使用密码进行 SSH 登录,并强制只允许使用 SSH key 进行登录,您可以按照以下步骤进行操作:

    在您的 Linux 服务器上登录一个拥有 sudo 权限的账户。

    确认该用户的 SSH key 已添加到服务器上的 authorized_keys 文件中。如果尚未添加,请将该用户的 SSH 公钥添加到该文件中。您可以使用以下命令将 SSH 公钥添加到 authorized_keys 文件中:

    sudo su - <username>
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    vim ~/.ssh/authorized_keys
    

    将以下行添加到 authorized_keys 文件的底部:

    no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/bin/false" <SSH key>
    

    请将 <SSH key> 替换为该用户的 SSH 公钥。该行的作用是禁止用户进行端口转发、X11 转发、代理转发和交互式 shell,只允许使用指定的命令。

    禁用该用户的密码登录功能。要禁用密码登录,请编辑 SSH 服务器配置文件并将 PasswordAuthentication 选项设置为 no。您可以使用以下命令打开配置文件:

    sudo nano /etc/ssh/sshd_config
    

    找到 PasswordAuthentication 选项,并将其设置为 no。如果该选项未在文件中找到,则可以添加以下行:

    PasswordAuthentication no
    

    重启 SSH 服务器以使更改生效。您可以使用以下命令重启 SSH 服务器:

    sudo systemctl restart sshd
    

    现在,该用户已被禁止使用密码进行 SSH 登录,并且只允许使用 SSH key 进行登录。如果该用户尝试使用密码进行 SSH 登录,将会收到 Permission denied 的错误消息。

  2. 为部署的服务创建一个独立的用户

    sudo useradd -m test-project2
    

    该服务只是在该用户下进行部署,也可以使用 docker 进行容器化,但是要关注 container escape 问题。

  3. 记录所有用户的操作

    要开启 Linux 上的用户操作日志记录,您可以使用 auditd 工具。 auditd 是一个系统审核守护进程,它可以捕获系统上发生的各种事件,并将它们记录到一个日志文件中。您可以按照以下步骤来开启用户操作日志记录:

    检查 auditd 是否已安装。如果没有安装,可以使用以下命令安装:

    sudo apt-get install auditd
    

    确认 auditd 服务是否已启动。您可以使用以下命令检查它的状态:

    sudo systemctl status auditd
    

    如果 auditd 服务未启动,则可以使用以下命令启动它:

    sudo systemctl start auditd
    

    编辑 /etc/audit/auditd.conf 文件并将以下行添加到文件的末尾:

    # Log all commands run by users
    -a always,exit -F arch=b64 -S execve -k USER_COMMANDS
    

    该行的作用是记录所有用户运行的命令,以便将来进行审计。

    重新启动 auditd 服务以使更改生效:

    sudo systemctl restart auditd
    

    现在,用户操作日志记录已开启。用户执行的所有命令都将被记录在 /var/log/audit/audit.log 日志文件中(再加一层保护的话,可以使用定时触发,写操作触发日志文件同步到远程机器或者对象存储)。您可以使用 ausearchaureport 工具来搜索、过滤和分析日志文件。例如,要查看特定用户在系统上执行的所 有命令,可以使用以下命令:

    sudo ausearch -u <username> -i --success yes
    

    请将 <username> 替换为要查看其操作日志的用户名。

  4. 定期备份

    • 全量备份:鉴于目前大部分机器都上了云,直接在云商的控制面板开启定期镜像不失为一个好选择。
    • 部分文件备份:使用 rsynccron 定期对文件进行类似于冗余复制的操作是一个轻便的方案。

对比

通过以上操作之后,至少可以做到内鬼可抓,损失可控的级别了,虽然不是什么很厉害的高可用,但是已经可以避免很多由于人工操作失误而导致的损失了。

更近一步

直接禁止人工登录机器,配合一套监控系统,让开发直接在系统进行查看即可,这里可以选中接入 prometheus, istio 等优秀开源监控项目。

但是,

请根据真实情况选择合适的政策,不要盲目跟风使用所谓流行技术而本末倒置。

因为所有的这些措施都是为了提高生产效率,

过度使用那些不必要的工具组件只会徒增复杂度,干活是多了,但是做功为零。

/images/images-jokes-1.jpeg

结论

说了一堆,还是回到一些朴素的,人人都懂,但是不见棺材不落泪的道理上:

没打战之前,人都是以为会永远和平下去的。

关键还是要尽早重视安全问题,构建好基础设施。