

在Android 4.3之前,Android使用DAC(自由访问控制)来实现用于自主访问控制的访问管理.
DAC的核心思想非常简单. 通俗地说,“谁创造了我,我有权利”. 例如,如果root用户启动了Camera,则Camera拥有root用户的权限,并且可以在Linux系统上执行任何操作.
很显然,只要您找到在Android系统上获取root权限的方法,DAC管理就太松懈了. 因此,在Android 5.0之前,Android系统很容易损坏,并且设备制造商经常在保修中明确声明“根本非保修”政策.
那么您如何解决这个问题? Google在android4.3版本上引入了SElinux,但是默认情况下它已关闭,而在Android5.0中则默认情况下被强制打开.
SElinux是一种新的安全模型. 此模型称为MAC(强制访问控制),它转换为强制访问控制. 相信在Linux系统中,每个人都听过一个叫做“一切都是文件”的句子,但是文件可以分为“活动”和“不活动”两种,“活动”是一个过程,它映射到软件的含义是: 实时进程可以启动操作,例如,它可以打开文件并对其进行操作,而无效文件只能由进程来处理.
SELinux策略指出,如果要执行某些操作,则必须在“安全策略文件”中授予权限. 没有出现在安全策略文件中的任何权限都将被拒绝.
SELinux中的所有内容均具有安全性属性. 正式名称是“安全上下文”. 安全上下文是一个字符串,它也分为两种类型: 进程和文件.
使用ps -Z查看Sharplogcat进程| grep sharplogcat命令,例如:
lcd_xxgae7a: /#ps -AZ | grep sharplogcat
u: r: sharplogcat: s0系统2640 1 9188 3092 __skb_wait_for_more_packets 0 S Sharplogcat
哪里
-u表示用户,SEAndroid用值u定义SELinux用户.
-r是角色的意思,角色是角色的意思,它是SELinux中一个相对高层,更方便的权限管理思想. 简单来说,一个u可以属于多个角色,并且不同的角色具有不同的权限.
-sharplogcat表示该进程所属的域是init. MAC强制访问控制的基本管理思想实际上是类型强制访问控制(简称TEAC,通常称为TE). 对于一个进程,“类型”是“域”. 例如,需要通过allow语句在te文件中说明Sharplogcat所需的权限.
-s0与SELinux设计的满足军事和教育行业的多层安全(MLS)机制有关. 简单来说,MLS对系统的进程和文件进行了分类,并且不同级别的资源需要相应级别的进程进行访问.
使用l -AZ供应商/ bin / sharplogcat命令查看sharplogcat文件:
lcd_xxgae7a: /#ls -AZ供应商/ bin / sharplogcat

u: object_r: sharplogcat_exec: s0供应商/ bin / sharplogcat
哪里
u: 与用户相同,它代表创建此文件的SELinux用户
object_r: 该文件是一个死物,无法发挥作用,因此在SELinux中,该死物使用object_r表示其角色
sharplogcat_exec,并且进程的域表示,这意味着Sharplogcat文件所属的类型是sharplogcat_exec
s0: MLS级别
SELinux规范
允许的域类型: 类权限;
-域-进程或进程组的标签. 也称为域类型,因为它仅指代进程的类型.
-类型-一个对象(例如文件,套接字)或一组对象的标签.
-Class-要访问的对象的类型(例如文件,套接字).
-Permission-要执行的操作(例如android的se状态,读取,写入).
=允许: 允许主体对物体进行操作
=永不允许: 拒绝主体对物体进行操作
= dontaudit: 不要记录有关违反规则的决定的信息
= auditallow: 记录某些决策信息. 通常,SElinux仅记录故障信息. 应用此规则后,将记录成功的决策信息.
示例介绍
以上面介绍的Sharplogcat为例: 在系统rc文件中创建一个Sharplogcat进程(此过程类似于用于记录android日志的本机logcat). 默认情况下它不会启动,而是由程序控制启动.

