文件传输协议--FTP
1 FTP特点
基于C/S结构
双通道协议:数据和命令连接
数据传输格式:二进制(默认)和文本
2 FTP常见的软件
1)客户端
ftp,lftp,lftpget,wget,curl
ftp -A ftpserver port -A主动模式 –p被动模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file 【rpm -qf `which lftp`】
gftp: GUI centos5 最新版2.0.19 (11/30/2008)
filezilla,CuteFtp,FlashFXP,LeapFtp
IE ftp://username:password@ftpserver
2)服务器端
Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器高速,稳定,下载速度是WU-FTP的两倍
ftp,redhat.com数据:单机最多可支持15000个并发
3 FTP的两种工作模式
1)主动模式:PORT style 服务器连接客户端
客户端打开随机端口通过命令连接告诉服务器端自己打开的数据连接端口(随机端口),服务器端使用自己的20端口去连接客户端端口,建立数据连接。
2)被动模式:PASV style 客户端连接服务器
客户端通过命令连接与服务器端的21端口建立连接,服务器端通过命令连接告诉客户端,自己打开了某随机端口,(端口号不确定)让客户端来连接,从而进行数据传输。
服务器 客户端
+-------+ 命令连接(主动) +-------+
| 20 | <-------------> | |
| 21 | <-------------> | |
+-------+ 数据连接(被动) +-------+
4 FTP常见服务状态码
1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
5 FTP用户认证
匿名用户:ftp,anonymous,对应Linux用户ftp
usermod /app/ftpd ftp 修改ftp家目录
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
nsswitch:network service switch名称解析框架
/etc/
pam:pluggable authentication module 用户认证
/lib64/security
/etc/pam.d/
/etc/pam.conf
VSFTPD服务
vsftpd不再是独立服务了,由xinetd超级守护进程服务代管
1 认识vsftpd的配置文件 yum install vsftpd(21端口)
[root@centos ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd # 日志滚动规则配置文件
/etc/pam.d/vsftpd # 用户认证配置文件,基于pam模块
/etc/rc.d/init.d/vsftpd # 服务脚本
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf # 主配置文件 可使用man5 vsftpd.conf【option=value】(key=value键值对)
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/sbin/vsftpd
/var/ftp # 共享文件位置:/var/ftp 匿名用户(映射为系统用户ftp )
/var/ftp/pub # 系统用户共享文件位置:用户家目录
注意: 虚拟用户共享文件位置:为其映射的系统用户的家目录
【option=value】中"="两遍不要有空格
2 常见配置 vim /etc/vsftpd/vsftpd.conf-->systemctl start vsftpd
# 监听端口 (可以自己定义)
写在文件结尾 listen_port=1024
例:ftp 192.168.159.135 1024
# 主动模式端口
connect_from_port_20=YES 主动模式端口为20
ftp_data_port=20 指定主动模式的端口号
passive将主动模式变为被动模式
# 被动模式端口范围
linux 客户端默认使用被动模式(21端口)
windows 客户端默认使用主动模式(20端口)
pasv_min_port=6000 0为随机分配 # 被动模式端口最小范围,传输数据时生效
pasv_max_port=6010
# 使用当地时间
use_localtime=YES 使用当地时间(默认为NO,使用GMT)
3 匿名用户访问控制
# 支持匿名用户(只能上传不能下载)
anonymous_enable=YES
# 匿名用户略过口令检查
no_anon_password=YES(默认NO)
#只能下载全部读的文件
anon_world_readable_only (默认YES)
# 允许匿名上传,注意:文件系统权限,对文件目录要有写权限
anon_upload_enable=YES
# 是否允许匿名用户删除和修改上传的文
anon_mkdir_write_enable=YES # 允许创建目录
anon_other_write_enable=YES # 允许修改和修改文件
# 指定匿名上传umask,及上传文件的默认权限;处于安全考量
anon_umask=077 # umask=077则上传的文件的权限为600
# 指定上传文件的默认的所有者和权限
chown_uploads=YES(默认NO) # 是否允许上传文件
chown_username=wang # 指定能上传文件的用户
chown_upload_mode=0644 # 上传文件的权限
4 vsftp系统用户控制
# 系统用户映射
guest_enable=YES 所有系统用户都映射成guest用户
guest_username=ftp 配合上面选项才生效,指定guest用户 (两个选项都要一起)
local_enable=YES 是否允许linux用户登录
write_enable=YES 允许linux用户上传文件,这里也要注意目录的文件
local_umask=022 指定系统用户上传文件的默认权限
local_root=/ftproot 非匿名用户登录所在目录
# 禁锢所有系统用户在家目录中
chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户
# 禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
说明:当chroot_local_user=YES时,则chroot_list中用户不禁锢 ;即是否允许切换根目录
当chroot_local_user=NO 时,则chroot_list中用户禁锢 ;即不能切换目录,使用pwd看到的结果为"/"
5 vsftpd用户认证
# 使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd
/etc/pam.d/vsftpd # pam配置文件
/etc/vsftpd/ftpusers # 默认文件中用户拒绝登录
# 是否启用控制用户登录的列表文件
userlist_enable=YES 默认有此设置
userlist_deny=YES (默认值)黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list 此为默认值
# vsftpd服务指定用户身份运行
nopriv_user=nobody
6 连接限制
# 客户端连接数
max_clients=0 最大并发连接数
max_per_ip=0 每个IP同时发起的最大连接数
# 传输速率:字节/秒
anon_max_rate=0 匿名用户的最大传输速率
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
7 vsftpd日志管理
1)wu-ftp日志:默认启用
xferlog_enable=YES #(默认)启用记录上传下载日志
xferlog_std_format=YES #(默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog #(默认)可自动生成
2)vsftpd日志:默认不启用
dual_log_enable=YES # 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log #(默认)可自动生成
3)登录提示信息
ftpd_banner=“welcome to mage ftp server" # 这一项优先生效,如果还有下面那一条
banner_file=/etc/vsftpd/ftpbanner.txt 图片存在独立文件中,要先创建文件
4)目录访问提示信息
dirmessage_enable=YES (默认)
message_file=.message (默认)信息存放在指定目录下.message
文本添加颜色:echo -e 'e[1;31mhahae[0m' > .message --->ftp
crtl +v 可以显示出^[ 这个单字符
8 将vsftpd服务设置为非独立服务 yum install telnet-server
cp /etc/xinetd.d/rsync /etc/xinetd.d/vsftpd
vim /etc/xinetd.d/vsftpd
service ftp
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
disable = no
}
service xinetd start
9 实例
1)要想用户能上传文件,我们该怎么做/
a) 允许匿名上传
anon_upload_enable=YES
b) 目录要有写权限
setfacl -m u:ftp:w /var/ftp/pub
chown a+w /var/ftp/pub
2)修改ftp服务为非独立服务
vim /etc/vsftpd/vsftpd.conf
listen=YES ===> listen=NO # 自己不监听
让xinetd服务知道
cp /etc/xinetd.d/rsync /etc/xinetd.d/ftp
vim /etc/xinetd.d/ftp
service ftp
{
disable = yes
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/ftp # 路径使用ps aux查看
server_args = --daemon
log_on_failure += USERID
}
实验:实现基于SSL的FTPS
# ftp默认是明文的,我们实现加密
# 查看是否支持SSL
ldd `which vsftpd` 查看到libssl.so
1)方法1:创建CA
(umask 077;openssl -genrsa -out /etc/pki/CA/privety/cakey.pem)
openssl req -x509 -new -in /etc/pki/CA/privety/cakey.pem -out /etc/pki/CA/cacerts.pem -days 6500
2)方法2:使用自带的工具创建自签证书
a)生成自签证书
cd /etc/pki/tls/certs/
make vsftpd.pem # 执行该命令之后,你需要输入证书需要的认证信息
openssl x509 -in vsftpd.pem -noout –text # 可查看生成的证书
b)修改配置文件,使用ftp支持ssl;/etc/vsftpd/vsftpd.conf
ssl_enable=YES # 启用SSL
allow_anon_ssl=NO # 匿名不支持SSL
force_local_logins_ssl=YES # 本地用户登录加密
force_local_data_ssl=YES # 本地用户数据传输加密
rsa_cert_file=/etc/vsftpd/vsftpd.pem # 指定证书文件路径
c)测试;可使用filezilla等工具测试
实现基于文件验证的vsftpd虚拟用户
1 虚拟用户
所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
2 虚拟用户帐号的存储方式:
1)文件:编辑文本文件,此文件需要被编码为hash格式
奇数行为用户名,偶数行为密码
vim vusers.txt
centos
123456
tom
1234567
db_load -T -t hash -f vusers.txt vusers.db
2)关系型数据库中的表中:
实时查询数据库完成用户认证
3)mysql库:pam要依赖于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
---------------------------------------------------------------------------------
实验:centos7实现基于DB文件验证的vsftpd虚拟用户 yum install vsftpd
1 创建虚拟用户列表文件,将文本文件转化成 特定格式的文本文件
vim /etc/vsftpd/ftpvusers
cd /etc/vsftpd
[root@centos vsftpd]# cat ftpvusers.txt
ftp1
123456
ftp2
centos
ftp3
123456
生成数据库文件
[root@centos vsftpd]# db_load -T -t hash -f ftpvusers.txt vuser.db
chmod 600 vuser.db #为了安全,使密码不可见
2 创建操作系统的用户和FTP访问目录
useradd -d -m -r /var/ftpsite -s /sbin/nologin vuser # 创建ftp访问目录,vuser是系统真是存在用户,以后虚拟用户都映射成vuser,/var/ftpsite自动生成家目录
chmod 555 /var/ftpsite/ # 使vuser用户有读写权限,给目录权限
mkdir /var/ftpsite/upload
chown vuser /var/ftpsite/upload
#if your system is CentOS 7,You need to do the following
chmod u-w /var/ftpsite/
mkdir /var/ftpsite/upload # 创建上传文件目录
setfacl -m u:vuser:rwx /var/ftpsite/upload # 授权vuser用户对该目录有读写权限
setfacl -d /var/ftpsite #删除权限
3 创建pam配置文件
vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vuser # 身份验证,跟上数据库路径。db=:指定数据文件
account required pam_userdb.so db=/etc/vsftpd/vuser 账号有效性
systemctl restart vsftpd
4 指定pam配置文件
vim /etc/vsftpd/vsftpd.conf
guest_enable=YES #映射文件
guest_username=vuser #将所有用户映射为vuser
pam_service_name=vsftpd.db #为了支持数据库文件vsftpd.db
user_config_dir=/etc/vsftpd/vusers.d/ # 指定虚拟用户配置文件所在的位置
systemctl restart vsftpd
5 配置各自虚拟用户的配置文件
mdkir /etc/vsftpd/vusers.d/ # 创建配置文件存放的路径
cd /etc/vsftpd/vusers.d/ # 进入此目录创建各用户自已的配置文件
[root@centos vsftpd.d]# vim /etc/vsftpd/vusers.d/ftp1 #ftp1的配置文件
anon_upload_enable=YES #匿名用户上传
anon_mkdir_write_enable=YES #匿名用户创建文件夹
local_root=/ftproot #默认登录目录
[root@centos vsftpd.d]# vim /etc/vsftpd/vusers.d/ftp2 #ftp2的配置文件,缺少它不能上传文件到家目录,虽然 ftp1和ftp2的目录一样但是权限不同也不行
local_root=/app/ftp2 登录目录不同
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
cd /app/ftp2--->touch ftp2.txt
systemctl restart vsftpd #重启服务
6 准备ftp2的目录
mkdir -p /app/ftp2/upload #创建子文件
chown vuser /app/ftp2/upload #给用户vuser权限
7 测试
在centos6上:ftp 192.168.159.139--->(ftp1-->cd upload-->ls-->!ls-->put b.sh 上传成功)
---------------------------------------------------------------------------------------------------
# SELinux设置
!直接禁用selinux
setenforce 0
sed -ir 's/^SELINUX=/SELINUX=disabled/' /etc/selinux/config
! setsebool -P ftpd_full_access 1
-----------------------------------------------------------------------------------------
实验:基于数据库MYSQL验证vsftpd虚拟用户
CentOS6: epel源里放了pam_mysql模块,yum install pam_mysql
Centos7:需要手动编译pam_mysql模块
1 实验准备
两台虚拟机,一台a主机作为ftp服务器;一台b主机作为mysql数据库服务器。
2 配置mysql服务器
①直接yum安装mysql-server(centos 6)或则mariadb mariadb-server(centos 7)
centos7:systemctl start mariadb.service # 启动服务
systemctl enable mariadb # 设置为开机启动
centos6:service mysqld restart # 启动服务
chkconfig enable mysqld # 设置为开机启动
②b主机数据库配置:
1) 创建存储虚拟用户的数据库和连接数据库用户
vim /app/b.txt
mysql #不设置密码
CREATE DATABASE vsftpdb;
GRANT SELECT ON vsftpdb.* TO vsftuser@'192.168%.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
2) 在a上进行连接测试
mysql -uvsftuser -p123456 -h 192.168.159.135
USE vsftpdb;
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,name CHAR(50)
BINARY NOT NULL,password CHAR(48) BINARY NOT NULL
);
INSERT INTO users(name,password) values('user1',password('centos'));
INSERT INTO users(name,password) values('user2',password('centos')); #创建虚拟用户
select * from users #查看用户信息
3 a主机 ftp服务器配置vsftpd服务
1)安装开发包组和服务包
yum -y install mariadb-devel pam-devel openssl-devel(加密包) mariadb vsftpd
yum -y groupinstall "Development Tools" #源码编译要装服务包
2)编译安装pam_mysql 或yum install pam_mysql
tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security(pam模块的相关路径)
make && make install #编译安装
3)在FTP服务器上建立pam认证所需文件
vim /etc/pam.d/vsftpd.mysql # 为了方便管理并和以前的pam进行区分,我们创建自己的pam认证配置文件
auth required pam_mysql.so user=vsftuser passwd=123456 host=192.168.159.135 db=vsftpdb table=users usercolumn=user passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftuser passwd=123456 host=192.168.159.135 db=vsftpdb table=users usercolumn=user passwdcolumn=password crypt=2
注意:参考README文档,选择正确的加密方式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()函数加密
4)建立相应用户和修改vsftpd配置文件,使其适应mysql认证
# 建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /app/ftpsite ftvuser #创建操作系统账号
# 去除ftp根目录的写权限,否者用户登录将受到文件系统权限的限制;
chmod 555 /app/ftpsite/
mkdir /app/ftpsite/upload
setfacl –m u:ftvuser:rwx /app/ftpsite/upload #为了使得用户能上传文件,我们以acl方式对相关目录设置权限,方便单个管理
# 确保/etc/vsftpd.conf中已经启用了以下选项
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
# 添加用户映射的选项
guest_enable=YES
guest_username=ftvuser #将普通用户映射ftvuser
# 修改下面一项,原系统用户无法登录;而是基于数据验证登录用户
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql
systemctl start vsftpd
测试:ftp 192.168.159.135-->user1-->put不了,get下载可以
5)在FTP服务器上配置虚拟用户且具有不同的访问权限
# 说明:vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。
配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
# 配置vsftpd为虚拟用户提供配置文件目录:vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_config
# 创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vusers_config/
cd /etc/vsftpd/vusers_config/
touch user1 user2 # 创建各自的配置文件,并以其名命名
# 配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如果需要让用户user1具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/user1文件。
vim /etc/vsftpd/vusers_config/user1 # 在里面添加如下选项并设置为YES即可,只读则设为NO
anon_upload_enable=YES #打开匿名上传文件
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
vim /etc/vsftpd/vusers_config/user2
anon_upload_enable=YES
local_root=/app/ftpsite2/ # 指定user2的目录;user2用户登录上来访问的目录
mkdir /app/ftpsite2/upload # 方便检验
chown ftpvuser /app/ftpsite2/upload #可以让子目录有权限,但家目录不能有权限
注意:需确保对应的映射用户对于文件系统有写权限
------------------------------------------------------------------------------------------------------------------
补充知识:
1)启动vsftp服务并设置为开机启动
service vsftpd start systemctl start vsftpd
chkconfig vsftpd on systemctl enable vsftpd
测试看端口是否开启:ss -tnl | grep 21 netstat -tnl | grep 21
2)Selinux相关设置
restorecon -R /lib64/security # 根据数据库恢复目录的selinux标签,因为我们新添加的配置文件没有selinux属性
setsebool -P ftpd_connect_db 1 # 允许连接数据库
setsebool -P ftp_home_dir 1 # 允许ftp访问家目录;否者用户不能登录。用户登录就要访问家目录
chcon -R -t public_content_rw_t /var/ftproot/ # 允许对家目录读写
3)测试:
Axel:网络客户端工具
下载安装axel:ftp://172.16.0.1/pub/Sources/6.x86_64/axel/axel-2.4-1.el6.rf.x86_64.rpm
axel -n 3 -o /root # 可以并行下载
curl http://172.16.0.1/pub 或 wget http://172.16.0.1/pub
ftp://172.16.0.1/pub/ISOs/CentOS-7-x86_64-Everything-1511.iso