环境:
server:
os:centos7.3
prog:vsftpd3.0.2
client:
centos7
ftp服务:
ftp协议:file transfer protocol,应用层协议,提供文件共享服务
工作模式:主动模式、被动模式
ftp服务在使用时会建立两个连接:
命令连接:客户端随机端口-->服务器21/tcp端口;
数据连接:当客户端发起数据传输命令时,会建立此连接,并在
数据传输完成后断开连接,ftp的主动和被动模式就是数据传输
连接的建立方式不同;
主动模式:服务器使用固定的20/tcp端口去连接客户端发起命令
连接的端口号+1的端口(如被占用,则继续+1)
被动模式:服务器通过命令连接发送数据连接随机端口号到客户端,
客户端向收到的端口号和服务器建立数据连接
数据传输格式:文本和二进制格式(不应人为指定某种传输格式,
而应根据文件格式自动使用数据传输格式)
服务端程序:
vsftpd:very secure ftp daemon
proftpd
pure-ftpd
serv-U(windows)
客户端程序:
ftp
filezilla
lftp
gftp
wget、curl
部署:
1、安装服务器软件vsftpd:
# yum install vsftpd -y
2、启动服务:
# systemctl start vsftpd
3、客户端安装软件:
# yum install ftp
4、关闭服务器和客户端的防火墙和selinux:
# setenforce 0
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -F
5、客户端访问
# ftp 192.168.181.10
192.168.181.10为服务器ip,匿名访问用户名输入anonymous或ftp
密码为任意;用户登录访问输入服务器端委派的用户
6、vsftpd的三种用户模式:
匿名用户:支持匿名用户登录,对应的目录文件权限为ftp用户权限
系统用户:支持系统用户登录,对应的目录文件权限为系统用户权限
虚拟用户:定义在数据库表中或文件中的用户,该类用户权限跟随匿名
用户权限设置;
7、配置文件/etc/vsftpd/vsftpd.conf参数:
anonymous_enable=YES
#允许匿名用户访问,NO为禁止
local_enable=YES
#允许系统用户访问,NO或注释为仅允许匿名访问
write_enable=YES
#允许写操作,NO或注释为禁止任何形式的写操作
local_umask=022
#系统用户默认umask为077,启用此项可修改为022
anon_upload_enable=YES
#允许匿名用户上传文件,NO或注释为禁止
anon_mkdir_write_enable=YES
#允许匿名用户创建目录,NO或注释为禁止
anon_other_write_enable=YES
#允许匿名用户删除文件或目录,NO或注释为禁止
dirmessage_enable=YES
#启用目录消息,在用户进入目录时,会显示目录下.message文件
中的内容;NO或注释为禁止
xferlog_enable=YES
#启用下载或上传的日志记录;NO或注释为禁止
chown_uploads=YES
#改变上传文件的属主属组,默认开启
chown_username=whoever
#和上个参数配合使用,改变后文件的属主属组名,默认开启
chroot_local_user=YES
#启用系统用户的chroot,即系统用户在登录时会锁定根目录在
用户家目录下,NO或注释为禁止(要和allow_writeable_chroot
=YES一起使用)
chroot_list_enable=YES
#启用chroot用户列表;配合chroot_list_file参数使用
当chroot_local_user=YES时,表示系统用户默认开启chroot,
列表中的用户为例外
当chroot_local_user=NO或注释时,表示系统用户默认不开启
chroot,列表中的用户为要进行chroot的用户
chroot_list_file=/etc/vsftpd/chroot_list
#此文件为默认项,文件中每行定义一个系统用户
allow_writeable_chroot=YES
#设置chroot的父目录具有写权限时也可执行chroot
listen=YES
#为yes时,vsftpd进程工作为独立守护进程模式;为no时,工作
时工作为瞬时守护进程模式
pam_service_name=vsftpd
#pam认证模块配置文件名称,位于/etc/pam.d下
user_list_enable=YES
#是否启用/etc/vsftpd/user_list文件来进行用户访问控制;
该文件中的用户默认为拒绝登录,设置参数userlist_deny=NO
时,该文件中的用户为允许登录,其他用户拒绝;
#该文件是对用户登录时输入的用户名称进行匹配检查;如登录名
称被文件匹配并禁止登录,则客户端登录失败;
用此文件禁止匿名登录时,需在文件中同时添加ftp和anonymous,
并设置user_deny=YES;
该选项是ftp服务本身的访问控制定义,而非pam的访问控制定义,
所以包括匿名用户、系统用户、虚拟用户等所有ftp用户都可进行控制;
#该文件中的用户如果设定为允许登录时,当pam_service_name
=vsftpd时,还会使用ftpusers文件进行二次认证,通过后才能登录;
(因为/etc/pam.d/vsftpd中定义了对ftpusers文件的用户认证)
max_clients=10
#允许同时最多客户端连接数为10
max_per_ip=3
#允许每ip可连接数为3
anon_max_rate=0
#允许匿名用户每秒最大传输速率总值,单位为字节,0是默认值,
为不限制;
local_max_rate=0
#允许系统用户每秒最大传输速率总值,单位为字节,0是默认值,
为不限制;
pasv_enable=YES
#是否开启被动模式,此为默认值;值为NO时,配置参数:
connect_from_port_20=YES,是开启主动模式,相对于被动模式
安全性稍差;
pasv_max_port=30000
#被动模式随机端口的最大值设置;
pasv_min_port=29900
#被动模式随机端口的最小值设置;
8、ftp的安全通信方式:ftps、sftp
ftps:
运行在ssl或tls加密协议之上的ftp服务
ca签署证书给vsftpd服务,并在vsftpd.conf中开启以下指令
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.pem
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem
ca证书中的主机名称必须和客户端访问的主机名称保持一致
设置完成后重启服务:
#systemctl restart vsftpd
此时,非匿名用户必须进行加密连接才允许登录
win10安装filezilla客户端,进行ftps连接,选择信任证书即可
sftp:
是基于ssh协议实现的加密的ftp服务,借助22端口提供服务,仅
当一个用户以ssh协议登录服务器时sftp服务才会被启动;sftp通
常是作为ssh实现程序的一部分,常用的例如openssh、tectia ssh
下面介绍openssh中sftp的用法:
服务器端:启动sshd服务,客户端连接sshd服务即可使用
客户端命令
scp命令:远程复制文件
sftp命令:类似ftp的交互式命令
sftp user@host
sshfs命令:挂载sshfs文件系统(需安装fuse-sshfs),借助
ssh安全连接挂载服务器端文件系统到客户端
sshfs user@host:/path/to/dir /path/to/dir
9、ftp虚拟用户登录设置:
使用数据文件进行虚拟用户登录认证
@创建用户文件,单行为用户名,偶数行为密码
#cat << EOF >> /root/vuser.list
<jerry
<123.com
<tom
<123.com
EOF
@转换vuser.list文件为Berkeley DB类型:
# db_load -T -t hash -f /root/vuser.list /etc/vsftpd/vuser.db
#chmod 600 /etc/vsftpd/vuser.db
@在/etc/pam.d目录下添加vuser认证配置文件:
#cat << EOF >> /etc/pam.d/vsftpd.vuser
<auth required pam_userdb.so db=/etc/vsftpd/vuser
<account required pam_userdb.so db=/etc/vsftpd/vuser
EOF
Tip:该文件中db文件名不能跟随.db,认证服务会自动补全,
加后缀名.db成为vuser.db后,客户端登录时会提示错误:
user_lookup: could not open database `/etc/vsftpd/vuser.db':
No such file or directory
@创建虚拟用户统一映射到的本地系统用户,设置家目录为ftp
为虚拟登录用户准备的共享目录
#useradd -d /var/ftp/pub/vuser-home -s /sbin/nologin vuserftp
#rm /var/ftp/pub/vuser-home/.* -rf
#chmod o+rx /var/ftp/pub/vuser-home
@修改/etc/vsftpd/vsftpd.conf配置文件,添加并修改以下内容:
添加内容:
guest_enable=YES ;启用来宾账号,即虚拟账号
guest_username=vuserftp ;虚拟账号映射成为的本地账号
修改内容:
pam_service_name=vsftpd改为
pam_service_name=vsftpd.vuser
@重启vsftpd服务:
#systemctl restart vsftpd
@客户端登录测试
@为虚拟用户单独设置权限控制:
首先,在/etc/vsftpd/vsftpd.conf主配置文件中添加以下参数:
user_config_dir=/etc/vsftpd/vuserconf
其次,创建上面参数中定义的目录,并在目录中创建同虚拟
用户名称的文件,文件中可定义参数为:
anon_upload_enable=[YES|NO];是否允许上传文件
anon_mkdir_write_enable=[YES|NO];是否允许创建目录
anon_other_write_enable=[YES|NO];是否允许删除目录
或文件
当主配置文件/etc/vsftpd/vsftpd.conf中参数与虚拟用户独立
配置文件重复时,以虚拟用户独立文件设定为最终权限;
例:
#mkdir /etc/vsftpd/vuserconf
#cat << EOF >> /etc/vsftpd/vuserconf/tom
<anon_upload_enable=YES
<anon_mkdir_write_enable=YES
<anon_other_write_enable=YES
EOF
此时,不管主配置文件是否分派权限,tom用户都具有以上
权限;
Tip:启用数据文件虚拟账号认证后,系统用户无法登录,匿名
用户登录仍可用
使用mysql进行用户登录认证数据存放
@安装所需软件
#yum install -y mariadb-server mariadb mariadb-devel
pam-devel
下载并安装pam的mysql扩展:
# wget http://prdownloads.sourceforge.net/pam-mysql
/pam_mysql-0.7RC1.tar.gz
#tar xf pam_mysql-0.7RC1.tar.gz
#cd pam_mysql-0.7RC1
#./configure --with-mysql=/usr
#cp pam_mysql.so pam_mysql.la /usr/lib64/security/
@配置数据库:
#systemctl start mariadb
#mysql ;连入数据库
......中间省略了数据库初始化、删除空用户、设置root密码等
MariaDB>create database vsftpd;
MariaDB>use vsftpd;
MariaDB>create table vuser (
MariaDB>id smallint auto_increment primary key not null,
MariaDB>user char(20) binary not null,
MariaDB>password char(48) binary not null);
MariaDB>grant select on vsftpd.vuser to 'vsftpd'@'192.168.
MariaDB>181.10' identified by ‘123.com’;
MariaDB>flush privileges;
MariaDB>inert into vuser (user,password) value ('tom',password
MariaDB>('123.com')),('jerry',password('123.com'));
MariaDB>exit;
@创建pam认证文件:
#cat <<EOF >> /etc/pam.d/vsftpd.mysql
<auth required pam_mysql.so user=vsftpd passwd=123.com
host=192.168.181.10 db=vsftpd table=vuser usercolumn=u
ser passwdcolumn=password crypt=2
<account required pam_mysql.so user=vsftpd passwd=123.com
host=192.168.181.10 db=vsftpd table=vuser usercolumn=u
ser passwdcolumn=password crypt=2
EOF
@修改vsftpd主配置以下选项为:
pam_service_name=vsftpd.mysql
@重启vsftpd服务:
#systemctl restart vsftpd
@此时仅可登录匿名用户和mysql数据库中标vuser中的用户
也可通过user_config_dir参数进行每用户权限控制
Tip:
%not null一般置于column定义参数的最后面,不然命令报错
%/etc/pam.d/vsftpd.mysql中定义crypt=2可能会报错,可以
尝试其他参数,详细说明参见pam_mysql-0.7RC1目录下
的readme文件;
Tip:
1、/var/ftp目录除了root用户具有w权限外,不能设置其他任何w权限,
否则报错‘vsftpd: refusing to run with writable root inside chroot()’,
客户端无法连接
2、客户端以ftp或anonymous用户进行匿名访问时,所创建的目录或
上传的文件属主属组都为ftp用户,默认设定,文件的权限为600,
目录的权限为700
匿名用户对所有匿名用户创建的目录无法访问,哪怕是在当前会话
创建的,可以进入目录,可以上传文件(假如设置了允许上传),
但目录内容不可见;(测试必须设置该目录其他用户拥有读权限);
anon_other_write_enable=YES;允许匿名登录用户在ftp用户拥有
写权限且other用户读权限的目录下删除文件
3、客户端
问题:
1、设置登录用户chroot时,用户登录提示
‘refusing to run with writable root inside chroot()’
解:正常情况下chroot不允许父目录具有写权限,在vsftpd.conf中加入
参数:allow_writeable_chroot=YES,重启vsftpd服务
参考:https://ma.ttias.be/vsftpd-linux-500-oops-vsftpd-refusing-run-
writable-root-inside-chroot/
2、Ubuntu18.04 使用ftp 192.168.181.10 命令访问centos7 vsftpd,
上传文件提示553 Could not create file. 而使用其他客户端相同
用户上传成功;
解:各linux发行版软件可能稍有差别,ubuntu中ftp的pub命令可能选项
稍有不同,使用lcd进入目标文件目录后,使用put命令再次上传成功
3, 在网关上做ftp连接的iptables转发, 命令连接正常, 但数据连接异常
解: PASSIVE模式ftp, 交换数据连接端口的行为导致, 以下文章有详细
的流程分析和解决方法:https://blog.51cto.com/ourlinux/895562