apparmor 源码导读
首先进入:apparmor_init初始化。
主要就以下几个步骤:
......
if (!apparmor_enabled || !security_module_enable(&apparmor_ops)) {
aa_info_message("AppArmor disabled by boot time parameter");
apparmor_enabled = 0;
return 0;
} //环境监察
error = aa_alloc_root_ns(); //申请一个新的命名空间,并且初始化 饭后赋值给root_ns
if (error) {
AA_ERROR("Unable to allocate default profile namespace\n");
goto alloc_out;
}
error = set_init_cxt(); //设置一个进程上下文和概要文件
if (error) {
AA_ERROR("Failed to set context on init task\n");
goto register_security_out;
}
error = register_security(&apparmor_ops); //注册该模块apparmor_ops指针赋值给security_ops,就这样注册到了系统中去。
if (error) {
AA_ERROR("Unable to register AppArmor\n");
goto set_init_cxt_out;
}
......
至此,在系统调用security_file_permission这个函数的时候,实际上调用的就是:apparmor_file_permission
下面以:apparmor_file_permission来进行简要说明:
对文件进行操作的时候,首先进入:common_file_perm()
--》检查文件是否需要权限检查;
--》如果需要检查,进入aa_file_perm();
然后根据apparmor现在所处的模式以及文件的限制权限来进行处理:
apparmor有三个模式:
enum profile_mode {
APPARMOR_ENFORCE, /* enforce access rules */
APPARMOR_COMPLAIN, /* allow and log access violations */
APPARMOR_KILL, /* kill task on access violation */
};
举一个例子:
readfile.c
#include <stdio.h>
int main()
{
system("cat /xx/liam/practice/testfile");
return 0;
}
gcc readfile.c 生成a.out
执行./a.out 能够正常打印:/home/xx/practice/testfile的文件内容。
cd /etc/apparmor.d
sudo aa-genprof /home/xx/practice/a.out (提示aa-genprof没有安装。执行:sudo apt-get install apparmor-utils 进行安装。)
生成:home.xx.practice.a.out 文件。
cat home.xx.practice.a.out
#include <tunables/global>
/home/xx/practice/a.out {
#include <abstractions/base>
/home/xx/practice/a.out mr,
/home/xx/practice/testfile l, /****在这里添加限制 这里l表示lock***/
}
默认使用enforcement模式,如果这里要改变模式可修改成:/home/xx/practice/a.out flags=(complain){
这里是添加限制的语法。 r = read w = write l = link k = lock a = append
重启服务:sudo /etc/init.d/apparmor reload
然后再执行./a.out的时候将不会有输出。在/var/log/syslog里面也会有记录。
没有添加apparmor之前,执行a.out能够正常显示文件内容。
这里不仅可以进行文件访问控制,也可以进行资源限制,网络访问控制等。
/home/xx/practice/a.out mr,
set rlimit [resource] <= [value],
network [ [domain] [type] [protocol] ]
ubuntu的apparmor更多用法参见:https://help.ubuntu.com/12.04/serverguide/apparmor.html

浙公网安备 33010602011771号