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

 

posted @ 2018-08-25 21:02  mmm君  阅读(308)  评论(0编辑  收藏  举报