轉載:http://blog.csdn.net/makingadream/article/details/51861902
Android 5.0 之后,SEAndroid所有的部分均為Enforcing模式;如果當某個操作不被SEAndroid允許時,例如對文件進行write,該如何排查出信息,同時,在sepolicy中,添加上相應的allow語句,將權限開放出去;
也就是說 audit2allow 有三種接收輸入的方法:
1.預設是由標准輸入 STDIN 接收
2.使用 -i 選項,如 -i /var/log/messages or -i /var/log/audit/audit.log (若有啟動 auditd 時)
3.使用 -d 選項,可以接收 dmesg 的訊息
例如:
[root@candyz:/var/log] audit2allow -i /var/log/messages
allow getty_t var_log_t:file write;
[root@candyz:/var/log] audit2allow -d
allow getty_t var_log_t:file write;
當看到一堆如下的 avc denied 之類的訊息時,要怎么解決?
audit(1146842928.277:2): avc: denied { getattr } for pid=3357 comm="httpd"
name="test.php" dev=hda6 ino=137349 scontext=root:system_r:httpd_t
tcontext=root:object_r:var_t tclass=file
* 在 RHEL4 或 FC3 上的解決方式:
$ cd /etc/selinux/targeted/src/policy/
使用 -d 從 dmesg 讀取 avc messages
$ audit2allow -d -o domain/misc/local.te
or 使用 -l -i /var/log/messages 讀取 /var/log/messages 的 avc messages
# 若有啟動 auditd 則要改讀 /var/log/audit/audit.log
$ audit2allow -l -i /var/log/messages -o domain/misc/local.te
or 直接從 STDIN 讀取 avc messages, 如 /tmp/avcs 里面放的就是儲存好的 avc messages
$ audit2allow -o domain/misc/local.te 最后再執行 make load 即可
$ make load
然后就會看到如 avc granted 之類的訊息了
* 在 FC5 上的解決方式:
[root@candyz:~] cd /etc/selinux/targeted/modules/
[root@candyz:/etc/selinux/targeted/modules] audit2allow -M local -d
Generating type enforcment file: local.te
Compiling policy
checkmodule -M -m -o local.mod local.te
semodule_package -o local.pp -m local.mod
******************** IMPORTANT ***********************
In order to load this newly created policy package into the kernel,
you are required to execute
semodule -i local.pp
同樣的,除了用 audit2allow -M local -d 從 dmesg 讀取訊息外
也可以用 audit2allow -M local -l -i /var/log/messages
或是 audit2allow -M local -i /var/log/audit/audit.log
或是 audit2allow -M local 最后記得要執行 semodule -i local.pp 來 load new policy to kernel,這點很重要
[root@candyz:/etc/selinux/targeted/modules] semodule -i local.pp
另外也可以用 audit2allow 來產生 local.te 檔案,然后可以去編輯或修改 local.te
[root@candyz:~] cd /etc/selinux/targeted/modules/
[root@candyz:/etc/selinux/targeted/modules] audit2allow -m local -l -i /var/log/messages > local.te
# 然后再執行 checkmodule 指令來產生 local.mod
[root@candyz:/etc/selinux/targeted/modules] checkmodule -M -m -o local.mod local.te
# 然后再執行 semodule_package 指令來產生 local.pp
[root@candyz:/etc/selinux/targeted/modules] semodule_package -o local.pp -m local.mod
同樣的,最后記得要執行 semodule -i local.pp 來 load new policy to kernel,這點很重要
[root@candyz:/etc/selinux/targeted/modules] semodule -i local.pp
或是產生 local.te 檔后,直接執行:
[root@candyz:/etc/selinux/targeted/modules] make -f /usr/share/selinux/devel/Makefile
這樣等於是執行 checkmodule + semodule_package
最后記得再 semodule -i local.pp 即可
1:SEAndroid不允許時,log記錄在哪里?
SEAndroid的審計不通過時,log記錄在dmesg 中,dmesg是kernel的log,如果想要獲取該log,可以使用如下命令:
adb shell su -c dmesg ----- 獲取kernel log
2: 查看SEAndroid 不允許的log
SEAndroid 審計不通過的log,帶有"avc:" 所以,用如下命令即可搜集到審計不同的log:
adb shell su -c dmesg | grep 'avc:' ---- 得到審計不通過的log信息
如果有審計不通過的,會得出如下類似的信息:
5> type=1400 audit: avc: denied { read write } for pid=177 comm="rmt_storage" name="mem" dev="tmpfs" ino=6004 scontext=u:r:rmt:s0 tcontext=u:object_r:kmem_device:s0 tclass=chr_file
不被允許的操作是:read 和write
訪問者是:u:r:rmt:s0
被訪問者是:u:object_r:kmem_device:s0
操作對象是:chr_file
相當於在sepolicy 策略語言中,缺乏這樣的語句allow rmt kmem_device:chr_file {read write}
TIP:
pid=177 表示訪問者所在的進程,comm中給的是一個提示,表示當這個denial發生時,什么正在運行;
3:如何消除這樣的不通過
很簡單,可以直接在sepolicy中加上這樣的策略語句;
例如上處avc不通過,可以在/external/sepolicy/ 目錄下,新建一個test.te
在test.te 中寫入,allow rmt kmem_device:chr_file {read write},
重新編譯策略語言,刷機即可;
但是當avc很多時,人工去看容易出錯且慢,我們可以使用工具來完成這項工作;
selinux/policycoreutils/audit2allow環境搭建:
測試電腦的配置是:unbutu 12.04
step 1:在 ubuntu中安裝policycoreutils
sudo apt-get install policycoreutils
step 2 : 使用audit2allow 工具完成策略語言的添加:
adb shell su -c dmesg | audit2allow
例如上訴avc語句就會輸出:
#============= rmt ============== allow rmt kmem_device:chr_file { read write };
TIP:
1: 要知道,audit2allow是policycoreutils中的工具之一
2:如果在ubuntu 14.04 或者更新的版本中,可以直接將策略語句插入到編譯好的sepolicy中
命令如下:
device>/root/sepolicy
而對於如何解決該類權限問題,一般的做法是,缺少什么就補什么,先介紹一下簡化方法:
簡化方法:
1、 提取所有的avc LOG. 如 adb shell "cat /proc/kmsg | grepavc" > avc_log.txt
2、 使用 audit2allow tool 直接生成policy. audit2allow -i avc_log.txt 即可自動輸出生成的policy
3、將對應的policy 添加到selinux policy 規則中。
SELinux 的 audit2allow 工具程序
The command audit2allow can receive input via three methods. Default is from standard input (STDIN). Using the -i option reads input from /var/log/messages, and the -d option reads input from dmesg output.
The command audit2allow can receive input via three methods. Default is from standard input (STDIN). Using the -i option reads input from /var/log/messages, and the -d option reads input from dmesg output.
也就是說 audit2allow 有三種接收輸入的方法:
1.預設是由標准輸入 STDIN 接收
2.使用 -i 選項,如 -i /var/log/messages or -i /var/log/audit/audit.log (若有啟動 auditd 時)
3.使用 -d 選項,可以接收 dmesg 的訊息
例如:
[root@candyz:/var/log] audit2allow -i /var/log/messages
allow getty_t var_log_t:file write;
[root@candyz:/var/log] audit2allow -d
allow getty_t var_log_t:file write;
當看到一堆如下的 avc denied 之類的訊息時,要怎么解決?
audit(1146842928.277:2): avc: denied { getattr } for pid=3357 comm="httpd"
name="test.php" dev=hda6 ino=137349 scontext=root:system_r:httpd_t
tcontext=root:object_r:var_t tclass=file
* 在 RHEL4 或 FC3 上的解決方式:
$ cd /etc/selinux/targeted/src/policy/
使用 -d 從 dmesg 讀取 avc messages
$ audit2allow -d -o domain/misc/local.te
or 使用 -l -i /var/log/messages 讀取 /var/log/messages 的 avc messages
# 若有啟動 auditd 則要改讀 /var/log/audit/audit.log
$ audit2allow -l -i /var/log/messages -o domain/misc/local.te
or 直接從 STDIN 讀取 avc messages, 如 /tmp/avcs 里面放的就是儲存好的 avc messages
$ audit2allow -o domain/misc/local.te 最后再執行 make load 即可
$ make load
然后就會看到如 avc granted 之類的訊息了
* 在 FC5 上的解決方式:
[root@candyz:~] cd /etc/selinux/targeted/modules/
[root@candyz:/etc/selinux/targeted/modules] audit2allow -M local -d
Generating type enforcment file: local.te
Compiling policy
checkmodule -M -m -o local.mod local.te
semodule_package -o local.pp -m local.mod
******************** IMPORTANT ***********************
In order to load this newly created policy package into the kernel,
you are required to execute
semodule -i local.pp
同樣的,除了用 audit2allow -M local -d 從 dmesg 讀取訊息外
也可以用 audit2allow -M local -l -i /var/log/messages
或是 audit2allow -M local -i /var/log/audit/audit.log
或是 audit2allow -M local 最后記得要執行 semodule -i local.pp 來 load new policy to kernel,這點很重要
[root@candyz:/etc/selinux/targeted/modules] semodule -i local.pp
另外也可以用 audit2allow 來產生 local.te 檔案,然后可以去編輯或修改 local.te
[root@candyz:~] cd /etc/selinux/targeted/modules/
[root@candyz:/etc/selinux/targeted/modules] audit2allow -m local -l -i /var/log/messages > local.te
# 然后再執行 checkmodule 指令來產生 local.mod
[root@candyz:/etc/selinux/targeted/modules] checkmodule -M -m -o local.mod local.te
# 然后再執行 semodule_package 指令來產生 local.pp
[root@candyz:/etc/selinux/targeted/modules] semodule_package -o local.pp -m local.mod
同樣的,最后記得要執行 semodule -i local.pp 來 load new policy to kernel,這點很重要
[root@candyz:/etc/selinux/targeted/modules] semodule -i local.pp
或是產生 local.te 檔后,直接執行:
[root@candyz:/etc/selinux/targeted/modules] make -f /usr/share/selinux/devel/Makefile
這樣等於是執行 checkmodule + semodule_package
最后記得再 semodule -i local.pp 即可