星期四, 6月 03, 2010

AppArmor 小記

AppArmor 相關資料夾

# ls /etc/apparmor.d/
abstractions    sbin.syslogd           usr.sbin.identd  usr.sbin.traceroute
bin.ping        sbin.syslog-ng         usr.sbin.mdnsd
program-chunks  tunables               usr.sbin.nscd
sbin.klogd      usr.sbin.avahi-daemon  usr.sbin.ntpd

Novell  將 / 轉成 . , 舉例來說 ping 指令
# which ping
/bin/ping
所在路徑為 /bin/ping, 所以設定檔就是在 /etc/apparmor.d內的
bin.ping

在profile內定義的 include 的相關目錄都是在 /etc/apparmor.d
例如
# cat /etc/apparmor.d/bin.ping 

#include
/bin/ping {
  #include
  #include
  #include

  capability net_raw,
  capability setuid,
  network inet raw,

  /bin/ping mixr,
  /etc/modules.conf r,
}


我們來觀察一下上面的 include 
# ls /etc/apparmor.d/
abstractions    sbin.syslogd           usr.sbin.identd  usr.sbin.traceroute
bin.ping        sbin.syslog-ng         usr.sbin.mdnsd
program-chunks  tunables               usr.sbin.nscd
sbin.klogd      usr.sbin.avahi-daemon  usr.sbin.ntpd

就會發現有 tunables 目錄, 繼續觀察此目錄
# ls /etc/apparmor.d/tunables/
global  home  ntpd  proc

觀察相關內容
# cat  /etc/apparmor.d/tunables/global 
# $Id: global 697 2007-05-25 03:09:30Z steve-beattie $
# ------------------------------------------------------------------
#
#    Copyright (C) 2006 Novell/SUSE
#
#    This program is free software; you can redistribute it and/or
#    modify it under the terms of version 2 of the GNU General Public
#    License published by the Free Software Foundation.
#
# ------------------------------------------------------------------

# All the tunables definitions that should be available to every profile
# should be included here

#include
#include

就可以知道他是用來定義 home 以及 proc 變數

# cat /etc/apparmor.d/tunables/home 
# $Id: home 12 2006-04-12 21:35:41Z steve-beattie $
# ------------------------------------------------------------------
#
#    Copyright (C) 2006 Novell/SUSE
#
#    This program is free software; you can redistribute it and/or
#    modify it under the terms of version 2 of the GNU General Public
#    License published by the Free Software Foundation.
#
# ------------------------------------------------------------------

