FTP1

post thumb
Internet
作者 Louis 发表于 2018年6月25日

摘要:实现基于mysql验证的vsftpd虚拟用户;实现基于SSL的FTPS.

实现基于MYSQL验证的vsftpd虚拟用户

  • 安装依赖
yum -y groupinstall "Development Tools"
yum -y install mariadb-devel pam-devel vsftpd
  • 获取pam-mysql,编译安装pam模块,并将模块安装到/lib64/security
$ wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
$ tar xf pam_mysql-0.7RC1.tar.gz 
$ cd pam_mysql-0.7RC1/
$ ./configure --help   #查看编译的选项帮助
$ ./configure --with-pam-mods-dir=/lib64/security
$ make -j 4 && make install
  • mysql数据库相关配置,创建名为vsftpd.vsftpd的数据库及数据表,存放虚拟用户的用户名及密码。
$ mysql -uroot -ppasswrod
create database vsftpd;
use vsftpd
show tables;
create table vsftpd
(id int auto_increment primary key,name char(20),pass char(48));
create table vsftpd (id int auto_increment primary key,name char(20),pass char(48));
desc vsftpd;
insert vsftpd(name,pass) values('ftp1',password('centos')), ('ftp2',password('magedu'));
select * from vsftpd;
grant all on vsftpd.* to vsftpd@'192.168.1.%' identified by 'centos';
flush privileges;
$ mysql -uvsftpd -pcentos -h192.168.1.18 #远程链接此mysqlserver,测试是否能进入。
  • vsftpd配置的相关配置。

建立虚拟用户映射的系统用户及对应的目录,注意:需除去ftp根目录的写权限,如果需要其他目录的权限,可以用acl权限来控制。

$ useradd -r -d /data/ftp -s /sbin/nologin vuser
$ mkdir  /data/ftp/{upload,pub} -pv
$ chown vuser.vuser /data/ftp
$ chmod -w /data/ftp
$ setfacl -m u:vuser:rwx /data/ftp/upload/
$ vim /etc/vsftpd/vsftp.conf
anonymous_enable=YES
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql #原将系统用户无法登录
user_config_dir=/etc/vsftpd/vusers.d/
$ vim /etc/pam.d/vsftpd.mysql #使用pam模块的验证方式,下面有配置说明
auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.1.18 db=vsftpd table=vsftpd usercolumn=name passwdcolumn=pass crypt=2
account required pam_mysql.so user=vsftpd passwd=centos host=192.168.1.18 db=vsftpd table=vsftpd usercolumn=name passwdcolumn=pass crypt=2 
  • pam模块验证方式的配置说明
• auth 表示认证
• account 验证账号密码正常使用
• required 表示认证要通过
• pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
• user=vsftpd为登录mysql的用户
• passwd=centos 登录mysql的的密码
• host=mysqlserver mysql服务器的主机名或ip地址
• db=vsftpd 指定连接msyql的数据库名称
• table=vsftpd 指定连接数据库中的表名
• usercolumn=name 当做用户名的字段,数据库的用户名的表头
• passwdcolumn=pass 当做用户名字段的密码,数据库密码的表头
• crypt=2 密码的加密方式为mysql password()函数加密
  • 启动服务,并远程登录ftp进行测试,并在ftp服务器查询相关日志。
