温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SElinux是什么

发布时间:2021-11-18 11:13:12 来源:亿速云 阅读:245 作者:iii 栏目:编程语言

本篇内容介绍了“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权限

在 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如何调试

在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是什么   

这是一个selinux权限问题,我们只关注denied{} 、scontext 、tcontext 和 tclass 四个关键字就可以

  • denied{}括号内的内容表示被拒的权限动作

  • scontext的值表示需要在哪个te文件添加

  • tcontext 表示需要赋予权限的目标

  • tclass 表示权限问题的类型

这个问题的修改方式是在system_app.te文件添加如下代码: allow system_app sysfs_thermal:dir search;

注意:有时在Enforcing模式时不能看到所有缺少的权限日志,例如:

SElinux是什么

这个日志由于FileNotFoundException问题导致程序不会继续执行到代码终点,所以没有执行的代码所缺少的权限日志就不能得到,但是在Permissive模式所有权限问题会打印出来,所以建议抓log在Permissive模式下或者两种模式都抓

“SElinux是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI