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

 

posted @ 2015-03-14 15:11  JustRelax  阅读(933)  评论(0)    收藏  举报