热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安全利器—SELinux

安全利器—SELinux一、初识SELinux二、SELinux安全上下文三、SELinux访问控制四、SELinux工作模式五、SELinux日常维护六、自定义SELinux规则

安全利器 — SELinux

  • 一、初识 SELinux
  • 二、SELinux 安全上下文
  • 三、SELinux 访问控制
  • 四、SELinux 工作模式
  • 五、SELinux 日常维护
  • 六、自定义 SELinux 规则模块

在 Linux 系统中一切皆文件,资源也属于某种文件。用户在访问文件的时候,系统对权限(读、写 、执行)进行检查。只要用户对文件有足够的权限,就可以任意操作资源。root 用户对所有资源拥有所有权限,是个危险的存在。每年都会看到某职员一不小心把系统“干趴下”的新闻。这种权限管理的主体是用户,被称为 Discretionary Access Control ,DAC ,自主访问控制

DAC 机制下,程序直接继承用户的权限。用户有权限,则用户启动的程序就有权限,恶意程序也有了发挥空间。DAC 让主体自主管理权限,实践中容易管理不当,基于读、写、执行的权限控制,也过于粗略。为了解决这个问题,Mandatory Access Control ,MAC ,强制访问控制,就诞生了。MAC 机制下,管理员定义好安全策略,用户行为被强制约束,避免发生意外。

一、初识 SELinux

SELinux 的价值 :实现 MAC 机制,增强抵御未知危害的能力。

SELinux 的出生 :NSA(美国国家安全局)和 SELinux 社区的联合项目。

SELinux 支持内核版本 :Linux Kernel 2.6.x 及以后版本。

SELinux 干了哪些活 :定义一套 MAC 的权限系统,对系统内的一切资源(文件)打上标记(安全上下文),使用安全策略来控制资源访问。用户同时通过 DAC 和 MAC 的检查,才能访问资源。

二、SELinux 安全上下文

安全上下文是 SELinux 的核心,格式由三部分组成:用户、角色、类型标识符:

格式USER:ROLE:TYPE[LEVEL[:CATEGORY]]
常见 USERsystem_urootuser_u
常见 ROLEstaff_ruser_robject_rsecadm_rsysadm_rsystem_r
TYPE类型强制访问的重要属性
LEVEL安全等级,目前已经定义的安全等级为 s0 - s15,等级越来越高
CATEGORY分类,目前已经定义的分类为 c0 - c1023

很多系统命令,如 lspsid ,带有 -Z 参数,可以查看文件/进程的安全上下文。

pic

selinux 的用户管理中,能跟踪一个登陆用户,即使用户通过 su 命令切换了身份,也被 selinux 视为同一个用户。

操作一:打开新的终端登陆 root

pic

操作二:打开新的终端登陆 yishuguo

pic

对比发现,从一开始登陆新的终端,到后期不管怎么进行用户切换操作,SELinux 用户身份始终保持不变,如上述操作截图中的 unconfined_uuser_u,那么 user_uunconfined_u 是怎么来的?如下图:

pic

用户登陆关系转换表,SELinux 就是这么把现有的系统用户关联起来的。

相关参考命令:

  • semanage user -a -L s0 -r "s0" -P user -R system_r tcxa_u
  • semanage login -{a|d|m} [-sr] login_name

示例:

  • 新增 se 用户:
    semanage user -a -L s0 -r “s0” -P user -R system_r tcxa_u
  • 删除 se 用户:
    semanage user -d tcxa_u
  • 新增关联:
    semanage login -a -s SEL用户 系统用户
  • 删除关联:
    semanage login -d -s SEL用户 系统用户


三、SELinux 访问控制

pic

因为DAC的读、写、执行权限过于粗略,SELinux 基于类型增强( Type-Enhanced ) 的属性进行访问控制,简单说就是基于安全上下文的类型属性的访问控制。上图中主体一般是指进程,它的类型标签为 a_t,客体是指所有可能被操作的文件,类型标签是 b_t。主体访问客体时,selinux 查询 AVC 库里的规则,判断主体 .a_t 能否访问客体 .b_t。可以用一个形象的比喻:a_t ,b_t 分别是主体和客体的工作牌,AVC 是企业的规章制度,制度决定 a_tb_t 权限关系。

四、SELinux 工作模式

pic

SELinux 有三种工作模式,分别是 enforcingpermissivedisabled

enforcingpermissivedisabled
强制模式宽容模式关闭策略
违反SELinux规则的行为都会被阻止并被记录到日志中。违反SELinux规则的行为只记录到日志,不会拦截。**

SELinux 工作模式可以通过 /etc/selinux/config 配置文件中 SELINUX 参数来配置,参考配置:

SELINUX=enforcing | permissive | disabled

