File Transfer Protocol

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

#####################################

FTP简介

vsftpd基本使用

明文传输带来的安全隐患

安全通信方式

vsftpd + PAM + mysql实现虚拟用户

#####################################

FTP简介

   文件传输服务位于应用层,监听21/tcp端口,数据传输模式为自适应,没有交叉编码能力Mine,遵循原文件本身格式,基于TCP协议实现,它有两个连接,命令连接和数据连接,它的工作模式有两种,主动模式和被动模式。

主动模式

222553294.png

被动模式

222712395.png


vsftpd基本使用

特性

   文件服务权限等于文件系统权限和文件共享权限的交集

   支持虚拟用户

       家目录在/var/ftp目录下,/目录被锁定为其家目录

   支持匿名用户

   支持系统用户

       家目录目录在/home/username目录下,/目录没有锁定,可以切换 lcd

   支持基于PAM实现用户认证

安装

1
2
3
4
5
6
7
8
9
yum  install  vsftpd
service vsftpd start
chkconfig vsftpd on
/etc/vsftpd                         配置文件
/etc/init .d /vsftpd                  服务脚本
/usr/sbin/vsftpd                    守护进程
/etc/pam .d/*                       配置文件
/lib/security                       认证模块
/var/ftp                            文件目录,不允许除root用户之外的其他用户具有写权限

常用选项

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
anonymous_enable=YES            启用匿名用户anonymous
local_enable=YES                启用系统用户
write_enable=YES                开启写入
anon_upload_enable=YES          开启上传
anon_mkdir_write_enable=YES     开启目录创建
anon_other_write_enable=YES     开启其他写权限,例如delete等……
dirmessage_enable=YES           开启目录进入欢迎提示
     vim  /var/ftp/upload/ .message      当用户切换到此目录时候会显示
xferlog_enable=YES             开启传输日志
xferlog_file= /var/log/vsftpd .log      定义传输日志存储位置和名称
#chown_uploads=YES              是否开启修改用户上传之后修改用户属主
#chown_username=whoever         修改为谁?
#idle_session_timeout=600       命令连接超时时间
#data_connection_timeout=120    数据连接超时时间
#ascii_upload_enable=YES        文本模式上传
#ascii_download_enable=YES      文本模式下载
chroot_list_enable=YES          禁锢用户至自己家目录
chroot_list_file= /etc/vsftpd/chroot_list 通过用户列表禁锢那些用户
#chroot_local_user=YES          禁锢所有用户至自己家目录,需要注释上面两项
listen=YES                      vsftpd是否工作为一个独立守护进程类型;
         独立守护进程适合于 (访问量大,在线时间长的服务)
         瞬时守护进程 (访问量比较小,在线时间不长的服务)
pam_service_name=vsftpd         基于pam的认证
   /etc/vsftpd/ftpusers  (文件中用户不能登录,清空 /etc/vsftpd/user_list 后才真正由此文件控制)
userlist_enable=YES            文件的用户不允许登录( /etc/vsftpd/user_list )
userlist_deny=NO               仅允许文件中的用户可以登录( /etc/vsftpd/user_list )
tcp_wrappers=YES
max_clients                    最多允许几个IP访问
max_per_ip                     一个IP最多几个请求

举例:让匿名用户可以上传文件

1
2
3
4
anon_upload_enable=YES    开启
mkdir  /var/ftp/upload
setfacl -m u: ftp :rwx  /var/ftp/upload/
getfacl  /var/ftp/upload/


明文传输带来的安全隐患

使用客户端连接FTP服务器

230924425.png

在服务器端使用tcpdum命令抓包

tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 192.168.1.30

231137952.png


安全通信方式

ftps:ftp+ssl/tls

sftp:OpenSSH,SubSystem,sftp(SSH)

创建私有CA

1
2
3
4
5
cd  /etc/pki/CA
mkdir  certs newcerts crl
echo  01 > serial
( umask  077;openssl genrsa -out private /cakey .pem 2048)创建私钥
openssl req -new -x509 -key private /cakey .pem -out cacert.pem -days 3650生成自签证书

生成证书颁发请求并签署

1
2
3
4
5
mkdir   /etc/vsftpd/ssl
cd  /etc/vsftpd/ssl
( umask  077; openssl genrsa -out vsftpd.key 2048;)  生成私钥
openssl req -new -key vsftpd.key -out vsftpd.csr   生成证书颁发请求
openssl ca - in  vsftpd.csr -out vsftpd.crt          签署证书

修改配置文件etc/vsftpd/vsftpd.conf支持ssl、tsl功能

1
2
3
4
5
6
7
8
9
# ssl or tls
ssl_enable=YES
ssl_sslv3=YES
ssl_tlsv1=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file= /etc/vsftpd/ssl/vsftpd .crt
rsa_private_key_file= /etc/vsftpd/ssl/vsftpd .key

客户端软件登陆

本文中使用FlashFXP作为FTP客户端

233903654.png

点击连接

234155400.png

成功连接

234501971.png

在服务器端抓包发现是明文

tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 192.168.1.30

234609661.png


vsftpd + PAM + mysql实现虚拟用户

一、安装所需要程序

事先安装好开发环境和mysql数据库;

1
2
yum -y  install  mysql-server mysql-devel
yum -y groupinstall  "Development Tools"  "Development Libraries"

安装pam_mysql-0.7RC1

1
2
3
4
5
tar  zxvf  pam_mysql-0.7RC1. tar .gz
cd   pam_mysql-0.7RC1
. /configure  --with-mysql= /usr  --with-opensslrpm包的mysql
make
make  install

002648483.png

安装vsftpd

1
yum -y  install  vsftpd

二、创建虚拟用户账号

准备数据库及相关表首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。

1
2
3
4
5
6
7
8
9
10
11
mysql> create database vsftpd;
mysql> grant  select  on vsftpd.* to vsftpd@localhost identified by  'vsftpd' ;
mysql> grant  select  on vsftpd.* to vsftpd@127.0.0.1 identified by  'vsftpd' ;
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 )
     -> );

添加测试的虚拟,用户pam_mysql的password()函数与MySQL的password()函数可能会有所不同。

1
insert into  users  (name,password) value ( 'bob' , '123' ),( 'tom' , '321' ),( 'lucy' , '333' );

三、配置vsftpd

建立pam认证所需文件vi /etc/pam.d/vsftpd.mysql

1
2
auth required  /usr/lib/security/pam_mysql .so user=vsftpd  passwd =vsftpd host=localhost db=vsftpd table= users  usercolumn=name passwdcolumn=password crypt=0
account required  /usr/lib/security/pam_mysql .so user=vsftpd  passwd =vsftpd host=localhost db=vsftpd table= users  usercolumn=name passwdcolumn=password crypt=0

修改vsftpd的配置文件,使其适应mysql认证,建立虚拟用户映射的系统用户及对应的目录

1
2
useradd  -s  /sbin/nologin  -d  /var/ftproot  vuser
chmod  go+rx  /var/ftproot

请确保/etc/vsftpd.conf中已经启用了以下选项

1
2
3
4
5
6
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=NO
chroot_local_user=YES

修改为NO,验证不通过SSL

1
2
force_local_data_ssl=NO
force_local_logins_ssl=NO

而后添加以下选项

1
2
guest_enable=YES        启用来宾用户
guest_username=vuser    来宾用户为

并确保pam_service_name选项的值如下所示

1
pam_service_name=vsftpd.mysql

四、启动vsftpd服务并测试

启动服务

1
2
service vsftpd start
chkconfig vsftpd on            自动启动

查看端口开启情况

1
netstat  -tnlp | grep  :21

查看数据库

003538317.png

FTP客户端工具登录验证pam是否生效

003653674.png

五、配置虚拟用户具有不同的访问权限

为虚拟用户使用配置文件目录

1
2
vim  /etc/vsftpd/vsftpd .conf
user_config_dir= /etc/vsftpd/vusers_dir

创建所需要目录,并为虚拟用户提供配置文件

1
2
mkdir  /etc/vsftpd/vusers_dir/
touch  /etc/vsftpd/vusers_dir/bob  /etc/vsftpd/vusers_dir/tom

配置虚拟用户的访问权限;所有虚拟用户的家目录为/var/ftproot;所有的虚拟用户映射到vuser中,而vuser属于匿名用户,因此虚拟用户的访问权限是通过匿名用户指令生效的。

bob可以上传、创建、删除

1
2
3
4
vim  /etc/vsftpd/vusers_dir/bob
anon_upload_enable=YES      (配置文件中已经开启,这里不写也可以)
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

tom不可以上传

1
2
vim  /etc/vsftpd/vusers_dir/tom
anon_upload_enable=NO

lucy可以上传

1
主配置文件中匿名上传已启用anon_upload_enable=YES,所以不需要做任何修改

bob测试

004055304.png

tom测试

004108679.png

lucy测试

004123838.png




本文转自 ftmoonfans  51CTO博客,原文链接:http://blog.51cto.com/soulboy/1290981


相关文章
|
29天前
|
存储 编译器 C++
从Proto到C++:探索Protocol Buffers的强大转换机制
从Proto到C++:探索Protocol Buffers的强大转换机制
248 4
|
6月前
|
存储 编译器 Go
Protocol Buffers [protobuf]
Protocol Buffers [protobuf]
31 0
|
8月前
|
开发工具 git
解决 HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
解决 HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
790 0
|
分布式数据库 Hbase
thriftpy2.protocol.exc.TProtocolException: No protocol version header
thriftpy2.protocol.exc.TProtocolException: No protocol version header
234 0
thriftpy2.protocol.exc.TProtocolException: No protocol version header
|
XML Dart Java
Protocol Buffers
protobuf它是Google提供的一个技术, 一个类库, 也可以说是一套规范, 学java的人都知道java有自己的序列化机制, 对不同的java程序来说,他们可以使用同一种序列化机制进行数据的传递, 但是java的序列化机制并不适用于其他的语言比如python
205 0
|
网络协议
OGG-01232 Receive TCP params error: TCP/IP error 104 (Connection reset by peer), endpoint:
源端: 2015-02-05 17:45:49 INFO OGG-01815 Virtual Memory Facilities for: COM anon alloc: mmap(MAP_ANON) anon free: munmap file alloc: mmap(MAP_SH...
3054 0
solidity中transfer异常"send" and "transfer" are only available for objects of type address
solidity中transfer异常"send" and "transfer" are only available for objects of type address
409 0