FTP
简介
ftp(file transfer protocol,文件传输协议)是 Internet 上仍常用的最老的网络协议之一 , 它为系统提供了通过网络与远程服务器进行传输的简单方法。FTP是一个客户机/服务器系统
ftp是文件共享服务。工作在应用层。
linux中三种常用的文件服务:
(1)ftp:工作在应用层的文件共享协议,在client端和server端的通信是通过tcp/ip协议的上层服务来实现的。
(2)nfs(Netwok File System网络文件系统):基于rpc(remote Procedure Call远程过程调用)的文件共享服务。rpc:让两台主机间的进程直接依赖于二进制协议完成通信。如hadoop
(3)samba:基于CIFS(通用文件系统)/SMB文件共享。实现文件跨平台传输。让linux支持cifs协议。让linux出现在windows的网上邻居中
linux实现ftp协议的软件:
服务器端的程序(红帽中):
Vsftpd(Very Secure File Transfer Protocol Damon)注重安全
客户端程序:
命令行格式(CLI):ftp,lftp
FTP有两个连接:
命令连接(控制连接):接收用户发来的命令并检查文件发来的命令;一直在线。服务端端口21/tcp
数据连接:进行传输文件;按需打开,按需关闭。
按数据传输的请求由谁发起分为主动模式和被动模式。主动、被动模式是站在服务器端的角度。
主动模式:当客户端请求数据传输时,服务器打开20/tcp端口主动向客户端发送数据。此时服务器端的端口是20/tcp。如果客户端有防火墙则不能进行数据传输。因为主动连接时,服务器端主动连接客户端的请求会被客户端的防火墙挡掉,所以连接不上。
被动模式:当客户端请求数据传输时,服务器端通过命令连接给客户端发送一个报文,告诉客户端自己已经打开了一个端口,让客户端主动连接这个端口,从而进行传输数据。此时服务器端口随机。
主动模式:
Server
Client
2121221
0222
被动模式:
Server
Client
防火墙:“挡掉进来的连接”。当主机接入互联网,防火墙将屏蔽“不请自来的请求和连接。关闭不需要的端口。端口就相当于“门”
防火墙的“连接追踪”功能:自行判断连接和连接的关系。
追踪来回请求的特征
客户端发起的新建立的连接请求:new
建立连接的响应:established
每一个数据连接和每一个命令连接有关系:related(相关联的会放行)
两种模式的比较:
共同点:都是通过21/tcp端口进行用户验证及管理
不同点:传输数据的方式不同
关于端口:tcp/ip协议中,Tcp 65535个端口,Udp 65535多个端口
一般用到的端口是1~65535。
1~1023为系统端口(BSD保留端口),只有系统特许的进程才能使用;
1024~65535为用户端口;
1024~5000为BSD临时端口,一般的应用程序使用1024~4999来进行通信;
5001~65535为BSD服务器(非特权)端口,用户自定义端口
Vsftpd
vsftpd(Very Secure FTP Deamon):非常安全的ftp后台服务。
21/tcp(/etc/services查看端口号)
配置文件目录:/etc/vsftpd(rpm包)
服务脚本:/etc/init.d/vsftpd
主程序:/usr/sbin/vsftpd
匿名用户文件根目录(ftp用户的家目录):/var/ftp(不允许除了root外用户其他用户有对此目录的写权限,包括ftp用户)。不能允许运行这个服务的用户拥有写权限,所以在/var/ftp/下建立子目录放置上传的文件。setfacl -m u:ftp:rwx /var/ftp/upload
默认配置文件让匿名用户(anonymous)只能下载位于CHROOT(/var/ftp)目录中的内容。意为远程FTP客户端能以用户anonymous或ftp身份连接到服务器(不需要密码),并从/var/ftp目录下载文件(其本地ftp用户可以读取这些文件)。getent passwd ftp ##查看ftp用户的家目录
支持上传和下载
下载风险小
上传风险大
基于PAM(可插入式认证模块)实现用户认证:
/etc/pam.d/*
/lib/security/* 模块文件
ftp本身信息传输是明文的,包括认证机制都是明文的。抓包分析后就能得到用户名和密码
数据传输模式(自动):两种传输都支持(遵循传输文件本身的模式)
二进制传输:
文本传输:
ftp的用户:
匿名用户anonymous(最终会映射为系统用户):ftp
虚拟用户(最终会映射为系统用户):
系统用户
(1)安装vsftpd:yum install vsftpd 大小140k
安装生成的文件:rpm –ql vsftpd
- 开启服务
/etc/init.d/vsftpd start
(3)基本配置
文件服务权限:文件系统权限*文件共享权限
默认:匿名用户可以登录、可以下载;本地用户可以登录、上传
【几个常见报错】
550:表示服务本身禁止使用某项功能
530:登录系统时输错密码,登录失败
553:本地文件的权限
【匿名用户】
匿名用户登录:anonymous_enable=YES | NO ##默认情况下
匿名用户上传:
1.配置文件
write_enable=YES
anon_upload_enable=YES
2.上传目录权限:
Chgrp ftp /var/ftp/pub
Chmod 770 /var/ftp/pub或
Mkdir /var/ftp/upload
Chgrp ftp /var/ftp/upload
Chmod 770 /var/ftp/upload
3.selinux相关设置
setsebool -P allow_ftpd_anon_write on
setenforce 0
匿名用户上传文件权限修改:anon_umask=022 ##将文件权限改为644
匿名用户家目录修改(注意家目录除root用户外,其他用户不能有写权限)
anon_root=/dir
匿名用户建立目录:anon_mkdir_write_enable=YES
匿名用户删除、重命名:anon_other_wtite_enable=YES
匿名用户下载:anon_world_readable _only =NO(对于权限为600的文件默认无法下载,必须使用此参数)
匿名用户上传身份的修改:不能为root,不能为系统不存在的用户
Chown_uploads=YES
Chown_username=student
匿名用户上传限速(单位为字节):anon_max_rate=102400
【本地用户】注意此处selinux关闭或者设置相应规则
本地用户登录:新建用户tom,并给tom一个密码:本地用户即能在/etc/passwd中找到的用户。
# echo ‘cyl&647308‘ |passwd --stdin tom
local_enable=YES
pam_service_name=vsftpd,这是本地用户默认的认证模块
本地用户可写:write_enable=YES
本地用户上传文件权限:local_umask=077
本地用户家目录更改:local_root=/dir
将所有本地用户锁在家目录中:chroot_local_user=YES(注意本地用户目录权限小于755)
3.本地用户登录进去默认在自己的家目录里,eg:/home/tom
可以进入其他目录查看文件等,可以获取到自己想要的资源。
4.将某个用户锁定在自己的家目录中:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list(在此文件中写入用户名)
eg:vim /etc/vsftpd/chroot_list
tom
5.所有写在/etc/vsftpd/ftpusers中的用户被拒绝访问ftp服务器(cat /etc/pam.d/vsftpd)
例如:jerry在此文件中,且在/etc/vsftpd/loginusers文件中,进行了用户验证
(2)启用/etc/vsftpd/userlist文件:
userlist_enable=YES
白名单userlist_deny=NO
# Cat /etc/vsftpd/user_list
Jerry
(2)黑名单 userlist_deny=YES
6.守护进程:
独立守护进程:xinetd是一个独立守护进程。适用于访问量特别大,用户在线时间比较长的。
瞬时守护进程:由超级守护进程xinetd代为管理。访问量比较小,用户连接时间不大长。
vsftpd配置为瞬时守护进程时,在/etc/xinetd.d/下添加一个瞬时守护进程脚本或者配置文件(格式后文再说)
【虚拟用户】
(1)创建虚拟账号:
#vim /etc/vsftpd/loginusers //loginusers名称任意取,注意一行用户名一行密码
ftpuser1
123
ftpuser2
123
#db_load -T -t hash -f /etc/vsftpd/loginusers /etc/vsftpd/loginusers.db
-T //指定执行动作为transfer
-t //转化方式哈希加密
-f //指定文件名
#vim /etc/pam.d/ckvsftpd
account required pam_userdb.so db=/etc/vsftpd/loginusers
auth requied pam_userdb.so db=/etc/vsftpd/loginusers
//用户帐号 认证必须
目录/etc/pam.d下的文件均为认证文件,认证就是一个将外来信息与系统文件中记录的信息匹配的一个过程,匹配通过则通过认证,认证是一个程序,需要相关的模块来完成,这些模块记录在系统库文件中
(2)创建本地用户到虚拟用户的映射:(默认ftp用户为虚拟用户的本地用户映射),可以登录到其他目录。
Useradd ftpuser
#vim /etc/vsftpd/vsftpd.conf
guest_username=ftpuser
guest_enable=YES
(3)虚拟账号家目录独立设定:
mkdir /ftpusershome
chgrp ftpuser /ftpusershome
chmod g+s /ftpusershome
mkdir /ftpuserhome/ftpuser{1,2}
#vim /etc/vsftpd/vsftpd.conf
local_root=/ftpuserhome/$USER //指定本地用户家目录
user_sub_token =$USER //指定$USER是个shell中的变量,使其生效
(4)虚拟帐号配置独立
打开账户独立功能:user_config_dir=/etc/vsftpd/userconf
mkdir /etc/vsftpd/userconf
vim /etc/vsftpd/userconf/ftpuser1
在此文件中配置文件中的所有参数,此文件的优先级高
在每一个目录下创建隐藏文件.massage:dirmassage_enable=YES,当客户端切换到此目录下,会先显示.massage文件中的内容。
定义vsftpd的资源访问:
Max_client=
Max_per_ip=
默认以文本模式上传文件:ascii_upload_enable=YES(一般不要设置!)
默认以文本模式下载文件:ascii_download_enable=YES(一般不要设置!)
将vsftpd定义为独立守护进程:listen=YES
安全通信方式:
(1)ftps:ftp+ssl/tls
(2)sftp:OpenSSH,SubSystem,sftp
虚拟用户映射到匿名用户ftp。
基于mysql中的数据库和表中的字段验证用户账号。
虚拟用户:
- 本地数据文件方式
1.添加虚拟用户口令文件
[[email protected] /]#vi /etc/vsftpd/vftpuser.txt
添加虚拟用户名和密码,一行用户名,一行密码,以此类推。奇数行为用户名,偶数行为密码。
ftpuser1
123
ftpuser2
123
将刚添加的vftpuser.txt虚拟用户口令文件转换成系统识别的口令认证文件。
首先查看系统有没有安装生成口令认证文件所需的软件db4-utils。
[[email protected] /]#rpm –qa |grep db4-utils
[[email protected] /]#rpm –ivh db4-utils-4.3.29-9.fc6.i386.rpm
下面使用db_load命令生成虚拟用户口令认证文件。
[[email protected] /]#db_load –T –t hash –f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
3.编辑vsftpd的PAM认证文件
在/etc/pam.d目录下,
[[email protected] /]#vi /etc/pam.d/vsftpd
将里面其他的都注释掉,添加下面这两行:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
//64为64,32位的是/lib/…..
4.建立本地映射用户并设置宿主目录权限
所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码。
[[email protected] /]#useradd –d /home/vftpsite –s /sbin/nologin vftpuser
[[email protected] /]#chmod 700 /home/vftpsite
5.配置vsftpd.conf(设置虚拟用户配置项)
[[email protected] /]#vi /etc/vsftpd/vsftpd.conf
guest_enable=YES #开启虚拟用户
guest_username=vftpuser #FTP虚拟用户对应的系统用户
pam_service_name=vsftpd #PAM认证文件
6.重启vsftpd服务
[[email protected] /]#service vsftpd restart
7.测试虚拟用户登录FTP
C:\User\Administrator>ftp 192.168.120.240
连接到192.168.120.240。
220 Welcome to BOB FTP server
用户(192.168.120.240(none)):ftpuser1
331 Please specify the password.
密码:
230 Login successful.
实验:
linux主机部署ftp服务,建立两个ftp用户t01,t02 属于ftp组,不允许登陆linux系统,只能登陆ftp;要求能实现匿名用户下载,限制同时最多连接3个用户,FTP日志文件放在 /var/log/FTP/ftp.log
安装vsftpd并开启服务,火墙selinux关闭
useradd -g ftp -d /var/ftp/pub/ -s /sbin/nologin t01
useradd -g ftp -d /var/ftp/pub/ -s /sbin/nologin t02
# cat /etc/passwd
t01:x:500:50::/var/ftp/pub/:/sbin/nologin
t02:x:501:50::/var/ftp/pub/:/sbin/nologin
max_clients=3 #允许的最大连接数3
vsftpd_log_file=/var/log/FTP/ftp.log #指定日志文件位置
[[email protected] pub]# ftp localhost
Trying ::1...
ftp: connect to address ::1Connection refused
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
500 OOPS: failed to open xferlog log file:/var/log/FTP/ftp.log
ftp> quit
解决
# vim /etc/vsftpd/vsftpd.conf
vsftpd_log_file=/var/log/FTP/ftp.log
[[email protected] pub]# /etc/init.d/vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[[email protected] pub]# ftp localhost
Trying ::1...
ftp: connect to address ::1Connection refused
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (localhost:root): t01
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 (127,0,0,1,31,70).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Aug 18 12:01 cyl
-rw-r--r-- 1 0 0 10240 Aug 19 02:43 shell.tar.gz
226 Directory send OK.
ftp> quit
221 Goodbye.