详解SELinux故障排查和陷阱规避

维护服务器的安全是一项艰巨的任务,尤其是在与第三方解决方案提供商打交道时。
在许多情况下,挑战是要求禁用SELinux以便应用程序能够正常运行。
幸运的是,这种情况越来越少见。
在大多数情况下,一些分析就足以找到适当的故障排除或解决方案。
SELinux是一个标签系统,它告诉我们系统中的每个文件、目录或对象都有一个对应的标签(Label)。
策略控制这些元素之间的交互,并且内核强制执行这些规则。
两个最重要的概念是标签(文件、进程、端口等)和类型强制(根据类型将进程彼此隔离)。
标签使用的格式为:用户:角色:类型:级别(可选)。
要查看当前配置,请运行getenforce和sstatus命令:/sys/fs/selinuxSELinux根目录:/etc/selinux加载的策略名称:targeted当前模式:enforcing配置文件中的模式:策略强制MLS状态:启用策略拒绝未知状态:允许内存保护检查:当前(安全)最大内核策略版本:32最佳实践告诉我们,当我们测试一个新的第三方应用程序时,我们需要临时将SELinux配置为宽容模式,以确定哪些策略或布尔值(简单修改行为链)是必需的。
运行以下命令:#setenforce0通过查看日志,您可以了解SELinux需要什么才能使您的应用程序正常工作。
SELinux试图告诉我什么?SELinux中产生警报的错误只有四个主要原因:标签。
SELinux需要知道。
SELinux策略和/或应用程序中可能存在错误。
您的信息可能会受到损害。
后一种情况是由于漏洞利用的漏洞发生变化或避免活动跟踪,但在这两种情况下都需要查看这些警报,我们目前不会讨论这一点。
标记问题:/srv/myweb中的文件未正确标记,因此无法访问。
SELinux为同一服务涉及的每个元素分配一个标签:二进制文件:/usr/sbin/httpd→httpd_exec_t配置文件:/etc/httpd→httpd_config_t日志文件:/var/log/httpd→httpd_log_t内容目录:/var/www/html→httpd_sys_content_t启动脚本:/usr/lib/systemd/system/httpd.service→httpd_unit_file_t进程:/usr/sbin/httpd→httpd_t端口:80/tcp、443/tcp→httpd_t和httpd_port_t在Web服务器上,在httpd_t上下文中运行的进程不能与对象关联与httpd_something_t标签进行交互。
解决方案:正确标记文件。
如果您知道正确的标签,请运行:#semanagefcontext-a-thttpd_sys_content_t'/srv/myweb(/.*)?'如果您知道带有equals标记的文件,请运行:#semanagefcontext-a-e/srv/myweb/var/www无论哪种情况,都将文件恢复到默认上下文:#restorecon-vR/srv/mywebProblemdlabel:如果文件被移动而不是复制,它将保留原始标签。
$mvindex.html/var/www/html/解决方案:正确标记文件。
将上下文更改为正确的标记:#chcon-thttpd_system_content_t/var/www/html/index.html将上下文更改为引用标记:#chcon--reference/var/www/html//var/www/html/index.html在这两种情况下,恢复默认上下文file:#Restorecon-vR/var/www/html/SELinux需要了解服务定制:Web服务器将侦听端口8585上的请求。
要将所需端口添加到上下文,请运行:#semanageport-a-thttp_port_t-ptcp8585向服务添加一项功能:Web服务器将能够发送电子邮件。
要启用发送电子邮件,请启用布尔值,请运行:#setsebool-Phttpd_can_sendmail1-P标志保留对布尔值的更改。
要获取所有布尔值,请运行:#getsebool-a要检查布尔值的状态,请运行:#semanageboolean-l策略故障排除程序未运行:使用wicd而不是NetworkManager服务来管理无线连接。
检查audit.log文件是否有访问被拒绝的情况:剪切-d{-f2排序-nuniq-u创建}forpid=2670comm="wicd"scontext=system_u:system_r:NetworkManager_t:s0tcontext=system_u:system_r:NetworkManager_t:s0tclass=appletalk_socketpermissive=1创建}对于pid=2670通讯=“wicd”scontext=system_u:system_r:NetworkManager_t:s0tcontext=system_u:system_r:NetworkManager_t:s0tclass=ax25_socketpermissive=1ioctl}forpid=2670comm="wicd"path="socket:[52681]"dev="sockfs"ino=52681ioctlcmd=0x8b01scontext=system_u:system_r:NetworkManager_t:s0tcontext=system_u:system_r:NetworkManager_t:s0tclass=ax25_socketpermissive=1ioctl}forpid=2670comm="wicd"path="socket:[52684]"dev=“fs袜子”ino=52684ioctlcmd=0x8b01scontext=system_u:system_r:NetworkManager_t:s0tcontext=system_u:system_r:NetworkManager_t:s0tclass=appletalk_socketpermissive=1setattr}forpid=2214comm="wicd"name="dhclient.conf.template“dev=”dm-0”ino=437068scontext=system_u:system_r:NetworkManager_t:s0tcontext=unconfined_u:object_r:etc_t:s0tclass=filepermissive=0注意:NetworkManager_t和etc_t上下文中涉及的某些元素需要权限,需要访问不同的文件并创建套接字。
创建具有策略所需权限的typeenforcement(.te)文件:#vimy_wicd.temodulemy_wicd1.0;要求{类型NetworkManager_t类型etc_t;和{创建ioctl};类appletalk_socket{创建ioctl};类文件setattr;}#============NetworkManager_t==============允许NetworkManager_tetc_t:dropsetattr;允许NetworkManager_tself:appletalk_socket{创建ioctl};允许NetworkManager_tself:ax25_socket{创建ioctl};e;要编译策略,请安装selinux-policy-devel软件包并生成策略软件包:#make-f/usr/share/selinux/devel/Makefilemy_wicd.pp要激活新生成的模块,请运行:#semodule-我收到my_wicd.pp策略错误消息:当我尝试访问我的网站时,我在日志中看到SELinux错误。
排除SELinux错误消息时的常见陷阱之一是创建策略。
在大多数情况下,如果您安装了setroubleshoot软件包,相同的提醒会为您提供所有可能的解决方法选项,按从最好到最差的顺序排列。
要查看今天生成的setroubleshoot回调,请运行:#Journalctl-tsetroubleshoot--sinceTodayDec81:08:33PMlab.example.comsetroubleshoot[12013]:无法检索/var/www/html/的RPM信息index.html12月8日1:08:34PMlab.example.comsetroubleshoot[12013]:SELinux阻止/usr/sbin/httpd访问文件/var/www/html/index.html上的getattr以获取完整的SELin。
ux消息运行:sealert-l011df984-4eb6-4079-98ab-cba173c4342eDec81:08:34PMlab.example.comsetroubleshoot[12013]:SELinux阻止/usr/sbin/httpd访问文件/var上的getattr/www/html/index.html*****恢复插件建议(99.5信任)************************。
如果要修复默认的/var/www/html/index.html标签标签应为httpd_sys_content_t。
然后你可以运行recoverycon。
由于没有足够的权限访问其中的父目录,访问尝试可能已被终止。
在这种情况下,请尝试相应地修改以下命令。
执行#/sbin/restorecon-v/var/www/html/index.html*****捕获所有插件建议(1.49信任)************。
****************如果您认为默认情况下应该允许httpd访问index.html文件,那么您应该将此报告为错误。
您可以生成本地策略模型。
现在可以通过运行以下命令来允许此访问:#ausearch-c'httpd'--raw|audit2allow-Mmy-httpd#semodule-X300-imy-httpd.pp这里最好的解决方案解决方案是修复文件标签。
总结对SELinux进行故障排除可能很困难,但是如果您应用此处介绍的一些概念并了解服务的组成部分,您就可以解决它们带来的困难。
请记住:SELinux是一个标签系统。

