本文来自依云's Blog,转载请注明。
最近学 wzyboy 搭了一套 collectd + Graphite + Grafana 监控。collectd 和 Grafana 都比较好搞,Arch 官方源里有。但是 Graphite 就没有了。
我没有使用 Python 2 版、带 Web 前端的 Graphite 包,而是使用 graphite-api 提供 Web API,python2-carbon 存储数据。它们在 AUR 上有,其中 python2-carbon 是相当危险的(现在已经改了)。
为什么危险呢?
首先,最明显的,carbon 服务以 root 用户运行。它本身没有任何使用 root 权限的必要,所以专门创建一个 carbon 用户更好。
其次,它运行起来之后,我发现是监听 0.0.0.0 的。这个也无必要:我的 collectd 就在本地呢。
最后,也是最吓人的:它默认开启了接收 pickle 数据的端口。Python pickle 模块的文档一打开,就能看到红色的警告,告诉人们不能接收不信任来源的 pickle 数据。而我曾经工作过的公司也发生过通过 pickle 注入代码的事情:攻击者发现了一个对外网开放的 Redis 服务,刚好那个 Redis 是给 Celery 用的。攻击者于是往里边写了条自己构造的 pickle,在解析时调用 curl 命令向其服务器报告IP、端口和当前UNIX用户的信息。
这接口,开在外网,就是远程代码招行;开在本地,就是本地提权。很危险的。
为了防止各种漏洞被利用,一个未雨绸缪的办法就是:权限最小化。本来这是件比较麻烦的事情,好在 systemd 提供了许多现成的配置项,使得给 carbon 这种服务加固简单易行。
首先创建用户,写一个 sysusers 文件就可以了:
u carbon - "carbon service" /var/lib/carbon
然后,它需要使用文件系统的某些部分。那么别的就用不着访问了,比如 /home。而 /dev、/tmp 这些,自己用自己的就好。连 / 也不让写,也不允许获取任何新特权了。其实使用 carbon 用户它本来就写不了 / 也没有任何特权了,但以防万一嘛,要是哪里来个本地提权漏洞呢?
[Unit] Description=Graphite/Carbon After=network.target [Service] Type=forking ExecStart=/usr/bin/carbon-cache.py --config=/etc/carbon/carbon.conf start User=carbon PrivateTmp=true PrivateDevices=true ProtectSystem=full ProtectHome=true NoNewPrivileges=true CapabilityBoundingSet= ReadOnlyPaths=/ ReadWritePaths=/run ReadWritePaths=/var/log/carbon ReadWritePaths=/var/lib/carbon [Install] WantedBy=multi-user.target
限制文件系统的访问,systemd 配置起来很方便,我打包的时候喜欢尽量加上。
Feb 11, 2018 11:54:28 PM
感觉还是 firejail 的配置写起来更舒服点 :)
Feb 12, 2018 09:02:16 AM
没具体使用过,看介绍 firejail 是针对面向用户的应用程序的吧?
Feb 12, 2018 03:29:37 PM
放假前给deepin内部也搭了一套 InfluxDB + Grafana,不过都是用现成的Docker :)