一、简述
1.ftp:file transfer protocol,文件传输协议
2.两类连接
命令连接:传输命令
数据连接:传输数据
3.两种模式
主动模式:port
server:20/tcp连接客户端的命令连接使用的端口向后第一个可用的端口
被动模式:PASV
server:打开一个随机端口,并等待客户端连接。
4.pam:认证框架,库,高度模块化
5.vsftpd:
url:ftp://username:password@host:port/path/to/file
路径映射:每个用户的url映射到当前用户的家目录
vsftpd以ftp用户的身份运行进程,默认用户即为ftp用户,匿名用户的默认路径及FTP用户的家目录/var/ftp.
ftp,anonymous
注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集,例:FTP用户的权限为文件/目录权限和配置参数交集。
6.ftp协议是明文,不安全。抓取网络包可从报文中读取用户数据
二、程序环境
1.主程序:/usr/sbin/vsftpd
2.主配置文件:/etc/vsftpd/vsftpd.conf
3.数据根目录:/var/ftp
4.Systemd unit File:/usr/lib/systemd/system/vsftpd.service
三、配置vsftpd
1.用户类别
匿名用户:anonymous --ftp, /var/ftp
系统用户:至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers中文件默认被禁止访问ftp服务, PAM(/etc/pam.d/vsftpd)设置
虚拟用户:非系统用户,用户账号不能登录操作系统的用户账号(非/etc/passwd中用户);
注意:用户通过vsftpd服务访问到的默认路径,是用户的家目录;默认可以自己有权限访问所有路径间切换;禁锢用户于家目录中
2.配置文件
/etc/vsftpd/vsftpd.conf
directive=value
注意:directive之前不能有多余字符,包括空格,要顶行第一个字符写起,“=”两侧不能有空格。
(1)匿名用户:
anonymous_enable=YES 启用匿名用户(默认)
anon_upload_enable=YES 启用匿名用户上传权限
anon_mkdir_write_enable=YES 启用匿名用户创建文件/目录权限
anon_other_write_enable=YES 启用匿名用户重命名,删除权限
anon_umask=077 匿名用户文件默认掩码(上次的文件权限为700,即去掉组和其它的所有权限)
(2)系统用户:
local_enable=YES 启用本地用户(默认)
write_enable=YES 启用写权限(默认,包括上传,创建,删除,下载,重命名)
local_umask=022(默认上传文件权限644,控制上传文件权限)
辅助配置文件/etc/vsftpd/ftpusers:
列在此文件中的用户,均禁止使用ftp服务;
chroot_local_user=yes
禁锢所有本地用户于其家目录:需要事先去掉用户对家目录的写权限, 否则登录失败
组合使用,禁锢列表中用户于家目录
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
禁锢列表文件chroot_list中存在的用户于其家目录中:需要事先去除对家目录的写权限
传输日志:
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
控制可登录vsftpd服务的用户列表:组合使用
userlist_enable=YES 启用/etc/vsftpd/user_list文件来控制可登录ftp服务用户
userlist_deny=YES|NO
YES:黑名单,不能登录
NO:白名单,能登录
上传下载速率
anon_max_rate=0 无限制
local_max_rate=0 无限制
并发连接数限制:
max_clients=2000 客户端最大并发2K
max_per_ip=50 单IP最大启用连接50个
(3)虚拟用户
a.用户账号存在哪里?文件、MySQL、redis等
b.vsftpd:认证功能托管给pam:
基于何种存储服务实现存储用户信息,以及对存储服务的驱动靠pam实现
c.pam_mysql
#yum install mariadb-devel pam-devel
d.使用pam_mysql-0.7RC1.tar.gz手动编译,包见附件
#./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security
#make && make install
e.创建数据库、授权用户、创建账号密码
/etc/pam.d/vsftpd.vusers配置文件,用pam+mysql存储用户认证
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
MySQL中/etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve=ON
innodb_file_per_table=ON
log_bin=mysql-bin
登录: #mysql -uuser -ppasswd -hlocalhost
授权用户:
MariaDB [(none)]>GRANT SELECT ON vsftpd.* TO vsftpd@'192.168.100.132' IDENTIFIED BY 'vsftpd'
f.虚拟用户配置vsftpd,添加或修改以下选项:
pam_service_name=vsftpd.vuser /etc/pam.d/vsftpd.vuser认证文件(必选)
guest_enable=YES 启用虚拟用户(必选)
guest_username=vuser 虚拟用户映射用户(系统用户)
g.实现不同用户有不同权限(ftp核心功能,系统用户所有用户权限都一样)
user_config_dir=/etc/vsftpd/vusers_config/
h.虚拟用户的写权限,通过匿名一样的指令进行定义;
anon_world_readable_only=no 下载
anon_upload_enable=YES 上传
anon_mkdir_write_enable=YES 创建
anon_other_write_enable=YES 删除
四、常见问题统计
1.服务开启,创建用户后不能登录,报500错误
a.开启禁锢了家目录,没有去掉用户家目录写权限
b.防火墙、selinux没有关闭,导致登录失败
c./etc/pam.d/vsftpd.xxx 使用虚拟用户时,pam认证文件配置错误
d.使用虚拟用户时,数据库连接失败
e.账号、密码错误
f./etc/vsftpd/vsftpd.conf配置文件错误
2.创建系统账号
注意:useradd -d /user/local/ningx/html -s /sbin/nologin user
a.手动指定家目录,登录shells类型
b. chown -R user.user /user/local/ningx/html
递归指定给家目录及子目录的用户及组
c.chmod -R 755 /user/local/ningx/html
递归指定家目录及子目录的文件目录权限
3.创建一个ftp用户,想让它禁锢在家目录,不能切换上级目录,不能登录操作系统,并且拥有上传,下载,创建,删除权限
allow_writeable_chroot=YES
chroot_local_user=YES
4.登录报530错误
a.确认账号、密码
b.查看shell类型
5.查看ftp配置
[root@slave2 ~]# grep [#] /etc/vsftpd/vsftpd.conf
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
ftpd_banner=Welcome to blah FTP service.
listen=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES