1.Selinux安全机制简介

Selinux是Google在Android 4.4上正式推出的一套以SELinux为基础于核心的系统安全机制。而SELinux则是由美国NSA(国安局)和一些公司(RedHat、Tresys)设计的一个针对Linux的安全加强系统。

NSA最初设计的安全模型叫FLASK,全称为Flux Advanced Security Kernel(由Uta大学和美国国防部开发,后来由NSA将其开源),当时这套模型针对DTOS系统。后来,NSA觉得Linux更具发展和普及前景,所以就在Linux系统上重新实现了FLASK,称之为SELinux。

Linux Kernel中,SELinux通过Linux Security Modules实现。在2.6之前,SElinux通过Patch方式发布。从2.6开始,SELinux正式入驻内核,成为标配。

虽然SELinux已在Linux内核中存在了近十年,但至今仍有很多管理员由于担心其配置的复杂性而弃之不用。虽然许多Linux管理员在他们的Linux服务器中禁用SELinux来避免在安装应用程序时对它进行配置,但在Linux安全性方面SELinux是一个非常有用的工具。

2.SELinux Policy语言介绍

在android里面,有两个类型,一种是文件,一种是进程。针对这两种类型,我们可以先来看看他们的不同。

【1】在android上面,adb shell之后进入手机,ps -Z可以查看当前进程所拥有的selinux的权限。

u为user的意思。SEAndroid中定义了一个SELinux用户,值为u。

r为role的意思。role是角色之意,它是SELinux中一种比较高层次,更方便的权限管理思路,即Role Based Access Control(基于角色的访问控制,简称为RBAC)。简单点说,一个u可以属于多个role,不同的role具有不同的权限。

init,代表该进程所属的Domain为init。对进程来说,Type就是Domain。比如init这个Domain有什么权限,都需要通过allow语句来说明。

S0和SELinux为了满足军用和教育行业而设计的Multi-Level Security(MLS)机制有关。简单点说,MLS将系统的进程和文件进行了分级,不同级别的资源需要对应级别的进程才能访问。

【2】在android上面,adb shell之后进入手机,ls -Z可以查看文件所拥有的selinux的权限。

u:同样是user之意,它代表创建这个文件的SELinux user。

object_r:文件是死的东西,它没法扮演角色,所以在SELinux中,死的东西都用object_r来表示它的role。

rootfs:死的东西的Type,和进程的Domain其实是一个意思。它表示root目录对应的Type是rootfs。

s0:MLS的级别。

总结进程和文件的SContext的文件格式如下:

user:role:type[:range]

注意,方括号中的内容表示可选项。s0属于range中的一部分。下文再详细介绍range所代表的Security Level相关的知识。SContext的核心其实是前三个部分:user:role:type。

MAC基本管理单位是TEAC(Type Enforcement Accesc Control),然后是高一级别的Role Based Accesc Control。RBAC是基于TE的,而TE也是SELinux中最主要的部分。

3.TE文件

在Android的源码中对应的TE文件所在的路径为/home/linux/fspad-733/androidL/external/sepolicy

这些.te文件中有allow的语句,咱们来具体的分析一下这个语句的功能

allow netd proc:file write

这条语句的语法为:

allow:TE的allow语句,表示授权。除了allow之外,还有allowaudit、dontaudit、neverallow等。

netd:source type。也叫subject,domain。

proc:target type。它代表其后的file所对应的Type。

file:代表Object Class。它代表能够给subject操作的一类东西。例如File、Dir、socket等。在Android系统中,有一个其他Linux系统没有的Object Class,那就是Binder。

write:在该类Object Class中所定义的操作。

5.问题的解决

参考例子如下:

audit(0.0:67): avc: denied { write } for path="/dev/block/vold/93:96" dev="tmpfs" ino=1263 scontext=u:r:kernel:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0

分析过程:

缺少什么权限:      { write }权限,

谁缺少权限:        scontext=u:r:kernel:s0,

对哪个文件缺少权限:tcontext=u:object_r:block_device

什么类型的文件:    tclass=blk_file

解决方法:kernel.te

allow kernel block_device:blk_file write;

【1】Selinux设备文件权限解决办法

[53692.570392] type=1400 audit(12565266.940:42): avc: denied { read write } for pid=10794 comm="m.example.hello" name="led1" dev="tmpfs" ino=39430 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0

分析过程:

缺少什么权限:  read  write

谁缺少权限:    scontext=u:r:untrusted_app:s0     untrusted_app

对那个文件缺少权限:tcontext=u:object_r:device:s0    device

什么类型的文件:tclass=chr_file                     chr_file

把缺少的权限添加上去,添加的过程如下。

cd  external/sepolicy:

1.修改file_contexts

/dev/led1           u:object_r:led1_device:s0

2.修改device.te

type led1_device, dev_type;

3.修改  untrusted_app.te

allow untrusted_app    led1_device:chr_file rw_file_perms;

