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. LogCook 一个简单实用的Android日志管理工具

    众所周知,日志的管理是软件系统很重要的一部分,千万不可忽略其重要性.完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能 ...

  2. SQL语言(二) java怎样连接操作数据库中的数据

    import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...

  3. # WPF动画速率效果

    在WPF中使用动画的情况非常多,而要让动画变得生动往往要使用一些变速动画,WPF也内置了很方便的缓动函数来实现这一功能. 除此之外,WPF还有关键帧动画,利用关键帧动画能够很好的控制动画的细节,与美工 ...

  4. 迭代操作-->c:forEach和c:forTokens

    jstl--->Core 核心标签库-->c:forEach 在页面上遍历后台传到前台的数据是最基本的最常用的方法  主要包含两种迭代操作:forEach和forTokens 语法1:迭代 ...

  5. Handlebars 和 angularjs 之间的区别

    handlebarsjs算不上框架,只是一种js模板引擎,是模板库,模板库的主要作用是:你想要生成某一大片有一定规律的界面,比如商品详情,不同商品之间差的只是名称,价格,图片,介绍这些,但是结构一样的 ...

  6. chromium源码阅读--HTTP Cache

    最近积累了一些关于HTTP缓存的知识,因此结合Chromium的实现总结一下,主要从如下2个分面: 1.HTTP缓存的基础知识 2.Chromium关于HTTP缓存的实现分析 一.HTTP缓存的基础知 ...

  7. “核弹级”Android漏洞Janus,黑客可以任意篡改App

    美国时间12月9日,Google披露了一个名为"Janus"安卓漏洞.该漏洞可以让攻击者绕过安卓签名机制,从而让攻击者对App进行篡改,安卓5.0到8.0等个版本系统均受影响. 顶 ...

  8. nginx使用ssl模块配置支持HTTPS访问【解决ssl错误】

    默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译nginx时指定–with-http_ssl_module参数. 需求:做一个网站域名为 www.localhost.cn 要求通过http ...

  9. 企业级LNMP架构搭建实例(基于Centos6.x)

    1.1 部署LNMP架构说明 1.1.1 LNMP架构内容 01.部署linux系统 02.部署nginx网站服务 03.部署mysql数据库服务 04.部署php动态解析服务 1.1.2 配置LNM ...

  10. angularJS简单调用接口,实现数组页面打印

    相比较jquery ,angular对这种接口数据处理起来会方便的多.这里举例调用 中国天气网的api接口. 首先肯定要引入angular.js这个不多说 <link rel="sty ...