FTP服务配置实践
一、FTP相关介绍
1、文本传输协议FTP
FTP (File Transfer Protocol) 文件传输协议,是因特网中使用最广泛的文件传输协议;
基于C/S结构的双通道协议(数据和命令连接)
数据传输格式:二进制(默认) 和 文本
两种模式 (服务器角度):
主动模式(PORT style):服务器主动连接
命令(控制):客户端:随机port ⟶ 服务器:tcp21
数据:客户端:随机port ⟵ 服务器:tcp20
被动模式(PASV style):客户端主动连接
命令(控制):客户端:随机port ⟶ 服务器:tcp21
数据:客户端:随机port ⟶ 服务器:随机port
服务器被动模式数据端口示例:
227 Entering Passive Mode (172,16,0,1,224,59) ,则服务器数据端口为:224*256+59
2、FTP软价介绍
FTP服务器:Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器
客户端软件:ftp,lftp,lftpget,wget,curl
3、FTP服务状态码:
1XX:信息 125: 数据连接打开
2XX:成功类状态 200: 命令OK 230: 登录成功
3XX:补充类 331: 用户名OK
4XX:客户端错误 425: 不能打开数据连接
5XX:服务器错误 530: 不能登录
4、FTP服务用户认证
匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
nsswitch:network service switch名称解析框架
pam:pluggable authentication module 用户认证 /lib64/security /etc/pam.d/ /etc/pam.conf
二、FTP相关配置说明
1、vsftpd 服务
配置文件:/etc/vsftpd/vsftpd.conf 可用man 5 vsftpd.conf 查看相关帮助,格式:option=value (=号前后不要有空格)
用户认证配置文件:/etc/pam.d/vsftpd
服务脚本:/usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
2、vsftpd 服务配置相关参数
命令端口
listem_port=21
主动模式端口
connect_from_port_20=YES #主动模式的端口为20
ftp_data_port=20 (默认) #指定主动模式的端口
被动模式端口范围
pasv_enable=yes #允许被动模式连接
pasv_min_port=6000 #设置用于被动模式的服务器的最小端口号
pasv_max_port=6010 #设置用于被动模式的服务器的最大端口号
使用当地时间
use_localtime=YES #使用当地时间(默认为NO,使用GMT)
匿名用户
anonymous_enable=YES #支持匿名用户
no_anon_password=YES (默认NO) #匿名用户略过口令检查
anon_upload_enable=YES #匿名上传,注意:文件系统权限
anno_root=/var/ftp #设备匿名用户的ftp根目录(不设置默认在/var/ftp目录下)
anon_mkdir_write_enable=YES #匿名建目录
anon_world_readable_only (默认YES) #只能下载全部读的文件
anon_umask=0333 #指定匿名上传文件的umask,默认077
anon_other_write_enable=YES #可删除和修改上传的文件
指定上传文件的默认的所有者和权限
chown_uploads=YES (默认NO)
chown_username=whoname
chown_upload_mode=0644
Linux系统用户
local_enable=YES #是否允许linux用户登录
write_enable=YES #允许linux用户上传文件
local_umask=022 #指定系统用户上传文件的默认权限
guest_enable=YES #所有系统用户都映射成guest用户
guest_username=ftp #配合上面选项才生效,指定guest用户
local_root=/ftproot #guest用户登录所在目录
禁锢所有系统用户在家目录中
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中用户禁锢
wu-ftp日志:默认启用
xferlog_enable=YES (默认) #启用记录上传下载日志
xferlog_std_format=YES (默认) #使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认) #可自动生成
vsftpd日志:默认不启用
dual_log_enable=YES #使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log (默认) #可自动生成
登录提示信息
ftpd_banner="welcome to mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt
日志访问提示信息
dirmessage_enable=YES (默认)
message_file=.message (默认) #信息存放在指定目录下.message
使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd #pam配置文件:/etc/pam.d/vsftpd 默认文件 /etc/vsftpd/ftpusers 中的用户拒绝登录
是否启用控制用户登录的列表文件
userlist_enable=YES #默认有此设置
userlist_deny=YES (默认值) #黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list #此为默认值
vsftpd服务指定用户身份运行
opriv_user=nobody (默认值)
连接数限制
max_clients=0 #最大并发连接数,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
SSL支持:
ssl_enable=YES #启用SSL
allow_anon_ssl=NO #匿名不支持SSL
force_local_logins_ssl=YES #本地用户登录加密
force_local_data_ssl=YES #本地用户数据传输加密
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem #指定RSA加密证书信息
三、FTP相关实验
系统:CentOS7.6,服务端(192.168.214.17),客户端(192.168.214.27),数据库:mariadb-server(光盘yum源)
1、实现基于SSL的FTP
1. 查看是否支持SSL
[root@centos7 ~]# ldd `which vsftpd`|grep ssl libssl.so.10 => /lib64/libssl.so.10 (0x00007fb62523d000)
2. 创建自签名证书
[root@centos7 ~]# cd /etc/pki/tls/certs/ [root@centos7 certs]# make vsftpd.pem #生成证书,执行后填写相应信息 [root@centos7 certs]# openssl x509 -in vsftpd.pem -noout -text #查看生成证书信息
3. 配置vsftpd服务支持SSL
[root@centos7 certs]# vim /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/pki/tls/certs/vsftpd.pem #指定证书路径
4. 用filezilla等工具测试
2、实现基于DB文件的虚拟用户FTP服务
1. 创建用户数据库文件
[root@centos7 ~]# cd /etc/vsftpd/ [root@centos7 vsftpd]# vim vusers.txt [root@centos7 vsftpd]# cat vusers.txt ftpuser1 #奇数行为用户名 centos #偶数行为密码 ftpuser2 linux [root@centos7 vsftpd]# db_load -T -t hash -f vusers.txt vusers.db [root@centos7 vsftpd]# chmod 600 vusers.db
2. 创建用于虚拟映射的用户和访问FTP目录
[root@centos7 vsftpd]# useradd -d /data/ftproot -s /sbin/nologin vuser [root@centos7 vsftpd]# ll /data total 0 drwx------ 3 vuser vuser 78 Dec 16 18:19 ftproot #centos7上FTP根目录不能有w写权限,所以要修改权限 [root@centos7 vsftpd]# chmod 555 /data/ftproot [root@centos7 vsftpd]# ll /data total 0 dr-xr-xr-x 3 vuser vuser 78 Dec 16 18:19 ftproot #无写权限,则用户不能上传文件 #所以需要建一个子目录,并设置w权限,这里用acl实现 [root@centos7 vsftpd]# mkdir /data/ftproot/upload [root@centos7 vsftpd]# setfacl -m u:vuser:rwx /data/ftproot/upload/
3. 创建支持虚拟用户的PAM认证文件
[root@centos7 vsftpd]# vim /etc/pam.d/vsftpd.db [root@centos7 vsftpd]# cat /etc/pam.d/vsftpd.db auth required pam_userdb.so db=/etc/vsftpd/vusers #注意,这里后面的文件是不带后缀的 account required pam_userdb.so db=/etc/vsftpd/vusers #这里也是不带后缀的
4. 指定pam配置文件
[root@centos7 vsftpd]# vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.db #修改此项 #添加以下两项 guest_enable=YES guest_username=vuser
5. SELinux 设置
禁用SELinux (本次实验已禁用),或者用以下命令
[root@centos7 vsftpd]# setsebool -P ftpd_full_access 1
6. 虚拟用户建立独立的配置文件
[root@centos7 vsftpd]# mkdir /etc/vsftpd/vusers.d/ #创建配置文件存放的路径 [root@centos7 vsftpd]# vim /etc/vsftpd/vsftpd.conf #修改主配置文件 user_config_dir=/etc/vsftpd/vusers.d/ #添加此行 [root@centos7 vsftpd]# cd /etc/vsftpd/vusers.d/ [root@centos7 vusers.d]# vim ftpuser1 #创建各用户自已的配置文件 #配置ftpuser1用户可读写,其它用户只读 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@centos7 vusers.d]# vim ftpuser2 #创建各用户自已的配置文件 #将ftpuser2的登录目录改变至指定的目录 local_root=/var/ftproot
7. 启动 vsftpd 服务并进行相关测试
[root@centos7 vusers.d]# systemctl start vsftpd
[root@centos7-27 ~]# ftp 192.168.214.17 Connected to 192.168.214.17 (192.168.214.17). 220 (vsFTPd 3.0.2) Name (192.168.214.17:root): ftpuser1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,214,17,95,155). 150 Here comes the directory listing. drwxrwxr-x 2 0 0 6 Dec 16 10:23 upload 226 Directory send OK. ftp> cd upload #只能在此目录下才能上传文件 250 Directory successfully changed. ftp> put anaconda-ks.cfg #上传文件 local: anaconda-ks.cfg remote: anaconda-ks.cfg 227 Entering Passive Mode (192,168,214,17,233,226). 150 Ok to send data. 226 Transfer complete. 1924 bytes sent in 0.000446 secs (4313.90 Kbytes/sec) ftp> ls #可以看到上传成功了 227 Entering Passive Mode (192,168,214,17,83,141). 150 Here comes the directory listing. -rw------- 1 1001 1001 1924 Dec 16 10:51 anaconda-ks.cfg 226 Directory send OK. [root@centos7 vusers.d]# mkdir /var/ftproot #创建ftpuser2的根目录 [root@centos7 vusers.d]# chmod -w /var/ftproot #去掉写权限 [root@centos7 vusers.d]# cp /etc/fstab /var/ftproot/f1.txt #客户端上测试 [root@centos7-27 ~]# ftp 192.168.214.17 Connected to 192.168.214.17 (192.168.214.17). 220 (vsFTPd 3.0.2) Name (192.168.214.17:root): ftpuser2 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,214,17,87,195). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 595 Dec 16 11:00 f1.txt 226 Directory send OK. ftp> get f1.txt #下载文件是可以的 local: f1.txt remote: f1.txt 227 Entering Passive Mode (192,168,214,17,86,114). 150 Opening BINARY mode data connection for f1.txt (595 bytes). 226 Transfer complete. 595 bytes received in 0.000463 secs (1285.10 Kbytes/sec) ftp> put f1.txt #上传是不行的,一是没配置权限,二是根目录也无写权限 local: f1.txt remote: f1.txt 227 Entering Passive Mode (192,168,214,17,143,39). 553 Could not create file.
3、实现基于MySQL的虚拟用户FTP服务
1. 配置MySQL服务,并创建相应库与表
[root@centos7 ~]# yum install mariadb-server #安装数据库 [root@centos7 ~]# systemctl start mariadb #启动 [root@centos7 ~]# mysql #连接数据库 MariaDB [(none)]> create database vsftpd; #创建数据库 Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> use vsftpd; Database changed MariaDB [vsftpd]> CREATE TABLE users ( --创建表 -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> name CHAR(50) BINARY NOT NULL, -> password CHAR(48) BINARY NOT NULL -> ); Query OK, 0 rows affected (0.00 sec) MariaDB [vsftpd]> insert users (name,password) value('ftpuser1',password('centos')); #添加用户 Query OK, 1 row affected (0.00 sec) MariaDB [vsftpd]> insert users (name,password) value('ftpuser2',password('linux')); #添加用户 Query OK, 1 row affected (0.00 sec) MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@localhost identified by 'centos'; #创建本地连接数据库用户 Query OK, 0 rows affected (0.00 sec) MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'127.0.0.1' identified by 'centos'; #创建本地连接数据库用户 Query OK, 0 rows affected (0.00 sec) MariaDB [vsftpd]> flush privileges; #刷新权限 Query OK, 0 rows affected (0.00 sec)
CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL );
2. 安装 pam_mysql 包
CentOS6上pam_mysql 由epel6 源中提供,配好epel源后 yum install vsftpd pam_mysql 即可
CentOS7上无对应的rpm包,需手动编译安装
[root@centos7 ~]# ls -l pam_mysql-0.7RC1.tar.gz #准备pam_mysql源码包 -rw-r--r-- 1 root root 335240 Dec 16 20:55 pam_mysql-0.7RC1.tar.gz #先安装相关依赖包 [root@centos7 ~]# yum install -y gcc gcc-c++ pam-devel mariadb-devel [root@centos7 ~]# tar xvf pam_mysql-0.7RC1.tar.gz [root@centos7 ~]# cd pam_mysql-0.7RC1/ #编译安装 [root@centos7 pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security/ [root@centos7 pam_mysql-0.7RC1]# make && make install
3. 安装 vsftpd 服务,并配置FTP目录权限
[root@centos7 ~]# yum install -y vsftpd [root@centos7 ~]# useradd -d /data/ftproot -s /sbin/nologin vuser #创建虚拟用户 [root@centos7 ~]# chmod 555 /data/ftproot #设置FTP目录权限 [root@centos7 ~]# mkdir /data/ftproot/upload #创建上传目录 [root@centos7 ~]# setfacl -m u:vuser:rwx /data/ftproot/upload #设置上传目录权限
4. 创建 pam 认证文件,并配置 vsftpd.conf 文件
[root@centos7 ~]# vim /etc/pam.d/vsftpd.mysql [root@centos7 ~]# cat /etc/pam.d/vsftpd.mysql auth required pam_mysql.so user=vsftpd passwd=centos host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=centos host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 [root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.mysql #修改此项 #添加以下三项 guest_enable=YES guest_username=vuser user_config_dir=/etc/vsftpd/vusers.d/
auth 表示认证 account 验证账号密码正常使用 required 表示认证要通过 pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝 对路径;后面为给此模块传递的参数 user=vsftpd 为登录mysql的用户 passwd=centos 登录mysql的的密码 host=localhost mysql服务器的主机名或ip地址 db=vsftpd 指定连接msyql的数据库名称 table=users 指定连接数据库中的表名 usercolumn=name 当做用户名的字段 passwdcolumn=password 当做用户名字段的密码 crypt=2 密码的加密方式为mysql password()函数加密,0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函数加密,3表示md5加密,4表示sha1加密
5. SELinux 设置
禁用SELinux (本次实验已禁用),或者用以下命令
[root@centos7 ~]# restorecon -R /lib64/security [root@centos7 ~]# setsebool -P ftpd_connect_db 1 [root@centos7 ~]# setsebool -P ftp_home_dir 1 [root@centos7 ~]# chcon -R -t public_content_rw_t /data/ftproot/
6. 虚拟用户建立独立的配置文件
[root@centos7 ~]# mkdir /etc/vsftpd/vusers.d/ #创建配置文件存放的路径
[root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf #修改主配置文件
user_config_dir=/etc/vsftpd/vusers.d/ #添加此行
[root@centos7 ~]# cd /etc/vsftpd/vusers.d/
[root@centos7 vusers.d]# vim ftpuser1 #创建各用户自已的配置文件
#配置ftpuser1用户可读写,其它用户只读
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 vusers.d]# vim ftpuser2 #创建各用户自已的配置文件
#将ftpuser2的登录目录改变至指定的目录
local_root=/var/ftproot
[root@centos7 vusers.d]# mkdir /data/ftproot #创建ftpuser2的登录目录
[root@centos7 vusers.d]# chmod 555 /data/ftproot #修改目录权限
7. 启动 vsftpd 服务并进行相关测试
[root@centos7 ~]# systemctl start vsftpd