# @{HOME} is a space-separated list of all user home directories. While
# it doesn't refer to a specific home directory (AppArmor doesn't
# enforce discretionary access controls) it can be used as if it did
# refer to a specific home directory
@{HOME}=@{HOMEDIRS}/*/ /root/

# @{HOMEDIRS} is a space-separated list of where user home directories
# are stored, for programs that must enumerate all home directories on a
# system. 
@{HOMEDIRS}=/home/

另外再來觀察

# cat /etc/apparmor.d/tunables/proc 
# $Id: proc 797 2007-07-23 17:31:39Z seth_arnold $
# ------------------------------------------------------------------
#
#    Copyright (C) 2006 Novell/SUSE
#
#    This program is free software; you can redistribute it and/or
#    modify it under the terms of version 2 of the GNU General Public
#    License published by the Free Software Foundation.
#
# ------------------------------------------------------------------

# @{PROC} is the location where procfs is mounted.
@{PROC}=/proc/

另外可以觀察 /etc/apparmor.d/abstractions/base
對相關的 函式庫 以及檔案也有 相關存取的規定




以下是自己練習AppArmor

AppArmor 是藉由紀錄程式的所有動作, 建立該程式的Profile
來達成 限制程式進行例外行為 以防止不正當的存取

建立的方式藉由 YasT --> Novell AppArmor --> Add Profile Wizard
或是#yast2  GenProf
來建立程式的Profile

建立方法為(以firefox 為例子)
#yast2  GenProf

輸入 firefox (程式名稱,他會去系統內抓) --> Create
這個時候有可能有預設的Profile 這個時候就可以 點選 Use Profile 或是點選View Profile 觀察
如果沒有這個程式的預設Profile 那就可以點選 Create New Profile
--> 出現 Profiling 的視窗 ,  按鍵盤上面的Alt + F2 --> 輸入  firefox --> Run
--> 執行平常的瀏覽 --> 關閉firefox
--> 點選 Scan system log for AppArmor events
這個時候會出現 firefox 這個程式會去呼叫哪些程式 或是 對那些目錄進行存取
程式的話 可以選擇 Inherit 或是Deny 來決定要不要讓他呼叫
權限的改變或是使用 例如 setgid or setuid 可以決定 Allow or Deny
針對一些目錄的存取, 除了 Allow or Deny 還可以使用 Glob 來使用 * 字元 再進行Allow 或是 Deny 的設定
--> 回答完一堆的問題之後 點選 Finish 完成

如何確認有生效呢
#cat  /sys/kernel/security/apparmor/profiles
確認該程式是 enforce 狀態

如果之前所設定的Profile 太嚴謹想要放鬆該如何呢
可以使用
#complain  firefox

將該程式切換到 complain 模式
重新開啟程式, 然後進行要允許的行為

接下來執行 Yast --> Novell AppArmor --> Update Profile Wizard
或是 #yast2  LogProf

再次決定相關行為是Allow or Deny

然後再次啟動 AppArmor  對該程式的限制
#enforce  firefox

是個好玩的軟體


另外可以利用 command的方式來管理

#autodep  程式名稱
這個方式很好玩
剛剛在建立 AppArmor 的時候會詢問是否要啟動儲存庫
如果有啟動的話
這個時候 使用 autodep 就可以看到 儲存庫上面的人的設定並套用


# autodep   firefox
正在連接至儲存庫...


設定檔 : /usr/lib/firefox/firefox.sh


 [1 - kuschel]
  2 - raulliborio 
  3 - Michi8383 
  4 - cjgiraldes 
  5 - noone123456789 
  6 - buds428 
  7 - mdemoulin 
  8 - amat17t 
  9 - netxxx 
  10 - alice 
  11 - osmo 
  12 - vtold 
  13 - test27 
  14 - memfys 
  15 - Ivan Susanin 
  16 - samavedam_vijay 
  17 - 非使用中本地設定檔/usr/lib/firefox/firefox.sh 
  18 - jjohansen 
  19 - juan 
  20 - philodoxia 
  21 - usernowy 
  22 - lasm 
  23 - walik 
  24 - mts-consult 
  25 - kelln 
  26 - rollo 


[(V)iew Profile] / (U)se Profile / (C)reate New Profile / Abo(r)t / (F)inish

接下來使用  genprof 來產生套用 profile
#genprof    firefox

要知道目前的程式 是在 enforce 啟用, 還是 complain 抱怨模式( 不啟動該服務的 AppArmor)

可以觀察設定檔, 例如

# cat /etc/apparmor.d/usr.lib.firefox.firefox.sh
# Last Modified: Thu Jun  3 20:36:16 2010
# REPOSITORY: http://apparmor.opensuse.org/backend/api kuschel 3827
#include


/usr/lib/firefox/firefox.sh flags=(complain) {
  #include
  #include
  #include


  deny capability sys_ptrace,




  /bin/basename rix,
  /bin/bash rix,
  /bin/grep rix,
  /etc/magic r,
  /usr/bin/file rix,
  /usr/lib/firefox/firefox px,
  /usr/share/misc/magic.mgc r,


}

所以就觀察 設定檔有沒有加上 complain 的 flags 就知道
如果要再次啟動 該程式的 AppArmor 保護可以使用
enforce  程式名稱

# enforce firefox
設定 /etc/apparmor.d/usr.lib.firefox.firefox.sh 為強迫 (enforce) 模式。

檢查是否有 complain 的 flags
# cat /etc/apparmor.d/usr.lib.firefox.firefox.sh | grep flag

再次觀察
# cat /etc/apparmor.d/usr.lib.firefox.firefox.sh
# Last Modified: Thu Jun  3 20:36:16 2010
# REPOSITORY: http://apparmor.opensuse.org/backend/api kuschel 3827
#include

/usr/lib/firefox/firefox.sh {
  #include
  #include
  #include

  deny capability sys_ptrace,


  /bin/basename rix,
  /bin/bash rix,
  /bin/grep rix,
  /etc/magic r,
  /usr/bin/file rix,
  /usr/lib/firefox/firefox px,
  /usr/share/misc/magic.mgc r,

}

另外就是可以透過 rcapparmor status 來觀看狀態


# rcapparmor status
apparmor module is loaded.
10 profiles are loaded.
10 profiles are in enforce mode.
   /usr/sbin/ntpd
   /usr/sbin/identd
   /sbin/klogd
   /sbin/syslogd
   /sbin/syslog-ng
   /usr/sbin/traceroute
   /usr/sbin/nscd
   /usr/sbin/mdnsd
   /bin/ping
   /usr/sbin/avahi-daemon
0 profiles are in complain mode.
2 processes have profiles defined.
2 processes are in enforce mode :
   /sbin/syslog-ng (1970) 
   /sbin/klogd (1958) 
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
[1]+  Done                    yast2  (wd: /var/log/audit)

也可以藉由去觀察  /sys/kernel/security/apparmor/profiles 來觀察狀態


# cat /sys/kernel/security/apparmor/profiles 
/usr/sbin/traceroute (enforce)
/usr/sbin/ntpd (enforce)
/usr/sbin/nscd (enforce)
/usr/sbin/mdnsd (enforce)
/usr/sbin/identd (enforce)
/usr/sbin/avahi-daemon (enforce)
/sbin/syslogd (enforce)
/sbin/syslog-ng (enforce)
/sbin/klogd (enforce)
/bin/ping (enforce)

另外可以利用 unconfined 指令來觀察哪些服務沒有被限制, 可以考慮限制他
# unconfined 
2657 /sbin/rpcbind 未限制
2657 /sbin/rpcbind 未限制
2657 /sbin/rpcbind 未限制
2657 /sbin/rpcbind 未限制
2657 /sbin/rpcbind 未限制
2657 /sbin/rpcbind 未限制
3164 /usr/sbin/cupsd 未限制
3164 /usr/sbin/cupsd 未限制
3164 /usr/sbin/cupsd 未限制
3251 /usr/sbin/rpc.mountd 未限制
3251 /usr/sbin/rpc.mountd 未限制
3252 /usr/sbin/rpc.statd 未限制
3252 /usr/sbin/rpc.statd 未限制
3252 /usr/sbin/rpc.statd 未限制
3343 /usr/lib/postfix/master 未限制
3384 /usr/sbin/nrpe 未限制
3507 /usr/sbin/sshd 未限制
3507 /usr/sbin/sshd 未限制
25120 /usr/sbin/sshd (sshd: root@pts/1) 未限制
25120 /usr/sbin/sshd (sshd: root@pts/1) 未限制
28328 /usr/sbin/ietd 未限制
28328 /usr/sbin/ietd 未限制
28328 /usr/sbin/ietd 未限制
29117 /usr/sbin/sshd (sshd: root@pts/2) 未限制
29117 /usr/sbin/sshd (sshd: root@pts/2) 未限制




沒有留言: