Linux—SeLinux
SELinux概念
SELinux是Linux的一个强制访问控制的安全模块,被集成在内核中。
在SELinux中,一切皆对象,而不是传统Linux的一切皆文件,是由存放在inode的扩展属性域的安全元素所控制其访问。
在SELinux中, 所有文件、端口资源和进程都具备安全标签,我们把安全标签称之为安全上下文。
那安全上下文格式怎样呢?
用户(登录系统的用户类型):角色(定义文件,进程和用户的用途):类型(指定数据类型):敏感度(:限制访问的需要):范畴。
举例说明: user_u:object_r:tmp_t:s0:c0。
但是实际上最后的范畴往往省略,即system_u:object_r:public_content_rw_t:s0。
省略范畴的原因便是,在Centos里,SELinux默认工作状态里为Target,而Tarhet不启用范畴。
启用SELinux
在启动SELinux之前,需要查看其状态,其状态分为三种:
enforcing: 强制,每个受限的进程都必然受限。
permissive: 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志 。
disabled: 禁用。
那么查看SELinux命令:
getenforce: 获取selinux当前状态
sestatus :查看selinux状态
启用命令:setenforce 0|1 :0: 设置为permissive 1: 设置为enforcing
但是实际中会发现,setenforce使用了之后报错,说SELinux is disabled
尽管在配置文件/etc/selinux/config 里开启SELinux也报错。
解决办法是在/boot/grub/grub.conf 将 enforce值设为0,重启。
这样可以避免开机启用SELinux的enforce状态禁止部分服务导致无法开机的情况。
但是开机后,enforce的值依然是1,如果在grub.conf中使用selinux=0禁用SELinux 。
管理文件安全标签
上下文我们主要研究的是 Sensitivity,即限制访问的需求,为content值。
有些命令在使用时,如get filename时会改变centent值,这样会使一些服务无法运行。
但是有些命令不改变content值,如cp –c –a 命令。
让我们介绍相关命令吧!
首先介绍查看安全上下文的命令:
查看文件: ls –Z filename
查看目录: ls –Zd directoryname
[root@mmmm(mei) ~]# ls -Z /etc/fstab -rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/fstab [root@mmmm(mei) ~]# ls -Zd /etc/ drwxr-xr-x. root root sysem_u:object_r:etc_t:s0 /etc/
那么修改上下文的命令是 chcon
chcon [ [-u USER] [-r ROLE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
选项 -R:递归打标
[root@mmmm(mei) ~]# touch /app/abc [root@mmmm(mei) ~]# ls -Z /app/abc -rw-r--r--. root root unconfined_u:object_r:default_t:s0 /app/abc [root@mmmm(mei) ~]# chcon -t public_content_t /app/abc [root@mmmm(mei) ~]# ls -Z /app/abc -rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 /app/abc
[root@mmmm(mei) ~]# chcon -R -t public_content_t /app/ [root@mmmm(mei) ~]# ls -Zd /app/ drwxrwxrwx. root root system_u:object_r:public_content_t:s0 /app/ [root@mmmm(mei) ~]# ls -Z /app/ -rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 abc drwxr-xr-x. root root system_u:object_r:public_content_t:s0 apache22 drwxr-xr-x. root root system_u:object_r:public_content_t:s0 bin drwxr-xr-x. root root system_u:object_r:public_content_t:s0 house drwxr-xr-x. user2 user2 system_u:object_r:public_content_t:s0 httpd-2.2.34 -rw-r--r--. root root system_u:object_r:public_content_t:s0 httpd-2.2.34.tar.bz2 drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 website
但是如果想要恢复修改之前的content值或者默认值,则:
restorecon [-R] /path/to/somewhere: –R 恢复目录期望值
但是并不是所有资源都是有期望值context值或默认值的,有时使用查看,出现 ? 的情况可能就是没有默认值的情况。
那么又引出一个问题,如何查看期望值呢?
这里涉及到一个命令——semanage
semangage fconetxt -l : 列出所有已设定的期望值
该命令支持管道,所以可以通过grep命令来查看具体某一条命令
semanage fcontext -l |grep '/var/www' 查看指定目录的期望值
semanage fcontext -a -t httpd_sys_content_t '/app/website(/.*)?' 为指定目录设定期望值
semanage fcontext -d -t httpd_sys_content_t '/app/website(/.*)?' 删除指定的期望值
管理端口标签
semanage port -l |grep http 查看
[root@mmmm(mei) ~]# semanage port -l |grep ftp ftp_data_port_t tcp 20 ftp_port_t tcp 21, 990 ftp_port_t udp 990 tftp_port_t udp 69
semanage port -a -t http_port_t -p tcp 9527 增加端口号的期望值
1 [root@localhost(mei) ~]# semanage port -a -t http_port_t -p tcp 9527 2 [root@localhost(mei) ~]# semanage port -l |grep http 3 http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 4 http_cache_port_t udp 3130 5 http_port_t tcp 9527, 80, 81, 443, 488, 8008, 8009, 8443, 9000 6 pegasus_http_port_t tcp 5988 7 pegasus_https_port_t tcp 5989
semanage port -d -t http_port_t -p tcp 9527 删除端口号的期望值
管理SELinux布尔值开关
getsebool -a |grep ftp 查看布尔值
[root@mmmm(mei) ~]# getsebool -a |grep ftp
allow_ftpd_anon_write --> on allow_ftpd_full_access --> off allow_ftpd_use_cifs --> off allow_ftpd_use_nfs --> off ftp_home_dir --> off ftpd_connect_db --> off ftpd_use_fusefs --> off ftpd_use_passive_mode --> off httpd_enable_ftp_server --> off tftp_anon_write --> off tftp_use_cifs --> off tftp_use_nfs --> off
setsebool -P allow_ftpd_anon_write on :-P表示永久生效
setsebool -P allow_ftpd_anon_write=1
semanage boolean -l -C 查看已修改过的所有布尔值
1 [root@localhost(mei) ~]# semanage boolean -l -^C 2 [root@localhost(mei) ~]# semanage boolean -l -C 3 SELinux boolean State Default Description 4 5 ftpd_anon_write (on , on) Allow ftpd to anon write