这里需要注意的是修改完配置需要重启系统才能生效。当然,也可以通过 setenforce 1|0 来临时快速切换 enforcingpermissive,并通过 getenforce 或者 sestatus 命令来验证当前状态。

五、SELinux 日常维护

auditd 记录了 selinux 的安全日志,默认存储在 /var/log/audit/audit.log 。我们利用命令分析该日志:

audit2why</var/log/audit/audit.log

找到异常或不当的日志记录&#xff0c;然后调整 selinux 的权限。一般分四步——

  1. 分析拦截日志转换成AV

cat audit.log|audit2allow -m tcxa -o tcxa.te

  1. 检查并编译模块

checkmodule -mM -o tcxa.mod tcxa.te

  1. 创建新模块

semodule_package -o tcxa.pp -m tcxa.mod

  1. 分析拦截日志转换成AV

semanagemodule -a tcxa.pp

selinux 的调整&#xff0c;都是围绕 semanage 这个工具完成的。常见操作案例如下&#xff1a;

  • 为某标签类型增加端口访问权限&#xff1a;

semanage port -a -t http_port_t -p tcp39999

  • 为指定目录或文件添加默认标签类型&#xff1a;

semanage fcontext -a -t httpd_sys_content_t&#39;/srv/www(/.*)?&#39;

  • 恢复指定目录或文件默认标签类型&#xff1a;

restorecon -Rv/srv/www

  • 临时变更文件标签类型&#xff1a;

chcon -R -t/srv/www/

  • 查找 SELinux 安全策略规则库&#xff1a;

sesearch -A -s tc_httpd_t -t tc_httpd_rw_t

  • 切换当前用户角色&#xff1a;

newrole -r sysadm_r

  • 查看和设置 SELinux 功能的 bool 值&#xff1a;

getsebool -a | grep httpsetsebool -P httpd_use_nfs on | off

六、自定义 SELinux 规则模块

有时我们需要自定义 selinux 规则模块。

假设我们在系统上新部署了 Apache&#xff0c;根据进程被拉起的方式不同&#xff0c;Apache 进程安全上下文也会不同&#xff0c;如注册为系统服务的方式和通过登陆用户后手动执行命令启动&#xff0c;效果是不一样的。

系统服务启动方式的安全上下文可能是&#xff1a;

system_u:system_r:initrc_t

用户登陆执行命令的安全上下文可能为&#xff1a;

unconfined_u:unconfined_r:unconfined_t

httpd 进程的安全上下文的第一标签&#xff08;用户&#xff09;和第二标签&#xff08;角色&#xff09;属性是根据启动者的身份进行判定的&#xff0c;如何设置第三标签属性呢&#xff1f;

我们可以借助于 system-config-selinux 工具或者命令行工具 /usr/bin/sepolgen 来配置&#xff0c;简单说明如下&#xff1a;

[root&#64;localhost Desktop]# system-config-selinux

pic

pic

通过向导完成操作后&#xff0c;会基于 SELinux 的模版文件在指定目录下生成 4 个基础的文件&#xff0c;我们也可以自行基于这 4 个基础文件添加或者修改需要的内容&#xff0c;最后执行 tc_httpd.sh 脚本即可自动完成 SELinux 扩展模块的编译&#xff0c;并自动尝试加载模块和设置安全上下文内容。

# ./tc_httpd.sh # /usr/local/apache2.2/bin/apachectl restart

pic

pic

上面截图的 Apache 进程的标签类型名称是 tc_httpd_t &#xff0c;Apache 程序目录&#xff0f;文件的标签类型名称是 tc_httpd_rw_t &#xff0c;我们可以搜索 SELinux 安全策略规则集&#xff0c;进一步了解 tc_httpd_ttc_httpd_rw_t 的访问规则。

[root&#64;localhost apache2.2]# sesearch -A -s tc_httpd_t -t tc_httpd_rw_t Found 2 semantic av rules: allow tc_httpd_t tc_httpd_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow tc_httpd_t tc_httpd_rw_t : dir { ioctl read write create getattr setattr
lock unlink link rename add_name remove_name reparent search rmdir open } ;

通过上述输出&#xff0c;可以知道 tc_httpd_ttc_httpd_rw_t 的操作权限&#xff0c;看字面意思也能猜出个大概。对于 SELinux 模块的操作可以通过 semodulesemanage 两个命令进行&#xff0c;可以自行参考 man 帮助手册。

SELinux 如果能熟练掌握并正确运用&#xff0c;那么对于 0day 漏洞的抵御能力等同于是加了一层“铜墙铁壁”。

Ref

  1. SELinux Project
  2. semanage - SELinux Policy Management tool
  3. semodule - Manage SELinux policy modules

推荐阅读
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
author-avatar
mobiledu2502931637
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有