胡开银 發表於 2017-4-6 16:16:01

CentOS上的安全防护软件Selinux详解

<p><strong>selinux简介</strong></p>
<p>SELinux(Security-Enhanced Linux)&nbsp;是美国国家安全局(NSA)对于强制访问控制的&nbsp;实现,是&nbsp;Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的&nbsp;任务中所需要文件。SELinux&nbsp;默认安装在&nbsp;Fedora&nbsp;和&nbsp;Red Hat Enterprise Linux&nbsp;上,也可以作为其他发行版上容易安装的包得到,2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中</p>
<p>DAC:Discretionary Access Control自由访问控制</p>
<p>MAC:Mandatory Access Control&nbsp;强制访问控制</p>
<p>DAC环境下进程是无束缚的</p>
<p>MAC环境下策略的规则决定控制的严格程度</p>
<p>MAC环境下进程可以被限制的</p>
<p>策略被用来定义被限制的进程能够使用那些资源(文件和端口)</p>
<p>默认情况下,没有被明确允许的行为将被拒绝</p>
<p><strong>selinux</strong><strong>的工作类型</strong></p>
<p>selinux一共有四种工作类型</p>
<p>strict:每个进程都受到selinux的控制</p>
<p>targeted:用来保护常见的网络服务,仅有限进程受到selinux控制,系统当中默认设置类型</p>
<p>minimum:这个模式在centos7上,是targeted的修改版,只对选择的网络服务,仅对选中的进程生效</p>
<p>mls:提供mls机制的安全性,国防级别的</p>
<p><strong>selinux</strong><strong>安全上下文</strong></p>
<p>传统的linux,一切皆文件,由用户、组、权限来进行访问控制,这当中有很多的缺陷</p>
<p>在selinux中,一切皆对象(进程),有存放在inode的扩展属性域的安全元素所控制其访问</p>
<p>所有文件和端口资源和进程都具备安全标签,这就是安全上下文</p>
<p><strong>安全上下文有五个元素组成</strong></p>
<p>system_u:object_r:admin_home_t:s0</p>
<p>user:role:type:sensitivity:category</p>
<p>user:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由进程</p>
<p>role:定义文件,进程和用户的用途,文件:object_r,进程和用户:system_r</p>
<p>type:指定数据类型,规则重定义何种进程类型访问何种文件,target策略基于type实现,多服务功用,public_content_t</p>
<p>sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,一个对象有且只有一个sensitivity,分0-15个级别,s0最低,target策略默认使用是s0</p>
<p>category:对于特定组织划分不分层的分类,如FBI secret,NSA secret,一个对象可以有多个category,&nbsp;c0-c1023共1024个分类,target策略不适用category</p>
<p>查看安全上下文</p>
<p>ls &ndash;Z ; ps&nbsp; -Z</p>
<p>期望(默认)上下文:存放在二进制的selinux策略库中</p>
<p>semanage&nbsp; fcontext &ndash;l&nbsp;&nbsp;查看系统中的默认安全上下文</p>
<p>&nbsp;@font-face {</p>
<p>&nbsp;font-family: &ldquo;宋体&rdquo;;</p>
<p>}@font-face {</p>
<p>&nbsp;font-family: &ldquo;Cambria Math&rdquo;;</p>
<p>}@font-face {</p>
<p>&nbsp;font-family: &ldquo;Calibri&rdquo;;</p>
<p>}@font-face {</p>
<p>&nbsp;font-family: &ldquo;@宋体&rdquo;;</p>
<p>}p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 10.5pt; font-family: &ldquo;Calibri&rdquo;,&rdquo;sans-serif&rdquo;; }.MsoChpDefault { font-family: &ldquo;Calibri&rdquo;,&rdquo;sans-serif&rdquo;; }div.WordSection1 { &nbsp;}&nbsp;</p>
<p align="center"><img alt="" src="https://img.jbzj.com/file_images/article/201704/2017040616093228.jpg" /></p>
<p><strong>selinux</strong><strong>策略</strong></p>
<p>对象(object):所有可以读取的对象,包括文件、目录和进程,端口等</p>
<p>主体:进程称为主题(subject)</p>
<p>selinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain标签。domain标签能够执行的操作由安全策略里定义</p>
<p>当一个subject视图访问一个object,kernel中的粗略执行服务器将检查AVC,在AVC中,subject和object的权限被缓存,查找应用+文件的安全环境,然后根据查询结果允许或拒绝访问</p>
<p>安全策略:定义主体读取对象的规则数据库,规则中记录了那个类型的主体使用了那个方法读取哪一个对象是允许还是拒绝的,并且定义了那种行为是允许或拒绝</p>
<p><strong>设置</strong><strong>selinux</strong></p>
<p>配置selinux</p>
<p>selinux是否启用</p>
<p>给文件重新打安全标签</p>
<p>给端口设置安全标签</p>
<p>设定某些操作的布尔型开关</p>
<p>selinux的日志管理</p>
<p><strong>selinux</strong><strong>的状态</strong></p>
<p>enforcing:强制,每个受限的进程都必然受限</p>
<p>permissive:允许;每个受限的进程违规操作不会被禁止,但会被记录与审计日志</p>
<p>disabled:禁用,允许任何操作</p>
<p>getenforce:获取selinux当前状态</p>
<p>sestatus:查看selinux状态</p>
<p>setenforce&nbsp; 0|1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:设置为permissive</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1:设置为enforcing</p>
<p>配置文件</p>
<p>/etc/sysconfig/selinux链接文件链接到/etc/selinux/config</p>
<p>/etc/selinux/config&nbsp;</p>
<p># This file controls the state of SELinux on the system.</p>
<p># SELINUX= can take one of these three values:</p>
<p>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enforcing &ndash; SELinux security policy is enforced.</p>
<p>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; permissive &ndash; SELinux prints warnings instead of enforcing.</p>
<p>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disabled &ndash; SELinux is fully disabled.</p>
<p>SELINUX=enforcing</p>
<p># SELINUXTYPE= type of policy in use. Possible values are:</p>
<p>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; targeted &ndash; Only targeted network daemons are protected.</p>
<p>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strict &ndash; Full SELinux protection.</p>
<p>SELINUXTYPE=targeted</p>
<p>SELINUX=enforcing&nbsp;设置selinux的状态</p>
<p>SELINUXTYPE=targeted&nbsp;设置selinux的工作类型</p>
<p>设置selinux也可以在开机的时候设定,在/boot/grub/grub.conf文件内核那一行后面设定selinux的状态selinux=0|1,只要配置文件或内核设定为禁用,最后selinux的状态为禁用</p>
<p>注意:在从disabled状态切换至enforcing或permissive状态需要重启系统,这时候系统会对每一个文件一一重打标签,需要花费一定的时间。</p>
<p><strong>修改</strong><strong>selinux&nbsp;</strong><strong>的安全标签</strong></p>
<p>给文件重新打安全标签</p>
<p>chcon&nbsp; &hellip;&nbsp; [-u&nbsp; USER]&nbsp; [-r&nbsp; ROLE] [-l RANGE] [-t TYPE] FILE..</p>
<p>chcon &hellip; &ndash;reference=RFILE FILE..</p>
<p>&nbsp;&nbsp; -R:递归打标,对目录而言</p>
<p>例如我想给自己定义的web文档根目录自定义为/htdocs</p>
<p>chcon -R&nbsp;&nbsp; httpd_sys_content_t&nbsp;&nbsp; /htdocs</p>
<p>恢复目录或文件默认的安全上下文</p>
<p>resotrecon&nbsp; [-R]&nbsp; /path/to/somewhere</p>
<p>例如:我又将web的文档根目录改为原来的目录,这时候自定义的目录的标签需要还原</p>
<p>restorecon &nbsp;-R &nbsp;&nbsp;/htdocs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>恢复是根据策略库当中的策略进行还原</p>
<p><strong>默认安全上下文查询与修改</strong></p>
<p>semanage来自policycoreutils-python包,有些系统默认没有安装,安装次包即可使用semanage命令</p>
<p>查看默认的安全上下文</p>
<p>semanage fcontext &ndash;l</p>
<p align="center"><img alt="" src="https://img.jbzj.com/file_images/article/201704/2017040616093229.jpg" /></p>
<p>添加安全上下文</p>
<p>semanage fcontext&nbsp; -a &ndash;t &nbsp;httpd_sys_content_t &lsquo;/home/hadoop(/.*)?&rsquo;</p>
<p>restorecon &ndash;Rv&nbsp; /home/hadoop&nbsp;&nbsp;此步骤一定不能忘记,它从策略库进行还原安全上下文,执行此命令才会生效</p>
<p>删除安全上下文</p>
<p>semanage fcontext &ndash;d &ndash;t httpd_sys_content_t &lsquo;/home/hadoop(/.*)?&rsquo;</p>
<p><strong>selinux</strong><strong>端口标签</strong></p>
<p>查看端口标签</p>
<p>semanage&nbsp; port&nbsp; -l</p>
<p align="center"><img alt="" src="https://img.jbzj.com/file_images/article/201704/2017040616093230.jpg" /></p>
<p>添加端口</p>
<p>semanage port&nbsp; -a&nbsp; -t&nbsp; port_label &ndash;p&nbsp; tcp|udp&nbsp; port</p>
<p>semanage port &ndash;a &nbsp;-t htt_port_t&nbsp;&nbsp; -p tcp&nbsp;&nbsp; 8080</p>
<p>删除端口</p>
<p>semanage port &nbsp;-d&nbsp; -t port_label&nbsp; -p tcp|udp&nbsp; port</p>
<p>semanage port&nbsp; -d&nbsp; -t&nbsp; htt_port_t&nbsp; -p tcp 8080</p>
<p>修改现有(已存在)端口为新标签</p>
<p>semanage&nbsp; port&nbsp; -m &ndash;t port_label &ndash;p tcp|udp&nbsp; port</p>
<p>semanage port &ndash;m &ndash;t&nbsp; ssh_port_t &ndash;p tcp 8080&nbsp;&nbsp;&nbsp;将ssh服务的端口改为8080</p>
<p><strong>selinux</strong><strong>布尔值</strong></p>
<p>查看布尔值命令</p>
<p>getsebool [-a] </p>
<p>semanage&nbsp; boolean &ndash;l&nbsp; -C&nbsp;&nbsp;查看修改过的布尔值</p>
<p>设置bool值命令</p>
<p>setsebool [-P] boolean&nbsp; value&nbsp;(on|off|1|0)</p>
<p>setsebool&nbsp; httpd_enable_homedirs&nbsp; on|1&nbsp;&nbsp;开启httpd家目录访问,但不会写入策略库中</p>
<p>setsebool&nbsp; -P&nbsp;&nbsp; httpd_enable_homedirs&nbsp; on|1</p>
<p>修改bool值时后面的值可以对布尔值类型后跟=加值的设置方法</p>
<p>setsebool&nbsp; httpd_enable_homedirs=on</p>
<p><strong>selinux</strong><strong>的日志管理</strong></p>
<p>需要安装settroublesshoot*安装此包需要重启系统才能生效,它会将错误日志记录到/var/log/message</p>
<p>grep setroubleshoot&nbsp; /var/log/message</p>
<p>sealer&nbsp; -l&nbsp; UUID</p>
<p>查看安全事件日志说明</p>
<p>sealert&nbsp; -a&nbsp; /var/log/audit/audit.log</p>
<p align="center"><img alt="" src="https://img.jbzj.com/file_images/article/201704/2017040616093231.png" /></p>
<p>扫描并分析日志</p>
<p>yum -y install selinux-policy-devel(centos7)</p>
<p>yum &ndash;y install selinux-policy-doc&nbsp;(centos6)</p>
<p>mandb | makewhatis&nbsp;需要更新man帮助的数据才能查询</p>
<p>man -k _selinux</p>
<p>例如man&nbsp; httpd_selinux</p>
<p align="center"><img alt="" src="https://img.jbzj.com/file_images/article/201704/2017040616093232.png" /></p>
<p>总结:selinux在安全防护上确实起到了一定的作用,它是在内核层面来工作,往往有许多的漏洞,一旦黑客利用漏洞入侵系统后果不堪设想,还有其 操作的繁琐和稳定性的欠缺的导致很多企业不愿意用到selinux ,一般都会使用硬件的安全防护设备,所以我们只需要作为了解,知道有这么个东西,如何开关闭及一些简单的操作即可。</p>
頁: [1]
查看完整版本: CentOS上的安全防护软件Selinux详解