Linux之SElinux安全上下文件(1)

Linux之SElinux安全上下文件(1)

SELinux:Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Courporation)开发的LInux的一个强制控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后继承在内核中。

访问控制类别:

DAC:Discretionary Access Control 自由访问控制

MAC:Mandatory Access Control 强制访问控制

DAC和MAC的特点:

DAC环境下进程是无束缚的

MAC环境下策略的规则决定控制的严格程度

MAC环境下进程可以被限定的

策略被用来定义被限定的进程能够使用那些资源(文件和端口)

默认情况下,没有被明确允许的行为将被拒绝

SElinux安全上下文工作类型:

strict:centos5,每个进程都受到selinux的控制

targeted:用来保护常见的网络服务,仅有限进程受到 selinux控制,

只监控容易被入侵的进程,rhel4只保护13个服务,rhel5保护88个服务

minimum:centos7,修改过的targeted,只对选择的网络服务。

mls:提供MLS(多级安全)机制的安全性

minimum和mls稳定信不足,未加以应用

为什么会用SElinux

传统的 Linux中一切皆文件,由用户、组、权限控制访问。而在SELinux中一切皆对象(object),由存放在inde表的扩展属性域的安全元素所控制其访问。

安全上下文基本格式说明

所有的文件和端口资源和进程都具备安全标签:安全上下文(security context)组成元素:

user:role:type:sesitivity:category,如

user_u:object_r:tmp_t:s0:c0

实际上下文存放在文件系统中,进程、文件、已经用户等都有相应的安全上下文:

例子:

#查看指定文件的安全上下文
ls  -Z

#查看进程的安全上下文件
ps  Z

#查看用户安全上下文

期望(默认)上下文:

存放在二进制的SELinux策略库(映射目录和期望安全上下文)中:

使用命令

semanage  fcontext  -l   #
可以查看所有默认策略

SELinux策略:

对象(object):所有可以读取的对象,包括文件、目录和进程,端口等

主体:进程称为主体(subject)

SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。domain标签能够执行的操作由安全策略里定义。

当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC(访问矢量缓存Access Vector Cache),在AVC中,subject和object的权限被缓存(cached),查找“应用+文件”的安全环境。然后根据查询结果运行或拒绝访问。

安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一项对象是允许还是拒绝的,并且定义了那种行为是运行或拒绝。

设置SELinux模式及开关使用命令:getnforce status setenforce

getenforce:#获取selinux的当前状态

sestatus:  #查看selinux完整状态

setenforce  0|1#开启或关闭

0:设置为permissive

1:设置为enforcing

配置文件:

/boot/grub/grub.conf在对应的kernel内核参数后面追加

selinux=1 (启用)   selinux=0(禁用)

/etc/sysconfig/selinux

/etc/selinux/config

SELINUX变量有3中参数:

SELINUX={disabled|enforcing|permissive}

基本使用实例:

#关闭当前selinux功能

[[email protected] ~]# setenforce 0

#查看当前selinux状态

[[email protected] ~]# getenforce 
Permissive

#启用当前selinux功能

[[email protected] ~]# setenforce 1

#再次查看当前selinux功能

[[email protected] ~]# getenforce

解析:这里的设置都是立即生效,使用此命令只能开启或关闭,并不能禁用 selinux。

#查看目前系统完整的selinux状态

[[email protected] ~]# sestatus

解析:因为selinux是需要内核或内核模块来支持的,那么也就需要对应的配置文件来提供读取,这里说明了其主配置目录为/etc/selinux,而当前状态为enabled启用状态,也就是说selinux还是可以通过命令来设置是否开启。而当前模式表示其selinux的具体管理方式。

enforcing: 表示完全安装selinux规则在处理。

permissive:表示只是根据selinux规则来进行警告,而不进行权限处理,但会记录。

修改文件的SELinux标签的命令:chcon  restorecon

chcon 命令

chcon - change file SELinux security context

更改文件的selinux安全上下文件

选项与用法:

chcon [option]...  CONTXT  /path/to/file...  #直接对指定的文件写完整的安全上下文字段

