selinux
selinux - NSA Security-Enhanced Linux
(SELinux)
selinux不是防火墙,他可以和iptables,pam,系统权限等共存
简单的说:selinux就是在原来的r,w,x,s,t系统权限的基础上扩展了很多其它权限。比如:httpd服务的内容,原来基本就只有是否能读,是否能写的权限。加上selinux还得加上端口是否能换,不同地方拷来的文件是否权限一样,家目录是否能换,等等
把selinux做个比方:
就象一个公司加了非常多的规章制度(相比于selinux来说,规章制度可能有成千上w,甚至几十W条),细小到类似规定上班时间上厕所的次数,每次最多几分钟等)
类似于一套安防系统(对本人和小偷都有效)
访问者subject(user或role):也就是程序
目标object:要访问的目标文件或目录或进程
安全上下文context:类似系统的rwx权限
政策规则policy:(包括bool值,使用getsebool -a查看)
# ll -Z /etc/yp.conf
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/yp.conf
# ll -Z /etc/fstab
-rw-r--r-- root root ? /etc/fstab
比较上面的两文件区别
1,一个权限九位后面有一个点,另一个没有点.(有点号表示有selinux相关的策略和安全上下文;没点则相反)
为什么有的有点号,有的没点号?
这说明这个操作系统以前是打开selinux的(rhel6安装系统默认就打开了),但后来又关闭了selinux,并且在关闭后修改过的文件就会没有这个点号了.或者在关闭selinux的状态下新创建的文件也没有点号.
查看selinux是否开启
#getenforce --查看selinux是在哪种级别
#sestatus --可以查看selinux现在的状态
# ls /selinux --打开selinux后,此目录就有数据了,否则为空的
#setenforce 1 --临时马上生效,切换成enforcing
#setenforce 0 --切换成permissive
--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 - SELinux is fully disabled. --直接关闭selinux
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
--selinux类型,也就是策略policy现在分为2大类。
1,targeted 红帽开发的,主要是对网络服务进行保护
2,strict NSA开发,对整个系统进行多级别保护
把SELINUX=disabled改成SELINUX=enforcing,然后reboot系统
如果你原来一直是disabled的情况用了比较久的时间,现在第一次开启selinux,系统重新启动时,会有一个把/下的文件relable
--这个relable会要等待一段时间(10分钟到10几分钟,由文件大小和硬盘速度决定)
# ll -Z /etc/fstab
-rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/fstab
system_u:object_r:etc_t:s0
--这就是身份(user),角色(role),类型(type) s0(保护等级,也就是MLS用的,我们这里是targeted,不用这种)
身份:(主要为下面二种,但还有其它)
system_u 表示系统程序
unconfined_u 代表普通用户下的文件
# yum install setools-console -y
# seinfo -u --查看有哪些身份
Users: 8
sysadm_u
system_u
xguest_u
root
guest_u
staff_u
user_u
unconfined_u
角色:(主要有下面两种,但还有其它不常用的)
object_r: 代表文件或目录
system_r: 代表程序
# seinfo -r
Roles: 14
auditadm_r
dbadm_r
guest_r
staff_r
user_r
logadm_r
object_r
secadm_r
sysadm_r
system_r
webadm_r
xguest_r
nx_server_r
unconfined_r
类型:
type:用ll -Z 文件查出的就为type
# seinfo -t
seinfo - SELinux policy query tool
-a 列出所有相关的属性
-u 列出selinux的所有user
-t 列出selinux的所有type
-r 列出selinux的所有role
-b 列出所有布尔值
=====================================================================================
--(建议在一个新的虚拟机下开启selinux来做下面的例子)
下面以rpm的http为例
例1:
# echo "main page" > /var/www/html/index.html
# ll -Z /etc/passwd
-rw-r--r--. root root system_u:object_r:passwd_file_t:s0 /etc/passwd
# cp /etc/passwd /var/www/html/ --注意这里是cp
# touch /root/123
# ll -Z /root/123
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/123
# mv /root/123 /var/www/html/ --注意这里是mv
# ll /var/www/html/ -Zd
# ll /var/www/html/ -Z
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 123
--现在可以发现在apache默认家目录下创建的文件和cp过来的文件都会和目录的安全上下文一样;但mv的就保留原来的安全上下文(或者使用cp -a命令也可以保留)
--用另一台客户端使用firefox来访问,主页和passwd文件可以被访问,但123文件不能被访问;其实就是http程序的http_t对123文件的admin_home_t没有访问权限
chcon (change context)
-t 修改类型域
-R 递归
-r 角色
-u 身份
--reference=示例文件 把安全上下文改成和示例文件一样
所以如果让客户端能够访问123文件,就用下面的命令来修改
例2:
# mkdir /www
# vim /etc/httpd/conf/httpd.conf --把家目录改成/www
119 DocumentRoot "/www"
131 <Directory "/www">
# systemctl restart httpd
--对比一下原家目录和现家目录
# ll /var/www/html/ -dZ
# ll /www/ -dZ
drwxr-xr-x root root root:object_r:default_t /www/
# echo "www main page" > /www/index.html --在现家目录里建立一个主页
# ll -Z /www/index.html --查看主页信息,是继承了上级目录的属性
-rw-r--r-- root root root:object_r:default_t /www/index.html
客户端访问,却访问不到里面的网页文件,因为网页文件权限属性没改
解决方法:加-R参数把整个目录都修改
或者使用--reference指定按照谁来修改context
# chcon -R --reference=/var/www/html/ /www/
例3:
apache默认只监听80和443这两个端口,如果你改为监听12000,则启动为报错
# rpm -qf `which semanage`
policycoreutils-python-2.5-8.el7.x86_64
# yum install policycoreutils-python
http_cache_port_t tcp 3128, 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
解决方法:
# semanage port -l |grep http_port_t --再次去查,就可以看到有12000这个端口了
http_port_t tcp 12000, 80, 81, 443, 488, 8008, 8009, 8443, 9000
除了这些控制外,还有一个布尔值也控制着访问权限
# getsebool -a --查找所有的布尔值
# getsebool -a |grep http --查找与http有关的布尔值
# getsebool -a |grep allow_ypbind --查看上个例子改后的值
====================================================
用selinux
目的:加强安全,按照需求对外提供服务,当需求与selinux规则冲突时,就需要修改selinux规则迎合需求
使用rhel6上的selinux排错工具和日志来进行selinux的辅助排错
# yum install selinux* setroubleshoot* policy* -y
# systemctl status auditd.service --确认审计日志服务开启
# cat /var/log/audit/audit.log --此日志里有selinux相关的信息,但是不容易看懂
# sealert -a /var/log/audit/audit.log --以比较容易懂的方式查看selinux的日志,并给出解决的提示
# sealert --打开图形排错工具
selinux排错的总结:
1,如果服务访问不了,或者是服务里的文件访问不了等问题;可以先尝试
# setenforce 0改成permissive;如果改了还不能访问,那么肯定就不是selinux的问题了;如果改了就可以访问,那么可以确认是selinux的问题
2,如果是selinux的问题,那么就访问一下让他报错,然后通过查日志,或者图形工具来查看解决方法
# sealert -a /var/log/audit/audit.log
# sealert
3,根本日志里提供的信息来进行排错
4, 如果仍然不能解决,请自行百度,谷歌
5, 解决后,做好工作笔记,以后就直接把selinux问题解决
排错实例1
1,在服务器上建一个用户,给它一个密码
# useradd abc
# echo 123 | passwd --stdin abc
# touch /home/abc/123
2,客户端登录,使用abc用户,密码123登录不上去
Connected to 172.16.2.10 (172.16.2.10).
220 (vsFTPd 2.2.2)
Name (172.16.2.10:root): abc
331 Please specify the password.
Password:
500 OOPS: cannot change directory:/home/abc
Login failed.
3,通过开关setenforce 0发现是selinux禁止了
排错实例2(实现让普通用户登录samba,可以在自己的家目录上传下载)
1,在服务器端安装samba,并启动
# yum install samba-* -y
# /etc/init.d/smb restart
# smbpasswd -a abc
New SMB password:
Retype new SMB password:
Added user abc.
2,
用普通用户abc登录samba服务器自己的家目录后,ls查看不到里面的内容,也下载不了
# smbclient //172.16.2.10/abc -U abc
Enter abc's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: > ls
NT_STATUS_ACCESS_DENIED listing *
smb: > get 123 --这里最好get 123下载一下,否则samba服务器那边使用sealert出不来提示信息
NT_STATUS_ACCESS_DENIED opening remote file 123
smb: > put /etc/fstab fstab --客户端的/etc/fstab上传到samba服务器取名仍然叫fstab,但也被selinux禁止
NT_STATUS_ACCESS_DENIED opening remote file fstab
排错实例3
smb服务器自定义一个共享后,使用普通用户abc登录,也是ls查看不到内容,也下载和上传不了
# vim /etc/samba/smb.conf
[test]
comment = test
path = /test
public = no
writable = yes
# /etc/init.d/smb restart
# mkdir /test
# chmod 757 /test
# touch /test/123 --touch一个文件做下载测试
客户端
# smbclient //172.16.2.10/test -U abc --可以登录成功,但是ls看不到内容
Enter abc's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: > ls
NT_STATUS_ACCESS_DENIED listing *
smb: > get 123
NT_STATUS_ACCESS_DENIED opening remote file 123
smb: > put /etc/inittab inittab
NT_STATUS_ACCESS_DENIED opening remote file inittab
通过sealert图形提示知道解决方法为:
setsebool -P samba_export_all_rw 1
--总结:如果一个服务不能访问;那么一般的检查步骤为:服务器端口-->网络->iptables->服务配置->系统权限->pam->selinux
--在生产环境中,在配置服务时,可以打开selinux,并使用上面的方法让你的服务可以被正常访问,这样就加强了安全(因为别人就算找到你服务的漏洞并破解,他仍然会受系统的selinux的限制)
=============================================================================
题目:
在selinux环境允许ftp匿名上传文件(要求换一个新的ftp家目录/ftp,不用默认的/var/ftp)
方法一:
1,chmod 757 /ftp
方法二:
1,chmod 757 /ftp