低成本运维你的 Linux(肉鸡)。Low Cost Maintenance of Your Linux
背景
现在国内各大小公司工作的程序员们,有些公司有专门的运维守着机器,有些则是由开发人员自己在兼职运维。
此间可谓人生百态,各种乱象丛生。
-
有
root
密码乱丢,谁都可以rm -rf /*
,直接从跑路快进到进局子的。 -
也有自欺欺人法,做了用户区分,但是人人都有
root
权限的,形同虚设,还是任何人都可以删库跑路。 -
还有,不是所有人都有
root
权限,但是服务用的是root
用户在跑的,一旦服务程序有安全漏洞,直接这台机器所有数据祭天,或者沦为肉鸡。
财大气粗的公司自然更重视自己的数据安全,会有更专业的人在管理机器,但是小公司可能下一秒就要死了,你跟他说这台服务器有重大的风险,这时候很可能不知道谁先上天。他们眼里要的是,业绩,业绩,还是业绩。小活下去,先谋生存再谋发展。
之所以各位看官没有听说这些事故,是因为
- 小公司价值小,不足以推动内鬼犯事,出了事也没有很大的社会影响力以引起关注,
- 大公司就算出了事,家丑不可外扬,很少会爆出来。(其实很小概率,因为一般有专职的运维。)
但是这里要说的是,一旦出事,基本是火葬场级别的。
这里需要注意的是,这个世界并不是只有大厂的,高并发的,高价值的业务,还存在着大量平常,中低价值的业务,这些业务也是赚钱的,也需要被重视,被保护。
“没有中小企业的发展,就没有整个经济的进步。” —— 乔布斯
“小企业是经济的血液,大企业是经济的骨骼。” —— 沃伦·巴菲特
from ChatGPT
目标
那如何低成本的避免服务器出现重大的事故,也就是在没有专职的运维的情况下,运维好你的 Linux
系统服务器?
也就是做到以下具体的这几点:
- 对所有人采用最小信任,做好权限隔离;
- 跑在同一机器上的服务做到相互隔离;
- 对所有操作都做到可溯源;
- 定期对系统进行备份;
可选方案
-
为每一个需要上机器操作的用户创建一个用户
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
的错误消息。 -
为部署的服务创建一个独立的用户
sudo useradd -m test-project2
该服务只是在该用户下进行部署,也可以使用
docker
进行容器化,但是要关注 container escape 问题。 -
记录所有用户的操作
要开启
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
日志文件中(再加一层保护的话,可以使用定时触发,写操作触发日志文件同步到远程机器或者对象存储)。您可以使用ausearch
或aureport
工具来搜索、过滤和分析日志文件。例如,要查看特定用户在系统上执行的所 有命令,可以使用以下命令:sudo ausearch -u <username> -i --success yes
请将
<username>
替换为要查看其操作日志的用户名。 -
定期备份
- 全量备份:鉴于目前大部分机器都上了云,直接在云商的控制面板开启定期镜像不失为一个好选择。
- 部分文件备份:使用
rsync
和cron
定期对文件进行类似于冗余复制的操作是一个轻便的方案。
对比
通过以上操作之后,至少可以做到内鬼可抓,损失可控的级别了,虽然不是什么很厉害的高可用,但是已经可以避免很多由于人工操作失误而导致的损失了。
更近一步
直接禁止人工登录机器,配合一套监控系统,让开发直接在系统进行查看即可,这里可以选中接入 prometheus, istio 等优秀开源监控项目。
但是,
请根据真实情况选择合适的政策,不要盲目跟风使用所谓流行技术而本末倒置。
因为所有的这些措施都是为了提高生产效率,
过度使用那些不必要的工具组件只会徒增复杂度,干活是多了,但是做功为零。

结论
说了一堆,还是回到一些朴素的,人人都懂,但是不见棺材不落泪的道理上:
没打战之前,人都是以为会永远和平下去的。
关键还是要尽早重视安全问题,构建好基础设施。