chcon [option]...  [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...  #根据上下文类型更改

chcon [option]...  --reference=RFILE  FILE....  #参考RFILE的上下文修改FILE的上下文

-R :如果是目录,将同时递归设置该目录下所有文件

restorecon 命令

restorecon - restore file(s) default SELinux security contexts.

恢复文件或目录默认的SELinux安全上下文

选项与用法:

restorencon  [option]  /path/to/somewhere

-R:递归恢复处理

SELinux规则管理工具命令:semanage

semanage - SELinux Policy Management tool

semange 命令  注:此命令来自policycoreutils-python  RPM包

默认安全文件规则的查询和修改:semanage  

semanage  命令

semanage fcontext [-S store] -{a|d|m|l|n|D} [-frstN] file_spec

用法与实例:

查询信息

#查看默认所有安全上下文列表

semanage fcontext  -l

#添加安全上下文

semanage fcontext -a -t httpd_sys_content_t ‘/testdir(/.*)?’

#删除安全上下文

semanage fcontext -d -t httpd_sys_content_t ‘/testdir(/,*)?’

端口标签的设置

#查询端口标签

semanage port -l

#添加端口

semanage port -a -t port_label -p tcp|udp POST 例如:

semanage port -a -t http_port_t -p tcp 9527

#删除端口

semanage port -d -t port_label -p tcp|udp POST 例如:

semanage port -d -t http_port -t -p tcp 9527

#修改现有端口为新标签

semanage port -m -t port_label -p tcp|udp POST 例如:

semanage port -m -t http_port_t -p tcp 9527

布尔值规则命令:getsebool  setsebool

SELinux布尔值设置

查看bool命令:

getsebool  [-a]  [boolean]

semanage boolean  -l

semanage boolean  -l  -C  #查看修改过的布尔值

设置bool值命令:

setsebool [-P] boolean value (on,off)

setsebool [-P] Boolean=value (0,1)

SELinux日志管理:setrublesshhoot 命令

yum  install  setrublesshooot*  (重启后生效)

setrub会将错误信息写入/var/log/message,使用下面方式查看:

grep  ‘setroubleshoot’  /var/log/messages

sealert  -l  UUID

查看安全时间日志说明

sealert  -a  /var/log/audit/audit.log

扫描并分析日志

获取SELinux的相关帮助信息

yum -y install selinux-policy-devel  #centos7下

yum -y install selinux-policy-doc   #centos6下

mandb | makewhatis  #更新man文档数据库

man  -k  _selinux   #列出selinux关键字相关文档

实战案例:

1、启用SELinx策略并安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,使网站可访问。

#使用yum原安装本地ISO镜像中httpd即可

[[email protected] ~]# yum install httpd -y

#修改配置主配置文件,将DocumentRoot 对应的路径和Direcotry标标签目录改为/webbsite

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf

注意:这两项都要修改,才会完整生效。

#查看修改后的结果

[[email protected] ~]# grep ‘[[:space:]]*DocumentRoot.*\".*\"‘ /etc/httpd/conf/httpd.conf 
DocumentRoot "/website"

#新建/website目录并给其目录添加文件标签规则

[[email protected] ~]# [ ! -d ‘/website‘ ] && mkdir /website

#查看原首页目录/var/www/html 的文件规则类型

[[email protected] ~]# ls -dZ /var/www/html/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

#新建index.html文件内容如下

[[email protected] website]# cat index.html 
<html>
<head>
<title>Welcome to Website directry!!!</title>
</head>
<body><div><ul>
 <li>Welcome to Website directry!!!</li>
</ul></div></body>
</html>

#查看原有的/var/www目录下的默认规则

[[email protected] website]# semanage fcontext -l | grep --exclude=‘.*?‘ ‘/var/www(/.*)?‘
/var/www(/.*)?          all files          system_u:object_r:httpd_sys_content_t:s0

#给/website及其下文件设置文件规则类型,3种方法

(1)执行设置特定值,使用chcon命令

[[email protected] website]# chcon -t httpd_sys_content_t -R /website/

(2)参考/var/www/html目录的规则来设定

[[email protected] website]# chcon -R --reference=‘/var/www/html/‘ /website/

(3)执行给目录添加规则,然后对目录进行递归默认规则还原

[[email protected] website]# semanage fcontext -l | grep -F ‘/var/www(/.*)?‘ | cut -d‘:‘ -f3
httpd_sys_content_t
[[email protected] website]# semanage fcontext -a -t httpd_sys_content_t ‘/website(/.*)?‘
[[email protected] website]# semanage fcontext -l | grep -F ‘/website(/.*)?‘ | cut -d‘:‘ -f3
httpd_sys_content_t
[[email protected] website]# restorecon -R /website/
[[email protected] website]# ls -aZ --ignore=‘..‘ /website
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html

解析:上述三种方法中,前两种如果执行了restorecon还原默认,而默认selinux规则里没有预设,那么会还原其它的默认值,而第三者方法采用直接在selinux规则中对此目录添加预设规则,这样无论怎么修改,只要使用restorecon就可以还原回来。

#启用selinux功能

[[email protected] website]# setenforce  1

#重启httpd服务

[[email protected] website]# service httpd restart

#使用另一条主机使用links工具访问其主页

[[email protected] ~]# links http://192.168.20.136

解析:显示出/website新建的index.html文件内容表示成功。

2、修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问

#修改httpd服务配置文件中Listen监听端口

[[email protected] ~]# sed -i ‘s/^\([[:space:]]*Listen\)[[:space:]]\+[0-9]\+/\1 9527/‘ /etc/httpd/conf/httpd.conf 
[[email protected] ~]# sed -n ‘/^[[:space:]]*Listen[[:space:]]\+[0-9]\+/p‘ /etc/httpd/conf/httpd.conf 
Listen 9527

#因为上面已经重启了服务,这次使用发送SIGHUP信号来重新调用httpd服务

[[email protected] ~]# pkill -SIGHUP ‘httpd‘

#查看原来的httpd默认监听端口80的端口标签类型

[[email protected] ~]# semanage port -l | grep ‘\<80\>‘
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

#添加9527端口进入此标签类型

[[email protected] ~]# semanage port -a -t http_port_t -p tcp 9527

#查看9527端口是否在此列表

[[email protected] ~]# semanage port -l | grep ‘\<9527\>‘
http_port_t                    tcp      9527, 80, 81, 443, 488, 8008, 8009, 8443, 9000

#修改一下/website/index.html的内容

[[email protected] ~]# cat /website/index.html 
<html>
<head>
<title>Welcome to Website directry!!!</title>
</head>
<body><div><ul>
 <li>This is next two!!!</li>
</ul></div></body>
</html>

#使用其它主机通过links统计进行访问9527端口

[[email protected] ~]# links http://192.168.20.136:9527

解析:这里显示和上面修改的body标签里的内容一样,说明已经生效。

3、启用相关的SElinux布尔值,使上述网站的用户student的家目录可通过http访问

#添加httpd.conf文件的用户目录访问配置

说明:找到<If Modulemod_userdir.c>标签在里面注释掉UserDir disabled此行,然后添加一个UserDir public_html行,表示在使用用户加目录下有个此文件会被访问。

#在student 用户家目录新建public_html目录

[[email protected] ~]# cd /home/student/
[[email protected] student]# mkdir -m 711  public_html

#拷贝/website/index.html到此目录下并修改

[[email protected] student]# cp /website/index.html ./public_html/

#修改index.html文件的li标签里的内容,随便改,为了区别显示

[[email protected] student]# grep ‘<li.*/li>‘ ./public_html/index.html 
 <li>This is stuent home</li>

#重新给httpd发送SIG信号

[[email protected] student]# killall -HUP -r ‘httpd‘

#再次访问links

解析:这是因为没有开启相关的httpd用户家目录布尔值导致的,于是修改其boolean值。

#查看httpd的用户目录读取,off为关闭,及提供此功能

[[email protected] student]# getsebool -a | grep ‘http.*user‘
httpd_read_user_content --> off

#修改为on,表示启用访问用户家目录

[[email protected] student]# setsebool httpd_read_user_content on

#再次访问

解析:这就成功了,在目录本身对其它人有相应的执行权限以外,还是要添加一个boolean。

时间: 2024-08-26 10:24:53

Linux之SElinux安全上下文件(1)的相关文章

谢烟客---------Linux之SELinux的基本应用

SELinux基础/激活或关闭SELinux/改变object的域/启用或关闭程序功能 获取更多帮助 <SELinux权威指南> 或许应该叫:如何理解Windows Linux比Windows更安全,这样说不合理. 安全等级: A>B>C>D Linux(c2) Windows(c2) GUI界面:MAC>Windows 图形工作站:mac Windows 专业普及计算机系统.图形不如mac,又不够安全. SELinux基础 1)访问模型 Linux原有访问模型:自主访

