我正在参与创作者训练营第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. 测验

SELINUX配置Proftpd安全FTP服务器权限实操指南

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)