简介:
ftp为计算机上的一种协议,在linux中有多种实现软件,server端如vsftpd,client端如:ftp lftp 等以及可以实现下载ftp服务端资源的工具如 wget
ftp工作于应用层之上,所以ftp可以跨平台,而且ftp通信时使用TCP的两个端口,一个用于发送指令,另外一个用于传输数据,但是只有指令端口处于监听状态,数据端口当在进行数据发送时才会打开。
以下图片将对本文中出现的内容进行简单概述
ftp状态码:
ftp用户:
ftp的用户可以分为三种但是无论使用三种中的任何一种登录系统,最终都需要在系统上进行用户身份的授权,即对访问文件系统的ftp进程的发起者的身份。系统上任何进程都需要指定发起者身份,所以指定进程运行身份是必须的。使用的任何的账户登录最终都要对应一个系统上的身份,
而用户最终能否访问系统上文件,需要进行两次筛选,登录的用户应用程序是否允许读取指定的文件,与操作系统是否允许以该用户对应身份运行的进程有权限读取该指定的文件。
用户分类:
匿名用户:
匿名登录时在服务端是以ftp账户登录,而且进入的是ftp用户的家目录,即以家目录为根. 对文件的操作权限使用系统账号ftp的权限
系统账户:
即操作系统使用的账号,存放在系统文件passwd中,该类账号以系统账号自身进行登录,即进程的发起者身份及为该账号。登录时登录到用户的家目录。
虚拟账户:
即ftp应用程序内部使用的账户,登录时可以指定映射为对应的系统账户,且必须指定映射的用户
ftp实现:
ftp客户端:
ftp为应用层的协议所以ftp支持众多的操作系统平台。
而且ftp的两种服务端工作模式,即主动模式与被动模式同样在客户端连接时在客户端上进行指定。
ftp服务端:
ftp的服务端实现即为vsftpd
端口:
ftp传输数据使用了两种方案。主动模式与被动模式
发送指令端口,默认使用21端口,而且在ftp服务运行之后,使用21端口进行监听
发送数据端口,对于发送数据的端口根据传送数据的模式不同有两种对应的方案.
主动模式,当服务器接收到请求数据指令时,服务器主动开启数据传输端口,向客户端发起ftp的三次握手请求,此时服务器默认的开启的数据传输端口为20.
被动模式,当服务器接收到请求数据指令时,服务器仅通过指令端口回传数据以及本地的监听的数据端口信息,继续由客户端发起ftp的三次握手请求。
主动模式与被动模式的区别为,服务器是否主动进行数据的传送(指令与数据中的数据),当服务器打开20端口并进行三次握手请求为主动模式.当客户端打开数值加一的随机端口向服务端的随机端口发送三次握手请求为被动连接.服务器与客户对于对方数据端口号的获取,通过指令端口进行.
通信时使用主动模式或是使用被动模式,需要server,client之间进行协商,协商的发起为client端。
ftp配置文件:
配置文件:/etc/vsftpd/vsftpd.conf
查看配置文件帮助
man 5 vsftpd.conf
设置监听的端口,即指令端口。
listen_port=修改的端口号,默认配置文件中不存在此配置,需要手工添加.
设置监听的端口,即指令端口。
connect_from_port_20=YES 主动模式端口为20
ftp_data_port=20 指定主动模式的端口,和上面设置相似
设置主动模式时,主动打开的端口
connect_from_port_20=YES 主动模式端口为20
ftp_data_port=20 指定主动模式的端口,和上面设置相似
设置被动模式时,可进行响应的端口范围
pasv_min_port=6000 最小端口号
pasv_max_port=6010 最大的端口号。
当以上两项数值都为0时,为随机分配
设置使用当地时区的时间
use_localtime=YES (默认为NO,使用GMT)
设置支持匿名账户登录
anonymous_enable=YES
设置匿名账户不进行口令检查
no_anon_password=YES
设置匿名账户只能下载ugo都为w的文件
anon_world_readable_only=YES
默认该项为YES
设置匿名账户可以上传文件,但需要注意系统账户ftp的权限
anon_upload_enable=YES
设置匿名账户可以创建文件夹
anon_mkdir_write_enable=YES
匿名账户可以删除,修改服务器上的文件
anon_other_write_enable=YES
设定匿名账户的umask值,也就是文件最终的权限
anon_umask=077
设置匿名文件的所有者
chown_username=wang
指定匿名账户上传文件的默认所有者,与权限
chown_uploads=YES(默认NO)
开启匿名上传功能
chown_username=wang
设置匿名文件的所有者
chown_upload_mode=0644
设置匿名文件的umask值
将所有的系统账户映射为指定的系统账户
guest_enable=YES
开启映射功能
guest_username=ftp(系统用户名称)
将所有的用户映射到指定的系统用户
是否允许Linux系统账户登录
local_enable=YES
YES为允许
系统用户是否可写
write_enable=YES
系统用户最终上传的权限
local_umask=022
非匿名用户登录时映射到的目录
local_root=路径
设置系统账户登录以家为根。
以系统用户登录可以进入系统中所有该账号有权限进入的目录,即以ftp服务器的文件系统的根为FTP的根,在大多数场景下,此类配置会带来安全隐患。ftp支持系统用户登录时以自己的家目录为ftp的根。
chroot_local_user=yes
将不允许用户切换至非家目录下的文件夹进行限制后文件的路径以家为根
如果需要开放某些特定的用户,对整个服务器的文件系统的全局访问权限
chroot_list_enable=YES 启用列表
chroot_list_file=路径 指定列表路径
当开启列表后chroot_local_user的值将决定列表中用户的性质,即列表为黑名单或白名单
chroot_local_user=NO 当为NO时不再文件中的用户可以切换至非家,文件中的将不能进行切换
chroot_local_user=YES 当为yes时在文件中的用户才可以进行切换
日志设置
FTP可以同时记录两种日志:WU日志;以及FTP本身日志
这应该是总开关
xferlog_enable=yes
开启wu日志
xferlog_std_format=yes
使用WU日志
xferlog_file=路径
设置日志的保存路径
开启vsftp日志
dual_log_enable=YES
使用vsftp日志
vsftpd_log_file=路径
设置日志的保存路径
设置用户登录ftp的提示信息以及用户进入某个目录的提示信息
登录的提示信息
基于输入的值
ftpd_banner=登录的提示信息
基于设定的文件
banner_file=文件的路径
进入目录的提示信息
功能启用
dirmessage_enable=YeS
设置文件夹下保存提示信息的文件
message_file=文件路径
默认为.message 分别保存在每个需要用到的显示切换信息的目录下
系统用户登录控制
基于pam的用户控制
基于pam的控制需要更改pam模块的配置文件/etc/pam.d/vsftpd
控制是基于pam_listfile.so模块进行控制的.所以更改配置文件中的第二行 pam_listfile.so的配置
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusersonerr=succeed
sense 设置文件的作用,作为黑名单或是作为白名单
sense=allow |deny 白名单|黑名单
file 即控制用户登录的文件.格式每行一个用户
作为pam的模块的配置文件 ,无需重启vsftpd服务
基于vsftp自身的用户控制
编辑vsftpd的配置文件
/etc/vsftpd/vsftpd.conf
开启用户列表控制功能
userlist_enable=yes
设置模式
userlist_deny=YES|NO 黑名单|白名单
设置文件路径
userlist_file=文件路径
更改配置文件需要重启
用户传输控制
配置文件:/etc/vsftpd/vsftpd.conf
连接数限制
设置最大的连接数,连接总数.
max_clients
设置每个IP的最大连接数
max_per_ip
当设置的值为0时将不限制,如:
max_clients=0
max_per_ip=0
传输速率限制
设置匿名用户的最大传输速率
anon_max_rate
设置本地用户的最大传输速率
local_max_rate
同样当设置值为0时将不进行限制
连接时间限制
主动模式下数据连接超时时间
connect_timeout=60
被动模式下数据连接超时时长
accept_timeout=60
数据连接无数据传输超时时间
data_connection_timeout=300
无命令操作超时时长
idle_session_timeout=60
设置默认的文件传输方式
可以设置为文本模式与二进制模式
设置为默认为文本编码进行文件上传,客户端的文件上传
ascii_upload_enable=YES
设置为默认为文本编码进行文件下载,客户端的文件下载
ascii_download_enable=YES
注:该配置只是设置优先的传输方式,可以在客户端指定本次传输使用的模式
windows中支持文本方式,但是linux只能使用二进制传输
设置二级进程的运行身份
默认的二级进程运行身份为nobody,nobody为系统中大部分程序需要使用默认的用户时使用的用户。
配置项 :nopriv_user=用户名称
nopriv_user=ftpd
设置ftp的服务类型
独立服务与非独立服务,centos6默认为独立服务,但是在centos7 中直接就没有独立服务,就是所有程序都为非独立服务。
配置文件配置项:
/etc/vsftpd/vsftpd.conf
listen=YES|NO 非立服务|独立服务
设置为非独立服务后需要使用xinetd进行管理:
确保xinetd已经安装,
修改或创建,或复制其他非独立服务文件进行修改。总之创建xinetd的vsftpd的配置文件
然后停止ftp
重启xinetd
使用ssl进行验证
启用SSL
ssl_enable=YES
匿名不支持SSL
allow_anon_ssl=NO
本地用户登录加密
force_local_logins_ssl=YES
本地用户数据传输加密
force_local_data_ssl=YES
指定证书文件地址
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
创建证书
openssl创建
需要将私钥追加至证书中
cat ftp.key >> ftp.pem
ftp自带工具创建
cd /etc/pki/tls/certs/
make vsftpd.pem
ftp虚拟用户
虚拟应该对应一个操作系统的账户。仅能被映射为一个账号。即操作文件系统上的文件需要一个操作系统上的身份,系统用户的权限为虚拟账户的上限。可以对虚拟账户进行分别权限设置
映射的系统账户设置
创建用户即家目录
useradd -d /var/ftproot -s /sbin/nologin ftproot
chmod +rw /var/ftproot/
设置权限
在家目录下创建对应的虚拟用户的目录
chmod -w /var/ftproot
mkdir /var/ftproot/upload
setfacl -m u:ftproot:rwx /var/ftproot/upload
设置虚拟账户的信息
基于文件的认证
将账户信息保存在文本文件中,文本文件格式
奇数行填账户,偶数行填密码
将文本转化为数据库的二进制格式
db_load -T -t hash -f 文本文件 生成的数据库文件
设置pam模块配置,使之适用于基于本地二进制文件的验证方式
需要使用到/usr/lib64/security/pam_userdb.so模块
创建配置文件,并编辑
vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/ftproot (生成的二进制文件名称)
account required pam_userdb.so db=/etc/vsftpd/ftproot (生成的二进制文件名称)
配置vsftpd的配置,指明进行验证的pam模块配置
编辑ftp配置文件文件
/etc/vsdtpd/vsftpd.conf
指定进行pam认证时使用的PAM配置文件
pam_service_name=vsftpd.db
设置虚拟账号与系统账户间的映射
guest_enable=YES
guest_username=ftproot
设置登录的用户映射成系统用户,映射为非系统的账户登录才被映射为指定账户
对每个虚拟账户进行相对的权限划分
用户的配置信息会保存到指定的文件夹中,该文件夹在vsftpd中进行声明
用户的配置文件,每个虚拟用户为单独的一份配置文件,以虚拟用户名称进行命名。
更改配置文件,进行虚拟账户配置文件指明
更改/etc/vsftpd/vsftpd.conf的配置信息:
user_config_dir=配置文件夹的路径
创建虚拟用户的配置文件
vim 配置文件夹的路径/用户名
配置独立的配置文件,及每个用户使用单独的配置文件,每个文件中可以进行如下配置。
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/ftproot
将账户信息保存在数据库文件中
PAM连接数据库需要使用模块pam_mysql(epel源提供)
安装模块
centos6 :
配置epel源
yum install pam_mysql
centos7 :
7中并没有提供该模块的rpmbao所以需要进行手动编译安装.
下载安装
安装开发工具
yum groupinstall Development Tools
安装mariadb ,pam 开发包
yum -y install mariadb-devel pam-devel
进行编译
./configure –with-mysql=/usr –with-pam=/usr –with-pam-mods-dir=/lib64/security
安装
make &&make install
创建数据库,以及对应管理数据库的账户
创建数据库
create databases ftpdb;
创建用户并向用户赋予权限
grant all on ftpdb.* to ftpuser@’172.16.%.%’ indentified by ‘jinbus’;
创建表结构
create table ftpusers (id int unsigned auto_increment primary key,name char(30) ,passwd char(48));
向表中添加数据
insert into ftpusers (name,passwd) values (‘ftp1’,password(‘haha’)) ,(‘ftp2’,password(‘hehe’));
设置ftp的pam认证
另外创建一个用于pam验证的配置文件,在/etc/pam.d/文件夹下
在创建的pam验证文件中写入验证规则
auth required pam_mysql.so user=数据库用户名称 passwd=用户密码 host=数据库主机地址 db=数据库名称 teble=表名称 usercolumn=表中保存虚拟用户名称的列 passwdcolumn=表中保存虚拟用户密码的列 crypt=2 (2为mysql加密)
crypt 值:
0 不加密
1 表crypt(3)加密
2 表示mysql password () 函数加密
3 表示MD5加密
4 表示sha1加密
详细配置
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
更改ftp的配置文件,将pam的验证策略指向为刚才创建的文件
pam_service_name=验证文件路径
映射虚拟账号至系统账户
guest_enable=YES
guest_username=映射为的系统账户
对每个虚拟账户进行相对的权限划分
用户的配置信息会保存到指定的文件夹中,该文件夹在vsftpd中进行声明
用户的配置文件,每个虚拟用户为单独的一份配置文件,以虚拟用户名称进行命名。
更改配置文件,进行虚拟账户配置文件指明
更改/etc/vsftpd/vsftpd.conf的配置信息:
user_config_dir=配置文件夹的路径
创建虚拟用户的配置文件
vim 配置文件夹的路径/用户名
配置独立的配置文件,即每个用户使用单独的一个配置文件
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/ftproot