AppArmor 是一个类似于selinux 的东东,主要的作用是设置某个可执行程序的访问控制权限,可以限制程序 读/写某个目录/文件,打开/读/写网络端口等等。。
1.安装 Ubuntu 7.10里 sudo apt-get install apparmor apparmor-profiles apparmor-docs apparmor-utils
2.启动服务 sudo /etc/init.d/apparmor restart
3.添加访问控制规则 3.1 先试编写一个小程序
代码:
int main(int argc,char *argv[]) { FILE * f; int nn,i; char ch; if (argc == 3){ f = fopen(argv[1],”w”); if (f ==NULL) { printf (”Open file \”%s\” with w ERROR\n”,argv[1]); return 2; } nn = strlen(argv[2]); i=0; while (i { fputc(argv[2][i],f); ++i; } fclose(f); } else if (argc == 2){ f = fopen(argv[1],”r”); if (f == NULL) { printf (”Open file \”%s\” with r ERROR\n”,argv[1]); return 2; } while ( (ch=fgetc(f)) != EOF ) { printf(”%c”,ch); } fclose(f); } else { printf(”Usage: testapp file \”string\” // write string to file \n” ” testapp file // read file and print it \n”); return 3; }
return 0; }
保存为/home/n1/Desktop/testapp.c, 程序很简单,带一个或两个参数,第一个参数是文件名,第二个参数是字符串,读或写文件 执行
cd /home/n1/Desktop gcc -Wall -o testapp testapp.c ./testapp abc “1abc” ./testapp abcd “2abcd” ./testapp abcde “3abcde” ls abc abcd abcde #/// <- 可看到文件 ./testapp abc ./testapp abcd ./testapp abcde #/// <- 可看到文件内容 rm abc abcd abcde
以上测试在用户家目录里,有完全的读写权限,写入读取文件一切正常。 3.2 创建规则
cd /home/n1/Desktop sudo genprof testapp #// 提示[(S)can system log for SubDomain events] / (F)inish 时按F 完成 ls /etc/apparmor.d/home.n1.* #// 可以看到有一个 /etc/apparmor.d/home.n1.Desktop.testapp 文件,
原始内容为
/home/n1/Desktop/testapp flags=(complain) {
/home/n1/Desktop/testapp mr, }
在文件大括号内加入
/home/n1/Desktop/abcde rwm, /home/n1/Desktop/abcd w, /home/n1/Desktop/abc r,
一部分为文件名,第二部分为权限,rwxm 之类与文件系统的权限类似。 4. 测试 执行下列命令
sudo /etc/init.d/apparmor reload // 重装读取 ./testapp abc “1abc00″ ./testapp abcd “2abcd00″ ./testapp abcde “3abcde00″ ls abc abcd abcde #/// <- 可看到文件 ./testapp abc ./testapp abcd ./testapp abcde #/// <- 可看到文件内容
gedit /var/log/syslog # 可以看到类似内容 kernel: [140321.028000] audit(1191433716.584:1578): type=1502 operation=”inode_create” requested_mask=”w” denied_mask=”w” name=”/home/n1/Desktop/abc” pid=4864 profile=”/home/n1/Desktop/testapp” kernel: [140362.236000] audit(1191433758.086:1579): type=1502 operation=”inode_permission” requested_mask=”r” denied_mask=”r” name=”/home/n1/Desktop/abcd” pid=4877 profile=”/home/n1/Desktop/testapp”
/etc/apparmor.d/home.n1.Desktop.testapp 他们没有对应的权限
rm abc abcd abcde
再执行
sudo enforce /etc/apparmor.d/home.n1.Desktop.testapp // 启用“强制”
sudo /etc/init.d/apparmor reload ./testapp abc “1abc0011″ # 写入出错 ./testapp abcd “2abcd0011″ ./testapp abcde “3abcde0011″ ./testapp otherfile “teststest” # 其它文件名,也是失败 ls abc abcd abcde #/// <- 看不到文件abc echo “i am test” > abc # 手工创建 ./testapp abc ./testapp abcd #读取出错 ./testapp abcde cat abcd # 内容为刚才加入的内容”2abcd0011″
查看AppArmor在整个系统的状态
sudo apparmor_status # 在启动时应该有 —– apparmor module is loaded. 17 profiles are loaded. 4 profiles are in enforce mode. ….. /home/n1/Desktop/testapp 13 profiles are in complain mode. /usr/sbin/traceroute ….. 5 processes have profiles defined. 1 processes are in enforce mode : /usr/sbin/cupsd (4812) 4 processes are in complain mode. ….. /sbin/syslogd (4574) 0 processes are unconfined but have a profile defined. —— 之类的,
以上是最简单的应用,通过 genprof 创建规则文件,只添加最少需要的文件读写权限规则, 可实现除了文件系统权限以外对某未知程序的读写文件控制。 在规则文件里的文件名路径可带通配符
其它自动化工具包括 logprof ,autodep,audit,complain,unconfined,查看状态 apparmor_status 等
要取消只要删除apparmor.d 里的文件,重启 apparmor 服务就行
有个问题就是把可执行文件复制到其它目录里就不能限制了
介绍内容来自 http://21nw.com/