/*************查看/开启关闭SELinux******************/
SELinux Mode:
1.Enforcing //enable selinux and enforce its policy
2.Permissive //enable selinux,but does't apply its policy(warning only)
3.Disable //disable selinux
getenforce //checking selinux modes
sestatus //checking selinux modes and status
SELinux configuration file
/etc/selinux/config //enable|disable selinux and change selinuxtype
SELinux从disable状态开启到enforce状态必须经两步进行:
1.从disable设置到permissive,然后reboot.
2.从permissive设置到enforcing,然后reboot.
原因:because every file in the system needs to have its context labelled before SELinux can be enforced. Unless all files are properly labelled, processes running in confined domains may fail because they can't access files with the correct contexts. This can cause the boot process to fail or start with errors.
setenforce {0|1} //在permissive(0)和enforcing(1)之间进行切换,无需reboot
An SELinux policy defines USER access to ROLEs, ROLE access to DOMAINs, and DOMAIN access to TYPEs.
/*******安装/移除/启用/禁用/查看策略模块*********/
semodule: //installing, removing, reloading, upgrading, enabling and disabling SELinux policy modules.
semodule -b base.pp //Install or replace a base policy package.
semodule -l //Display list of installed modules
semodule -i httpd.pp //Install or replace a non-base policy package.
semodule -i *.pp //Install or replace all non-base modules in the current directory.
semodule -d Module_Name //disable Modulei
策略模块的保存位置:/etc/selinux/targeted/modules/active/modules/
策略模块们读入内存后,整合成一个策略二进制文件: /etc/selinux/targeted/policy/policy.29
/*******修改策略设置*************/
策略模块为二进制文件,不可以直接手动修改,我可以通过命令进行设定.
semanage boolean -l //查看策略布尔值设定
getsebool SEBoolean_Name //查看策略布尔设定的当前状态
setsebool ftpd_anon_write on [-P] //打开ftpd匿名用户的写入权限,重启后恢复默认设置,-P永久更改配置
/**************SELinux的进程和文件的基本机制*************************/
SELinux只限定在Domain中的process,不在Domain中的process不受限制.
SELinux中任何东西都可以有context,不同对象的context的含义也不同
一.文件的Context:
ls -Z File_Name //查看文件的安全context
system_u:object_r:etc_t:s0 //文件context共分为4部分,用:隔开
第一部分: SELinux User,每个系统用户都会映射到相应该的SELinux用户
第二部分: SELinux Role,
第三部分: Type of File, 用来描述文件或目录属于哪个Type
第四部分: sensitivity of the resource,只有在MLS模式下使用,平时用不上.
二.进程的Context:
ps -efZ | grep "httpd" //查看进程的context
system_u:system_r:httpd_t:s0 //进程的context共分4部分,用:隔开
第一部分: SELinux User,同上(和文件的属性一样)
第二部分: SELinux Role,同上(和文件的属性一样)
第三部分: Process Domain,Domain用来限定process所能访问的资源
第四部分: sensitivity 同上,(和文件的属性一样)
*SELinux的全名习惯: User_Name以"_u"为后缀, Role_Name以"_r"为后缀, Type或Domain以"_t"为后缀.
SELinux Policy Rule的模板:
allow <domain> <type>:<class> { <permissions> };
例: allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ;
查看SELinux Policy中的Rule:
sesearch --allow --source httpd_t --target httpd_sys_content_t --class file
//查看httpd_t这个Domain对Type为httpd_sys_content_t的文件(file)有什么权限
chcon -t Type_Name File_Name //更改文件的Type
restorecon -v File_Name //恢复文件的默认Context
-------------关于继承----------
1.进程默认会继承其父进程的Domain,文件也会继承他父目录的Type.
2.将文件copy到其它目录,默认不会携带原有的type,文件的type会更改为目的目录的type.
cp --preserve=context SourceFile Destination //复制文件时携带原有的type
-------------文件的Type--------
文件和目录的默认type保存在: /etc/selinux/targeted/contexts/files/file_contexts
文件和目录的自定义type保存在: /etc/selinux/targeted/contexts/files/file_contexts.local
//使用restorecon命令恢复文件的默认context时,这个命令就是参考上述文件进行恢复的,这两个文件不建议手工编辑
自定义文件type:
semanage fcontext --add --type httpd_sys_content_t "/www(/.*)?" //修改/www目录以及它的子目录的默认type为httpd_sys_content_t, 修改内容为自动更新至上述配置文件
matchpathcon -V File_Name //检查指定文件的context和该文件的默认context是否匹配, 排错使用
------------域过渡(Domain Transition)-----------
+----------+ +--------------+ +----------+
|Process_A | |ExecutableFile| |Process_B |
| |====================>| |===================>| |
|Domain_A | Pro_A execute File |Type_X | File spawns Pro_B |Domain_B |
+----------+ +--------------+ +----------+
域为A的进程A通过执行一个Type为X的可执行文件来产生一个域为B的新进程B,必须符合以下3点:
1.父进程A的Domain_A必须有对File的Type_X有执行权限.
2.File的Type_X必须能够被其产生的进程B的Domain_B执行
3.父进程A的Domain_A必须被SELinux的Policy允许过渡到Domain_B.
----------Unconfined Domain(不受限的域)----------
我们可以理解unconfined域拥有所有访问类型(all type of access).
/*****************SELinux中用户权限的基本工作机制********************/
semanage login -l //查看linux用户和SELinux用户之间的映射关系
+---------------------------命令输出内容---------------------------------+
| Login Name SELinux User MLS/MCS Range Service |
| |
| __default__ unconfined_u s0-s0:c0.c1023 * |
| root unconfined_u s0-s0:c0.c1023 * |
| system_u system_u s0-s0:c0.c1023 * |
+------------------------------------------------------------------------+
注释:
除root以外的所有linux用户全部映射到__default__用户
semanage user -l //查看policy中所有的SELinux用户,以及SELinux用户和roles的映射关系.
id -Z //查看当前linux用户所映射到的SELinux的用户,角色以及可执行什么Domain的进程
命令输出: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
---------------------SELinux User所对应的权限---------------------
guest_u: This user doesn't have access to X-Window system (GUI) or networking and can't execute su / sudo command.
xguest_u: This user has access to GUI tools and networking is available via Firefox browser.
user_u: This user has more access than the guest accounts (GUI and networking), but can't switch users by running su or sudo.
staff_u: Same rights as user_u, except it can execute sudo command to have root privileges.
system_u: This user is meant for running system services and not to be mapped to regular user accounts.
------------------------------------------------------------------
%%%%%%%%%%%%%%%%%%%%%%%%%%限制切换用户%%%%%%%%%%%%%%%%%%%%%%%%%%%%
修改本地User到SELinux User的映射:
semanage login -a -s user_u liang //把linux本地用户"liang"映射到SELinux用户user_u中去.
%%%%%%%%%%%%%%%%%%%%%%%%%%限制运行脚本%%%%%%%%%%%%%%%%%%%%%%%%%%%%
默认映射到SELinux guest_u用户的本地用户有执行脚本的权限,我们可以设定SELinux Bool值来修改默认配置
getsebool guest_exec_content //查看bool设置状态
命令输出:guest_exec_content --> on
setsebool guest_exec_content off //关闭guest用户执行脚本的设定
semanage login -a -s guest_u liang //将本地用户"liang"映射到SELinux用户guest.
验证结果:用户Liang将不能执行脚本.
%%%%%%%%%%%%%%%%%%%%%%%%%%限制访问服务%%%%%%%%%%%%%%%%%%%%%%%%%%%%
普通用户默认不可以使用sudo命令,需要修改/etc/sudoers文件
在该文件添加: liang ALL=(ALL) ALL //允许用户liang使用sudo命令
sudo service httpd start //在liang用户下执行命令可以开启httpd服务
id -Z //经查看发现liang用户映射到了unconfined_u这个SELinuxUser下了,权限不受限
semanage login -a -s user_u liang //将liang这个用户映射到user_u这个SELinuxUser下.
seinfo -u[User] -r[Role] -t[Domain|Type] -x //查看SELinux用户,角色,域或类的详细属性
seinfo -uuser_u -x //查看user_u可以访问的roles有哪些(-u和user_u之间无空格)
seinfo -ruser_r -x //查看user_r可以访问的Domain有哪些(-r和user_r之间无空格)
实验分析:
本地用户liang默被映射到unconfined_u中,所以权限不受限制,可以启动任何服务.通过命令,我们把用户liang映射到user_u这个SELinux用户中, 通过seinfo命令查看,用户user_u有对角色user_r的访问权限,然而角色user_r没有对域httpd_t的执行权限,所以最终用户liang没有启动httpd服务的权限.