详解SEAndroid以及Hack其规则(sepolicy)

之前做Xpose遇到的问题是卸载Xpose一开始需要root权限,但是Xpose的原理是破解zygote进程(以后有时间再写xpose的原理)而zygote本身是有root权限的,所以Xposed应该可以rootzygote来卸载自己。
但实际操作过程中发现这是不可能的。
经过一番研究发现这与SEAndroid有关。
zygote的一些操作会受到SEAndroid的限制,它的root权限将不允许它做它想做的一切。
接下来我们会详细讲一下SEAndroid,然后我们会讲一下如何改变这个规则。
本文有三个目标:1.了解SEAndorid的工作原理2.能够了解SEAndroid的规则3.能够自己添加、删除和更改其规则(这个选项可能大多数人都不会使用,所以前两个是主要目标)SEAndroid这是Android上的SELinux端口。
SELinux是Linux中的一种系统安全机制。
SELinux的全称是SecurityEnhancedLinux(安全增强型Linux)。
这是MAC(MandatoryAccessControl,强制访问控制系统)的一种实现。
它的目的是清楚地表明进程可以访问哪些资源(文件、网络端口等)。
Android系统是在Linux上实现的。
针对传统Linux系统,NSA开发了SELinux安全机制来提高安全性。
然而,由于Android系统具有独特的用户空间运行时,SELinux可能并不完全适用于Android系统。
为此,NSA和Google为Android系统开发了基于SELinux的SEAndroid。
该机制在Android4.4中首次引入。
SEAndroid和SELinux最大的区别在于SEAndroid将Binder适配到了Android系统中。
登录adbshel​​l后,可以使用getenforce命令检查是否应用。
root后,可以通过setenforce0关闭SEAndroid。
但该功能目前似乎已被禁用。
要理解SEAndorid的概念,就不得不提到DAC和MAC。
DAC是传统的Linux访问控制方法。
DAC可以控制对文件、文件夹、共享等的访问。
在DAC模型中,文件对象的所有者(或管理员)负责访问控制管理。
DAC使用ACL(AccessControlList)向非管理员用户授予各种权限,root用户对文件系统拥有完全自由的控制权。
通俗地说,如果小明创建了一个文件,他就对该文件拥有绝对的控制权,可以独立控制其他人对该文件的访问权限。
文件权限分为三种类型:读(r)、写(w)和执行(x)。
我们可以使用ls-l命令查看每个文件的权限。
然后,您可以使用chmod命令更改其他人对此文件的权限。
(chmod7771.txt命令大家应该都知道,就不详细说了。
)但是这种机制的缺点是root用户可以控制任意文件的权限,为所欲为。
并且控制粒度比较粗。
如果我希望我的文件只能由另一个人读取,并且该人与我不在同一用户组中,我只能通过chmodXX4XX来实现此目的,但在这种情况下,任何人都可以读取我的文件。
文件。
所以它的粒度相对较粗。
因此,Linux引入了MAC机制来强制访问控制。
MAC背后的基本思想是,任何想要在SELinux系统上执行任何操作的进程都必须首先在安全策略配置文件中获得权限。
安全策略配置文件中未指定的任何权限都表明该进程没有权限。
这种机制相当于白名单。
所有进程的权限都配置在这个白名单中。
进程只能在白名单指定的权限范围内执行操作。
只要他想进行不属于他权限的操作,就去做。
被拒绝了。
MAC不再像DAC那样简单地将进程划分为根进程。
相反,每个进程(Subject,Subject)和文件(Object,Object)在进程控制(读、写等)时都是通过类型(Type)来配置的。
文件时,系统将确定进程类型是否有权使用该文件类型。
您可以查看标签使用ps-Z命令处理安全性,使用ls-Z可以查看文件的标签(安全上下文)。
例如,进程安全上下文中的init进程是init类型,后面的进程是kernel类型。
(其实进程类型也叫Domain)文件安全。
上下文中的类型123.txt是tootfs。
(进程和文件安全上下文标签的格式为user:role:type:security_level。
不用担心其他列。
这适用于SELinux中的其他几种访问控制模型。
在SEAndroid中我们只需要关心它的类型比如初始化进程的u:r:init:s0,我们只需要知道它的类型是init)就可以知道进程和文件的安全上下文,那么如何通过它们的安全上下文来管理权限呢?手机有sepolicy。
该文件是SEAndroid安全策略配置文件。
它包含所有进程的权限配置。
进程只能在其权限范围内执行操作。
即使具有root权限也无法删除该文件。
当你重置这个文件的内容时,你会发现里面有很多规则(我反转了魅族的4000条规则和三星的20000条规则)。
看两个例子。
alloweduntrusted_appsystem_app_data_file:file{read}allowzygotesdcard_type:file{readwritecreatrename}其具体格式为:allowDomainType:Class{Permission}(domain指的是进程类型)。
通过这种格式对上述三个规则的解释是:1.允许该对的untrusted_app类型的进程。
读取system_app_data_file类型的文件。
2.允许zygote类型进程读取、写入和创建名为sdcard_type的文件。
因此,MAC控制方法如下:当进程管理文件时,系统判断该进程和该文件的上下文,以确定该进程所属的类型是否有管理该文件类型的权限。
例如:zygote要读取SD卡上的文件,文件类型为sdcard,zygote的类型(域)为zygote。
系统会检查并找到这条规则allowzygotesdcard_type:file{readwritecreatrename}。
然后该操作将被允许执行。
如果zygote想要删除SD卡上的某个文件,系统检测到对应的规则中没有删除,就会拒绝。
(上面的两条规则和这个例子我只是为了说明情况而编造的。
实际情况下,zygote有删除SD卡上文件的权限。
)DAC和MAC同时工作。
在DAC和MAC上。
经过MAC检测和后续执行后,如果不满足任何机制的条件,则申请将被拒绝。
上面的部分解释了SEAndroid的工作原理。
现在我们知道为什么zygoteroot不能做它想做的一切,以及如何更改SEAndroid规则和扩展zygote权限。
直接更改sepolicy是不行的,因为sepolicy在boot.img中,每次开机都会覆盖并读取sepolicy文件,所以更改无法成功。
因此,您需要立即解压boot.img,替换里面的sepolitics,然后重新打包。
Linux有一套用于解包和打包的工具。
Windows解压工具是Android-Image-Tools-windows.zip。
首先找到手机厂商的官方ROM固件包,找到boot.img并解压。
里面有一个sepolicy文件。
更换sepolitik并更换它,重新包装并将其闪存到手机上。
(好吧,这个其实挺复杂的,但是我想大多数人可能都不需要,所以就先这样写吧,如果需要的话,我稍后再详细写,本来是打算下载自己的工具的,但是没打扰我知道如何上传文件...我找不到它。
我的工具的链接在这里,你可以在这里找到它))https://github.com/xmikos/s。
etools-android1.sepolicy-inject:注入规则2.sesearch:反编译sepolicy3.seinfo:查看sepolicy版本。
修改sepolicy命令:点击手机直接输入./(对应文件)就可以看到它的使用方法了(下面是我粘贴的命令之一)。
://forum.xda-developers.com/showthread.php?t=2073775博客是学习的起点,而不是终点。


