访问文件的SELinux权限添加

最近做了一个功能:设备首次驻网时,在设备指定目录创建文件,并在此文件中写入当前的时间,然后通过暗码可以读取这个时间

这个功能挺简单的,唯一比较麻烦的是添加SELinux权限时的一些问题,在此记录一下。

首先通过rc文件创建一个目录

init.rc

mkdir /data/vendor/time_code 0771 radio radio

然后设备首次驻网时在此目录下创建txt文件,"/data/vendor/time_code/time_code.txt",此时SELinux权限问题就来了,如下所示:
SELinux权限拒绝
ps:如何确认是 SELinux 问题?可以关闭 SELinux(adb shell setenforce 0),确认相关功能是否 ok,如果 ok 是 SELinux 问题,如果nok,说明本身程序有问题

上述的SELinux报的权限并不全,通常SELinux打开时不会一次性打印出所有缺少权限,可以先将SELinux关闭,在通过adb logcat或者adb shell dmesg打印全部缺少权限

SELinux报错的标准格式是:

  avc: denied  { 操作权限  }  for pid=26382  comm=“进程名” 
  scontext=u:r:源类型:s0  tcontext=u:r:目标类型:s0  
  tclass=访问类型 permissive=0

添加规则是,在源类型.te文件中添加 :

allow  源类型 目标类型:访问类型 {操作权限};

例如上图报出的log:
05-11 16:39:13.249 1950 1950 W SharedPreferenc: type=1400 audit(0.0:99): avc: denied { read } for name=“time_code.txt” dev=“mmcblk0p65” ino=27156 scontext=u:r: radio:s0 tcontext=u:object_r:vendor_data_file:s0 tclass=file permissive=0

我们就应该在radio.te中添加:allow radio vendor_data_file:file { read };

添加SELinux权限的一个原则就是报出来什么,添加什么,上述log中缺少权限并没有报全,最终添加全部缺少权限如下:

allow radio vendor_data_file:dir rw_dir_perms;
allow radio vendor_data_file:file { open write read create rw_file_perms setattr};
allow radio vendor_data_file:file rename;
allow radio vendor_data_file:file unlink;

添加好了之后进行编译,mmma system/sepolicy/,此时发现编不过,
在这里插入图片描述
这是因为我们添加的SELinux权限违反了google的neverallow规则,google不允许名为radio源类型访问标签名为vendor_data_file的目标类型,

解决方案是修改我们要访问的文件的标签名vendor_data_file,如何修改呢?我们要访问的目录是/data/vendor/time_code/,先看一下这个目录的信息
在这里插入图片描述
需要修改的标签属于文件类型,另外还有属性类型和程序类型,对于文件类型标签的修改就是自定义一个新的标签,在file.te中定义,在file_contexts中使用,
file.te中添加如下语句:

type tct_time_data_file, file_type, data_file_type, mlstrustedobject;

file_contexts中添加如下语句:

/data/vendor/time_code(/.*)?       u:object_r:tct_time_data_file:s0

标签就被修改为了tct_time_data_file,然后再修改radio.te中的目标类型

allow radio tct_time_data_file:dir rw_dir_perms;
allow radio tct_time_data_file:file { open write read create rw_file_perms setattr};
allow radio tct_time_data_file:file rename;
allow radio tct_time_data_file:file unlink;

再进行编译,mmma system/sepolicy/
在这里插入图片描述
编译成功后push进手机验证,
adb push out/target/product/dubaivzw/vendor/etc/selinux/ /vendor/etc/

首先ls -Z看看/data/vendor/time_code/的信息,可以看到,标签名已经被修改
在这里插入图片描述
并且log中没有再报SELinux权限的问题,/data/vendor/time_code/time_code.txt文件也成功创建了,此文件中也成功写入了当前驻网时间:
在这里插入图片描述

### 如何配置或添加 SELinux 权限 在 Linux 系统中,SELinux 是一种强制访问控制 (MAC) 安全模块,用于提供更精细的安全策略。为了应对特定场景下的权限需求,可以通过以下方式添加或调整 SELinux权限。 #### 添加 SELinux 权限时的一般流程 设备切换到宽容模式(Permissive Mode),以便观察并记录因缺少适当权限而产生的错误日志。随后根据这些日志提示创建新的 SELinux 策略文件[^4]。具体步骤包括: 1. **设置为 Permissive 模式** 使用命令 `setenforce 0` 将 SELinux 切换至 Permissive 模式,在此模式下不会阻止任何操作,但会记录违反策略的行为。 2. **复现问题场景** 执行引发权限拒绝的操作,确保能够捕获相关的 AVC(Access Vector Cache)消息。 3. **收集 AVC 日志** 查看 `/var/log/audit/audit.log` 文件或者通过工具如 `ausearch` 和 `sealert` 获取详细的拒绝信息。 4. **生成自定义策略** 基于上述日志数据利用自动化脚本 `audit2allow` 创建新规则。例如: ```bash grep denied /var/log/audit/audit.log | audit2allow -M my_custom_policy ``` 5. **加载新策略** 加载刚刚编译好的模块以扩展现有的 SELinux 配置: ```bash semodule -i my_custom_policy.pp ``` 完成以上过程之后,建议重新启用 Enforcing 模式 (`setenforce 1`) 并验证更改效果是否满足预期。 #### SELinux 策略类型概述 SELinux 提供多种预设的策略框架支持不同级别的安全性要求。主要包括 Targeted、Strict 及 MLS/MCS 这些主要类别[^1]。其中最常用的是 Targeted 策略,它仅对选定的服务实施严格的限制,而对于其他部分则保持宽松状态;相比之下 Strict 更加严格全面覆盖整个操作系统环境;MLS(Multi-Level Security)/MCS(Multi-Category Security)适用于高度敏感场合比如政府机构内部网络隔离等特殊用途。 #### Permissive 模式的功能描述 当处于 Permissive 模式时,虽然仍然会对不符合当前生效规则的动作发出警告通知,但是并不会真正拦截它们的实际运行行为。这种特性非常适合用来诊断潜在冲突以及测试即将部署的新规条目是否会带来负面影响之前先做评估工作。 ```python import os os.system('getenforce') # Check current SELinux mode. if 'Enforcing' not in str(os.popen('getenforce').read()): print("System is currently NOT enforcing SELinux policies.") else: print("SELinux enforcement is active on this system.") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值