本篇内容介绍了“SElinux是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
为瓦房店等地区用户提供了全套网页设计制作服务,及瓦房店网站建设行业解决方案。主营业务为网站制作、成都网站制作、瓦房店网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件
在 SELinux 出现之前,Linux 上的安全模型叫 DAC,全称是 Discretionary Access Control,翻译为自主访问控制。 DAC 的核心思想很简单,就是:进程理论上所拥有的权限与执行它的用户的权限相同。比如,以 root 用户启动 Browser,那么 Browser 就有 root 用户的权限,DAC 管理太过宽松,不够灵活所以有了SELinux。
在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。
SELinux使用类型强制来改进强制访问控制。所有的主体(程序进程)对客体(文件/socket等资源)的访问都有一条TE规则来许可。当程序访问一个资源的时候,系统会搜索所有的TE规则集,并根据结果进行处理。这个规则集是由访问向量规则(AV, Access Vector)来描述的。
内核向外部暴露允许访问的资源权限,由TE来描述主体拥有什么样的访问权。SELinux定义了30个不同的客体类别:
security process system capability filesystem file dir fd lnk_file chr_file blk_file socket_file ...
每个客体类别都定义了操作许可,比如针对file有19个操作许可:
`ioctl read write create getattr setattr lock relablefrom relableto append unlink link rename execute swapon quotaon mounton execute_no_trans entrypoint
在 SELinux 中,每种东西都会被赋予一个安全属性,官方说法叫做 Security Context,Security Context 是一个字符串,主要由三个部分组成,例如 SEAndroid 中,进程的 Security Context 可通过 ps -Z 命令查看:
rk3288:/ $ ps -AZ u:r:hal_wifi_supplicant_default:s0 wifi 1816 1 11388 6972 0 0 S wpa_supplicant u:r:platform_app:s0:c512,c768 u0_a14 1388 228 1612844 57396 0 0 S android.ext.services u:r:system_app:s0 system 1531 228 1669680 119364 0 0 S com.android.gallery3d u:r:kernel:s0 root 582 2 0 0 0 0 S [kworker/1:2] u:r:radio:s0 radio 594 228 1634876 89296 0 0 S com.android.phone u:r:system_app:s0 system 672 228 1686204 141716 0 0 S com.android.settings u:r:platform_app:s0:c512,c768 u0_a18 522 223 1721656 152116 0 0 S com.android.systemui
上面的最左边的一列就是进程的 Security Context,以第一个进程 wpa_supplicant 为例
u:r:hal_wifi_supplicant_default:s0
u 为 user 的意思,SEAndroid 中定义了一个 SELinux 用户,值为 u
r 为 role 的意思,role 是角色之意,它是 SELinux 中一个比较高层次,更方便的权限管理思路。简单点说,一个 u 可以属于多个 role,不同的 role 具有不同的权限。
hal_wifi_supplicant_default 代表该进程所属的 Domain 为 hal_wifi_supplicant_default。MAC(Mandatory Access Control)强制访问控制 的基础管理思路其实是 Type Enforcement Access Control(简称TEAC,一般用TE表示),对进程来说,Type 就是 Domain,比如 hal_wifi_supplicant_default 需要什么权限,都需要通过 allow 语句在 te 文件中进行说明。
s0 是 SELinux 为了满足军用和教育行业而设计的 Multi-Level Security(MLS)机制有关。简单点说,MLS 将系统的进程和文件进行了分级,不同级别的资源需要对应级别的进程才能访问
AV用来描述主体对客体的访问许可。通常有四类AV规则:
allow:表示允许主体对客体执行许可的操作.
neverallow:表示不允许主体对客体执行制定的操作。
auditallow: 表示允许操作并记录访问决策信息。
dontaudit:表示不记录违反规则的决策信息,切违反规则不影响运行`
通用的类型规则语法位:
1 allow platform_app debugfs:file { read ioctl };
表示类别为platform_app的程序进程,对debugfs类型的文件执行read和ioctl操作。
SELINUX有「disabled」「permissive」,「enforcing」3种选择。
Disabled就不用说了。
permissive就是Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用,是UserDebug的默认模式。
Enforcing就是你违反了策略,你就无法继续操作下去。
通过以下命令可以切换系统的SElinux模式 adb shell setenforce 0
0--代表Permissive
1--代表Enforcing
adb shell getenforce---查看状态
在android系统开发中,因为selinux权限问题一般会在user版本出现,但我们在userdebug版本通过以下方式可以验证
1、第一步先确定问题是否由selinux权限问题引起
通过命令: adb shell getenforce //查看当前SePolicy权限状态(Enforcing 表示打开 Permissive表示关闭)
userdebug版本处于permissive关闭状态 settenforce 1 //更改状态到Enforcing,0表示Permissive 进行测试,如果此时问题会出现,那么就是selinux权限问题
2、解决方法
1.adb shell dmesg----抓kernel log
(特别说明:adb shell "cat /proc/kmsg | grep avc" > avc_log.txt 可以直接提出avc的log)
2.adb logcat –b events
关键字:
avc: denied
如图:
这是一个selinux权限问题,我们只关注denied{} 、scontext 、tcontext 和 tclass 四个关键字就可以
denied{}括号内的内容表示被拒的权限动作
scontext的值表示需要在哪个te文件添加
tcontext 表示需要赋予权限的目标
tclass 表示权限问题的类型
这个问题的修改方式是在system_app.te文件添加如下代码: allow system_app sysfs_thermal:dir search;
注意:有时在Enforcing模式时不能看到所有缺少的权限日志,例如:
这个日志由于FileNotFoundException问题导致程序不会继续执行到代码终点,所以没有执行的代码所缺少的权限日志就不能得到,但是在Permissive模式所有权限问题会打印出来,所以建议抓log在Permissive模式下或者两种模式都抓
“SElinux是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!