本文是SEAndroid的介绍。
她有一个重要的目标。
只讲了主要部分,并没有涵盖太多内容。
如果你想了解更多关于SEAndroid的知识,可以阅读老罗的文章。
**最后,同学们,请给我们点个赞吧!!!添加订阅者**。
链接链接:SEAndroid安全机制及方案简介训练。
老罗对SEAndroid策略的分析值得推荐。
深入了解SELinux。

SELinux三种基本控制模式以及切换方式,以及SELinux的特点

1.目前系统文件权限管理有两种:DAC(传统)和MAC(SELINUX)11。
文件权限与账户的传统关系:自由访问控制,DAC(DISCRETIONARYACCESSCONTROL,DAC)12,它是由策略定义的。
规则。
确定特定程序读取特定文件:任意访问控制,MAC1【了解】2二、SELINUX的工作模式21、【重要原理】SELINUX通过MAC控制程序,22、显示安全的上下文命令2【要点】】默认情况下,TARGETED策略中,IDENTIFY和ROLE字段基本不重要!33.启动、停止和显示SELINUX31.并非所有的LINUXDISTRIBUTIONS都支持SELINUX32.检查SELINUX模式33.检查SELINUX策略(POLICY)?34.通过配置文件调整SELINUX设置35.启动和停止SELINUX46.查看启动程序的TYPE设置

SELinux策略语法以及示例策略

本文将深入分析SELinux策略的基本语法,并通过示例说明实际应用。
SELinux安全上下文由四个部分组成。
尽管大多数示例中并未使用RBAC模型的用途和组件,但理解它们的定义非常重要。
组件的权限由与type属性的关联决定。
例如,如果一个函数具有a_t类型的读写权限,那么它就具有必要的操作能力。
设计语法中的标签定义角色、用户、MLS(可选)以及对象类型和权限。
访问控制规则有四种:permission(最常见的权限分配)、dontaudit(不记录日志)、auditallow(重要数据访问记录)、neverallow(编译时检查)。
类型转换规则描述了各种类型的程序执行后如何进行类型转换,通常在exec操作之后进行。
SELinux在文件系统中提供了多种注释方法,例如基于扩展文件属性的fs_use_xattr使用、基于父进程的使用、基于转换规则的交叉使用等。
github上提供了一个示例项目。
要测试这个初始计划,您必须首先在/etc/selinux/config中对其进行设置,并确保在首次运行时将其设置为宽容模式。
总体来说,SELinux的设计虽然看似复杂,但基本概念和实际操作并不困难。