$ service vsftpd start;systemctl start vsftpd  
$ chkconfig vsftpd on;systemctl enable vsftpd
$ tail /var/log/secure
Jun 25 21:58:59 localhost polkitd[707]: Unregistered Authentication Agent for 
unix-process:11468:4172182 (system bus name :1.65, object path
/org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
  • 远程登录ftp服务器测试,虚拟用户登录为mysql-servervsftpd.vsftpd的用户及密码。
$ ftp 192.168.1.18
Connected to 192.168.1.18 (192.168.1.18).
220 (vsFTPd 3.0.2)
Name (192.168.1.18:root): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

实现基于SSL的FTPS

​ 为了提高安全性,我们有 2 种选择,FTPS: 一种多传输协议,相当于加密版的FTP;SFTP:这个协议使用 SSH 文件传输协议加密从客户机到服务器的 FTP 连接,是一种替代 FTPS 的协议是安全文件传输协议(SFTP)。

系统:centos7,虚拟机:VMware Workstation14

抓包工具

  • 安装抓包工具
$ yum install -y wireshark libpcap
  • 配置ssl前,启动服务,先抓包试一试,然后开始用客户端连接 FTP ,发现明文密码和用户。
$ tshark -ni ens33 -R "tcp.dstport eq 21"
tshark: -R without -2 is deprecated. For single-pass filtering use -Y.
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens33'
 40 9.638793475 192.168.1.16 -> 192.168.1.18 TCP 74 52764 > 21 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=2995729 TSecr=0 WS=64
 42 9.639132045 192.168.1.16 -> 192.168.1.18 TCP 66 52764 > 21 [ACK] Seq=1 Ack=1 Win=14656 Len=0 TSval=2995730 TSecr=11006002
 45 9.644326579 192.168.1.16 -> 192.168.1.18 TCP 66 52764 > 21 [ACK] Seq=1 Ack=21 Win=14656 Len=0 TSval=2995733 TSecr=11006005
 46 9.644362705 192.168.1.16 -> 192.168.1.18 FTP 72 Request: FEAT
 54 9.645159556 192.168.1.16 -> 192.168.1.18 TCP 66 52764 > 21 [ACK] Seq=7 Ack=50 Win=14656 Len=0 TSval=2995736 TSecr=11006007
 56 9.645246021 192.168.1.16 -> 192.168.1.18 TCP 66 52764 > 21 [ACK] Seq=7 Ack=78 Win=14656 Len=0 TSval=2995736 TSecr=11006007
 57 9.645584396 192.168.1.16 -> 192.168.1.18 FTP 80 Request: OPTS UTF8 ON
 59 9.646038469 192.168.1.16 -> 192.168.1.18 FTP 77 Request: USER ftp1
 61 9.646830645 192.168.1.16 -> 192.168.1.18 FTP 79 Request: PASS centos

配置FTPS

  • 查看是否支持SSL
$ ldd `which vsftpd` |grep ssl  查看到libssl.so
  • 创建自签名证书
cd /etc/pki/tls/certs/
make vsftpd.pem
openssl x509 -in vsftpd.pem -noout –text
  • 配置vsftpd服务支持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/pki/tls/certs/vsftpd.pem
  • 在客户端进行访问,客户端使用lftp工具。
$lftp ftp1@192.168.1.18
Password: 
lftp ftp1@192.168.1.18:~> ls         
drwxrwxr-x    2 0        0              38 Jun 25 14:00 upload
lftp ftp1@192.168.1.18:/> cd upload/
lftp ftp1@192.168.1.18:/upload> ls
-rw-------    1 996      993          2242 Jun 25 06:28 Makefile
  • 在服务器端进行抓包,已经是加密的了。
$ tshark -ni ens33 -R "tcp.dstport eq 21"
tshark: -R without -2 is deprecated. For single-pass filtering use -Y.
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens33'
63 35.579718558 192.168.1.16 -> 192.168.1.18 TCP 74 52762 > 21 [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=2408883 TSecr=0 WS=64
66 35.580304307 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=1 Ack=1 Win=14656 Len=0 TSval=2408883 TSecr=10417113
68 35.586512644 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=1 Ack=21 Win=14656 Len=0 TSval=2408889 TSecr=10417119
69 35.586526890 192.168.1.16 -> 192.168.1.18 FTP 72 Request: FEAT
76 35.586922917 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=7 Ack=54 Win=14656 Len=0 TSval=2408890 TSecr=10417120
80 35.587063220 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=7 Ack=82 Win=14656 Len=0 TSval=2408890 TSecr=10417120
86 35.587543425 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=7 Ack=133 Win=14656 Len=0 TSval=2408891 TSecr=10417121
87 35.587704732 192.168.1.16 -> 192.168.1.18 FTP 76 Request: AUTH TLS
90 35.627874000 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=17 Ack=164 Win=14656 Len=0 TSval=2408931 TSecr=10417121
91 35.745084236 192.168.1.16 -> 192.168.1.18 FTP 185 Request: \026\003\003\000r\001\000\000n\003\003[1\350\036\344\023\030\a?\033
 93 35.745897710 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=136 Ack=1245 Win=16768 Len=0 TSval=2409049 TSecr=10417279
 95 35.752492964 192.168.1.16 -> 192.168.1.18 FTP 345 Request: \026\003\003\000\a\v\000\000\003\000\000\000\026\003\003\001\006\020\000\001\002\001\000\241e\227\246\016\233\360b\204\215[CWS\177\322\206&u\270\336\356\331\3534\000\327\364\273\244F\017\3163\016\335\b\313V\324\243\325\\363Z\334{\341\337V\377\210zR1\300\003$\270\225\342
 98 35.792069268 192.168.1.16 -> 192.168.1.18 FTP 141 Request: \024\003\003\000\001\001\026\003\003\000@\277\265\366SZ\2507(6\024_n\357\266\373\247\234e\312\246\324\034\355U\230\327~\002\235-\327\347v\232p=\201\373\377\276\2235{%\302\273;\321\251\332\366S=\202W\2048\271\353fs\361\364\217
101 35.832569356 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=490 Ack=1320 Win=16768 Len=0 TSval=2409135 TSecr=10417326
102 35.832619179 192.168.1.16 -> 192.168.1.18 FTP 135 Request: \027\003\003\000@tG\310\277\202)\266cT\275\036"\026\260\225\311\a\223\266\236\250f\320\326p\357g\a\307\224jHX\315\036\253\377\251\276\224/\263\024\a\006 ,
104 35.833041550 192.168.1.16 -> 192.168.1.18 TCP 66 52762 > 21 [ACK] Seq=559 Ack=1389 Win=16768 Len=0 TSval=2409135 TSecr=10417366
上一篇
nfs 详解

文章推荐