添加好了之后重新编译Android的源码,烧写system.img和boot.img

【2】Selinux服务权限解决办法

E/SELinux (  128): avc:  denied  { add } for service=led scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager

问题分析:从第一个问题中我们分析在执行ioctl这个函数时返回了一个空的指针,从第二个查看的内容中我们分析到的问题时led这个内容没有Selinux权限。

分析过程:

缺少什么权限:      { add }权限,

谁缺少权限:        system_server

对哪个文件缺少权限:default_android_service

什么类型的文件:    service_manager

解决方法:system_server.te

allow system_server  default_android_service: service_manager add;

把缺少的权限添加上去,添加的过程如下。

进入fspad-733/androidL/external/sepolicy中

1.在service.te文件中添加

type led_service,    service_manager_type;

2.在service_contexts文件中添加

led           u:object_r:led_service:s0

3.在system_server.te文件中添加

allow system_server  led_service: service_manager add;

添加好了之后重新编译Android的源码,烧写system.img和boot.img

Selinux安全机制的更多相关文章

  1. [转]Apache 监听端口失败,selinux惹的祸

    原文在此 CentOS 下启动Httpd 失败,报 (13)Permission denied: make_sock: could not bind to address [::]:8000 因为 小 ...

  2. 防火墙和SELinux复习02

    1.防火墙 防火墙主要起隔离作用,严格的过滤入站,允许出站.又分为硬件防火墙和软件防火墙,硬件防火墙主要保护一群机器,而软件防火墙主要保护本机. 防火墙相关命令:systemctl status fi ...

  3. 解决SELinux导致Apache更改端口后无法启动的问题

    systemctl start httpd    # 将Apache的默认端口改为90后,启动Apache时提示失败 systemctl status httpd    # 查看Apache的状态 可 ...

  4. Security基础(二):SELinux安全防护、加密与解密应用、扫描与抓包分析

    一.SELinux安全防护 目标: 本案例要求熟悉SELinux防护机制的开关及策略配置,完成以下任务: 将Linux服务器的SELinux设为enforcing强制模式 在SELinux启用状态下, ...

  5. (转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    原文链接: http://www.cnblogs.com/ants/p/5732337.html 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Cor ...

  6. 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...

  7. 将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署方 ...

  8. Linux 部署 nginx服务代理

    原文地址:http://www.cnblogs.com/ants/p/5732337.html#_label5 参考地址:http://www.cnblogs.com/hustskyking/p/ng ...

  9. HTTP学习笔记(五)

    目前,市场上流行有很多web服务器软件,每种服务器都有自己的特点.我们在开发的过程中,经常要和它们打交道,所以了解它们的工作原理也是很重要的. 几款比较流行的服务器 它们会做些什么? 第三篇中有这样的 ...

随机推荐

  1. 给负载均衡器添加多IP

    看到一个场景,针对web应用的一个需求,需要在负载均衡器设置多个公网ip. 给负载均衡器添加多个公共ip 创建多个虚拟机,同时把他们添加到同一个可用性集中,方便后期部署到负载均衡器. 创建多个公网ip ...

  2. android扫描网页二维码进行网页登录

    转载请标明出处: http://www.cnblogs.com/dingxiansen/: 本文出自:丁先森-博客园 周六和朋友去网吧开黑,开机打开TGP,朋友那边开始输入账号密码,我看了他一眼low ...

  3. UITextField的使用小技巧

    [tf setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];//修改placeHolder ...

  4. GDI+ 应用,Release没有错误,Debug很多。

    问题描述: 在VC6环境中,一个界面工程利用了GDI+的一些库,Release模式下编译.运行无误,但在Debug模式下就会报告错误. xxx.cpp D:\Program Files\Microso ...

  5. GC 基础(转)

    转自:http://blog.csdn.net/ning109314/article/details/10411495/ = GC 基础 ===================== JAVA堆的描述如 ...

  6. IK-Analyzer(5.3.1)动态配置自定义词典

    参考文献:http://blog.csdn.net/fatpanda/article/details/37911079 jar包: IK-Analyzer-extra-5.3.1.jar IKAnal ...

  7. C/C++筛选法算素数

    什么是求素数 )i在2到n-1之间任取一个数,如果n能被整除则不是素数,否则就是素数 普通枚举法: #include <iostream> #include <string> ...

  8. Prism for WPF初探(构建简单的模块化开发框架)

    先简单的介绍一下Prism框架,引用微软官方的解释: Prism provides guidance to help you more easily design and build, flexibl ...

  9. extjs 关于dom操作的几个库

    经过几天的学习研究,发现ext与jquery的设计思路完全是来自两个方向. jquery是内聚,把所有东西都放在$的下面,而ext是采用分模块的设计思路,每个功能封装一个库.这样就形成了各自的实用风格 ...

  10. wps 操作

    wps选择视图-->文档结构图