![在单独的文件中创建 apparmor 帽子的正确方法](https://linux22.com/image/793047/%E5%9C%A8%E5%8D%95%E7%8B%AC%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%9B%E5%BB%BA%20apparmor%20%E5%B8%BD%E5%AD%90%E7%9A%84%E6%AD%A3%E7%A1%AE%E6%96%B9%E6%B3%95.png)
我正在尝试重新加强我的 LAMP 配置的安全性
在我的配置中,每个网站包括:
- 一个Unix帐户
- 一个 MySQL 数据库只能从一个 MySQL 帐户访问
- 在单独的文件中定义一个 VirtualHost
- 在单独的文件中定义一个 php-fpm 池
现在我正在尝试使用 apparmor 来加强安全性。
我从 php-fpm 的配置文件开始。
我的想法是有一个通用的 php-fpm 配置和每个 php-fpm 池的特定配置。
据我了解,一般配置是轮廓具体配置应该定义为aa帽子。
我希望有这个具体帽子配置在单独的文件中定义。
在投诉模式一切似乎都有效(至少当我使用命令时我什么都没有日志分析)
这就是我的做法
让我们考虑一个网站https://www.test.com拥有一个 Linux 用户“test”和一个 php-fpm 池“test.conf”
1° 在 php-fpm 池中/etc/php/8.1/fpm/pool.d/test.conf我添加了这个来定义一个名为 test 的帽子
apparmor_hat = test
2° 我已经将我的全球规则定义为/etc/apparmor.d/php-fpm。这是我在单独文件中启用帽子的配置
include if exists <php-fpm.d>
...
signal send peer=php-fpm//*,
signal send set=quit peer=php-fpm//**,
signal send set=kill peer=php-fpm//**,
signal send set=term peer=php-fpm//**,
...
change_profile -> php-fpm//**,
3° 我的测试帽子已定义为/etc/apparmor.d/php-fpm.d/测试像这样
^test flags=(complain,attach_disconnected) {
/var/run/php/php-fpm-test.sock rwlk,
/var/log/php-fpm/test.access.log rw,
...
deny /var/www/** r,
owner /home/test/www/** rw,
}
当我尝试传递给强制模式,看来我在主装甲中定义的规则轮廓/etc/apparmor.d/php-fpm 没有被我考虑进去帽子
这是我的第一个 apparmor 配置文件,我已经按照我理解的方式制作了它。
我不知道我错过了什么。我错过了最佳实践吗?
编辑
我发现我可以将主配置文件放入强制模式。
我遇到的问题只是当我戴上帽子时强制模式当我尝试重新启动 php 服务时
在这种情况下,我看到以下错误消息
php8.1-fpm.service: Failed to kill control group /system.slice/php8.1-fpm.service, ignoring: Permission denied
答案1
这似乎表明 AppArmor 阻止了 systemd 与 PHP-FPM 通信。请确保在主 FPM 配置文件(不是 hat)中有类似以下内容:
signal (receive) set=(cont,exists,term) peer=unconfined,
owner w /run/systemd/notify,
也许您可以在系统日志 ( dmesg
/ journalctl
) 中看到这一点。AppArmor 对其正在做的事情非常详细地描述。