我正在参与创作者训练营第5期,点击了解活动详情
1. 概述
本文以proftpd为例描述了在Linux体系中为运用装备selinux权限的作业流。
2. selinux装置
博主的体系环境为:Ubuntu20.04
2.1 selinux装置情况查询
有些linux发行版自带selinux,有的需求独自装置,我们输入sestatus指令来检查一下selinux的运转情况。
zhoushimin@zsm:Downloads$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: default # 策略类型targeted(default)
Current mode: permissive # 当前作业形式为宽恕形式,适用于调试
Mode from config file: permissive # 装备文件作业形式为宽恕形式
Policy MLS status: enabled # 是否含有mls的形式机制
Policy deny_unknown status: allowed # 是否默许抵御未知的主体程序
Memory protection checking: requested (insecure)
Max kernel policy version: 33
假如提示上面这个信息,阐明selinux现已启用了。假如没有装置则按下如下过程进行。
2.2 装置(适用Ubuntu20.04,其它版本未测验)
sudo apt install policycoreutils selinux-utils selinux-basics auditd
2.3 激活selinux
sudo selinux-activate
默许装备selinux为permissive形式
2.5 重启
sudo reboot
注意事项:
- 假如改变了方针则需求从头开机;
- 假如由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他两个,那也必需求从头开机,这是由于 SELinux 是整合到核心里面去的。
- 在 SELinux 运转下切强制 (enforcing) 或宽恕 (permissive) 形式能够相互切换,但不能够直接封闭 SELinux 的!
- 从 disable 转到发动 SELinux 的形式时,将会给资源从头打上Lable,过程会比较缓慢。
[外链图片转存失利,源站可能有防盗链机制,主张将图片保存下来直接上传(img-UPsfOolV-1659701195656)(../images/c8b2e29a914eb324cfe99ba550a48604b2803ae6a9f9ff1431b657e9d201c8aa.png)]
2.6 重启后,检查状况
zhoushimin@zsm:Downloads$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: default
Current mode: permissive
Mode from config file: permissive
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: requested (insecure)
Max kernel policy version: 33
3. 装置Proftpd
具体请参阅博主文章:敞开TLS加密传输的Proftpd安全FTP服务器装置攻略 – ()
4. 根底认知
selinux的MAC强制拜访权限的流程是这样的:
-
DAC拜访权限验证。用户具有的属主、属组权限是否能够执行对应的操作。
-
selinux策略是否发动
-
selinux的安全上下文是否匹配。
5. selinux的根底装备
按照如下指令装备selinux:
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 - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# default - equivalent to the old strict and targeted policies
# mls - Multi-Level Security (for military and educational use)
# src - Custom policy built from source
SELINUXTYPE=default
# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0
SELINUX为啥要先设置为permissive呢,首次发动时需求打标签,另外即便规矩没有装备好,也不影响运转。
SELINUXTYPE选择default,它对应的就是targeted.
6. 为proftpd装备权限
6.1 DAC拜访权限位装备
ls -l /home/ftproot
book@100ask:/home$ sudo ls -l /home/ftproot/
total 8
drwxrwx---. 2 2001 200 4096 Aug 5 05:49 down
drwxrwx---. 2 2001 200 4096 Aug 5 06:57 upload
文件是否赋予了用户拜访权限,在这儿,文件的权限操控位为0771,是满足读写权限操控的,属主、属组用户均有读写执行权限,其它用户无权限。
6.2 首要检查ftp相关的selinux bool规矩开关
seinfo -b | grep ftp
allow_ftpd_anon_write
allow_ftpd_full_access
allow_ftpd_use_cifs
allow_ftpd_use_nfs
ftp_home_dir
ftpd_connect_all_unreserved
ftpd_connect_db
ftpd_use_passive_mode
httpd_enable_ftp_server
sftpd_anon_write
sftpd_enable_homedirs
sftpd_full_access
sftpd_write_ssh_home
tftp_anon_write
tftp_enable_homedir
能够看到ftp相关的bool规矩挺多的,查一下它们的开关状况。
6.3 检查selinux相关bool规矩的开关状况
getsebool -a | grep ftp
book@100ask:/etc/proftpd$ getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> on
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_use_passive_mode --> 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_enable_homedir --> off
能够看到有的时敞开的,有的是封闭的。
由于我布置的ftp服务器是既能够上传,也能够下载,且需求密码拜访,因而不敞开匿名拜访。这儿仅敞开ftp_home_dir即可。为啥要敞开呢?由于它影响着进程安全上下文和文件安全上下文的答应规矩,能够检查它究竟管控了什么?
6.4 检查bool规矩影响的拜访规矩
sesearch -A -b ftp_home_dir
book@100ask:/etc/proftpd$ sesearch -A -b ftp_home_dir
allow ftpd_t cifs_t:dir { add_name create getattr ioctl link lock open read remove_name rename reparent rmdir search setattr unlink write }; [ use_samba_home_dirs && ftp_home_dir ]:True
allow ftpd_t cifs_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ use_samba_home_dirs && ftp_home_dir ]:True
allow ftpd_t cifs_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ use_samba_home_dirs && ftp_home_dir ]:True
allow ftpd_t cifs_t:file { append create getattr ioctl link lock open read rename setattr unlink write }; [ use_samba_home_dirs && ftp_home_dir ]:True
allow ftpd_t cifs_t:lnk_file { create getattr ioctl link lock read rename setattr unlink write }; [ use_samba_home_dirs && ftp_home_dir ]:True
allow ftpd_t ftpd_t:capability { dac_override dac_read_search }; [ ftp_home_dir ]:True
allow ftpd_t home_root_t:dir { getattr open search }; [ ftp_home_dir ]:False
allow ftpd_t home_root_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t home_root_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t home_root_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t home_root_t:lnk_file { getattr read }; [ ftp_home_dir ]:False
allow ftpd_t home_root_t:lnk_file { getattr read }; [ ftp_home_dir ]:True
allow ftpd_t home_root_t:lnk_file { getattr read }; [ ftp_home_dir ]:True
allow ftpd_t home_root_t:lnk_file { getattr read }; [ ftp_home_dir ]:True
allow ftpd_t httpd_sys_content_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t nfs_t:dir { add_name create getattr ioctl link lock open read remove_name rename reparent rmdir search setattr unlink write }; [ use_nfs_home_dirs && ftp_home_dir ]:True
allow ftpd_t nfs_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ use_nfs_home_dirs && ftp_home_dir ]:True
allow ftpd_t nfs_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ use_nfs_home_dirs && ftp_home_dir ]:True
allow ftpd_t nfs_t:file { append create getattr ioctl link lock open read rename setattr unlink write }; [ use_nfs_home_dirs && ftp_home_dir ]:True
allow ftpd_t nfs_t:lnk_file { create getattr ioctl link lock read rename setattr unlink write }; [ use_nfs_home_dirs && ftp_home_dir ]:True
allow ftpd_t tmp_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:False
allow ftpd_t tmp_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t tmp_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t tmp_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:False
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_dir_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name create getattr ioctl link lock open read remove_name rename reparent rmdir search setattr unlink write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:file { append create getattr ioctl link lock open read rename setattr unlink write }; [ ftp_home_dir ]:True
allow ftpd_t user_runtime_root_t:dir { getattr open search }; [ ftp_home_dir ]:False
allow ftpd_t user_runtime_root_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_runtime_root_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_runtime_root_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_runtime_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:False
allow ftpd_t user_runtime_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_runtime_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_runtime_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_tmp_t:dir { add_name create getattr ioctl link lock open read remove_name rename reparent rmdir search setattr unlink write }; [ ftp_home_dir ]:True
allow ftpd_t user_tmp_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_tmp_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_tmp_t:file { append create getattr ioctl link lock open read rename setattr unlink write }; [ ftp_home_dir ]:True
allow ftpd_t var_run_t:dir { getattr open search }; [ ftp_home_dir ]:False
allow ftpd_t var_run_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t var_run_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t var_run_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t var_run_t:lnk_file { getattr read }; [ ftp_home_dir ]:False
allow ftpd_t var_run_t:lnk_file { getattr read }; [ ftp_home_dir ]:True
allow ftpd_t var_run_t:lnk_file { getattr read }; [ ftp_home_dir ]:True
allow ftpd_t var_run_t:lnk_file { getattr read }; [ ftp_home_dir ]:True
allow ftpd_t var_t:dir { getattr open search }; [ ftp_home_dir ]:False
allow ftpd_t var_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t var_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t var_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t var_t:dir { getattr open search }; [ ftp_home_dir ]:True
能够看到这儿有许多的拜访权限规矩的装备。那么究竟哪个规矩才是我们所需求的呢?
6.5 检查文件的安全上下文
首要看一下文件的安全上下文:
ll -Z /home/
book@100ask:/etc/proftpd$ ll -Z /home/
total 40
drwxr-xr-x. 7 root root system_u:object_r:home_root_t:s0 4096 Aug 5 05:12 ./
drwxr-xr-x. 26 root root system_u:object_r:root_t:s0 4096 Aug 5 04:13 ../
drwxr-xr-x. 4 2001 200 system_u:object_r:user_home_dir_t:s0 4096 Aug 5 06:44 ftproot/
能够看到目录文件的安全上下文为user_home_dir_t,假如不是这个能够运用restorecon指令重置一下规矩
restorecon -R /home/ftproot
6.6 检查进程的安全上下文
ps -eZ | grep proftpd
book@100ask:~$ ps auxZ | grep proftpd
system_u:system_r:ftpd_t:s0 proftpd 1316 0.0 0.1 68244 3144 ? Ss 07:39 0:00 proftpd: (accepting connections)
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 book 1703 0.0 0.0 14428 1040 pts/0 S+ 07:40 0:00 grep --color=auto proftpd
能够看到进程的安全上下文为ftpd_t。
6.7 检查进程上下文和文件安全上下文是否匹配
还记得6.3节,ftp_home_dir影响许多拜访规矩,哪项才是我们需求的呢?
sesearch -A -b ftp_home_dir -s ftpd_t | grep user_home
book@100ask:~$ sesearch -A -b ftp_home_dir -s ftpd_t | grep user_home
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:False
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_dir_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name create getattr ioctl link lock open read remove_name rename reparent rmdir search setattr unlink write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:file { append create getattr ioctl link lock open read rename setattr unlink write }; [ ftp_home_dir ]:True
能够看到有目录的拜访权限
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_dir_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_dir_t:dir { getattr open search }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name create getattr ioctl link lock open read remove_name rename reparent rmdir search setattr unlink write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
allow ftpd_t user_home_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ ftp_home_dir ]:True
也有文件的拜访权限:
allow ftpd_t user_home_t:file { append create getattr ioctl link lock open read rename setattr unlink write }; [ ftp_home_dir ]:True
ftproot目录下的文件的默许安全上下文就是这个user_home_t,继承父目录的安全上下文。
到这儿,proftpd的拜访权限就装备好了。
运用filezilla能够正常拜访proftpd。
7. 敞开强制拜访操控
sudo setenforce 1
注意事项:记得先切换到指令行形式下运转,否则在桌面下敞开会导致桌面环境无拜访权限崩溃
CTRL+ALT+F1-F6
8. 测验
7. 封闭拜访权限
假如需求封闭拜访权限,则只需求ftp_home_dir开关封闭即可。
setsebool -P ftp_home_dir 0
8. 问题排查
假如权限与设计的需求不符,能够检查selinux日志分析问题原因。
日志所在目录为:
/var/log/audit/audit.log.x
9. 常用的selinux有用指令东西
-
getenforce – 检查当前的作业形式
-
setenforce – 设置当前的作业形式,重启后会恢复成/etc/selinux/config中装备的形式
-
seinfo – 检查selinux支持的一切规矩信息
-
sestatus – 检查selinux的运转状况
-
sesearch – 查找selinux规矩
-
setsebool – 设置bool规矩开关
-
getsebool – 读取bool规矩开关
-
restorecon – 重置文件安全上下文
-
chcon – 设置文件安全上下文
具体指令的运用参阅:sestatus指令 – 显示SELinux状况 – Linux指令大全(手册) (linuxcool.com)