SElinux与vsftp那点事儿

来源:互联网 发布:淘宝秒杀有关的句子 编辑:程序博客网 时间:2024/06/06 23:59
哦,SElinux,一个令人感觉不舒服的词语。接触过linux的人或多或少会对他有点了解(例如只是查过怎么去关闭它...),今天在搭建vsftp实验环境的时候,被他折磨的死去活来,无法访问用户的主目录。现在已经解决该问题,特意把当时的思路以及解决办法写出,方便日后参考。
ps:本文只是说明了如何解决在指定建立家目录下该如何解决selinux,这么一个简单的问题而已。
----L  y.

知己知彼,首先goole了一下SElinux是什么。

一,什么是SElinux

SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (MandatoryAccess Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)
其实,关键也就是黑体字那一句而已,很简单。
SElinux就是指明进程能访问那些资源,如果其访问了非指明的资源,SElinux就会阻止他,并告诉这个程序,你没有权限,不能让你访问。然后这时候程序一般因访问不到资源会中断或报错
例如,我们的Web服务器apache,进程一般的访问目录是/var/www/,因为网站存储在这里。那么假如因为apache本身的漏洞,黑客入侵并获得了账户的信息,想试图下载 /etc/passwd 这个文件。因为/etc/passwd 不具有Apache的访问标签,所以 Apache 对于 /etc/passwd 的访问会被SELinux 阻止。从这点看来SELinux可以起到弥补该漏洞的缓和方案


二,关于vsftp和SElinux结合

当一个系统新安装了vsftp,并在SElinux开启的状态下进行网络分享,那么可能确实有一点小麻烦(就像我遇到的那样)。
在网上查到的大部分帖子中,大概80%的帖子会要求直接关闭SElinux,大概19%的帖子告知了处理一些基本配置的方法,但是一些出错或者更为显得“偏僻”的功能却没查到。(剩下那1%就是他们写了但是我没搜到的)
我在做实验的时候遇到了一个实际的需求。因为需要ext4格式的磁盘来测试vsftp的磁盘配额功能,但我本身磁盘格式是xfs的,无法完成实验,所以我想了一个方案
1,新建一个镜像并格式化成ext4格式
2,根下建立一个test目录,并挂载这个镜像。
3,将新用户ccc家目录指定到/test 
我想这样我应该能继续我的实验。于是我开工

 还原当时场景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
255  yum install vsftp*
     
#安装vsftp
256  ls
257  dd if=/dev/zero of=/dev/test.img bs=20M count=5
     
#新建一个100M的镜像文件
258  ls
259  mkfs.ext4 /dev/test.img
     
#格式化成ext4格式
260  mkdir /test
     
#根下建立/test文件夹
261  mount /dev/test.img /test
     
#挂载镜像到/test下
262  useradd -d /test/ccc -m ccc
     
#建立ccc用户,指定家目录为/test/ccc
263  passwd ccc
     
#设置密码
264  ls
265  su ccc 
266  setsebool -P ftp_home_dir 1
     
#设置SElinux,授权系统用户访问家目录权限
267  getsebool -a |grep ftp
     
#查看确认是否拥有权限
268  ps -ef |grep ftp
     
#查看进程是否启动
269  service vsftpd start
     
#没问题,启动服务
270  su ccc
     
#切换ccc用户,在自己家目录建立一个文件夹,这样如果访问成功就能看到
正常情况到此应该万事大吉了才对,我登录ccc后应该显示出我的家目录,并且家目录里面有我事先建立好的文件,可事实是
SElinux与vsftp那点事儿

空空如也,没有想象中的家目录,并且新建东西也提示没权限,是哪里出了问题了吗?
首先想到的是检查iptable,
SElinux与vsftp那点事儿
连开启都没有,头号嫌疑犯防火墙排除。
其次是不是vsftp的问题呢,于是新建一个bbb用户,登录测试下
SElinux与vsftp那点事儿

用bbb用户登录竟然完!全!没!有!问!题!,可以上传,下载,新建,删除。我当时就懵逼了,这问题出在哪里?想到可能是linux本身读写权限问题,cd到目录看了下也没问题。束手无策了。
当时的思想卡在了这么一个循环里
1,如果SElinux有问题,那么它不可能同是系统用户,一个能访问,另一个不能访问,只针对一个这样不符合公平的原理啊,当时排除了SElinux的嫌疑。(当时我错误在认为开启home目录是“所有"用户的home目录都被开启了,后面会详细说)
2,同样如果vsftp有问题,那应该是两个都不能访问。而现在的情况是一个正常完全不受影响,vsftp排除
3,iptables没开...
4,文件权限没问题
找笔记发现那天偷懒了没记,借笔记看了下仍未有收获
感觉全部地方都想到了,但是还是不能查处问题的原因所在,最后的最后的最后我突然想到了一个神器,日志!

查看message信息,发现罪魁祸首,SElinux组织了vsftp的访问
SElinux与vsftp那点事儿
奇怪,不是已经设置了可以系统用户可以访问家目录吗?
selinux对文件控制是通过控制文件的上下文来实现的,我打开了seinux对ftp的man手册(摘抄了关键的部分)

分享文件
1
2
3
4
5
6
7
8
SHARING FILES

If  you  want to share files with multiple domains (Apache, FTP, rsync, Samba), you can set file context of public_content_t and public_content_rw_t.  These context allow any of
the above domains to 
read the content.  If you want particular domain to write to the public_content_rw_t domain, you must set the appropriate boolean.

semanage fcontext -a -t public_content_rw_t 
"/var/ftpd/incoming(/.*)?"
restorecon -F -R -v /var/ftpd/incoming
setsebool -P ftpd_anon_write 
1

第一行写明了,如果你想分享给 (Apache, FTP, rsync, Samba)  可以怎么做。
结合这些事情,那我大概猜到之前setsebool -P ftp_home_dir 1这条命令的作用了,一直以为这个home是开启每个用户的家目录的意思,但现在看来它指的单单是/home这个位置了。
现在理解布尔值选项,对于一个新手来说感觉很高大上的一个东西,那说白了其实就是一些开关。一个功能越庞大的系统,那么他的需要设置的要求也就越多,则是必然的。(每多一个新功能就要加一个开关)如果某个功能实现的功能太过繁琐是非常不合理的,假如说我仅仅要共享一个文件夹但却需要我设置50个选项,那么我绝笔不干。这时候就可以把这些常用的选项封装成一个总的选项,通过0或1开表达开启或关闭,可以方便我们执行,我想这就是所谓的布尔值吧,想明白也就没感觉它怎么神奇了。
好了扯远了,按照之前的man手册给步骤继续做
SElinux与vsftp那点事儿

SElinux与vsftp那点事儿

最后,成功解决问题。所以处理问题的诀窍就是:1,多看日志理。2,想问题要思路清晰。解决了才发现什么都不难,解决不了感觉比登天都难SElinux与vsftp那点事儿
明天可以继续我的实验啦,最后的最后还有一个插曲,就是

   需要注意的
1
2
3
4
5
#这两个的意思是不同的
semanage fcontext -a -t public_content_rw_t "/test/ccc"     #处理ccc的上下文

semanage fcontext -a -t public_content_rw_t 
"/test/ccc/"    #处理ccc内的上下文
#坑了我好久

原创粉丝点击