Ubuntu Kylin技术论坛

 找回密码
查看: 6326|回复: 3

AppArmor介绍

[复制链接]
  • TA的每日心情
    奋斗
    2018-8-22 10:21
  • 签到天数: 80 天

    [LV.6]常住居民II

    发表于 2015-4-8 09:19:14 | 显示全部楼层 |阅读模式
    原文链接:http://www.lenky.info/archives/2014/05/2405

    AppArmor是一款与SeLinux类似的安全框架/工具,其主要作用是控制应用程序的各种权限,例如对某个目录/文件的读/写,对网络端口的打开/读/写等等。
    来之Novell网站的引用:
    1. AppArmor is designed to provide easy-to-use application security for both servers and workstations. Novell AppArmor is an access control system that lets you specify per program which files the program may read, write, and execute. AppArmor secures applications by enforcing good application behavior without relying on attack signatures, so it can prevent attacks even if they are exploiting previously unknown vulnerabilities.
    复制代码
    AppArmor通过一个配置文件(即profile)来指定一个应用程序的相关权限。在大多数情况下,可以通过限制应用程序的某些不必要的权限来提升系统安全性,比如指定Firefox不能访问系统目录,这样即便是使用Firefox访问了恶意网页,也可以避免恶意网页通过Firefox访问到系统目录。
    AppArmor是Ubuntu的默认选择,但在默认情况下,系统自带安装的profile配置文件很少,通过命令:sudo apt-get install apparmor-profiles,可以安装额外的AppArmor-profile文件。
    在Ubuntu下通过命令sudo apparmor_status可以查看当前AppArmor的状态。
    执行sudo apt-get install apparmor-profiles命令之前的自带profile配置:
    1. lenky@local:~$ sudo apparmor_status
    2. apparmor module is loaded.
    3. 20 profiles are loaded.
    4. 20 profiles are in enforce mode.
    5.      /sbin/dhclient
    6.      /usr/bin/evince
    7.      /usr/bin/evince-previewer
    8.      /usr/bin/evince-previewer//sanitized_helper
    9.      /usr/bin/evince-thumbnailer
    10.      /usr/bin/evince-thumbnailer//sanitized_helper
    11.      /usr/bin/evince//sanitized_helper
    12.      /usr/lib/NetworkManager/nm-dhcp-client.action
    13.      /usr/lib/connman/scripts/dhclient-script
    14.      /usr/lib/cups/backend/cups-pdf
    15.      /usr/lib/lightdm/lightdm-guest-session
    16.      /usr/lib/lightdm/lightdm-guest-session//chromium
    17.      /usr/lib/telepathy/mission-control-5
    18.      /usr/lib/telepathy/telepathy-*
    19.      /usr/lib/telepathy/telepathy-*//pxgsettings
    20.      /usr/lib/telepathy/telepathy-*//sanitized_helper
    21.      /usr/lib/telepathy/telepathy-ofono
    22.      /usr/sbin/cups-browsed
    23.      /usr/sbin/cupsd
    24.      /usr/sbin/tcpdump
    25. 0 profiles are in complain mode.
    26. 4 processes have profiles defined.
    27. 4 processes are in enforce mode.
    28.      /usr/lib/telepathy/mission-control-5 (2438)
    29.      /usr/sbin/cups-browsed (1070)
    30.      /usr/sbin/cupsd (2881)
    31.      /usr/sbin/cupsd (2884)
    32. 0 processes are in complain mode.
    33. 0 processes are unconfined but have a profile defined.
    34. lenky@local:~$
    复制代码
    执行sudo apt-get install apparmor-profiles命令之后的情况:
    1. lenky@local:~$ sudo apparmor_status
    2. apparmor module is loaded.
    3. 47 profiles are loaded.
    4. 23 profiles are in enforce mode.
    5.      /sbin/dhclient
    6.      /usr/bin/evince
    7.      /usr/bin/evince-previewer
    8.      /usr/bin/evince-previewer//sanitized_helper
    9.      /usr/bin/evince-thumbnailer
    10.      /usr/bin/evince-thumbnailer//sanitized_helper
    11.      /usr/bin/evince//sanitized_helper
    12.      /usr/lib/NetworkManager/nm-dhcp-client.action
    13.      /usr/lib/chromium-browser/chromium-browser//browser_java
    14.      /usr/lib/chromium-browser/chromium-browser//browser_openjdk
    15.      /usr/lib/chromium-browser/chromium-browser//sanitized_helper
    16.      /usr/lib/connman/scripts/dhclient-script
    17.      /usr/lib/cups/backend/cups-pdf
    18.      /usr/lib/lightdm/lightdm-guest-session
    19.      /usr/lib/lightdm/lightdm-guest-session//chromium
    20.      /usr/lib/telepathy/mission-control-5
    21.      /usr/lib/telepathy/telepathy-*
    22.      /usr/lib/telepathy/telepathy-*//pxgsettings
    23.      /usr/lib/telepathy/telepathy-*//sanitized_helper
    24.      /usr/lib/telepathy/telepathy-ofono
    25.      /usr/sbin/cups-browsed
    26.      /usr/sbin/cupsd
    27.      /usr/sbin/tcpdump
    28. 24 profiles are in complain mode.
    29.     /sbin/klogd
    30.     /sbin/syslog-ng
    31.     /sbin/syslogd
    32.     /usr/lib/chromium-browser/chromium-browser
    33.     /usr/lib/chromium-browser/chromium-browser//chromium_browser_sandbox
    34.     /usr/lib/chromium-browser/chromium-browser//lsb_release
    35.     /usr/lib/chromium-browser/chromium-browser//xdgsettings
    36.     /usr/lib/dovecot/deliver
    37.     /usr/lib/dovecot/dovecot-auth
    38.     /usr/lib/dovecot/imap
    39.     /usr/lib/dovecot/imap-login
    40.     /usr/lib/dovecot/managesieve-login
    41.     /usr/lib/dovecot/pop3
    42.     /usr/lib/dovecot/pop3-login
    43.     /usr/sbin/avahi-daemon
    44.     /usr/sbin/dnsmasq
    45.     /usr/sbin/dovecot
    46.     /usr/sbin/identd
    47.     /usr/sbin/mdnsd
    48.     /usr/sbin/nmbd
    49.     /usr/sbin/nscd
    50.     /usr/sbin/smbd
    51.     /usr/{sbin/traceroute,bin/traceroute.db}
    52.     /{usr/,}bin/ping
    53. 10 processes have profiles defined.
    54. 4 processes are in enforce mode.
    55.     /usr/lib/telepathy/mission-control-5 (2438)
    56.     /usr/sbin/cups-browsed (1070)
    57.     /usr/sbin/cupsd (2881)
    58.     /usr/sbin/cupsd (2884)
    59. 0 processes are in complain mode.
    60. 6 processes are unconfined but have a profile defined.
    61.     /usr/sbin/avahi-daemon (868)
    62.     /usr/sbin/avahi-daemon (873)
    63.     /usr/sbin/dnsmasq (2493)
    64.     /usr/sbin/nmbd (2639)
    65.     /usr/sbin/smbd (704)
    66.     /usr/sbin/smbd (1105)
    67. lenky@local:~$
    复制代码
    可以看到新安装了一些profile配置文件。Apparmor的profile配置文件均保存在目录/etc/apparmor.d,对应的日志文件记录在/var/log/messages。
    Apparmor使用内核标准安全文件系统机制(/sys/kernel/security)来加载和监控profiles文件。而虚拟文件/sys/kernel/security/apparmor/profiles里记录了当前加载的profiles文件。
    1. lenky@local:/var/log$ cat /sys/kernel/security/apparmor/profiles
    2. cat: /sys/kernel/security/apparmor/profiles: 权限不够
    3. lenky@local:/var/log$ sudo -i
    4. [sudo] password for lenky:
    5. root@local:~# cat /sys/kernel/security/apparmor/profiles
    6. /usr/{sbin/traceroute,bin/traceroute.db} (complain)
    7. /usr/sbin/smbd (complain)
    8. /usr/sbin/nscd (complain)
    9. /usr/sbin/nmbd (complain)
    10. /usr/sbin/mdnsd (complain)
    11. /usr/sbin/identd (complain)
    12. /usr/sbin/dovecot (complain)
    13. /usr/sbin/dnsmasq (complain)
    14. /usr/sbin/avahi-daemon (complain)
    15. /usr/lib/dovecot/pop3-login (complain)
    16. /usr/lib/dovecot/pop3 (complain)
    17. /usr/lib/dovecot/managesieve-login (complain)
    18. /usr/lib/dovecot/imap-login (complain)
    19. /usr/lib/dovecot/imap (complain)
    20. /usr/lib/dovecot/dovecot-auth (complain)
    21. /usr/lib/dovecot/deliver (complain)
    22. /usr/lib/chromium-browser/chromium-browser (complain)
    23. /usr/lib/chromium-browser/chromium-browser//browser_java (enforce)
    24. /usr/lib/chromium-browser/chromium-browser//browser_openjdk (enforce)
    25. /usr/lib/chromium-browser/chromium-browser//chromium_browser_sandbox (complain)
    26. /usr/lib/chromium-browser/chromium-browser//lsb_release (complain)
    27. /usr/lib/chromium-browser/chromium-browser//sanitized_helper (enforce)
    28. /usr/lib/chromium-browser/chromium-browser//xdgsettings (complain)
    29. /sbin/syslog-ng (complain)
    30. /sbin/syslogd (complain)
    31. /sbin/klogd (complain)
    32. /{usr/,}bin/ping (complain)
    33. /usr/sbin/tcpdump (enforce)
    34. /usr/lib/telepathy/telepathy-ofono (enforce)
    35. /usr/lib/telepathy/telepathy-* (enforce)
    36. /usr/lib/telepathy/telepathy-*//sanitized_helper (enforce)
    37. /usr/lib/telepathy/telepathy-*//pxgsettings (enforce)
    38. /usr/lib/telepathy/mission-control-5 (enforce)
    39. /usr/sbin/cups-browsed (enforce)
    40. /usr/bin/evince-thumbnailer (enforce)
    41. /usr/bin/evince-thumbnailer//sanitized_helper (enforce)
    42. /usr/bin/evince-previewer (enforce)
    43. /usr/bin/evince-previewer//sanitized_helper (enforce)
    44. /usr/bin/evince (enforce)
    45. /usr/bin/evince//sanitized_helper (enforce)
    46. /usr/lib/lightdm/lightdm-guest-session (enforce)
    47. /usr/lib/lightdm/lightdm-guest-session//chromium (enforce)
    48. /usr/sbin/cupsd (enforce)
    49. /usr/lib/cups/backend/cups-pdf (enforce)
    50. /usr/lib/connman/scripts/dhclient-script (enforce)
    51. /usr/lib/NetworkManager/nm-dhcp-client.action (enforce)
    52. /sbin/dhclient (enforce)
    53. root@local:~#
    复制代码
    profile文件以它所对应的应用程序的完整路径来命名,当然,要去除对前面的根符号(/),然后把路径中间的/替换为.。如果是软连接,还必须转换到最终的应用程序。比如firefox的情况:
    1. lenky@local:/var/log$ whereis firefox
    2. firefox: /usr/bin/firefox /etc/firefox /usr/lib/firefox /usr/bin/X11/firefox /usr/share/man/man1/firefox.1.gz
    3. lenky@local:/var/log$ file /usr/bin/firefox
    4. /usr/bin/firefox: symbolic link to `../lib/firefox/firefox.sh'
    5. lenky@local:/var/log$ ls /usr/lib/firefox/firefox.sh -l
    6. -rwxr-xr-x 1 root root 2740  4月 11 05:10 /usr/lib/firefox/firefox.sh
    复制代码

    可以看到firefox对应的最终路径是/usr/lib/firefox/firefox.sh,因此与此相对的AppArmor配置文件为:/etc/apparmor.d/usr.lib.firefox.firefox.sh,即我们可以在/etc/apparmor.d目录下建立一个usr.lib.firefox.firefox.sh文件来定义firefox的相关权限。
    一个profile文件定义好之后,当其对应的应用程序启动(比如firefox),它也就自动激活生效。有两种模式,分别为:
    complain:应用程序发生了超过其权限之外的动作时,Apparmor会进行log记录,但是不会阻止应用程序相关动作的成功执行。
    enforce:应用程序发生了超过其权限之外的动作时,Apparmor会进行log记录,并且会阻止应用程序相关动作的成功执行。
    通过命令aa-complain或aa-enforce可以切换profile文件的状态。这需要先安装对应的utils工具:

    1. sudo apt-get install apparmor-utils
    复制代码
    试试:

    1. lenky@local:~$ sudo aa-complain tcpdump
    2. Setting /usr/sbin/tcpdump to complain mode.
    3. lenky@local:~$ sudo aa-enforce tcpdump
    4. Setting /usr/sbin/tcpdump to enforce mode.
    复制代码
    做了这种修改后需要重启apparmor,Apparmor的启动、停止等操作的相关命令如下:
    1. Start : sudo /etc/init.d/apparmor start
    2. Stop : sudo /etc/init.d/apparmor stop
    3. reload: sudo /etc/init.d/apparmor reload
    4. Show status: sudo /etc/init.d/apparmor status
    复制代码
    其他命令:
    aa-unconfined用来显示系统里那些拥有tcp/udp端口,但又未处于apparmor监控之下的进程。
    1. lenky@local:~$ sudo aa-unconfined
    2. 704 /usr/sbin/smbd not confined
    3. 868 /usr/sbin/avahi-daemon not confined
    4. 979 /usr/sbin/sshd not confined
    5. 1070 /usr/sbin/cups-browsed confined by '/usr/sbin/cups-browsed (enforce)'
    6. 2493 /usr/sbin/dnsmasq not confined
    7. 2639 /usr/sbin/nmbd not confined
    8. 2881 /usr/sbin/cupsd confined by '/usr/sbin/cupsd (enforce)'
    9. 9624 /usr/sbin/nginx (nginx: master process /usr/sbin/nginx) not confined
    复制代码

    这样的进程越多,对应系统被攻击的风险也就越大。aa-genprof命令用来生成一个profile文件。实例:利用命令sudo aa-genprof nginx生成nginx的一个profile文件。
    在一个终端1里执行:
    1. lenky@local:~$ sudo aa-genprof nginx
    2. ...
    3. [(S)can system log for AppArmor events] / (F)inish
    复制代码
    另开一个终端2,执行sudo nginx,然后切回终端1,按s进行扫描,竟然挂了,原因不明,不管,直接再执行sudo aa-genprof nginx,按s进行扫描,没有扫描到东西。
    切换会终端2,sudo killall nginx; sudo nginx,切回终端1,按s进行扫描,有如下提示:
    1. [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)ore
    复制代码
    按a,还有类似提示,一直按a,即全部设置为allow,到最后出现:
    1. (S)ave Changes / Save Selec(t)ed Profile / [(V)iew Changes] / View Changes b/w (C)lean profiles / Abo(r)t
    复制代码
    按s保存配置。
    出现:
    1. [(S)can system log for AppArmor events] / (F)inish
    复制代码
    按f结束












    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-22 10:21
  • 签到天数: 80 天

    [LV.6]常住居民II

     楼主| 发表于 2015-4-8 09:27:57 | 显示全部楼层
    [续正文]

    原文链接:http://www.lenky.info/archives/2014/05/2405

    查看生成的profile文件:
    1. lenky@local:~$ sudo cat /etc/apparmor.d/usr.sbin.nginx
    复制代码
    1.   /etc/group r,
    2.   /etc/nginx/conf.d/ r,
    3.   /etc/nginx/mime.types r,
    4.   /etc/nginx/nginx.conf r,
    5.   /etc/nginx/sites-enabled/ r,
    6.   /etc/nsswitch.conf r,
    7.   /etc/passwd r,
    8.   /etc/ssl/openssl.cnf r,
    9.   /run/nginx.pid w,
    10.   /usr/sbin/nginx mr,
    11.   /var/log/nginx/error.log a,
    复制代码


    可以看到还有很多操作没有捕获到,比如对access.log文件的访问。
    执行命令:sudo aa-logprof
    可以继续设置这些权限的权限:
    1. lenky@local:~$ sudo aa-logprof
    2. Reading log entries from /var/log/syslog.
    3. Updating AppArmor profiles in /etc/apparmor.d.
    4. Complain-mode changes:
    5. WARN: unknown capability: CAP_dac_override

    6. Profile:    /usr/sbin/nginx
    7. Capability: dac_override
    8. Severity:   unknown

    9. [(A)llow] / (D)eny / (I)gnore / Audi(t) / Abo(r)t / (F)inish
    复制代码


    继续按a把所有操作都设置为allow,最后按s保存配置。此时,操作权限设置更多了:
    1. lenky@local:~$ sudo cat /etc/apparmor.d/usr.sbin.nginx
    2. # Last Modified: Thu May 29 16:48:58 2014
    3. #include <tunables/global>

    4. /usr/sbin/nginx flags=(complain)
    5.   #include <abstractions/base>
    6.   #include <abstractions/nis>
    7.   capability dac_override,
    8.   capability dac_read_search,
    9.   capability net_bind_service,
    10.   capability setgid,

    11.   /etc/group r,
    12.   /etc/nginx/conf.d/ r,
    13.   /etc/nginx/mime.types r,
    14.   /etc/nginx/nginx.conf r,
    15.   /etc/nginx/sites-available/default r,
    16.   /etc/nginx/sites-enabled/ r,
    17.   /etc/nsswitch.conf r,
    18.   /etc/passwd r,
    19.   /etc/ssl/openssl.cnf r,
    20.   /run/nginx.pid rw,
    21.   /usr/sbin/nginx mr,
    22.   /usr/share/nginx/html/appamror/allow.html r,
    23.   /usr/share/nginx/html/appamror/deny.html r,
    24.   /var/log/nginx/access.log w,
    25.   /var/log/nginx/error.log w,
    复制代码


    如果没有新的操作需要设置权限,那么执行aa-logprof的结果是这样的:
    1. lenky@local:~$ sudo aa-logprof
    2. Reading log entries from /var/log/syslog.
    3. Updating AppArmor profiles in /etc/apparmor.d.
    4. Complain-mode changes:
    5. Enforce-mode changes:
    复制代码


    之所以要把所有操作都默认设置为允许,是因为下面要把这个profile改为enforce,然后重启nginx,如果不捕获全部操作,那么默认禁止会导致nginx启动不了。
    1. lenky@local:~$ sudo aa-enforce nginx
    2. Setting /usr/sbin/nginx to enforce mode.
    3. lenky@local:~$ sudo /etc/init.d/apparmor restart
    4. * Reloading AppArmor profiles                                                                                                                         Skipping profile in /etc/apparmor.d/disable: usr.bin.firefox
    5. Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
    6.                                                                                                                                                 [ OK ]
    7. lenky@local:~$ sudo /etc/init.d/nginx restart
    8. * Restarting nginx nginx                                                                                                                       [fail]
    9. lenky@local:~$ sudo nginx
    10. nginx: [emerg] socket() 0.0.0.0:80 failed (13: Permission denied)
    复制代码


    以前面的profile配置来看,nginx仍然启动不了,原因是没有设置nginx对80端口的权限。
    换成这个(来之:http://jdh8.github.io/linux/apparmor-nginx-php-fpm/):
    1. lenky@local:~$ sudo cat /etc/apparmor.d/usr.sbin.nginx
    2. # Last Modified: Thu May 29 17:11:18 2014
    3. #include <tunables/global>

    4. /usr/sbin/nginx
    5.   #include <abstractions/apache2-common>
    6.   #include <abstractions/base>
    7.   #include <abstractions/nis>


    8.   capability dac_override,
    9.   capability dac_read_search,
    10.   capability net_bind_service,
    11.   capability setgid,
    12.   capability setuid,

    13.   /etc/nginx/** r,
    14.   /etc/ssl/openssl.cnf r,
    15.   /proc/*/auxv r,
    16.   /run/nginx.pid rw,
    17.   /run/nginx.pid.oldbin w,
    18.   /run/php5-fpm.sock rw,
    19.   /srv/www/** r,
    20.   /usr/sbin/nginx mr,
    21.   /usr/share/nginx/html/** r,
    22.   /var/log/nginx/* w,
    复制代码


    重启生效:
    1. lenky@local:~$ sudo /etc/init.d/apparmor restart
    2. * Reloading AppArmor profiles                                                                                                                         Skipping profile in /etc/apparmor.d/disable: usr.bin.firefox
    3. Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
    4.                                                                                                                                                 [ OK ]
    5. lenky@local:~$ sudo /etc/init.d/nginx restart
    6. * Restarting nginx nginx                                                                                                                       [ OK ]
    7. lenky@local:~$ wget 127.0.0.1
    8. --2014-05-29 17:13:48--  http://127.0.0.1/
    9. 正在连接 127.0.0.1:80... 已连接。
    10. 已发出 HTTP 请求,正在等待回应... 200 OK
    11. 长度: 612 1
    12. 正在保存至: “index.html”

    13. 100%[=============================================================================================================>] 612         --.-K/s   用时 0s   

    14. 2014-05-29 17:13:48 (115 MB/s) - 已保存 “index.html” [612/612])

    15. lenky@local:~$
    复制代码


    再验证,在/etc/apparmor.d/usr.sbin.nginx里加一行:
    1. deny /usr/share/nginx/html/appamror/deny.html r,
    复制代码


    测试:
    1. lenky@local:~$ sudo /etc/init.d/apparmor restart
    2. * Reloading AppArmor profiles                                                                                                                         Skipping profile in /etc/apparmor.d/disable: usr.bin.firefox
    3. Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
    4.                                                                                                                                                 [ OK ]
    5. lenky@local:~$ sudo /etc/init.d/nginx restart
    6. * Restarting nginx nginx                                                                                                                       [ OK ]
    7. lenky@local:~$
    8. lenky@local:~$ wget 127.0.0.1/appamror/allow.html
    9. --2014-05-29 17:16:28--  http://127.0.0.1/appamror/allow.html
    10. 正在连接 127.0.0.1:80... 已连接。
    11. 已发出 HTTP 请求,正在等待回应... 200 OK
    12. 长度: 33 1
    13. 正在保存至: “allow.html.1”

    14. 100%[=============================================================================================================>] 33          --.-K/s   用时 0s   

    15. 2014-05-29 17:16:28 (6.73 MB/s) - 已保存 “allow.html.1” [33/33])

    16. lenky@local:~$ wget 127.0.0.1/appamror/deny.html
    17. --2014-05-29 17:16:34--  http://127.0.0.1/appamror/deny.html
    18. 正在连接 127.0.0.1:80... 已连接。
    19. 已发出 HTTP 请求,正在等待回应... 403 Forbidden
    20. 2014-05-29 17:16:34 错误 403:Forbidden。
    复制代码

    可以看到页面deny.html没法访问了,而去掉deny行后又可以访问了,说明apparmor的profile设置生效了。

    参考:http://ubuntuforums.org/showthread.php?t=1008906
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-22 10:21
  • 签到天数: 80 天

    [LV.6]常住居民II

     楼主| 发表于 2015-4-8 09:30:12 | 显示全部楼层
    说明:由于在代码和正文中粘贴的代码内容不能写入{},导致粘贴的代码段中去掉了"{"和"}"
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-11-21 10:01
  • 签到天数: 240 天

    [LV.8]以坛为家I

    发表于 2015-4-8 11:44:52 | 显示全部楼层
    andrewyang83 发表于 2015-4-8 09:30
    说明:由于在代码和正文中粘贴的代码内容不能写入{},导致粘贴的代码段中去掉了"{"和"}"

    辛苦了!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|Ubuntu Kylin    

    GMT+8, 2019-12-11 11:17 , Processed in 0.014739 second(s), 8 queries , File On.

    Copyright ©2013-2019 Ubuntu Kylin. All Rights Reserved .

    ICP No. 15002470-2 Tianjin

    快速回复 返回顶部 返回列表