zoukankan      html  css  js  c++  java
  • centos selinux学习记录

    SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。

    强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或 ACL 的替代品,在用途上也不重复。

    举例来说,系统上的 Apache 被发现存在一个漏洞,使得某远程用户可以访问系统上的敏感文件(比如/etc/passwd 来获得系统已存在用户),而修复该安全漏洞的 Apache 更新补丁尚未释出。此时 SELinux 可以起到弥补该漏洞的缓和方案。因为 /etc/passwd 不具有 Apache 的访问标签,所以 Apache 对于 /etc/passwd的访问会被 SELinux 阻止。

    相比其他强制性访问控制系统,SELinux 有如下优势:

    • 控制策略是可查询而非程序不可见的。
    • 可以热更改策略而无需重启或者停止服务。
    • 可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
    • 控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口。

    selinux有三种状态

    enforcing    在强制模式下的SELinux将强制执行在Linux系统上的政策,并确保用户和进程的任何未经授权的访问尝试将被拒绝。 访问拒绝也写入相关的日志文件

    permissive 许可模式类似于半启用状态。 SELinux不会在允许模式下应用其策略,因此不会拒绝任何访问。 但是,任何策略违规仍然记录在审核日志中。 这是一个伟大的方式来测试SELinux之前强制它。

    disabled    禁用模式是不言自明的 – 系统将不会运行增强的安全性。

    获取selinux的状态

    sestatus

    设置selinux状态

    setenforce 0 将selinux设置为permissive

    setenforce 1将selinux设置为enforcing

    需要说明的是如果是disabled是无法使用setenforce的,因为是禁用状态。

    可以修改selinux为disabled,但是不安全

    vim /etc/selinux/config

    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=disabled
    # SELINUXTYPE= can take one of these two values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected. 
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted

    设置完需要重启才能生效

    selinux策略

    selinux是控制程序是否能够读取档案资源

    查看安全性本文(secruity context)

    ls -Z查看当前目录下的安全性本文

    [root@www ~]# ls -Z
    -rw-------. root  root  system_u:object_r:admin_home_t:s0     anaconda-ks.cfg
    drwxr-xr-x. root  root  unconfined_u:object_r:admin_home_t:s0 bin
    -rw-r--r--. root  root  system_u:object_r:admin_home_t:s0     install.log
    -rw-r--r--. root  root  system_u:object_r:admin_home_t:s0     install.log.syslog
    # 上述下划线的部分,就是安全性本文的內容!

    分别是identify身份识别,role角色,type类型

    常见的身份识别

    root    表示root账号身份

    system_u 表示系统程序方面的识别,通常就是程序

    user_u 代表某个一般使用者账号相关身份

    角色

    object_r  代表档案或目录等档案资源

    system_r  代表程序

    类型

    type

    domain

    修改安全性本文

    chcon

    恢复安全性本文

    restorecon

    主要有seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。

    seinfo和sesearch都是用来查询的

    使用seinfo命令可以查询SELinux的策略提供多少相关规则,如果查到的相关类型或者布尔值,想要知道详细规则时,使用sesearch命令查询。

    getsebool

    getsebool命令是用来查询SElinux策略内各项规则的布尔值

    setsebool
    setsebool命令是用来修改SElinux策略内各项规则的布尔值
    semanage

    semanage命令是用来查询与修改SELinux默认目录的安全上下文

    [root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l
    [root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec
    選項與參數:
    fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思;
    -a :增加的意思,你可以增加一些目錄的預設安全性本文類型設定;
    -m :修改的意思;
    -d :刪除的意思。

     sestatus用来查看当前的selinux状态

     排除 SELinux 疑难

    你终有一天会被 SELinux 阻止你存取所需的东西,而且要解决这个问题。SELinux 拒绝某个档案、进程或资源被存取的基要原因有数个:

    • 一个被错误标签的档案。
    • 一个进程在错误的 SELinux 安全性脉络下运行。
    • 政策出错。某个进程要存取一个在编写政策时意料不到的档案,并产生错误信息。
    • 一个入侵的企图。

    头三个情况我们可以处理,而发出警报及通告正正是第四个情况的预期表现。

    日志档是排除任何疑难的关键,而 SELinux 亦不例外。SELinux 预设会透过 Linux 审计系统 auditd 将日志写在 /var/log/audit/audit.log 内,而该务服预设为启用的。假若 auditd 长驻程式并未运行,信息将会被写进 /var/log/messages。SELinux 的日志都以 AVC 这个关键字作标签,让 grep 等程式可轻易地把它们从其它信息中过滤出来。

    由 CentOS 5 起,你可以用 SELinux 排除疑难工具协助你分析日志档,将它们转换为供人阅读的格式。这个工具包含一个以可读格式显示信息及解决方案的图像介面、一个桌面通报图示、与及一个长驻进程,setroubleshootd,它负责查阅新的 SELinux AVC 警告并传送至通报图示。不运行 X 伺服器的用户可设置以电邮通报。SELinux 排除疑难工具是由 setroubleshoot 套件所提供的。这个工具可以从 X 视窗图像管理员的「系统」选单或从指令行启动:

    sealert -b 

    不运行 X 伺服器的人可以透过指令行产生供人阅读的报告:

    sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt 

     总结一下

    selinux是用来对进程权限进行限制的。限制某些进程只能读取某些文件。

    一般我们如果通过setenforce 0吧selinux设置为警告模式之后,程序正常运行了。那就说明是selinux在捣乱。通常的做法是直接disable禁用掉selinux,但是这样不安全。

    总结下一些简单的解决方案

    一般来说都是因为权限的问题,很可能是进程没有权限读取文件。

    以apache为例

    我们检视 Apache 的主页,/var/www/html/index.html 的 SELinux 安全性脉络来看看它们如何运作:

    $ ls -Z /var/www/html/index.html -rw-r--r-- username username system_u:object_r:httpd_sys_content_t /var/www/html/index.html

    /var/www/html/index.html 类别是httpd_sys_content_t

    现在来看看apache进程的selinux安全性脉络

    $ ps axZ | grep httpd

    system_u:system_r:httpd_t 3234 ? Ss 0:00 /usr/sbin/httpd

    从类别栏我们看出 Apache 在 httpd_t 这个类别区域内运行

    最后,让我们看看位于我们的主目录内的一个档案的安全性脉络:

    $ ls -Z /home/username/myfile.txt

    -rw-r--r-- username username user_u:object_r:user_home_t /home/username/myfile.txt

    它的类别是 user_home_t,这是位于每个户主目录内的档案的预设类别。

    唯有相似的类别才可互相存取,因此以 httpd_t 运行的 Apache 可以读取拥有 httpd_sys_content_t 类别的 /var/www/html/index.html。由于 Apache 在 httpd_t 这个区域内运行但不属 username 这个用户,纵使 /home/username/myfile.txt 可供任何人读取,Apache 却无法存取该档案,因为它的 SELinux 安全性脉络并不是 httpd_t 类别。倘若 Apache 被人占用,又假设它仍未取得更改 SELinux 标签至另一个脉络的 root 权限,它将会无法启动 httpd_t 区域外的进程(藉此防止权限升级),或存取与 httpd_t 区域不相关的档案。

    所以如果要让httpd能读取myfile.txt文件

    可以使用semanage命令

    semanage -a -t httpd_sys_content_t /home/username/myfile.txt

    将myfile.txt的安全性文本改为httpd_sys_content_t,这样就可以了。

    restorecon 这个指令可以用来还原为档案预设的安全性脉络

    restorecon -v /var/www/html/index.html

    一般修改安全性文本就可以解决问题了,但是如果不行的话可以查看selinux的日志,里面会提示你应该怎么做。如何查看日志上面已经提到了

    cat /var/log/messages

    参考自https://wiki.centos.org/zh/HowTos/SELinux

  • 相关阅读:
    Burp Suite抓包使用步骤
    抓包工具Burp Suite安装步骤(待补充)
    mysql版本和模式查询
    git仓库下拉和上传
    git仓库个人和企业版新增仓库和成员
    漏洞扫描工具acunetix破解安装步骤
    漏洞扫描工具acunetix12会遇到的问题
    memcached缓存:安装和清缓存
    oracle数据库备份、还原命令及常见问题(待补充)
    Linux中,关闭selinux
  • 原文地址:https://www.cnblogs.com/lgh344902118/p/7503767.html
Copyright © 2011-2022 走看看