systemd介绍
systemd是一个系统套件,充当 Linux 操作系统的系统和服务管理器,提供用于控制、报告和系统初始化的工具和服务。systemd 管理的基本对象是 systemd 单元,表示系统资源和服务。systemd 单元由一个名称、类型和配置文件组成,用于定义和管理特定任务。更多细节可通过 man systemd查阅。
systemd安全作用
下面就systemd在安全的#最小权限#、#减少攻击面#两大原则上发挥的作用介绍几个示例。
环境:CentOS Linux release 7.6.1810 (Core) Linux 3.10.0-1160.45.1.el7.x86_64
类ulimit资源限制
ulimit 从系统和用户级限制系统资源的占用,比如内存,CPU,进程数,而systemd能更精细化,做到服务/进程级控制系统资源的使用,避免相同主机下某业务遭受攻击时资源占用异常影响其他业务。
[Service]
TasksMax=2
MemoryLimit=9437184
CPUQuota=20%
上面TasksMax限制进程数,可避免程序异常或启动进程数受配置控制而配置被污染这两种场景下的进程炸弹,当超出systemd自动杀死多余进程;MemoryLimit为进程使用限制,测试验证malloc申请超限内存,没返回NULL,进程正常运行,这个待后续继续研究;CPUQuota为限制CPU使用占比,20%为总CPU核数占比,比如2进程3核,2进程总占用不超20%的CPU。更多类ulimit限制可查看man systemd.resource-control。
运行权限限制
Linux下进程权限继承自执行用户,如crond以root身份启动定时脚本,systemd默认也是root身份启动所管理服务,不过可以通过User=和Group=指派运行身份,通过较低权限用户运行,缓解命令执行、任意文件读取等风险后果。
[Service]
Type=forking
User=daemon
Group=daemon
Group如果未指定,则赋值为User所属的Group,具体现实中使用,可学习#参考文献#中的redis服务管理文件,里面有用到。更细化的可设置capability,比如CapabilityBoundingSet,这块没做研究,有兴趣可深入了解。
磁盘与网络限制
对应类WEB服务,对外交互,且读写目录可相对固定,可通过限制目录的读写范围和指定目录读写权限,避免任意文件读写风险,结合PrivateTmp做到进程临时目录隔离。而对于只需要本机内互相通信进程集,则可以结合PrivateNetwork=与JoinsNamespaceOf=完成网络隔离,消除异常外联风险。
[Service]
ExecStart=/usr/sbin/t
KillMode=mixed
Restart=on-failure
RestartSec=42s
PrivateNetwork=true
JoinsNamespaceOf=t1
[Service]
ExecStart=/usr/sbin/rd
KillMode=mixed
Restart=on-failure
RestartSec=42s
ReadWriteDirectories=/home/webconfig /home/webdata /tmp
ReadOnlyDirectories=/home/root /usr
InaccessibleDirectories=/etc
JoinsNamespaceOf=t1
磁盘限制,ReadOnlyDirectories指定目录只读,InaccessibleDirectories标识目录不可访问;而网络限制,PrivateNetwork选项开启则服务只能访问本地回环地址(loopback network device "lo" inside it),无法外联,其他服务通过设置JoinsNamespaceOf完成与之通信。
参考文献
(1)https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/introduction-to-systemd_configuring-basic-system-settings
(2)https://en.wikipedia.org/wiki/Systemd
(3)https://gist.github.com/berkayunal/402180516e1f2db0e3a87f7e2df499f2