业务部门提过来一个FTP配置需求,具体情况如下:
请提供一台FTP服务器,需要创建的FTP目录及账号规则如下!
人员配置情况:
北京总部:5人(需创建2个账号:bjzb读权限 bjguanli读写执行权限)
北京大区:8人(需创建1个FTP账号:bjdq)
上海大区:6人(需创建1个FTP账号:shdq)
广州大区:5人(需创建1个FTP账号:gzdq)
FTP目录及账号权限创建设计:
/data/bj (北京大区)
账号bjdq权限:写权限、读权限、执行权限
账号shdq、gzdq权限:读权限
账号bjzb权限:读权限
账号bjguanli权限:读权限、写权限、执行权限
/data/sh (上海大区)
账号shdq权限:写权限、读权限、执行权限
账号bjdq、gzdq权限:读权限
账号bjzb权限:写权限、读权限
账号bjguanli权限:读权限、写权限、执行权限
/data/gz (广州大区)
账号gzdq权限:写权限、读权限、执行权限
账号bjdq、shdq权限:读权限
账号bjzb权限:写权限、读权限
账号bjguanli权限:读权限、写权限、执行权限
大家看到这则需求时,基本上会感觉,权限实现起来有点困难。因为在linux下,对一个文件可以进行操作的对象被分为三类:file owner(文件的拥有者)、group(组,注意不一定是文件拥有者所在的组)、other(其他)。在每个类里,权限都是一致的,而在一个相同的类里实现不同的权限就不那么方便了,而上述提到的需求就是要在同一个类里实现不同的权限。那么我们就需要通过LINUX下的ACL来实现题中的需求。简单地说acl就是可以设置特定用户或用户组对于一个文件及目录的操作权限,需要掌握的命令也只有三个:getfacl,setfacl,chacl.
我们来具体说一下文章开头提到的那个需求的实现过程
1、目录和账号的创建
默认情况下,在linux下建立用户的时候,有个默认的家目录,一般是在/home下,但是如果我们想在系统中建立多个用户,而家目录都不在/home 下的话,就需要用useradd -d 来指定家目录
#groupadd ftpgroup
# useradd bjdq -d /data/bj -g ftpgroup
#passwd bjdq
# useradd shdq -d /data/sh -g ftpgroup
#passwd shdq
# useradd gzdq -d /data/gz -g ftpgroup
#passwd gzdq
#useradd bjzb
#passwd bjzb
#useradd bjguanli
#passwd bjguanli
补充还有一个方法是修改/etc/default/useradd文件
# useradd defaults file
GROUP=100
HOME=/home (将默认的HOME改为你设定的目录)
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
这样也可以在建用户的时候,指定特定的用户主目录。
2、FTP的设置
FTP服务器地址:192.168.1.130
修改FTP配置文件
# vi /etc/vsftpd/vsftpd.conf
在里面添加如下语句
local_enable=YES //是否允许本地用户登录FTP服务器,默认是允许
write_enable=YES //是否允许用户具有在FTP服务器文件中执行写的权限,默认是允许
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
local_umask=007 #用户的权限
chroot_list_enable=YES //如果希望用户登录后不能切换到自己目录以外的其它目录,需要设置该项来锁定用户目录
chroot_list_file=/etc/vsftpd/chroot_list
userlist_enable=YES #设置userlist_enable=YES,那么只允许/etc/vsftpd/user_list中列出的用户具有该功能
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
~
"/etc/vsftpd/vsftpd.conf" 147L, 5079C written
设置完重启ftp服务
# service vsftpd restart
关闭 vsftpd:[确定]
为 vsftpd 启动 vsftpd:[确定]
三、权限的设置
由于/data/bj的所有者是bjdq,/data/sh的所有者是shdq,/data/gz的所有者是gzdq,这样自然就有了读、写、执行权限,我们只需设置组和其他的权限即可
为了限定bjdq、shdq、gzdq的用户不能切换目录,我们还需要把bjdq、shdq、gzdq这三个用户写入chroot_list文件。
[root@localhost vsftpd]# echo "bjdq" >>chroot_list
[root@localhost vsftpd]# echo "shdq" >>chroot_list
[root@localhost vsftpd]# echo "gzdq" >>chroot_list
权限设置如下:
#chmod 755 /data/bj
#chmod 755 /data/sh
#chmod 755 /data/gz
针对bjzb和bjguanli这两个账户的权限设置如下
#setfacl -R -m u:bjzb:rx /data/bj
#setfacl -R -m u:bjguanli:rwx /data/bj
#setfacl -R -m u:bjzb:rx /data/sh
#setfacl -R -m u:bjguanli:rwx /data/sh
#setfacl -R -m u:bjzb:rx /data/gz
#setfacl -R -m u:bjguanli:rwx /data/gz
[root@localhost data]# ls -l
total 12
drwxr-xr-x+ 4 bjdq ftpgroup 4096 Jan 18 19:09 bj
drwxr-xr-x+ 4 shdq ftpgroup 4096 Jan 18 19:12 sh
drwxr-xr-x+ 4 gzdq ftpgroup 4096 Jan 18 19:22 gz
最后大家可以通过getfacl来查看这三个目录的权限并通过客户端登陆来验证。
(注:setfacl –x g:ftpgroup file 删除ftpgroup组对file文件的所有权限
setfacl -x u:bjguanli /data/bj 删除bjguanli用户对/data/bj目录的权限保留读权限
setfacl –x u:bjzb file 删除bjzb用户对file文件的所有权限)
#getfacl --omit-header /data/bj
getfacl: Removing leading '/' from absolute path names
# file: data/bj
# owner: bjdq
# group: ftpgroup
user::rwx
user:bjguanli:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:bjguanli:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
其他目录权限设置类似
四、客户端测试
[root@localhost /]# ftp 192.168.1.130
Connected to localhost.localdomain.
220 (vsFTPd 2.0.5)
Name (localhost:root): bjdq
331 Please specify the password.
Password:
500 OOPS: cannot change directory:/data/bj
Login failed.
ftp> quit
注意这个报错,你需要考虑IPTABLES和SELINUX的限制了。
可以直接关闭IPTABLES和SELINUX,如果是不能关则需要做如下调整
在IPTABLE里开放FTP服务,允许21、20端口通行。
针对SELINUX的安全限制,可以使用这句
[root@localhost test]# setsebool ftpd_disable_trans 1 #关闭SELinux对ftp的保护
[root@localhost test]# service vsftpd restart
最后再试,一切正常。
[root@localhost test]#ftp 192.168.1.130
Connected to localhost.localdomain.
220 (vsFTPd 2.0.5)
Name (localhost:root): bjdq
331 Please specify the password.
Password:
Login successful.
ftp> pwd
"/"
ftp>bye
经验证,最后权限设置,符合业务部门的需求。