Linux之Selinux几种模式之间的转换说明

在linux环境下执行某些程序时,偶尔会遇到来一个关于SELinux的强制模式不可执行的情况,这种情况下需要关闭SELinux或者将enforcing改为 permissive 模式后才能进行执行. selinux是Linux内核中提供的强制访问控制(MAC)系统下面就selinux的几种模式及其转换进行说明: SELinux 的启动.关闭与查看 1.并非所有的 Linux distributions 都支持 SELinux 目前 SELinux 支持三种模式,分别如下: •enforcing:

Linux下MySQL的写文件时权限错误(Errcode: 13)解决方法

在数据库中select * into outfile '/home/mysql/data.sql',mysql又提示错误: ERROR 1 (HY000): Can't create/write to file '/home/mysql/data.sql' (Errcode: 13)   权限错误(Errcode: 13)解决方法 1  查看导出目录的权限 是否有mysql用户写的权限 2 如果有多级目录,要确保到处目录的上级目录有可执行权限,如果是/root目录 700要修改705 否则写不进

DTE Linux、SELinux与SEAndroid之间的对比分析

2000年,美国威廉玛丽学院的研究人员Serge等人在USENIX的4th annual Linux Showcase &Conference会议上发表了题为"Domainand Type Enforcement for Linux"的文章.该文章第一次将DTE模型用于Linux,实现了DTE Linux原型系统. 同年,美国国家安全局NSA的Stephen Smalley等人发布了开源的Linux安全框架SELinux,SELinux第一个版本基于Linux 2.5内核,并采

