SELinux( Security Enhanced Linux 安全性增强的Linux),由美国国家安全局NSA(National Security Agency)开发,构建与Kernel之上,拥有灵活的强制性访问控制结构,主要用在提高Linux的安全性,提供强健的安全保证,可以防御未知攻击,据称相当于B1级的军事安全性能(信息安全评估标准)!
信息安全评估标准:4类(D,C,B,A),7个级别:D,C1,C2,B1,B2,B3,A
Selinux已经整合到了2.6的Kernel以上的版本中
传统的Linux在没有Selinux保护的时候,倘若运行于之上的服务器被骇客攻陷,其服务器最高权限就可能随之丧失,但是倘若有了SElinux的保护,入侵的也只有服务本身,整个服务器的最高权限依然还健在!
一句话熟悉Selinux的作用:增强Linux系统安全性,一个例子:那么是我运行的Apache服务器被入侵,也只是入侵到了我httpd这个服务,可以把它禁锢到这里(相当于整个服务器运行了httpd,入侵了httpd而已),而系统的整个权限依然正常!
SELinux(Security Enhanced Linux)提供了一个额外的系统安全层。SELinux 可用于解答:<主体>是否可以针对<对象>进行<操作>?。例如:一个 web 服务器是否可以对用户目录中的文件进行访问?
系统管理员一般无法通过基于用户、组群和其它权限(称为 Discretionary Access Control,DAC)的标准访问策略生成全面、精细的安全策略。例如,限制特定应用程序只能查看日志文件,而同时允许其他应用程序在日志文件中添加新数据。
SELinux 使用强制访问控制(Mandatory Access Control,简称 MAC)。每个进程和系统资源都有一个特殊的安全性标签,称为 SELinux 上下文( context)。SELinux 上下文有时被称为 SELinux 标签,它是一个提取系统级别细节并专注于实体的安全属性的标识符。这不仅提供了在 SELinux 策略中引用对象的一个一致方法,而且消除了在其他身份识别系统中可能存在的模糊性。例如,某个文件可以在使用绑定挂载的系统中有多个有效的路径名称。
SELinux 策略在一系列规则中使用这些上下文,它们定义进程如何相互交互以及与各种系统资源进行交互。默认情况下,策略不允许任何交互,除非规则明确授予了相应的权限。
注意 请记住,对 SELinux 策略规则的检查是在 DAC 规则后进行的。如果 DAC 规则已拒绝了访问,则不会使用 SELinux 策略规则。这意味着,如果传统的 DAC 规则已阻止了访问,则不会在 SELinux 中记录拒绝信息。 |
SELinux 上下文包括以下字段: user(用户)、role(角色)、type(类型)和 security level(安全级别)。在 SELinux 策略中,SELinux 类型信息可能是最重要的。这是因为,最常用的、用于定义允许在进程和系统资源间进行的交互的策略规则会使用 SELinux 类型而不是 SELinux 的完整上下文。SELinux 类型以 _t 结尾。例如:网页服务器的类型名称为 httpd_t。在 /var/www/html/ 中的文件和目录的类型上下文是 httpd_sys_content_t。在 /tmp 和 /var/tmp/ 中的文件和目录的类型上下文是 tmp_t。web 服务器端口的类型上下文是 http_port_t。
存在一个策略规则,它允许 Apache(web 服务器进程作为 httpd_t 运行)访问 /var/www/html/ 和其它web 服务器目录中带有上下文的文件和目录(httpd_sys_content_t)。而在 /tmp 和 /var/tmp/ 中的文件的策略没有允许规则,因此不允许对它们进行访问。因此,当使用 SELinux 时,即使 Apache 被破坏,一个恶意的脚本可以访问它,也无法访问 /tmp 目录。
通过 SELinux 以安全的方式运行 Apache 和 MariaDB 的示例。
在上例中,SELinux 允许以 httpd_t 运行的 Apache 进程访问 /var/www/html/ 目录,并拒绝同一进程访问 /data/mysql/ 目录,因为 httpd_t 和 mysqld_db_t 类型上下文没有允许规则。另一方面,作为mysqld_t 运行的 MariaDB 进程可以访问 /data/mysql/ 目录,SELinux 也会正确地拒绝使用 mysqld_t 类型的进程来访问标记为 httpd_sys_content_t 的 /var/www/html/ 目录。
SELinux 提供以下优点:
但是,SELinux 本身并不是:
SELinux 旨在增强现有的安全解决方案,而不是替换它们。即使运行 SELinux,仍需要遵循好的安全实
践,如保持软件更新、使用安全的密码、使用防火墙。
1:MAC(Mandator Access Control) 对访问控制彻底化,对所有的文件,目录,端口的访问,都是基于策略设定的,这些策略都是由管理员设定的,一般用户无权限管理和更改
2:RBAC(Role Base Access Control) 对用户只赋予最小权限,对于用户来说,被划分一些role,即使是root用户,你要是不在sysadm_r里,也不能实行sysadm_t的管理操作
3:TE(Type Enforcement) 对进程只赋予最小运行权限,TE的概念在SElinux中非常重要,其特点是对文件赋予一个叫type的标签类型,对进程赋予一个叫domain的标签,可以规定某个标签进程只能执行某类文件,例如:
我们熟悉的apache服务器,httpd进程只能在httpd_t 里运行,这个httpd_t 的domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t,密码文件赋予shadow_t,TCP的80端口赋予 http_port_t等等。如果在access vector里我们不允许 http_t来对http_port_t进行操作的话,Apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为 httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(read only)
一句话:SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。(这个进程只能执行某些标签的操作,你有了这个用户权限,也只能干这个标签的事儿)
首先有系统策略,subject去访问object的时候,也会去看系统策略
当一个subject(如: 一个应用)试图访问一个object(如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节位于/var/log/messages中。
只有当你系统策略和Selinux的策略都通过时,才能正常访问!
SELinux 是一个内置在 Linux 内核中的 Linux 安全模块(LSM)。内核中的 SELinux 子系统由安全策略驱动,该策略由管理员控制并在引导时载入。系统中所有与安全性相关的、内核级别的访问操作都会被SELinux 截取,并在加载的安全策略上下文中检查。如果载入的策略允许操作,它将继续进行。否则,操作会被阻断,进程会收到一个错误。
SELinux 决策(如允许或禁止访问)会被缓存。这个缓存被称为 Access Vector Cache(AVC)。通过使用这些缓存的决定,可以较少对 SELinux 策略规则的检查,这会提高性能。请记住,如果 DAC 规则已首先拒绝了访问,则 SELinux 策略规则无效。
A访问B,系统权限,Selinux
Selinux 启动(AVC)---优先查找AVC----若拒绝----查看Selinux Security Server—放入AVC---访问
[root@taijitao63 ~]# vim /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced. 强制模式,只要Selinux不允许,就无法执行,默认操作模式,在 enforcing 模式下 SELinux 可正常运行,并在整个系统中强制实施载入的安全策略。
# permissive - SELinux prints warnings instead of enforcing. 警告模式,将事件记录,依然执行,在 permissive 模式中,系统会象 enforcing 模式一样加载安全策略,包括标记对象并在日志中记录访问拒绝条目,但它并不会拒绝任何操作。不建议在生产环境系统中使用 permissive 模式,但permissive 模式对 SELinux 策略开发和调试很有帮助。
# disabled - No SELinux policy is loaded. 关闭Linux
SELINUX=disabled #默认启用,我们的实验环境关闭了,启用需要重启系统
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected, 这对主要的网络服务进行保护如apache,sendmail,bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。
# mls - Multi Level Security protection. 多层安全保护,MLS策略确保有适当许可(clearance)的Subject访问特定分类(classification)的Object。什么人什么等级可以访问不同内容!了解即可!
# Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。
SELINUXTYPE=targeted #默认为targeted
[root@taijitao63 ~]# rpm -qa | grep selinux //与selinux相关软件包,默认已经安装
libselinux-utils-2.0.94-5.3.el6_4.1.x86_64
libselinux-devel-2.0.94-5.3.el6_4.1.x86_64
selinux-policy-3.7.19-231.el6.noarch
libselinux-python-2.0.94-5.3.el6_4.1.x86_64
selinux-policy-targeted-3.7.19-231.el6.noarch
libselinux-2.0.94-5.3.el6_4.1.x86_64
[root@taijitao63 ~]# ls /etc/sysconfig/selinux //配置文件位置
[root@taijitao63 ~]# getenforce //查看当前selinux的运行状态
[root@taijitao63 ~]# vim /etc/sysconfig/selinux //编辑selinux配置文件,启用selinux
……
SELINUX=enforcing #启用selinux,启用了Selinux需要重启系统,初次开启,需要更新文件标签,时间较久
……
Selinux状态切换
使用 setenforce 工具在 enforcing 和 permissive 模式间进行切换。使用 setenforce 所做的更改在重启后不会被保留。要改为使用 enforcing 模式,以 Linux 根用户身份输入 setenforce 1 命令。要改为使用permissive 模式,输入 setenforce 0 命令。使用 getenforce 实用程序查看当前的 SELinux 模式
[root@taijitao63 ~]# setenforce 0 //enforcing切换为permissive状态
[root@taijitao63 ~]# getenforce
Permissive
[root@taijitao63 ~]# setenforce 1 //permissive切换为 enforcing
[root@taijitao63 ~]# getenforce
Enforcing
在 Red Hat Enterprise Linux 中,您可以在系统处于 enforcing 模式时,将独立的域设置为 permissive 模式。例如,使 httpd_t 域为 permissive 模式:
# semanage permissive -a httpd_t
请注意,permissive 域是一个强大的工具,它可能会破坏您系统的安全性。红帽建议谨慎使用 permissive域,如仅在调试特定情境时使用。
在引导时,您可以设置几个内核参数来更改 SELinux 的运行方式:
enforcing=0
设置此参数可让系统以 permissive 模式启动,这在进行故障排除时非常有用。如果您的文件系统被破坏,使用 permissive 模式可能是唯一的选择。在 permissive 模式中,系统将继续正确创建标签。在这个模式中产生的 AVC 信息可能与 enforcing 模式不同。
在 permissive 模式中,只报告来自于同一拒绝的一系列操作的第一个拒绝信息。然而,在 enforcing模式中,您可能会得到一个与读取目录相关的拒绝信息,应用程序将停止。在 permissive 模式中,您会得到相同的 AVC 信息,但应用程序将继续读取目录中的文件,并为因为每个拒绝额外获得一个AVC。
selinux=0
这个参数会导致内核不载入 SELinux 构架的任意部分。初始化脚本会注意到系统使用 selinux=0 参数引导,并创建 /.autorelabel 文件。这会导致系统在下次使用 SELinux enabled 模式引导时自动重新标记。
关闭Selinux可以通过内核传递参数来控制
[root@taijitao63 ~]# vim /boot/grub/grub.conf
……
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=31f87693-32fa-4811-b5d4-7a5d35586f44 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet selinux=0 #末尾添加selinux=0关闭selinux
……
或者在开机时编辑grub界面,给内核传递一个参数selinux=0 方法和进入单用户方式一样,不过是一次有效
上图,按E键,进入单用户模式
上图按E键,添加内核参数selinux=0
回车,按B键启动操作系统
[root@taijitao63 ~]# getenforce
Disabled
[root@taijitao63 ~]# vim /etc/sysconfig/selinux
……
SELINUX=enforcing #配置文件还是启用的,所以内核控制生效,如果在grub.conf配置文件,永久生效,启动单用户模式配置,当次有效,重启selinux将启用
……
[root@taijitao63 ~]# reboot //重启会更新标签,是个”漫长”的过程
配置selinux之前,我们需要先了解几个概念
Security context:安全文本,安全上下文(安全环境),也就是一个访问控制属性,可以理解为rwx的权限,也就是权限的一种,为了方便记忆!由以下内容构成
System_u:object_r:httpd_sys_content_t 三段分别为 用户:角色:类型
(policy 策略,控制规则,那些进程可以访问那些资源)
当selinux启动时,Linux中所有的文件与对象都有安全上下文,进程的安全上下文是域domain,不必苛刻地去区分或避免使用术语域,通常,我们认为【域】、【域类型】、【主体类型】和【进程类型】都是同义的,即都是安全上下文中的“TYPE”。
1:系统根据pam子系统中的/lib64/security/pam_selinux.so模块设定登陆者运行程序安全的上下文
2:rpm包会根据rpm包内的记录生成安全上下文
3:如果是手工他键的,会根据policy中的规定来设置上下文
4:如果是cp,或重新生成上下文
5:mv的,上下文不变
安全上下文三段组成你:user:role:type (用户,角色,类型),现在分别说明
User:类此系统中的UID,提供身份识别,安全上下文的一部分
三种常见的user: user_u 普通用户登录系统后的预设
system_u 开机过程中系统进程的预设,系统用户(程序用户),管理员
unconfined_u 非限制,无意义,没有任何定义用户
root 部分安全上下文,直接是root用户为预设
Role:集中常见的角色
文件与目录的role: object_r
程序的role: system_r
用户的role类似于系统的gid,不同过的角色具有不同过的权限,用户可以具备很多个role,但是同一时间只能使用一个role!
注意:预设的targeted中,user和role通常是不重要的,重要的在于type上,基本上,一个主题程序能不能读取这个文件资源,与type有关,而type在文件与程序上的定义又不太相同
Type:最重要的部分,有两种叫法
type:在文件资源Object上面为type
domain:在主题程序subject称为领域,也就是前面说的我们可以理解为进程类型和与视为同一物
type用来将主体与客体划分为不同的组,组每个主体和系统中的客体定义一个类型,为进程提供最低权限的运行环境!
Selinux增强系统安全性,还会涉及到几个概念,我们一一说明,包括bool值,通过几个实验知道为什么系统权限给足了,但是还是没有办法正常工作等问题
[root@taijitao63 ~]# touch a.txt
[root@taijitao63 ~]# ls -Z a.txt //-Z=context,查看文件上下文
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
#unconfined_u:object_r:admin_home_t
#第一段unconfined_u代表用户,root表示root账户身份,user_u代表无特权用户,system_u标识系统用户,搭配角色一起使用,这里无定义
#第二段boject_r代表角色,普通文件和目录都为object_r角色,system_r为进程角色,
#第三段是selinux最重要的类型,这里是admin_home_t的类型
[root@taijitao63 ~]# ll -Z -d /root/
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root/
#系统用户:目录或文件:admin_home_t类型
[root@taijitao63 ~]# useradd find //新建一个普通用户
[root@taijitao63 ~]# ll -Z -d /home/find/ //查看普通用户家目录的上下文
drwx------. find find unconfined_u:object_r:user_home_dir_t:s0 /home/find/
[root@taijitao63 ~]# ll -d -Z /etc/
drwxr-xr-x. root root system_u:object_r:etc_t:s0 /etc/
普通用户创建完成之后,查看上下文
[root@taijitao63 ~]# su - find
[find@taijitao63 ~]$ touch /tmp/b.txt
[find@taijitao63 ~]$ ll -Z /tmp/b.txt
-rw-rw-r--. find find unconfined_u:object_r:user_tmp_t:s0 /tmp/b.txt
当年我们需要修改一个文件或目录的上下文的时候,我么你可以借鉴同级别的上下文类型,并不知道预设了那些类型,通过移值借鉴达到目的!
项目 |
说明 |
Unconfiged_ |
未设置类别 |
Default_t |
默认类别 |
Mnt_t |
代表挂载点的类型,/mnt/中的文件属于这个类别 |
Boot_t |
作为开机文件的类型,/boot/中文件属于这个类别 |
Bin_t |
作为二进制执行文件,/bin中多数属于这个类别 |
Sbin_t |
作为系统管理类型的文件,/sbin中属于这个类别 |
Device_t |
代表设备文件. /dev 下属于这个类别 |
Lib_t |
连接库类型 |
Var_t |
…… |
Usr_t |
……… |
Etc_t |
…….. |
Tty_device_t |
代表终端机或控制台设备 |
Su_exec_t |
具备SU功能的执行文件 |
Java_exec_t |
JAVA相关的执行文件 |
Public_content_t |
公共内容类型的文件。如:FTP,NFS等服务器文件 |
Shadow_t |
代表存储密码文件的类型 |
Httpd_t |
作为HTTP文件的相关类别 |
[root@taijitao63 ~]# ls /etc/selinux/targeted/contexts/ //一些预设值在这儿,了解即可
dbus_contexts failsafe_context netfilter_contexts sepgsql_contexts virtual_domain_context
default_contexts files removable_context userhelper_context virtual_image_context
修改目录及目录下所有文件的安全上下文
使用到的命令是chcon,语法:#chcon -u[user] -r[role] -t[type] -R[递归] 对象
[root@taijitao63 ~]# ll -Z -d /tmp/abc/
drwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/abc/
[root@taijitao63 ~]# chcon -R -t samba_share_t /tmp/abc/
[root@taijitao63 ~]# ll -Z -d /tmp/abc/
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 /tmp/abc/
当你不知道是什么类型的时候,参考一下服务器中其他文件(最后拓展一下类型查询,意义不大)
[root@taijitao63 ~]# echo "AAAAAAAAAAAAAAAAAAA" > /var/www/html/a.html
[root@taijitao63 ~]# ll /var/www/html/a.html -Z //此类方式生成的是属于apache的安全上下文
[root@taijitao63 ~]# echo "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" > b.html
[root@taijitao63 ~]# ll -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 a.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 b.html #通过mv一走过去的,是当前/root目录的上下文
[root@taijitao63 ~]# service httpd restart // 重启服务测试
http://192.168.1.63/a.html OK http://192.168.1.63/b.html 不OK
[root@taijitao63 ~]# mv b.html /var/www/html/
[root@taijitao63 ~]# setenforce 0 //临时关闭Selinux,测试
http://192.168.1.63/b.html 的访问,OK,证明是selinux的原因
[root@taijitao63 ~]# setenforce 1 //启用selinux
[root@taijitao63 ~]# chcon --reference=/var/www/html/ /var/www/html/b.html
//--reference 使用=后面的文件的安全上下文为/var/www/html/b.html的安全上下文
[root@taijitao63 ~]# ll -Z !$
ll -Z /var/www/html/b.html
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/b.html
然后再测试
复制一个文件或者目录树,安全上下文会改变为目标目录的类型
[root@taijitao63 ~]# echo TTTTTTTTTTT > c.html
[root@taijitao63 ~]# ll -Z c.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 c.html #新建的时候是adm_home_t的类型
[root@taijitao63 ~]# cp c.html /var/www/html/
[root@taijitao63 ~]# ll -Z !$
ll -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 a.html
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 b.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 c.html #复制过来,类型改为了/var/www/html的类型
测试:http://192.168.1.63/c.html OK
MV移动的时候,保留了当前文件的安全上下文类型
默认的规则位置:
[root@taijitao63 ~]# ls /etc/selinux/targeted/contexts/files/
file_contexts file_contexts.homedirs media
#file_contexts就是默认规则位置,部分版本会有file_context.local这个文件也是
[root@taijitao63 ~]# vim /etc/selinux/targeted/contexts/files/file_contexts //查看
……
/var/www(/.*)? system_u:object_r:httpd_sys_content_t:s0 #这个就是www目录服务的默认规则,安全上下文默认类型
……
如果我们修改了某些文件,忘记了当初是什么安全类型,可以使用restorecon恢复默认的预设值
[root@taijitao63 ~]# ll -Z /etc/ntp.conf
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/ntp.conf
[root@taijitao63 ~]# chcon -t var_t /etc/ntp.conf //修改它的安全上下文的类型
[root@taijitao63 ~]# ll -Z /etc/ntp.conf
-rw-r--r--. root root system_u:object_r:var_t:s0 /etc/ntp.conf
[root@taijitao63 ~]# restorecon -v /etc/ntp.conf //恢复默认值,-v显示相信信息
restorecon reset /etc/ntp.conf context system_u:object_r:var_t:s0->system_u:object_r:net_conf_t:s0
[root@taijitao63 ~]# ll -Z /etc/ntp.conf
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/ntp.conf #已经正常,恢复默认了
查看selinux策略:作用,指定进程可以访问那些文件
一个完整的selinux,除了安全上下文,还有bool值,就是对安全上下文的一个扩充
[root@taijitao63 ~]# getsebool -a //获取本机的selinux策略值
……
xen_use_nfs --> off
xguest_connect_network --> on
xguest_mount_media --> on
xguest_use_bluetooth --> on
xserver_object_manager --> off
zabbix_can_network --> off
selinux一个完整,是通过两个部分完成的,一个是安全上下文,另外一个就是策略,也就是bool值,bool是对安全上下文的补充。
Selinux规范了许多bool数值清单档案,提供开启或关闭的存取项目,这些值都存放在/selinux/Booleans/目录内相关文件中,这些值只有两种1,0(on,off)即启用关闭,也就是bool值!
布尔值是“真” True 或“假” False 中的一个。动作脚本也会在适当时将值 True 和 False 转换为 1 和 0。布尔值经常与动作脚本语句中通过比较控制脚本流的逻辑运算符一起使用。
我们给足用户权限,如果开启了selinux的话,普通用户还是不可以在自己家目录下上传下载文件(默认会切换到自己的家目录)
[root@taijitao63 ~]# useradd find
[root@taijitao63 ~]# echo find:123456 | chpasswd
[root@taijitao63 ~]# setenforce 0
[root@taijitao63 ~]# yum install -y vsftpd lftp
[root@taijitao63 ~]# service vsftpd restart
[root@taijitao63 ~]# lftp [email protected] //使用find登陆测试
lftp [email protected]:~> put a.txt
lftp [email protected]:~> ls
rw-r--r-- 1 501 501 0 Oct 23 06:52 a.txt
[root@taijitao63 ~]# setenforce 1
[root@taijitao63 ~]# lftp [email protected]
lftp [email protected]:~> ls
ls: Login failed: 500 OOPS: cannot change directory:/home/find
解决办法
[root@taijitao63 ~]# getsebool -a | grep ftp_home
ftp_home_dir --> off
[root@taijitao63 ~]# setsebool -P ftp_home_dir=on
[root@taijitao63 ~]# lftp [email protected]
lftp [email protected]:~> ls //未报错了
匿名用户我们同样给足权限,按时默认我们还是没有办法上传文件
[root@taijitao63 ~]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES #把这两行启用
anon_mkdir_write_enable=YES
[root@taijitao63 ~]# service vsftpd restart
[root@taijitao63 ~]# chmod 777 /var/ftp/pub/
[root@taijitao63 ~]# lftp 192.168.1.63 //匿名用户登录
lftp 192.168.1.63:~> ls
drwxr-xr-x 2 0 0 4096 Feb 12 2013 pub
lftp 192.168.1.63:/> cd pub
lftp 192.168.1.63:/pub> put a.txt
put: Access failed: 553 Could not create file. (a.txt)
lftp 192.168.1.63:/pub> exit
[root@taijitao63 ~]# setenforce 0 //关闭selinux测试一下
[root@taijitao63 ~]# lftp 192.168.1.63
lftp 192.168.1.63:/> cd pub
lftp 192.168.1.63:/pub> put a.txt
lftp 192.168.1.63:/pub> ls
-rw------- 1 14 50 0 Oct 23 07:01 a.txt
[root@taijitao63 ~]# setenforce 1 //selinux启用
[root@taijitao63 ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off #此项就是匿名用户能否上传,开启了selinux之后,默认拒绝
……
[root@taijitao63 ~]# setsebool -P allow_ftpd_anon_write=on
[root@taijitao63 ~]# lftp 192.168.1.63 //再次测试
lftp 192.168.1.63:/> cd pub
lftp 192.168.1.63:/pub> put install.log
put: Access failed: 553 Could not create file. (install.log) #上传还是失败
解决办法,检车目录类型
[root@taijitao63 ~]# ll -Z /var/ftp/pub/
-rw-------. ftp ftp unconfined_u:object_r:public_content_t:s0 a.txt
[root@taijitao63 ~]# chcon -t public_content_rw_t /var/ftp/pub
[root@taijitao63 ~]# lftp 192.168.1.63 // 再测试
lftp 192.168.1.63:~> cd pub
lftp 192.168.1.63:/pub> put install.log
59386 bytes transferred
yum provides “*/seinfo” #查看seinfo命令由那个包提供
需要使用到一个工具,seinfo
[root@taijitao63 ~]# seinfo [-trub]
选项与参数:
-t :列出 SELinux 的所有类别 (type) 种类
-r :列出 SELinux 的所有角色 (role) 种类
-u :列出 SELinux 的所有身份识别 (user) 种类
-b :列出所有守则的种类 (布林值)
[root@taijitao63 ~]# seinfo -t | grep ftp //列出ftp相关的安全上下文类型
ftpd_var_run_t
tftpd_var_run_t
ftpd_etc_t
ftpd_initrc_exec_t
ftp_data_client_packet_t
ftpdctl_exec_t
……
[root@taijitao63 ~]# sesearch -t public_content_rw_t --all //查询一个类型的作用,也可以查bool
使用semanage工具设置为预设值,那么我们就可以使用restorecon恢复到这个值
[root@taijitao63 ~]# yum install -y policycoreutils-python
[root@taijitao63 ~]# mkdir /web
[root@taijitao63 ~]# ll -Z -d /web/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /web/
[root@taijitao63 ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
[root@taijitao63 ~]# restorecon -v /web/
restorecon reset /web context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[root@taijitao63 ~]# ll -Z -d /web/
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /web/
[root@taijitao63 ~]# vim /etc/samba/smb.conf
……
# Set labels only on directories you created!
# To set a label use the following: chcon -t samba_share_t /path
#
# If you need to share a system created directory you can use one of the
# following (read-only/read-write):
# setsebool -P samba_export_all_ro on
# or
# setsebool -P samba_export_all_rw on
……
根据samba的提示,如果启用了samba的值,那么我们需要配置上面红色的内容了
Server192.168.1.63================================Client192.168.1.64
设置共享目录,共享权限,添加用户
# yum install samba -y
# vim /etc/samba/smb.conf
[share] # 在smb.conf中末尾添加如下一个共享
comment = share for selinux test
path = /share
public = yes
writable = yes
printable = no
# mkdir /share
# pdbedit -a alice //完成这些之后,重启服务
客户端
# mount //192.168.1.63/share /opt -o user=alice,pass=redhat //客户端挂载共享
# ls /opt //发现有一个错误提示:ls: reading directory .: Permission denied
服务端修改selinux相关选项
# chcon -t samba_share_t /share //修改类型标签
# setsebool -P samba_export_all_rw on //bool值添加可以读写
# chmod a+w /share/ //目录可以写权限
客户端测试,,未报错
[root@taijitao63 ~]# yum install -y policycoreutils-gui
[root@taijitao63 ~]# LANG=zh_CN.UTF-8
[root@taijitao63 ~]# system-config-selinux