服务Sharplogcat /供应商/ bin / sharplogcat -n 1 -r $ {persist.sys.logbuffer} -v时间-f $ {sys.android.log}
用户系统
组系统
已禁用
oneshot
The
system / sepolicy /目录是Android系统的默认策略文件. 编译后,这些文件将包含SELinux内核安全策略,并涵盖上游Android操作系统. 但是,当我们配置并添加SELinux策略文件时,它不在此目录中,而是在/ device / Manufacturer / device-name / sepalicy目录中,例如HISI上的device / hisilicon / bigfish / external / sepolicy目录. 平台.
1. 配置新的sharplogcat.te策略文件. 当编译为单个SELinux内核策略文件时,新策略文件将与现有策略文件合并. te文件是根据Sharplogcat所需的权限配置的(为了方便起见,请不要添加所有权限. 应该添加什么?):
#Sharplogcat的政策
输入sharplogcat,域;
type sharplogcat_exec,exec_type,file_type,vendor_file_type;
init_daemon_domain(sharplogcat)
allow sharplogcat sharplogcat: 功能{dac_override sys_nice};
allow sharplogcat sharp_log_file: dir rw_dir_perms;
allow sharplogcat sharp_log_file: 文件{创建读写打开追加附加重命名getattr setattr rw_file_perms};
allow sharplogcat logdr_socket: sock_file {write};
允许Sharplogcat登录: unix_stream_socket {connectto read};
2. file_contexts,用于为文件分配标签,并且可以由各种用户空间组件使用. 创建新策略时,请创建或更新文件以为文件分配新标签:

/(供应商|系统/供应商)/ bin / sharplogcat u: object_r: sharplogcat_exec: s0
SELinux相关设置
SElinux可以设置两个级别,可以通过getenforce查看
-Permissive-Records,但不强制执行SELinux安全策略.
-执行-实施和记录安全策略. 如果失败,则显示为EPERM错误.
setenforce命令修改/ sys / fs / selinux / force节点的值,这是从内核意义上修改selinux的策略. 缺点是停电后将重置节点值.
setenforce 0
第一种方法: 修改system / core / init / Android.mk
ifneq(,$(过滤userdebug eng,$(TARGET_BUILD_VARIANT)))
#HISILICON添加开始
#reboot. 在非用户模式下重新启动时,禁用转储.
init_options + =
-DALLOW_LOCAL_PROP_OVERRIDE = 1
-DALLOW_PERMISSIVE_SELINUX = 1 // 1: 允许
-DREBOOT_BOOTLOADER_ON_PANIC = 1
-DDUMP_ON_UMOUNT_FAILURE = 0
#HISILICON添加结束
其他

init_options + =
-DALLOW_LOCAL_PROP_OVERRIDE = 0
-DALLOW_PERMISSIVE_SELINUX = 1 // 1: 允许
-DREBOOT_BOOTLOADER_ON_PANIC = 0
-DDUMP_ON_UMOUNT_FAILURE = 0
endif
第二种方法: 修改system / core / init / init.cpp,需要重新编译启动分区并刻录分区.
static bool selinux_is_enforcing(void)//直接注释内容,否则为false.
{
如果(ALLOW_PERMISSIVE_SELINUX){
返回selinux_status_from_cmdline()== SELINUX_ENFORCING;
}
返回true;
}
第三种方法: 引导时修改bootargs. 引导时Ctrl + c连续进入快速启动模式,printenv获取当前参数配置,修改androidboot.selinux =允许,然后setenv-> saveenv->重置.
bootargs = selinux = 1 androidboot.selinux =允许的firmware_class.path = /供应商/固件/控制台= ttyAMA0,115200 loglevel = 7 no_console_suspend blkdevparts = mmcblk0: 1M(快速启动),1M(bootargs),40M(恢复), 8M(panelparam),2M(deviceinfo),38M(徽标),2M(btfw),40M(内核),1M(dtb),2M(atf)android的se状态,25M(trustedcore),10M(安全存储),1M(版本信息), 1M(杂项),3072M(系统),300M(厂商),50M(atv),50M(db),2048M(缓存),-(用户数据)mtdparts = hi_sfc :-( hi_sfc)pci = nomsi mem = 3072M dma_zone = 2G mmz = ddr,0,1996M,48M mdlid = 0 cmode = 0 finit = 0 panelsize = 0 androidboot.sharp.serialno = androidboot.productname =-
ver = Fastboot 3.3.0-00015-g327655d-dirty(build @ serd-build-008)(Mar 18 2019-09: 17: 15)
在实际开发中,配置selinux非常繁琐且乏味,但是作为一项正式推广的安全策略,我仍然希望每个人都能理解. 以上是本文的全部内容,希望对大家有所帮助.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/sanxing/article-158683-1.html
应该说爱卿所言甚是