Linux CentOS安装搭建FTP文件服务

本文环境:centos7,IP=192.168.1.11 1.安装vsftpd和默认配置启动 1.1 安装vsftpd yum install -y vsftpd 1.2 启动vsftpd systemctl start vsftpd 查看vsftpd状态和运行 systemctl status vsftpd 或者 netstat -nltp | grep 21 2.配置vsftpd 2.1 配置路径 vsftpd 的配置目录为 /etc/vsftpd,包含下列的配置文件: vsftpd.con

Linux 是如何管理目录文件?

Linux 是使用级层式的树状结构来管理文件目录,如下图所示(只列出了部分目录文件): 在 Linux 中,所有的文件和目录都由根目录(/)开始.它是所有目录和文件的源头,然后再一个一个分支下去.所以我们表示一个目录文件就从根开始一级级写. 如上图的,rc.sysinit 文件,表示该文件的路径是: /etc/rc.d/rc.sysinit  我们系统查找文件也是从根目录开始一级级往下找的. 我们表示一个目录文件的位置有两种方式: 1.  绝对路径: 表示一个文件时,它的开头一般是"/"

securecrt在linux与windows之间传输文件(转)

摘自:http://blog.csdn.net/rangf/article/details/6096365 SecureCRT这款SSH客户端软件同时具备了终端仿真器和文件传输功能.比ftp命令方便多了,而且服务器不用再开FTP服务了.rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. windows端需要支持ZModem的telnet/ssh客户端,SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可).

Linux下为何都是文件的理解

所谓“文件”,就是在我们的电脑中,以实现某种功能.或某个软件的部分功能为目的而定义的一个单位. Linux都是以文件的形式存在,当我们访问某个文件(Linux中的文件有目录,连接,普通文本),由于Linux的文件的类型 而区分:如连接文件等,那使用这个文件时,那么就是调用了某个命令: 如普通文本文件时,那么当使用这个文件时,那就是访问该文件的内容 由于文件的类型的不同,从而区别于window系统下的应用:如播放器,EditPlus,浏览器,文件夹等,这些在Linux中都有 对于的不同类型的文件!

Linux下的删除过期文件操作

在实际的软件开发项目中,经常会有实现删除过期文件的需求.即要求程序能够自动删除多长时间之前生成的文件.本文提供了一个示例代码,为相关的开发工作提供了参考. 程序如下(本程序用makefile进行编译): /*********************************************************************** 版权所有 (C)2014, Zhou Zhaoxiong.* * 文件名称: TestFileDelete.c* 内容摘要: 用于演示Linux下过期