基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定
一、SELINUX
1.基本 SELINUX 安全性概念
SELINUX ( 安全增强型 Linux ) 是可保护你系统安全性的额外机制, 在某种程度上 , 它可以被看作是与标准权限系统并行的权限系统。在常规模式中 , 以用户身份运行进程 , 并且系统上的文件和其他资源都设置了权限 ( 控制哪些用户对哪些文件具有哪些访问权 SELINUX 的另一个不同之处在于 , 若要访问文件 ,你必须具有普通访问权限和 SELINUX 访问权限。因此 , 即使以超级用户身份root 运行进程 , 根据进程以及文件或资源的 SELinux 安全性上下文可能拒绝访问文件或资源限 ) 标签。
2.selinux 安全上下文访问规则
WEB 服务器HTTPD 进程设置了 SELINUX 上下文system_u:system_r:httpd_t 标签。该上下文的重要部分是第三个用冒号分隔的字段 SELINUX 类型 : httpd_t系统上的文件和资源也设置了 SELINUX 上下文标签 , 并且重要的部分是 SELINUX 类型。例如 , /var/www/html 中的文件具有类型 httpd_sys_content_t 。 /tmp 和 /var/tmp 中的文件通常具有类型 tmp_t。
Seliux 策略具有允许以 httpd_t 身份运行的进程访问标记为httpd_sys_content_t 的文件的规则。没有规则允许这些进程访问标记有 tmp_t 的文件 , 因此将拒绝这些访问 , 即使常规文件权限指出应该允许这些访问SELINUX 模式。
3.显示及更改 SELINUX 模式
getenforce
setenforce 0|1
0 表示 permissive # 警告
1 表示 enforcing # 强制
4.显示 SELinux 文件上下文。
什么确定文件的初始 SELinux 上下文 ? 通常是父目录。将父目录的上下文指定给新创建的文件。这对 vimcp 和 touch等命令起作用 , 但是 , 如果文件是在其他位置创建的并且保留了权限 ( 与 mv 或 cp -a 一样 ) 则还将保留 SELinux上下文许多处理文件的命令具有一个用于显示或设置 SELinux 上下文的选项 ( 通常是 -Z ) 。例如 , ps 、 ls 、 cp 和mkdir 都使用 -Z 选项显示或设置 SELinux 上下文。
实验一:修改 selinux 安全上下文
“chcon -t” ———— 一次性定制安全上下文 。
实验前提
[aaa@qq.com ftp]# vim /etc/sysconfig/selinux
SELINUX=enforcing
[aaa@qq.com ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r-- 1 0 0 0 May 05 07:22 file
drwxr-xr-x 2 0 0 30 Mar 07 2014 pub
lftp 172.25.254.126:/> quit
[aaa@qq.com ~]# cd /mnt
[aaa@qq.com mnt]# touch westos3
[aaa@qq.com mnt]# cd /var/ftp
[aaa@qq.com ftp]# ls
file pub westos3
[aaa@qq.com ftp]# mv /mnt/westos3 /var/ftp/ ##移动是重命名的过程,不改变安全上下文。复制是新建的过程,改变安全上下文。
[aaa@qq.com ftp]# ls
file pub westos3
[aaa@qq.com ftp]# lftp 172.25.254.126 ##此时看不见新移动过来的文件
lftp 172.25.254.126:~> ls
-rw-r--r-- 1 0 0 0 May 05 07:22 file
drwxr-xr-x 2 0 0 30 Mar 07 2014 pub
lftp 172.25.254.126:/> quit
[aaa@qq.com ftp]# ls -Z westos3 ##查看安区上下文
-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0 westos3
[aaa@qq.com ftp]# ls -Z file
-rw-r--r--. root root system_u:object_r:public_content_t:s0 file ##比对不同
[aaa@qq.com ftp]# chcon -t public_content_t westos3 ##将westos3的安区上下文修改为public_content_t。
[aaa@qq.com ftp]# ls -Z westos3
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westos3 ##修改成功。
[aaa@qq.com ftp]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r-- 1 0 0 0 May 05 07:22 file
drwxr-xr-x 2 0 0 30 Mar 07 2014 pub
-rw-r--r-- 1 0 0 0 May 06 08:51 westos3 ##此时查看则可以看到。
lftp 172.25.254.126:/> quit
[aaa@qq.com ftp]# semanage fcontext -l |grep /var/ftp ##查看看/var/ftp目录中许可的安区上下文。
/var/ftp(/.*)? all files system_u:object_r:public_content_t:s0
/var/ftp/bin(/.*)? all files system_u:object_r:bin_t:s0
/var/ftp/etc(/.*)? all files system_u:object_r:etc_t:s0
/var/ftp/lib(/.*)? all files system_u:object_r:lib_t:s0
/var/ftp/lib/ld[^/]*\.so(\.[^/]*)* regular file
截图展示:
以上的修改是临时的,在selinux重启后配置会还原!!!!
[aaa@qq.com ~]# mkdir /westos #新建一个目录。用来将此目录指定为用户默认家目录。
[aaa@qq.com ~]# touch /westos/westosfile
[aaa@qq.com ~]# vim /etc/vsftpd/vsftpd.conf #添加家目录
anon_root=/westos #添加内容
[aaa@qq.com ~]# systemctl restart vsftpd.service #重启服务
[aaa@qq.com ~]# ls -Z /var/ftp
-rw-r--r--. root root system_u:object_r:public_content_t:s0 file
-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0 file2
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub
drwxrwxrwt. root root system_u:object_r:mnt_t:s0 westos
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westos3
[aaa@qq.com ~]# chcon -t public_content_t /westos -R #将家目录安全上下文修改为public_content_t,-R表示目录本身及目录内所有。
[aaa@qq.com ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r-- 1 0 0 0 May 12 02:02 westosfile #此时可以查看
lftp 172.25.254.126:/> quit
[aaa@qq.com ~]# touch /.autorelabel #新建一个文件,此文件在重起后会自动重启selinux服务。
[aaa@qq.com ~]# reboot #重启
Connection to 172.25.254.126 closed by remote host.
Connection to 172.25.254.126 closed.
[aaa@qq.com ~]$ ssh aaa@qq.com #重新连接
aaa@qq.com's password:
Last login: Fri May 11 21:19:24 2018 from 172.25.254.26
[aaa@qq.com ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
lftp 172.25.254.126:/> quit
#此时无法看到文件,证明了chcon的修改是临时的 [aaa@qq.com ~]# ls -Z /westos
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 westosfile #安全上下文回到之前默认值
[aaa@qq.com ~]# semanage fcontext -l | grep /westos
[aaa@qq.com ~]# #默认selinux重启后westos目录没有安全上下文
#此时无法看到文件,证明了chcon的修改是临时的
实验二:semanage 命令 ———— 永久性定制安全上下文
[aaa@qq.com ~]# semanage fcontext -a -t public_content_t '/westos(/.*)?'
#永久修改wetos目录的安区上下文,-a,新建、-t,指定类型、'/westos(/.*)?‘,目录本身及其内所有内容和隐藏文件。/westos(/.*)?=/westos/*
[aaa@qq.com ~]# restorecon -FvvR /westos/ #刷新配置
restorecon reset /westos context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
restorecon reset /westos/westosfile context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
[aaa@qq.com ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r-- 1 0 0 0 May 12 02:02 westosfile #此时可以查看
lftp 172.25.254.126:/> quit
[aaa@qq.com ~]# reboot #重启,.autorelabel文件和会默认在重启时重启selinux服务。
Connection to 172.25.254.126 closed by remote host.
Connection to 172.25.254.126 closed.
[aaa@qq.com ~]$ rht-vmctl view desktop
[aaa@qq.com ~]$ ssh aaa@qq.com
aaa@qq.com's password:
Last login: Fri May 11 22:10:13 2018 from 172.25.254.26
[aaa@qq.com ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r-- 1 0 0 0 May 12 02:02 westosfile
lftp 172.25.254.126:/> quit #此时可以查看,则永久修改成功。
实验三:管理 SELinux 布尔值
SELinux 布尔值是更改 SELinux 策略行为的开关。 SELinux 布尔值是可以启用或禁用的规则。安全管理员可以使 SELinux 布尔值来调整策略 , 以有选择地进行调整许多软件包都具有 man page *_selinux(8), 其中详细说明了所使用的一些布尔值 ; man -k ‘_selinux’ 可以轻松地找到这些手册getsebool 用于显示布尔值 , setsebool 用于修改布尔值setsebool -P 修改 SELinux 策略 , 以永久保留修改。
semanage boolean -l 将显示布尔值是否永久。
[aaa@qq.com ~]# ll -d /home/student
drwxrwxr-x. 6 student student 1024 May 11 23:49 /home/student
#查看student用户的目录权限,此时是可写的,因此可以利用lftp上传文件。
[aaa@qq.com ~]# lftp 172.25.254.126 -u student
Password:
lftp aaa@qq.com:~> ls
lftp aaa@qq.com:~> put /etc/passwd
put: Access failed: 553 Could not create file. (passwd)
lftp aaa@qq.com:~> quit ##无法上传
[aaa@qq.com ~]# setenforce 0 ##修改为警告模式
[aaa@qq.com ~]# lftp 172.25.254.126 -u student
Password:
lftp aaa@qq.com:~> ls
lftp aaa@qq.com:~> put /etc/passwd
2186 bytes transferred
lftp aaa@qq.com:~> quit ##上传成功,则说明是selinux服务阻止了上传。
[aaa@qq.com ~]# setenforce 1 ##修改为强制模式
[aaa@qq.com ~]# getsebool -a |grep ftp ##查看selinux的开启和禁用规则
ftp_home_dir --> off ##关闭
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[aaa@qq.com ~]# setsebool -P ftp_home_dir on #打开
[aaa@qq.com ~]# getsebool -a |grep ftp
ftp_home_dir --> on
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[aaa@qq.com ~]# lftp 172.25.254.126 -u student
Password:
lftp aaa@qq.com:~> put /etc/group
905 bytes transferred ##此时即可上传成功。
实验四:监控 SELinux 冲突
必须安装 setroubleshoot-server 软件包 , 才能将 SELinux消息发送至 /var/log/messages , setroubleshoot-server 侦听 /var/log/audit/audit.log 中的审核信息并将简短摘要发送至 /var/log/messages,摘要包括 SELinux 冲突的唯一标识符 ( UUIDs ), 可用于收集更多信息。 Sealert -l UUID 用于生成特定事件的报告。 Sealert -a /var/log/audit/audit.log 用于在该文件中生成所有事件的报告。
[aaa@qq.com ~]# rpm -qa |grep setrouble #查看是否有setrouble软件setroubleshoot-server-3.2.17-2.el7.x86_64
setroubleshoot-3.2.17-2.el7.x86_64
setroubleshoot-plugins-3.0.59-1.el7.noarch
[aaa@qq.com~]#yum remove setroubleshoot-server-3.2.17-2.el7.x86_64
Loaded plugins: langpacks #卸载setrouble软件
Resolving Dependencies
--> Running transaction check
[aaa@qq.com ~]# > /var/log/messages #清空日志
[aaa@qq.com ~]# > /var/log/audit/audit.log #清空系统审核信息日志
[aaa@qq.com ~]# touch /mnt/file
[aaa@qq.com ~]# mv /mnt/file /var/ftp/ 使用浏览器访问ftp服务
[aaa@qq.com ~]# cat /var/log/audit/audit.log #查看系统审核信息日志
type=AVC msg=audit(1526104058.698:272): avc: denied { getattr } for pid=3145 comm="vsftpd" path="/yifan" dev="vda1" ino=33572719 scontext=system_u:system_r:ftpd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mnt_t:s0 tclass=file
type=SYSCALL msg=audit(1526104058.698:272): arch=c000003e syscall=6 success=no exit=-13 a0=7fa1ac280620 a1=7fa1ac2887a0 a2=7fa1ac2887a0 a3=2020202020203020 items=0 ppid=3143 pid=3145 auid=4294967295 uid=14 gid=50 euid=14 suid=14 fsuid=14 egid=50 sgid=50 fsgid=50 tty=(none) ses=4294967295 comm="vsftpd" exe="/usr/sbin/vsftpd" subj=system_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null) [aaa@qq.com ~]# cat /var/log/messages #查看日志,无报错
[aaa@qq.com ~]# yum install setroubleshoot-server-3.2.17-2.el7.x86_64 -y #重新安装etroubleshoot-server-3.2.17-2.el7.x86_64软件。 浏览器访问ftp服务。
[aaa@qq.com ~]# cat /var/log/messages #查看日志
May 12 01:50:01 localhost systemd: Starting Session 19 of user root.
May 12 01:50:01 localhost systemd: Started Session 19 of user root.
May 12 01:50:27 localhost dbus-daemon: dbus[545]: [system] Reloaded configuration
May 12 01:50:27 localhost dbus[545]: [system] Reloaded configuration
May 12 01:50:27 localhost dbus-daemon: dbus[545]: [system] Reloaded configuration
May 12 01:50:27 localhost dbus[545]: [system] Reloaded configuration
May 12 01:50:28 localhost systemd: Reloading.
May 12 01:50:28 localhost systemd: [/usr/lib/systemd/system/rtkit-daemon.service:
restorecon -v '$FIX_TARGET_PATH' #报错提醒建议
[aaa@qq.com ~]# restorecon -v /var/ftp/* #修复
restorecon reset /var/ftp/yifan context unconfined_u:object_r:mnt_t:s0->unconfined_u:object_r:public_content_t:s0
二、 服务默认端口的添加
以httpd服务为例
[aaa@qq.com ~]# systemctl start httpd ##打开httpd服务
[aaa@qq.com ~]# vim /etc/httpd/conf/httpd.conf ##http的配置文件
>---编辑内容 ---<
41 #Listen 12.34.56.78:80
42 Listen 80 ---->改为----> 42 Listen 6666 #修改端口值
43 #
[aaa@qq.com ~]# systemctl restart httpd
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. ##重启失败
[aaa@qq.com ~]# semanage port -l | grep http #列出http服务允许端口
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
##”semanage port -l | grep http”与“ cat /etc/services | grep http”命令作用相同,“/etc/services”为系统中存放端口的文件。##
[aaa@qq.com ~]# semanage port -a -t http_port_t -p tcp 6666
libsemanage.semanage_reload_policy: load_policy returned error code -1. (Interrupted system call). ##添加6666为其允许端口
[aaa@qq.com ~]# semanage port -l | grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 6666, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989 ##添加成功
[aaa@qq.com ~]# systemctl restart httpd ##重启服务,成功