获得有关生命、宇宙和SELinux以外的重要问题的答案,《银河系漫游指南》安全、稳健、合规、策略是末世系统管理员的四驾马车。除了我们的日常任务——监控、备份、实施、调优、更新等——我们也需要为我们的系统安全负责。甚至那些系统都是第三方提供商告诉我们禁用以增强安全性的系统。这看起来像《碟中碟》中EthanHunt的工作。面对这种困境,一些系统管理员决定服用蓝色小药丸,因为他们认为他们永远不会知道生命、宇宙和其他大问题的答案。我们都知道它的答案是这个42。本着《银河系漫游指南》的精神,这里有42关于在您的系统上管理和使用SELinux的大问题的答案。SELinuxx是一个标签系统,也就是说每个进程都有一个标签。每个文件、目录和系统对象都有一个标签。策略规则负责控制标记进程和标记对象之间的访问。这些规则由内核强制执行。最重要的两个概念是:标签(文件、进程、端口等)和类型强制(根据不同的类型隔离不同的进程)。正确的标签格式是user:role:type:level(可选)。多级安全(MLS)实施的目的是根据进程(域)使用的数据的安全级别强制控制它们。例如,具有机密级别的进程无法读取具有非常机密级别的数据。多类别安全(MCS)强制相似进程(如虚拟机、OpenShift齿轮、SELinux沙箱、容器等)的相互保护。在启动时更改SELinux模式的内核参数是:autorelabel=1→强制重新标记系统selinux=0→内核不加载SELinux基础结构的任何部分enforcing=0→如果重新标记整个系统,则以宽容模式启动:#touch/.autorelabel#reboot如果系统标签错误较多,为了使autorelabel成功,可以以宽容模式启动系统。检查SELinux是否启用:#getenforce临时启用/禁用SELinux:#setenforce[1|0]SELinux状态工具:#sestatus配置文件:/etc/selinux/configSELinux是如何工作的?以下是为ApacheWeb服务器标记的示例:二进制文件:/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_d进程:/usr/sbin/httpd-DFOREGROUND→httpd_t端口:80/tcp,443/tcp→httpd_t,http_port_tinhttpd_t一个进程在安全上下文中运行可以与标签为httpd_something_t的对象进行交互。许多命令可以接受-Z参数来查看、创建和修改安全上下文:ls-Zid-Zps-Znetstat-Zcp-Zmkdir-Z创建父目录的安全上下文(有一些可能的例外)。RPM可以在安装期间设置安全上下文。以下是SELinux可能出错的四个主要原因,它们在下面的15-21中进行了描述:myweb没有正确标记,访问可能会被拒绝。以下是针对此类问题的一些修复:如果您知道标记:#semanagefcontext-a-thttpd_sys_content_t'/srv/myweb(/.*)?'如果您知道与它具有相同标记的文件:#semanagefcontext-a-e/srv/myweb/var/www恢复安全上下文(对于上述两种情况):#restorecon-vR/srv/myweb标签问题:如果您移动一个文件而不是复制它,那么这个文件将保留在它们原来的环境中。要解决此类问题:使用标签更改安全上下文:#chcon-thttpd_system_content_t/var/www/html/index.html使用参考文件的标签更改安全上下文:#chcon--reference/var/www/html//var/www/html/index.html恢复安全上下文(针对上述两种情况):#restorecon-vR/var/www/html/如果SELinux需要知道HTTPD正在侦听端口8585,请告诉SELinux使用以下命令:#semanageport-a-thttp_port_t-ptcp8585SELinux需要知道是否允许在运行时更改部分SELinux策略而不重写SELinux策略。比如你想让httpd发送邮件,输入:#setsebool-Phttpd_can_sendmail1SELinux需要知道SELinux设置为off或on的一组boolean值:要查看所有的boolean值:#getsebool-aTo查看每个布尔值的描述:#semanageboolean-l设置一个布尔值:#setsebool[_boolean_][1|0]要将其配置为永久值,请添加-P标志。示例:#setseboolhttpd_enable_ftp_server1-PSELinux策略/应用程序可能有错误,包括:不寻常的代码路径配置重定向stdout泄漏的文件描述符可执行内存错误构建库打开票证(但不要提交Bugzilla报告;使用Bugzilla(有是没有相应的服务)你的信息可能已经损坏,如果你被限制在某个区域,试试这个:加载内核模块关闭SELinux强制模式写etc_t/shadow_t修改iptables规则开发策略模块SELinux工具:#yum-yinstallsetroubleshootsetroubleshoot-server.安装完成后重启机器或重启auditd服务.使用journalctl列出与setroubleshoot相关的所有日志:#journalctl-tsetroubleshoot--since=14:20使用journalctl列出与a相关的所有日志具体的SELinuxlabel例如:#journalctl_SELINUX_CONTEXT=system_u:system_r:policykit_t:s0当SELinux出错时,使用setroubleshoot的journal试试找到一些可能的解决方案。示例:来自journalctl:Jun1419:41:07web1setroubleshoot:SELinux阻止httpd对文件/var/www/html/index.html进行getattr访问。对于完整的消息运行:sealert-l12fd8b04-0119-4077-a710-2d0e0ee5755e#sealert-l12fd8b04-0119-4077-a710-2d0e0ee5755eSELinux正在阻止httpd对文件/var/www/html/index.html的getattr访问。*****pluginrestorecon(99.5confidence)suggests************************如果你想修复标签,/var/www/html/index.htmldefaultlabel应该是httpd_syscontent_t。那么你可以restorecon.Do#/sbin/restorecon-v/var/www/html/index.html日志:SELinux记录的信息都在这些地方:/var/log/messages/var/log/audit/audit.log/var/lib/setroubleshoot/setroubleshoot_database.xml日志:在审计日志中查找SELinux错误:#ausearch-mAVC,USER_AVC,SELINUX_ERR-tstoday搜索SELinux的访问向量缓存特定服务的(AVC)信息:#ausearch-mavc-chttpdaudit2allowutilitycanpass通过从日志中收集有关被拒绝操作的信息,然后生成SELinux策略允许的规则,例如:-a创建一个自定义模块:#audit2allow-a-Mmypolicy,其中-M选项将创建一个具有特定名称的强制类型文件(.te)并将此规则编译成策略包(.pp):mypolicy.ppmypolicy.te安装自定义模块:#semodule-imypolicy.pp配置单个进程(域)以宽容模式运行:#semanagepermissive-ahttpd_t如果您不再希望域处于宽容模式:#semanagepermissive-dhttpd_t禁用所有许可域:#semodule-dpermissivedomains启用SELinuxMLS策略:#yuminstallselinux-policy-mls在/etc/selinux/config中:SELINUX=permissiveSELINUXTYPE=mls确保SELinux在许可模式下运行:#setenforce0使用fixfiles脚本来确保f文件将在下次重新启动时重新标记:#fixfiles-Fonboot#reboot创建一个具有特定MLS范围的用户:#useradd-Zstaff_ujohn使用useradd命令将新用户映射到现有的SELinux用户(示例中的staff_u多于)。查看SELinux和Linux用户之间的映射:#semanagelogin-l为用户定义一个指定范围:#semanagelogin--modify--ranges2:c100john调整用户主目录上的标签(如果需要):#chcon-R-ls2:c100/home/john列出当前类别:#chcat-L修改类别或创建自己的类别,修改以下文件:/etc/selinux/_
