在CentOS 6.X上折腾SELinux
SELinux就是Security-Enhanced Linux的简称,安全加强的linux。传统的linux权限是对文件和目录的owner, group和other的rwx进行控制,而SELinux采用的是委任式访问控制,也就是控制一个进程对具体文件系统上面的文件和目录的访问,SELinux规定了很多的规则,来决定哪个进程可以访问哪些文件和目录。
SELinux是根据进程或文件的security context来决定进程是否有权限访问文件系统的,security context由Identify:role:type三部分组成,当selinux的类型为SELINUXTYPE=targeted的时候,只有security context的type是有用的。selinux的配置文件在这里:/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 - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
需要安装必要的SELinux的相关工具:
yum install policycoreutils-Python setools-console setroubleshoot setroubleshoot-server查看当前SELinux的状态:
[root@CentOS ~]# getenforce
Enforcing状态为Enforcing就代表打开了SELinux,为disabled或permissive则需要使用下面的命令开启(permissive代表如果不符合SELinux的权限控制,则会出现warning提示信息,不会真的block进程的访问):
设置SELinux为Enforcing:
[root@centos ~]# setenforce 1之后,重启电脑,并等待SELinux相关文件建立完成。
查看进程的security context:
[root@centos ~]# ps aux -Z | grep httpd
unconfined_u:system_r:httpd_t:s0 root 6056 0.0 0.3 11672 3504 ? Ss 15:31 0:03 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6061 0.0 0.2 11804 2664 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6062 0.0 0.2 11672 2132 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6063 0.0 0.2 11804 2664 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6064 0.0 0.2 11804 2780 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6065 0.0 0.2 11672 2132 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6066 0.0 0.2 11672 2132 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6067 0.0 0.2 11672 2132 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:system_r:httpd_t:s0 apache 6068 0.0 0.2 11672 2132 ? S 15:31 0:00 /usr/sbin/httpd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 6845 0.0 0.0 4340 752 pts/0 S+ 18:16 0:00 grep httpd查看目录的security context:
[root@centos ~]# ls -dZ /var/www/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/列出SELinux的统计信息,包括security context中的user,role和type,还有规则(Booleans):
[root@centos ~]# seinfo
Statistics for policy file: /etc/selinux/targeted/policy/policy.24
Policy Version & Type: v.24 (binary, mls)
Classes: 81 Permissions: 235
Sensitivities: 1 Categories: 1024
Types: 3488 Attributes: 273
Users: 9 Roles: 12
Booleans: 187 Cond. Expr.: 222
Allow: 273920 Neverallow: 0
Auditallow: 96 Dontaudit: 199904
Type_trans: 23469 Type_change: 38
Type_member: 48 Role allow: 20
Role_trans: 291 Range_trans: 3993
Constraints: 87 Validatetrans: 0
Initial SIDs: 27 Fs_use: 22
Genfscon: 81 Portcon: 426
Netifcon: 0 Nodecon: 0
Permissives: 59 Polcap: 2
查看所有的规则名字:
[root@centos ~]# seinfo -b
Conditional Booleans: 187
allow_domain_fd_use
allow_ftpd_full_access
allow_sysadm_exec_content
allow_user_exec_content
allow_zebra_write_config
cdrecord_read_content
fcron_crond
httpd_manage_ipa
httpd_use_openstack
mmap_low_allowed
samba_share_fusefs
sepgsql_enable_users_ddl
abrt_handle_event
allow_ftpd_use_cifs
allow_httpd_mod_auth_pam
allow_java_execstack
cron_can_relabel
.......
查看一个规则是否打开:
[root@centos ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
打开一个规则:
[root@centos ~]# setsebool -P httpd_enable_homedirs=1
[root@centos ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on
查看一个规则的具体信息(也就是allow或者deny某个进程的security context的type访问某个文件系统的security context的type):
[root@centos ~]# sesearch -b httpd_enable_homedirs --all
ERROR: Cannot get avrules: Neverallow rules requested but not available
Found 46 semantic av rules:
allow httpd_sys_script_t home_root_t : dir { getattr search open } ;
allow httpd_sys_script_t home_root_t : lnk_file { read getattr } ;
allow httpd_suexec_t user_home_dir_t : dir { getattr search open } ;
allow httpd_suexec_t user_home_dir_t : lnk_file { read getattr } ;
allow httpd_suexec_t autofs_t : dir { ioctl read getattr lock search open } ;
allow httpd_suexec_t cifs_t : file { ioctl read getattr lock execute execute_no_trans open } ;
allow httpd_suexec_t cifs_t : dir { ioctl read getattr lock search open } ;
allow httpd_suexec_t cifs_t : lnk_file { read getattr } ;
allow httpd_suexec_t nfs_t : file { ioctl read getattr lock execute execute_no_trans open } ;
allow httpd_suexec_t nfs_t : dir { ioctl read getattr lock search open } ;
allow httpd_suexec_t nfs_t : lnk_file { read getattr } ;
allow httpd_t user_home_t : file { ioctl read getattr lock open } ;
.............
selinux在文件系统中是存在很多的默认设置的,可以通过semanage来查看系统中所有目录的默认security context: