站长资讯网
最全最丰富的资讯网站

详解FTP服务之vsftpd(附三种用户安装脚本)

FTP(File Transfer Protocol,文件传输协议)可以在网络中传输文档、图像、视频以及应用程序等多种类型的文件。在企业中大多数情况下,则是用户使用FTP从服务器上下载文件。

一个完整的FTP文件传输需要建立两种类型的连接,一种为控制文件传输的命令,称为控制连接;另一种实现真正的文件传输,称为数据连接

控制连接:客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器TCP协议的21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接

数据连接:FTP控制连接建立后,即可开始传输文件,传输文件的连接称为FTP数据连接。FTP数据连接就是FTP传输数据的过程,它有主动传输模式和被动传输模式两种。

FTP数据传输原理

用户在使用FTP传输数据时,整个FTP建立连接的过程经过以下几个步骤

1、FTP服务器会自动对默认端口21进行监听,当某个客户端向这个端口请求建立连接时,便激活了FTP服务器上的控制进程,通过这个控制进程,FTP服务器对连接用户名、密码以及连接权限等进行身份验证

2、当FTP服务器身份验证完成后,FTP服务器和客户端之间还会建立一条用来传输数据的专有连接

3、FTP服务器在传输数据过程中的控制将一直工作,并不断发出指令控制整个FTP传输数据,数据传输完毕后控制进程给客户端发送结束指令。

FTP传输模式

在建立数据传输的时候有两种传输模式,即主动模式和被动模式

主动模式(PORT模式)

主动模式的数据传输专有连接是在建立控制连接(用户身份验证完成后),首先由FTP服务器使用20端口主动向客户端进行连接,建立专用于传输数据的连接,这种方式在网络管理上比较好控制。FTP服务器上的端口21用于用户验证,端口20用于数据传输,只要将这两个端口开放就可以使用FTP功能了,此时客户端只是出于接收状态。

被动模式(PASV模式)

被动模式与主动模式不同,数据传输专有连接是在建立控制连接(用户身份验证后)由客户端向FTP服务器发起连接的。客户端使用哪个端口,连接到FTP服务器的哪个端口都是随机产生的,服务器并不参与数据的主动传输,只是被动接受。

FTP用户

匿名用户:它是指在FTP服务器中没有指定账户,但是他仍然可以匿名访问某些公开的资源。

本地用户:它是指在FTP服务器上拥有账户。在这类用户访问FTP服务器的时候,其默认的主目录就是账户命名的家目录。但是他还可以变更到其他目录中去。

虚拟用户:在FTP服务器中,使用这类用户只能访问其主目录下的文件,而不能访问目录以外的文件,FTP服务器通过这种方式来保障服务器上其他文件的安全性。

vsftpd简介

vsftpd(very secure FTP daemon,非常安全的FTP守护进程)是一款可以运行在Unix/Linux操作系统上,安全、易用、开放源代码的FTP服务器软件。

1、匿名用户登录

vsftps服务启动后,默认就允许匿名用户(anonymous或ftp)连接到vsftpd服务器。默认匿名用户不能离开vsftpd服务器匿名用户目录/var/ftp,匿名用户只能下载文件,而没有权限上传文件到vsftpd服务器上。

[root@linux-node1 ~]# yum install -y vsftpd

[root@linux-node1 ~]# cat /etc/vsftpd/vsftpd.conf|egrep -v '^#|^$' ##默认配置

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=NO

listen_ipv6=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

[root@vsftpd ~]# vim /var/ftp/pub/.message

hello world

允许匿名用户上传、下载文件和创建目录

[root@linux-node1 ~]# vim /etc/vsftpd/vsftpd.conf

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

[root@vsftpd ~]# cd /var/ftp/pub/

[root@vsftpd pub]# mkdir test

[root@vsftpd pub]# chmod o+w test/

[root@vsftpd vsftpd]# chmod 777 /var/ftp/pub/

[root@vsftpd vsftpd]# ll /var/ftp/

total 4

-rw-r–r– 1 root root 0 Nov 19 16:25 123

drwxrwxrwx 3 root root 4096 Nov 19 23:05 pub

[root@vsftpd vsftpd]# /etc/init.d/vsftpd start

Shutting down vsftpd: [ OK ]

Starting vsftpd for vsftpd: [ OK ]

2、认证用户配置:

[root@vsftpd ~]# useradd -d /var/ftp ftpuser

[root@vsftpd ~]# echo '123456'|passwd –stdin ftpuser

[root@vsftpd vsftpd]# vim vsftpd.conf

anonymous_enable=NO

local_root=/var/ftp

chroot_local_user=YES

[root@vsftpd ~]# systemctl restart vsftpd

拒绝指定用户连接vsftpd服务器

1、编辑/etc/vsftpd/ftpusers文件

在默认情况下,这个文件内已经有一些拒绝连接的用户,在该文件的最后添加拒绝的用户就可以了

[root@vsftpd ~]# vim /etc/vsftpd/ftpusers

ftpuser

[root@vsftpd ~]# systemctl restart vsftpd

[root@linux-node2 ~]# wget ftp://ftpuser:123@10.0.0.100:21/123

–2018-11-23 20:53:55– ftp://ftpuser:password@10.0.0.100/123

=> “123.1”

Connecting to 10.0.0.100:21… connected.

Logging in as ftpuser … Logged in!

==> SYST … done. ==> PWD … done.

==> TYPE I … done. ==> CWD not needed.

==> SIZE 123 … done.

==> PASV … done. ==> RETR 123 … done.

[<=> ] 0 –.-K/s in 0s

2018-11-23 20:53:55 (0.00 B/s) – “123.1” saved [0]

3、虚拟用户设置:

匿名用户可以很好地保证服务器的安全性,但是对匿名用户的权限管理不够灵活。如果想对访问FTP的账户给予更多的权限,就可以使用本地账户来实现。但是本地账户默认情况下是可以登录Linux系统的,这样对Linux系统来说是一个安全隐患。使用虚拟用户能在灵活地赋予FTP用户权限的前提下,保证服务器乃至系统的安全。

虚拟用户并不是一个合法的Linux系统账户,但是他可以来登录系统上运行的vsftpd服务器,当用户在连接上vsftpd服务器后,会被要求输入用户名和密码。服务器在拿到这个用户名和密码后,会调用相应的PAM认证模块对,和系统中的FTP认证文件进行比较。如果该用户名和密码与FTP认证文件中的某条记录相符就通过认证,该账户就被映射成一个Linux下的本地账户,然后根据该本地账户对FTP资源进行访问,负责就断开该连接请求。

3.1、建立虚拟用户帐号口令库文件

[root@linux-node1 vsftpd]# vim vulist

tom

123

[root@linux-node1 vsftpd]# yum install db4-utils -y

[root@linux-node1 vsftpd]# db_load -T -t hash -f vulist vuser.db (转化为伯克利格式)

[root@linux-node1 vsftpd]# chmod 600 vuser.*

3.2、建立虚拟用户映射的系统用户及根目录

[root@linux-node1 vsftpd]# useradd -d /var/vftp -s /sbin/nologin vuser

[root@linux-node1 vsftpd]# chmod 755 /var/vftp

3.3、建立虚拟用户的PAM认证文件

[root@linux-node1 vsftpd]# vim /etc/pam.d/vupam

auth required pam_userdb.so db=/etc/vsftpd/vuser

account required pam_userdb.so db=/etc/vsftpd/vuser

3.4、修改vsftpd.conf,开启虚拟用户支持

[root@linux-node1 vsftpd]# vim vsftpd.conf

listen=YES

listen_address=10.0.0.103

listen_port=21

connect_from_port_20=YES

#pasv_min_port=2222

#pasv_max_port=2225

write_enable=YES

xferlog_enable=YES

xferlog_std_format=YES

#pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

#max_clients=0

#max_per_ip=0

anonymous_enable=NO

anon_umask=022

#anon_root=/var/ftp

#anon_upload_enable=YES

#anon_mkdir_write_enable=YES

#anon_other_write_enable=YES

#anon_max_rate=0

local_enable=YES

local_umask=022

#local_root=/var/ftp

#chroot_local_user=YES

#local_max_rate=0

guest_enable=YES

virtual_use_local_privs=YES ##centos7中一定要有

guest_username=vuser

pam_service_name=vupam

3.5、为不同虚拟用户建立独立的配置文件

listen=YES

listen_address=10.0.0.103

listen_port=21

connect_from_port_20=YES

#pasv_min_port=2222

#pasv_max_port=2225

write_enable=YES

xferlog_enable=YES

xferlog_std_format=YES

#pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

#max_clients=0

#max_per_ip=0

anonymous_enable=NO

anon_umask=022

#anon_root=/var/ftp

#anon_upload_enable=YES

#anon_mkdir_write_enable=YES

#anon_other_write_enable=YES

#anon_max_rate=0

local_enable=YES

local_umask=022

#local_root=/var/ftp

#chroot_local_user=YES

#local_max_rate=0

guest_enable=YES

virtual_use_local_privs=YES ##centos7中一定要有

guest_username=vuser

pam_service_name=vupam

user_config_dir=/etc/vsftpd/vuconf

[root@linux-node1 vsftpd]# mkdir /etc/vsftpd/vuconf

[root@linux-node1 vsftpd]# vim /etc/vsftpd/vuconf/tom

anon_upload_enable=YES

anon_mkdir_write_enable=YES

local_root=/var/ftp/pub/tom

[root@linux-node1 vsftpd]# mkdir /var/ftp/pub/tom

[root@linux-node1 vsftpd]# chmod 777 /var/ftp/pub/tom

[root@linux-node1 vsftpd]# vim /var/ftp/pub/tom/23

121234

[root@linux-node1 vsftpd]# /etc/init.d/vsftpd restart

Shutting down vsftpd: [ OK ]

Starting vsftpd for vsftpd: [ OK ]

[root@linux-node2 ~]# wget ftp://tom:123@10.0.0.103:21/23

–2018-11-23 22:42:01– ftp://tom:password@10.0.0.103/23

