一、环境说明:
作系统:centOS6.5
其它设置:
关闭了iptables及selinuxyum
yum安装了nginx(存在了nginx用户)
通过附一的命令安装了vsftp,用户名字为test
默认配置文件为
[root@vm2 vuser_conf]# cat /etc/vsftpd/vuser_conf/test
local_root=/disk1/tools
local_umask=022
write_enable=YES
guest_enable=yes
guest_username=nginx
anonymous_enable=no
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_umask=022
二、vsftp虚拟用户权限设置
2.1.修改用户权限相关的知识点
local_umask
本地用户上传后文件时的umask掩码
anon_umask
虚拟用户或匿名用户上传文件时的umask掩码
没有配置file_open_mod只有local_umask和anon_umask情况下
对于目录来说最大权限是777(rwxrwxrwx)对于文件来说最大权限是666(rw-rw-rw-)
file_open_mode上传档案的权限:
为了突破umak文件最大权限不能超过666,在ssh上可以采用chmod修改,在vsftp中file_open_mode参数与shh中的chmod 功能是等效的!只不过是该用户模式下的chmod,
所以你用该真实用户chmod修改权限要在他的能力范围之内,如该用户无权修改其它真实用户的文件权限(比如root用户创建的文件)
与chmod不同的是前面补多一个0,如chmod 775,那file_open_mode则为0775
该参数一般放在最后执行
2.例1 文件权限为774,目录权限为775
因用nginx作为php和nginx的进程用户,公司网络不稳定有时用FTP上传会经常性中断,需要还需要建立一个普通的ssh用户名字为putong用sftp上传,对VSFTP中test用户所在目录也能读写,为了解决这个问题,
nginx用户和ssh用户putong共用组,可以putong用户添加多一个nginx组
组要有读写权限,那么目录就要775,文件就要774权限了
sftp上传文件也要变成
操作:
#1.添加ssh用户putong,把nginx追加到其中,最后把putong的组改为nginx
usermod -a -G nginx putong
[root@vm2 ~]# id putong
uid=501(putong) gid=501(putong)groups=501(putong),499(nginx)
vim /etc/passwd
#修改putong ssh用户组为nginx组号499,这样建立文件用户名为putong,组为nginx
putong:x:501:499::/home/putong:/bin/bash
#2.修改vsftp中test用户的配置使用其中目录权限为775,文件权限为774
local_root=/disk1/tools
local_umask=022
write_enable=YES
guest_enable=yes
guest_username=nginx
anonymous_enable=no
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_umask=002 #改成4位也行,0002,
file_open_mode=0774 #此处的0不能少,这上参数相当于chmod 774 上传文件名
#3.修改ssh用户用sftp上传文件和目录的权限
发现sftp没有像file_open_mode这样的参数,所在只能先用sftp上传完,随便用该账号ssh登陆,chmod命令修改文件及目录权限了,find
/disk1/tools/ -type f -exec chmod 774 {} \;
因为上面把putong用户的组改为nginx,这样nginx进程也能对该目录进行读写删除操作。
如果觉得这样做麻烦的话,可以写一个脚本定时判断目录下文件权限是否是774,如果不是就修改为774也行。
2.3.vsftp用户改变总结
#1)设置上传文件权限:
可以使用file_open_mode参数,一定要4位数字,相当于chmod命令
如:
file_open_mode=0774相当于chmod
774 当前上传文件名
#2)修改虚拟用户目录权限:
可以使用anon_umask参数,保持local_umask=022不变,权限为777-anon_umask的值。
发现一个问题有偶尔会出现不稳定的情况,other组不稳定的情况,不知道是客户端原因还是其它。
如:
anon_umask=003,则权限的值为777-003=774
三、VSFTP虚拟用户的精确控制
3.1.cmds_allowed参数
当我们需要对某个用户进行精确控制的情况下,如除了删除命令其它都可以执行,那么就要用到cmds_allowed参数了
因为我的是基于虚拟用户,进入虚拟用户配置目录我这里是按“附一 VSFP安装”来弄,
#1.进入虚拟目录
cd /etc/vsftpd/vuser_conf
#2.随便找一个用户,我这里是test用户,保证
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
上面4个选择是YES的,默认配置是YES了
#3.在最后面添加一个cmds_allowed=命令1,命令2,...命令n即可控制进行精确的控制了
3.2. cmds_allowed参数命令列表
cmds_allowed参数可用的命令列表如下:
# ABOR - abort a file transfer
# CWD - change working directory
# DELE - delete a remote file
# LIST - list remote files
# MDTM - return the modification time of a file
# MKD - make a remote directory
# NLST - name list of remote directory
# PASS - send password
# PASV - enter passive mode
# PORT - open a data port
# PWD - print working directory
# QUIT - terminate the connection
# RETR - retrieve a remote file
# RMD - remove a remote directory
# RNFR - rename from
# RNTO - rename to
# SITE - site-specific commands
# SIZE - return the size of a file
# STOR - store a file on the remote host
# TYPE - set transfer type
# USER - send username
# less common commands:
# ACCT* - send account information
# APPE - append to a remote file
# CDUP - CWD to the parent of the current
directory
# HELP - return help on using the server
# MODE - set transfer mode
# NOOP - do nothing
# REIN* - reinitialize the connection
# STAT - return server status
# STOU - store a file uniquely
# STRU - set file transfer structure
# SYST - return system type
3.3.例子:
1. 可以上传、重命名、建立文件(或目录),不能删除(或目录)
[root@vm6 vuser_conf]# cd
/etc/vsftpd/vuser_conf/
[root@vm6 vuser_conf]# cat test
local_root=/disk1/tools
local_umask=022
write_enable=yes
guest_enable=yes
guest_username=nginx
anonymous_enable=no
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_umask=022
cmds_allowed=ABOR,APPE,CWD,CDUP,FEAT,LIST,MKD,MDTM,PASS,PASV,PWD,QUIT,RETR,REST,STOR,STRU,TYPE,USER,RNTO,RNFR
2. 可以上传和建立文件(或目录),不能重命名和删除文件(或目录)
把上面的RNTO,RNFR去掉即可
cmds_allowed=ABOR,APPE,CWD,CDUP,FEAT,LIST,MKD,MDTM,PASS,PASV,PWD,QUIT,RETR,REST,STOR,STRU,TYPE,USER
附一、vsftp安装
操作系统:centOS6.5
其它设置:关闭了iptables及selinux,yum安装了nginx
下面是以nginx用户基础建立的虚拟用户,#如果你想基于其他用户可以修改为其它如apache,mysql等,前提是它是系统存在的用户,如果虚拟用户所在的真实用户没权限那么虚拟用户也不有权限,虚拟用户是继承真实用户权限的基础再做权限控制的。
#------------------------------------------------------直接刷命令-------------------------------------
#1.安装vsftpd-2.2.2-14.el6.x86_64
yum -y install vsftpd
chkconfig vsftpd on
#2.基于虚拟用户的配置
cd /etc/vsftpd/
cp vsftpd.conf vsftpd.conf.orig
#写入配置文件含被动模式
cat>>vsftpd.conf<
#by hua 2016.1.12
user_config_dir=/etc/vsftpd/vuser_conf
pasv_enable=YES
pasv_min_port=5000
pasv_max_port=5100
pasv_promiscuous=YES
EOF
vsftpd]# tail -7 vsftpd.conf
#3.进行认证,安装Berkeley
DB工具
yum install db4 db4-utils -y
#创建用户密码文本
cat>>vuser_passwd.txt<
test
123456
EOF
#生成虚拟用户认证的db文件
db_load -T -t hash -f
/etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.orig
echo '#%PAM-1.0'
>/etc/pam.d/vsftpd
echo 'auth required
pam_userdb.so db=/etc/vsftpd/vuser_passwd'>>/etc/pam.d/vsftpd
echo 'account required
pam_userdb.so db=/etc/vsftpd/vuser_passwd' >>/etc/pam.d/vsftpd
cat /etc/pam.d/vsftpd
#创建虚拟用户配置文件
mkdir /etc/vsftpd/vuser_conf
cd /etc/vsftpd/vuser_conf/
#下面是test账号用法
cat>>test<
local_root=/disk1/tools
local_umask=022
write_enable=YES
guest_enable=yes
guest_username=nginx
anonymous_enable=no
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_umask=022
EOF
service vsftpd start
chkconfig vsftpd on
chown nginx.nginx /disk1/tools
#为了安全禁止匿名用户登陆,如果发现问题可以去掉
sed -i '/anonymous_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf
grep 'anonymous_enable'
/etc/vsftpd/vsftpd.conf
/etc/init.d/vsftpd restart
#------------------------------------------------------直接刷命令-------------------------------------
#如果是centos7则添加多一条,centos7用的是vsftp 3版本,centos6
yum安装的是2.2版本,不能添加否则报错
#500 OOPS: unrecognised variable in config
file: allow_writeable_chroot
echo
'allow_writeable_chroot=YES'>>/etc/vsftpd/vsftpd.conf
#3.错误解决:
500 OOPS: cannot locate user entry:nginx
说明没有nginx用户,可以修改guest_username=nginx为其他用户
附二、vsftp禁止下载,只能上传
因公司业务需要,几个账号共用一个目录,里面的资料比较重要的不能让别人随意下载获取,故禁止下载。
vi /etc/vsftpd/vsftpd.conf
#在尾部添加,如下内容,并重启服务器
#deny download
anon_world_readable_only=NO
download_enable=NO
/etc/init.d/vsftpd restart
测试结果:
注:
如果是针对单个虚拟用户,只需要在该虚拟用户配置文件中添加下面两行并重启vsftp即可:
anon_world_readable_only=NO
download_enable=NO