创建适用于Apache的AppArmor配置文件

AppArmor是一个什么东西?

在Ubuntu中,有一个Linux模块可以对每个程序进行文件访问、系统调用等限制(强制访问控制 MAC)。即使应用程序存在漏洞,如Apache、PHP等的零日漏洞导致任意代码执行,该模块也能够阻止其访问到不正当的位置。这对于多层次的防御非常重要,建议一定要进行设置。尽管在权限设置方面应该防止脆弱性导致的WebShell等设施的设置,但即使这方面有疏漏,AppArmor也会拦截它的写权限。

制限规则需要针对每个可执行文件创建一个”配置文件”。
至少在Ubuntu 20.04中,默认情况下并没有Apache的配置文件,但是它提供了一些通用部分作为组件,可以使用这些组件和学习工具来创建配置文件。
看起来很难,但实际上相当容易。
(可能根据环境的不同,所需的规则也会变化,所以即使提供了默认规则时,要么限制太严格而被忽略,要么过于松散而变得无意义。)

另外,如果要从apache调用其他程序,可以继承父进程的规则,也可以切换到不同的配置文件,因此可以无问题地使用。

安装

虽然它本身是内置在Ubuntu中的,但工具需要进行安装。

sudo apt install auditd apparmor-utils

创建个人资料

首先,使用aa-genprof工具根据实际程序的运行行为自动生成规则,然后手动进行适当修正。

第一步 自动生成

运行 “sudo aa-genprof /usr/sbin/apache2” 进入学习状态,在访问 apache 并执行各种访问操作。
由于还涉及一些只在启动时访问的文件,因此需要在另一个终端中停止/启动 apache。
完成后,使用 (S)can 命令从以前的行为中选择和筛选提议的规则。
完成后,输入(F)以退出。

    • 可能ならファイル単位ではなくワイルドカードでフォルダ単位指定をしてシンプルに(Globを選ぶ)

/var/www/html/myproject/** r など

権限は最小限に。書き込み(w)、実行(x)は特に。

/var/www/html/myproject/logs/* rwk のように必要な箇所だけ付与

一般的に使われるルールの固まり(abstractions)が用意されており、これが使そうなら提示してくれるので可能ならそれを選ぶ (中身は/etc/apparmor.d/abstractions/にある)

步骤2 手动修改

由于在Step1中创建的规则已经存储在/etc/apparmor.d/usr.sbin.apache2中,因此需要使用glob进行整理并进行手动调整以缩小过于宽松的权限。有关如何设置目标、rwxk等权限的编写方式,请参考官方文档。

看起来最好还是添加一个名为”attach_disconnected”的标志。在解析路径时,将其视为以斜杠开头。如果没有该标志,则可能导致路径解析出错,并触发DENIED处理。

profile /usr/sbin/apache2 flags=(attach_disconnected) { #←このflags=(...)を追加

加载已创建的个人资料

sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.apache2

如果进行修正,这也会得到反映。

设定适用

    • 強制モード (enforce mode)

プロファイルで許可していないものは単純にアクセス禁止する。本番は当然こちら。

不平/学習モード (complaion mode)

不許可アクセスのログだけ取得して実行は妨げない。いきなり禁止が怖い場合はこちらでしばらく動かしてみて、aa-logprofでログをスキャンして問題ないか確認する。

sudo aa-enforce /usr/sbin/apache2 #強制モード
または
sudo aa-complain /usr/sbin/apache2 #不平モード/学習モード(止めずにログだけ出す)

sudo systemctl restart apache2 #apacheも再起動しないと反映されない模様

sudo aa-status #設定状況の確認 complain/enforce modeにapacheが入っているのを確認する

确认

使用file_get_content()函数,将数据从已授权的位置和未授权的位置加载,并确认只有前者可以加载。

日志审查

如果安装了 auditd,在 /var/log/audit/audit.log 中会有日志输出。
如果没有安装,会在 syslog 中输出。
如果有问题,则可以使用 aa-logprof 更新策略 → 文档。

向SIEM(Wazuh)发送日志

(Wazuh 4.2版本) 默认设置会从audit.log中读取。
但是请注意,权限错误的警报级别较低,如果希望发送警报,请注意。
→ 更改警报级别的方法

填補不足之處

尽管有一个名为mod_apparmor的Apache模块,但就像上述所述,它并不是必需的。
由于它可以使用帽子功能进行详细的配置,因此我认为它在需要精细调整设置时非常方便。

请您参考以下内容,以便在中文环境下进行更好的理解和使用:

AppArmor 维基
Ubuntu 维基
mod_apparmor

bannerAds