FTP服务器简介:
FTP服务器是提供文件存储和访问服务的服务器,通过ftp(文件传输协议)实现数据传输,而且FTP是仅基于TCP的服务,不支持UDP。FTP应用是一种C/S架构的应用,客户端和服务器端都需要安装相关的软件才能实现相互之间的数据传输。常见的软件套件有FileZilla,Server-U,VsFTP,Pure-FTPd ,ProFTPD等,其中VsFTP,Pure-FTPd ,ProFTPD是单纯的服务器程序,常见客户端程序有ftp,lftp。本文实验环境中采用的服务器程序是vsftp。
工作原理:
基于pam认证框架实现认证:
安装:
[root@sherry ~]# yum install vsftpd -y
启动:
[root@sherry home]# service vsftpd start Starting vsftpd for vsftpd: [ OK ]
[root@sherry home]# ps -ef |grep vsftpd root 85235 1 0 00:52 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf #以root启动以ftp运行
默认家目录:
[root@sherry home]# cat /etc/passwd |grep ftp ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@sherry pub]# cd /var/ftp/pub [root@sherry pub]# touch a
客户端默认登入:
[root@martin ~]# ftp 172.16.178.153 Connected to 172.16.178.153 (172.16.178.153). 220 (vsFTPd 2.2.2) Name (172.16.178.153:root): anonymous #匿名用户 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 (172,16,178,153,65,242). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 May 25 16:59 pub 226 Directory send OK. ftp> cd pub 250 Directory successfully changed. ftp> ls 227 Entering Passive Mode (172,16,178,153,138,207). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 May 25 16:59 a 226 Directory send OK.
创建一个ftp账号:
[root@sherry tftp]# useradd -g sherry -s /sbin/nologin -d /home/tftp testftp
登入本地账号(use lftp):
[root@martin ~]# yum install lftp -y [root@martin ~]# lftp -u testftp,111111 172.16.178.153 lftp [email protected]:~> ls -rw-r--r-- 1 0 0 0 May 25 17:59 1 -rw-r--r-- 1 501 500 0 May 25 18:02 a lftp [email protected]:/> put all.sql 651585 bytes transferred
lftp指令获取:
lftp [email protected]:/> help !<shell-command> (commands) alias [<name> [<value>]] bookmark [SUBCMD] cache [SUBCMD] cat [-b] <files> cd <rdir> chmod [OPTS] mode file... close [-a] [re]cls [opts] [path/][pattern] debug [<level>|off] [-o <file>] du [options] <dirs> exit [<code>|bg] get [OPTS] <rfile> [-o <lfile>] glob [OPTS] <cmd> <args> help [<cmd>] history -w file|-r file|-c|-l [cnt] jobs [-v] kill all|<job_no> lcd <ldir> lftp [OPTS] <site> ls [<args>] mget [OPTS] <files> mirror [OPTS] [remote [local]] mkdir [-p] <dirs> module name [args] more <files> mput [OPTS] <files> mrm <files> mv <file1> <file2> [re]nlist [<args>] open [OPTS] <site> pget [OPTS] <rfile> [-o <lfile>] put [OPTS] <lfile> [-o <rfile>] pwd [-p] queue [OPTS] [<cmd>] quote <cmd> repeat [OPTS] [delay] [command] rm [-r] [-f] <files> rmdir [-f] <dirs> scache [<session_no>] set [OPT] [<var> [<val>]] site <site_cmd> source <file> torrent [-O <dir>] <file> user <user|URL> [<pass>] version wait [<jobno>] zcat <files> zmore <files>
在lftp上用!command执行本地命令
lftp [email protected]:/> !ls a a.bin.sql a.sql all.sql anaconda-ks.cfg install.log install.log.syslog
获取配置文件帮助:
[root@sherry vsftpd]# man vsftpd.conf
配置文件:
[root@sherry vsftpd]# vim /etc/vsftpd/vsftpd.conf # 注释 # 是否启用匿名用户 anonymous_enable=YES # 匿名用户默认再根目录下没有写权限 子目录文件系统有写权限和服务进程开启写就可以写入 跟目录不能改权限 # 上传 #anon_upload_enable=YES # 删除 #anon_other_write_enable=YES # 创建目录 #anon_mkdir_write_enable=YES # 是否允许本地用户访问 local_enable=YES # 是否允许本地用户上传 write_enable=YES # 禁锢所有用户家目录 默认no chroot_local_user=YES # 开启对记录文件中的用户 禁锢功能 跟上面chroot_local_user=YES 不能同时使用 #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list # 登入信息显示 #ftpd_banner=Welcome to blah FTP service. # 还可以引入文件 #banner_file=/etc/vsftpd/banner # 在有.messages的目录 切换到此目录就会显示.messages里面信息 dirmessage_enable=YES # 用户列表是否启用 默认是黑名单 # 黑名单:userlist_enable=YES userlist_deny=YES 第二选项可省略 # 白名单: userlist_enable=YES userlist_deny=NO userlist_enable=YES # 连接限制 # 最大并发连接数 #max_clients # 每个ip可同时发起并发请求 #max_per_ip # 传输速率 # 匿名用户的最大传输速率,单位是“字节/秒” #anon_max_rate # 本地用户的最大传输速率,单位是“字节/秒” #local_max_rate # 上传文件的umask # 匿名用户上传文件的umask; #anno_umask # 本地用户上传文件的umask; #local_umask # 修改匿名用户上传文件的属主和属组: #chown_uploads=YES #chown_username=someuser # 日志 xferlog_enable=YES #xferlog_file=/var/log/xferlog
很多系统用户不能登入比如root:
[root@sherry tftp]# cat /etc/pam.d/vsftpd #%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #这项认证中的文件里的用户都是不能登入的 auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth
[root@sherry tftp]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
所有的虚拟用户会映射会一个系统用户,访问时的文件目录是为此系统用户的家目录;
虚拟用户配置:
hash编码的文件:奇数行为用户名,偶数行为密码
关系型数据库:pam-mysql实现认证
查询pam_mysql.so是否安装
[root@sherry vsftpd]# ls /lib64/security/pam_m pam_mail.so pam_mkhomedir.so pam_motd.so
yum install pam_mysql -y [root@sherry vsftpd]# ls /lib64/security/pam_m pam_mail.so pam_mkhomedir.so pam_motd.so pam_mysql.so
创建vsftpd所需用到的库,表,以及vsftpd用户
mysql> create database vsftpd; mysql> grant select on vsftpd.* to 'vsftpd'@'localhost' identified by '222222'; mysql> flush privileges; 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) );
添加虚拟用户:
mysql> insert into users(name,password) values('tom',password('tom')); mysql> insert into users(name,password) values('jerry',password('jerry'));
配置vsftpd:
建立pam认证所需文件
[root@sherry pam.d]# vim /etc/pam.d/vsftpd.mysql # 认证时 crypt=2 mysql-password加密 3 md5 4sha1 auth required /lib64/security/pam_mysql.so user=vsftpd passwd=222222 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 # 账号检验 account required /lib64/security/pam_mysql.so user=vsftpd passwd=222222 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
[root@sherry tftp]# useradd -g sherry -s /sbin/nologin -d /home/tftp testftp [root@sherry home]# chmod go+rx tftp/
请确保/etc/vsftpd.conf中已经启用了以下选项 anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES 而后添加以下选项 guest_enable=YES guest_username=testftp #映射用户 pam_service_name=vsftpd.mysql
启动服务:
[root@sherry home]# /etc/init.d/vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ]
登入成功:
[root@martin ~]# lftp -u tom,tom 172.16.178.153 lftp [email protected]:/> put a.bin.sql 2448 bytes transferred [root@sherry tftp]# ll total 644 -rw------- 1 testftp sherry 2448 May 26 04:50 a.bin.sql
权限配置:
[root@sherry ~]# vim /etc/vsftpd/vsftpd.conf # 配置vsftpd为虚拟用户使用配置文件目录vusers_config 名字随意 user_config_dir=/etc/vsftpd/vusers_config
创建所需要目录,并为虚拟用户提供配置文件
[root@sherry ~]# mkdir /etc/vsftpd/vusers_config/ [root@sherry ~]# cd /etc/vsftpd/vusers_config/ [root@sherry ~]# touch tom jerry
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让tom用户具有上传文件的权限,可以修改/etc/vsftpd/vusers/tom文件,在里面添加如下选项即可。
[root@sherry ~]# /etc/vsftpd/vusers/tom anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable={YES|NO}