FTP协议
FTP(File Transfer Protocol)文件传输协议,工作在TCP的20和21端口,其中21端口是用来控制用户连接,而20端口是用来数据连接的属于应用层协议。属于C/S模式,有服务器和客户端之分。
FTP用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:“下载“(Download)和“上传“(Upload)。“下载“文件就是从远程主机拷贝文件至自己的计算机上;“上传“文件就是将文件从自己的计算机中拷贝至远程主机上。
FTP连接模式
主动模式:服务器主动发起数据连接,首先由客户端向服务器的21端口建立ftp控制连接,当需要传输数据时;客户端以PORT命令告知服务器我打开了某端口你过来连接我,于是服务器从20端口向客户端的该端口发送请求并建立数据连接。
被动模式:服务器被动等待数据连接,如果客户机所在的网络的防火墙禁止主动模式连接,通常会使用被动模式,首先由客户机向服务器的21端口建立ftp控制连接,当需要传输数据时;服务器以PASV命令告知客户端我打开了某端口你来连接我,于是客户端向服务器的该端口(非20端口)发送请求并建立连接。
FTP传输模式
ASCII码模式
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
二进制模式
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如在ASCII方式下传输二进制文件,即使不需要也仍会转译,这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)
Vsftpd管理
Vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开发源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。
Vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序,特点是小巧轻快,安全易用。在开源操作系统中常用的FTPD套件主要还有ProFTPD、PureFTPd和wuftpd等。
1. 安装Vsftp相关的软件包(受selinux控制)
1 |
$ yum install vsftpd |
2. Vsftpd的文件
1 2 3 4 5 6 7 8 9 10 11 |
# 主配置文件; /etc/vsftpd/vsftpd.conf # 服务脚本; /etc/init.d/vsftpd # 主程序; /usr/sbin/vsftpd # 根目录; /var/ftp/ |
3. Vsftpd安全控制文件
/etc/vsftpd/ftpusers:黑名单,此文件中列出的用户将禁止登陆vsftpd服务器,不管该用户是否在user_list文件中出现。
/etc/vsftpd/User_list:此文件中包含的用户可能被禁止登陆,也可能被允许登陆具体取决于主配置文件vsftpd.conf中的设置,当存在userlist_enable=yes的配置项时user_list列表文件方可生效,若指定userlist_deny=yes则仅禁止此列表中的用户登陆,若指定userlist_deny=no则仅允许列表中的用户登陆。
4. Vsftpd主配置文件(基本不用修改)
以下是可选参数,有些已经默认开启,如果需要为FTP开启什么功能就添加对应的参数即可(注意:使用参数之间不能相互矛盾)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
$ vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES # 开启匿名; no_anon_password=YES # 匿名用户login时不询问口令; anon_umask=022 # 设置匿名用户所上传文件的默认权限掩码值; anon_root=/var/ftp # 设置匿名用户的ftp根目录; anon_upload_enable=no # 是否允许匿名用户上传文件; anon_mkdir_write_enable=no # 是否允许匿名用户有创建目录的写入权限; anon_other_write_enable=no # 是否允许匿名用户有其他写入权限、如对文件删除; anon_max_rate=80000 # 这是匿名用户的下载速度为80KBytes/s; local_enable=YES # 开启本地用户; local_umask=022 # 允许本地用户写入的权限; local_root=/ftp # 你可以指定所有本地用户登陆后的目录,如果不设置此项(默认用户都会登陆于自己的家目录); chroot_local_user=yes # 将ftp宿主目录禁锢在宿主目录所有用户; local_max_rate=0 # 设置本地用户上传速率; write_enable=YES # 全局配置可写入权限; listen=yes # 是否以独立守护进程的方式监听服务; listen_address=0.0.0.0 # 设置监听ftp服务的地址; listen_port=21 # 设置监听ftp服务的端口; download_enable=yes # 是否允许下载文件(建立仅限于浏览等); dirmessage_enable=YES # 用户切换目录时显示创建的.message文件信息; xferlog_enable=YES # 启用传输日志; xferlog_file=/var/log/vsftpd.log # 记录传输日志的文件路径; xferlog_std_format=YES # 启用标准日志; idle_session_timeout=600 # 客户端超过600S没有动作就自动被服务器踢出; data_connection_timeout=120 # 数据传输时超过120S没有动作被服务器踢出; chown_uploads=yes # 是否更改用户上传文件的属主和属组; chown_username=whoever # 更改的用户名; connect_from_port_20=YES # 允许服务器主动模式(从20端口建立数据连接); pasv_enable=yes # 允许被动模式连接; pasv_max_port=24600 # 设置用于被动模式的服务器最大端口; pasv_min_port=24500 # 设置用于被动模式的服务器最小端口; pam_service_name=vsftpd # 设置用于用户认证PAM文件(/etc/pam.d/vsftpd); userlist_enable=YES # 启用user_list用户列表文件; userlist_deny=YES # YES此文件就是黑名单;NO此文件就是白名单; max_clients=0 # 设置允许多少个客户端同时连接(0为无限制); tcp_wrappers=YES # 是否启用TCP_wrappers主机访问控制; |
FTP客户端
安装FTP客户端
1 |
$ yum install ftp |
或
1 |
$ yum install lftp |
PS:这是Linux命令行提供的ftp客户端工具,有ftp和lftp。在Windows上也有很多FTP客户端工具,如cuteFTP,Filezilla等等。
FTP客户端命令
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ftp 192.168.10.1 #连接FTP服务器; help #查看可使用的命令; help CMD #查看命令帮助; ls #展示目录; cd #进入目录; get #下载文件; mget #批量下载文件; put #上传文件; pwd #显示当前目录; mkdir #创建目录; rmdir #删除目录; delete #删除文件; bye #退出连接; |
实验
1. 需求
A. 创建leader和eric两个可以登录的用户。
B. leader用户对FTP下的/var/ftp/leader目录有完全控制权限,而eric用户对/var/ftp/leader/eric目录只有写入权限。
C. 匿名用户可以读取除/var/ftp/leader/eric外的所有文件内容。
2. 安装Vsftpd
1 |
$ yum install vsftpd |
3. 安装VSftpd后主配置文件开启的参数如下,还有一些默认参数,这里没有显示出来。其实当默认的配置文件基本够用无需做多大的调整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sed /^#/d /etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES # 添加; chroot_local_user=YES no_anon_password=YES |
4. 创建用户并指定其宿主目录(这样用户就可以对其目录有了控制权限,并且当用户登录时直接到家目录)
1 2 3 4 |
$ useradd -d /var/ftp/leader -s /sbin/nologin leader $ passwd leader $ useradd -d /var/ftp/leader/eric -s /sbin/nologin eric $ passwd eric |
5. 权限调整为/var/ftp/leader设置权限,属主为leader,属组为eric 并设置其权限为735
1 2 3 4 5 6 7 8 |
# 这个权限设置是为后面权限的调整; $ chown -R leader:eric /var/ftp/leader # 这个权限调整是为了eric用户可以登录到家目录,同时匿名用户可以对此目录有读取权限。(默认权限是700); $ chmod -R 755 /var/ftp/leader # 这个权限调整是为了eric用户登录到家目录后只有写入权限,同时匿名用户不允许访问; $ chmod -R 730 /var/ftp/leader/eric |
6. 重启vsftpd服务
1 |
$ service vsftpd restart |
建立基于Hash的虚拟用户
1. 安装db4-utils软件包
1 |
$ yum install db4-utils |
2. 建立虚拟用户的用户名/密码数据库库(/etc/vsftpd/vusers.list)
1 2 3 4 5 |
$ cat /etc/vsftpd/viruser.list aa 123 bb 456 |
3. db_load工具将列表转化为DB数据库文件
1 2 3 4 5 |
$ cd /etc/vsftpd/ $ db_load -T -t hash -f viruser.list viruser.db -f #选项用于指定用户名/密码列表文件; -T #允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件; -t hash #选项指定读取数据文件的基本方法; |
1 2 3 4 |
# 降低文件权限以提高安全性; $ file virtual.db vusers.db: Berkeley DB (Hash, version 8, native byte-order) $ chmod 600 /etc/vsftpd/viruser.* |
4. 建立FTP访问的根目录及虚拟用户对应的系统账户
1 2 3 4 5 |
# 建立映射账号virtual; $ useradd -d /var/ftp/data -s /sbin/nologin virtual # 更改FTP根目录的权限; $ chmod -R 777 /var/ftp/data |
5. 建立PAM认证文件(/etc/pam.d/vsftpd.vu)
1 2 3 |
$ cat /etc/pam.d/vsftpd.vu auth required pam_userdb.so db=/etc/vsftpd/viruser account required pam_userdb.so db=/etc/vsftpd/viruser |
6. 修改vsftpd.conf主配置文件,添加虚拟用户支持 (/etc/vsftpd/vsftpd.conf)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ cat /etc/vsftpd/vsftpd.conf # 使用虚拟用户需开启本地用户; local_enable=YES # 启用用户映射功能; guest_enable=yes # 将映射用户指定为virtual; guest_username=virtual # 修改使用的pam文件位置; pam_service_name=vsftpd.vu # 添加用户配置目录支持; user_config_dir=/etc/vsftpd/virtualuser |
7. 为用户aa,bb建立独立的配置目录及主配置文件
1 2 3 4 5 |
$ mkdir /etc/vsftpd/virtualuser $ cd /etc/vsftpd/virtualuser $ cat aa anon_upload_enable=yes anon_mkdir_write_enable=yes |
8. 重启FTP
1 |
$ service vsftpd restart |
PS:所有建立的虚拟用户登录都是到了对应的virtual账户的家目录,另外启用虚拟用户之后系统用户就不可以登录了,因为没有了PAM认证。
建立基于MySQL的虚拟用户
1. 安装RPM版的Mysql及开发库
1 2 |
$ yum -y install mysql-server mysql-devel $ service mysqld start |
2. 安装支持Mysql的Pam模块
1 2 3 4 5 |
$ tar zxvf pam_mysql-0.7RC1.tar.gz $ cd pam_mysql-0.7RC1 $ ./configure --with-mysql=/usr –with-openssl $ make $ make install |
3. 准备数据库及相关表
1 2 3 4 5 6 7 |
$ mysql mysql> create database vsftpd; mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'redhat'; mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'redhat'; mysql> flush privileges; mysql> use vsftpd; mysql> create table users (id int AUTO_INCREMENT NOT NULL,name char(20) binary NOT NULL,password char(48) binary NOT NULL,primary key(id)); |
4. 在MySQL中创建两个测试用户
1 2 |
mysql> insert into users(name,password) values('tom','redhat'); mysql> insert into users(name,password) values('jerry','redhat'); |
5. 建立pam认证所需文件
1 2 3 |
$ cat /etc/pam.d/vsftpd.mysql auth required /lib/security/pam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0 account required /lib/security/pam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0 |
6. 建立虚拟用户映射的系统用户及对应的目录其他用户要有读和执行权限
1 2 |
$ useradd -s /sbin/nologin -d /var/ftp/data virtual $ chmod go+rx /var/ftp/data |
7. 给Vsftpd的配置文件添加如下参数
1 2 3 4 5 6 7 8 9 10 11 12 |
$ cat /etc/vsftpd/vsftpd.conf # 启用用户映射功能; guest_enable=YES # 把所有的虚拟用户都映射为系统用virtual; guest_username=virtual # 启用MySQL认证; pam_service_name=vsftpd.mysql # 配置Vsftpd为虚拟用户使用配置文件目录; user_config_dir=/etc/vsftpd/virtualuser |
8. 虚拟用户登录已经可以但是其所有虚拟用户的权限都跟匿名用户一样,为虚拟用户配置访问权限,为用户tom,jerry建立独立的配置目录及主配置文件
1 2 3 4 5 6 |
$ mkdir /etc/vsftpd/virtualuser $ cd /etc/vsftpd/virtualuser $ touch tom jerry $ cat /etc/vsftpd/vusers/tom anon_upload_enable=YES anon_mkdir_write_enable=yes |
9. 重启FTP
1 |
$ service vsftpd restart |
PS:所有建立的虚拟用户登录都是到了对应的virtual账户的家目录,另外启用虚拟用户之后系统用户就不可以登录了,因为没有了PAM认证。
Shell中连接FTP
1 2 3 4 5 6 7 8 9 10 11 12 13 |
############################## USER=tcigame PASSWORD='!QAZ_4rfv' FTPHOST=172.16.7.110 PORT=21 ############################## ftp -in << EOF open $FTPHOST2 $PORT user $USER2 $PASSWORD2 bin put $bakfile bye EOF |