=> “23”

Connecting to 10.0.0.103:21… connected.

Logging in as tom … Logged in!

==> SYST … done. ==> PWD … done.

==> TYPE I … done. ==> CWD not needed.

==> SIZE 23 … 5

==> PASV … done. ==> RETR 23 … done.

Length: 5 (unauthoritative)

100%[===================================>] 5 –.-K/s in 0s

2018-11-23 22:42:01 (662 KB/s) – “23” saved [5]

附一键安装脚本:

#!/bin/bash

time=$(date +%F-%H:%M)

Kernel=$(uname -r|awk -F. '{print $1}')

menu(){

cat <1.[anonymous install]

2.[local_user(ftpuser) install]

3.[vuser_user(tom and andy) install]

4.[vuser_user(tom's home) install]

5.[exit]

EOF

echo -e "33[36m ###################33[0m"

read -p " please input your number:" a

num=$a

}

install(){

yum install -y vsftpd

}

sever-restart(){

if [ $Kernel -eq 3 ]

then

systemctl restart vsftpd

else

/etc/init.d/vsftpd restart

fi

}

anonymous(){

mkdir /var/ftp/pub/test

chmod o+w /var/ftp/pub/test

cat >>/etc/vsftpd/vsftpd.conf <

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

EOF

sever-restart

}

local_user(){

useradd -d /var/ftp ftpuser

echo '123456'|passwd –stdin ftpuser

sed -i 's|anon_upload_enable=YES|#anon_upload_enable=YES|g' /etc/vsftpd/vsftpd.conf

sed -i 's|anon_mkdir_write_enable=YES|#anon_mkdir_write_enable=YES|g' /etc/vsftpd/vsftpd.conf

sed -i 's|anon_other_write_enable=YES|#anon_other_write_enable=YES|g' /etc/vsftpd/vsftpd.conf

sed -i 's|anonymous_enable=YES|anonymous_enable=NO|g' /etc/vsftpd/vsftpd.conf

cat >>/etc/vsftpd/vsftpd.conf <

local_enable=YES

local_umask=022

local_root=/var/ftp

chroot_local_user=YES

EOF

sever-restart

}

vuser(){

cat >/etc/vsftpd/vulist

123

andy

321

EOF

/usr/bin/db_load -T -t hash -f /etc/vsftpd/vulist /etc/vsftpd/vuser.db

if [ $ -ne 0 ]

then

/usr/bin/yum install pam pam- db4 db4-

/usr/bin/db_load -T -t hash -f /etc/vsftpd/vulist /etc/vsftpd/vuser.db

fi

chmod 600 /etc/vsftpd/vu*

cat /etc/passwd|grep vuser >>/dev/null 2>&1

if [ $ -ne 0 ]

then

useradd -d /var/vftp -s /sbin/nologin vuser

else

echo 'vuser is exsit,please change user name !'

exit 1

fi

chmod 700 /var/vftp

cat >/var/vftp/test

ftpuser

EOF

cat >/etc/pam.d/vupam

account required pam_userdb.so db=/etc/vsftpd/vuser

EOF

mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak_$time

cat >/etc/vsftpd/vsftpd.conf

listen_port=21

connect_from_port_20=YES

#pasv_enable=YES

#pasv_min_port=2222

#pasv_max_port=2225

write_enable=YES

xferlog_enable=YES

xferlog_std_format=YES

#pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

#max_clients=0

#max_per_ip=0

anonymous_enable=NO

#anon_umask=022

#anon_root=/var/ftp

#anon_upload_enable=YES

#anon_mkdir_write_enable=YES

#anon_other_write_enable=YES

#anon_max_rate=0

local_enable=YES

local_umask=022

#local_root=/var/ftp

#chroot_local_user=YES

#local_max_rate=0

guest_enable=YES

virtual_use_local_privs=YES

guest_username=vuser

pam_service_name=vupam

EOF

sever-restart

}

vuser-tom(){

cat >>/etc/vsftpd/vsftpd.conf

EOF

mkdir /etc/vsftpd/vuconf

cat >/etc/vsftpd/vuconf/tom

anon_mkdir_write_enable=YES

local_root=/var/ftp/pub/tom

EOF

mkdir -p /var/ftp/pub/tom

chmod 777 /var/ftp/pub/tom

cat >/var/ftp/pub/tom/test.txt

tom

EOF

sever-restart

}

main(){

menu

netstat -antup|grep 22 >/dev/null 2>&1

if [ $ != 0 ]

then

install

fi

case "$num" in

1)echo 'Start installing vsftpd of anonymous!'

anonymous

;;

2)echo 'Start installing vsftpd of local_user(ftpuser)!'

local_user

;;

3)echo 'Start installing vsftpd of vuser_user(tom and andy)!'

vuser

;;

4)echo "Start installing vsftpd of vuser_user(tom's home)!"

vuser-tom

;;

5)echo "EXIT…."

exit 1

;;

)

echo "USAGE:please input your number:{1|2|3|4|5}"

exit 2

;;

esac

}

main $

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号