美文网首页
ftp的主动和被动模式,并实现基于pam认证的vsftpd

ftp的主动和被动模式,并实现基于pam认证的vsftpd

作者: 任总 | 来源:发表于2018-06-28 15:49 被阅读63次
  • vsftpd是一款在Linux发行版中最受 推崇的FTP服务器程序,特点是小巧轻快,安全易用,目前在开源操作系统中常用的FTP套件主要有proftpd、pureftp、ServU和wu- ftpd等。本文将讲解vsftpd的基本功能和如何基于PAM和MySQL/MariaDB实现虚拟用户访问控制。

(1) ftp的主动和被动模式

  • PORT(主动模式)
    PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据.
    image.png
  • PASV(被动模式)
    PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输.
    image.png
  • ftp的守护进程的类型:有两种
    standalone:独立守护进程;由服务进程自行监听套按字,并接收用户访问请求;
    transient:瞬时守护进程;由受托管方代为监听套按字,服务进程没有访问请求时不启动;当托管方收到访问请求时,才启动服务进程;一般使用这种
    CentOS 6:xinetd独立守护进程, /etc/xinetd.d/,
    CentOS 7:由systemd代为监听

  • vsftpd以ftp用户的身份运行进程,默认认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp
    程序环境:

  • 主程序:/usr/sbin/vsftpd
    主配置文件:/etc/vsftpd/vsftpd.conf
    数据根目录:/var/ftp

(2)vsftpd用户:

1)、用户类别:

  • 匿名用户:anonymous --> ftp, /var/ftp

  • 系统用户:至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd);

  • 虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd);

  • 用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可以自己有权限访问的所有路径间切换;禁锢用户于其家目录中;

2)、配置文件设置

  • 主配置文件:/etc/vsftpd/vsftpd.conf
    directive value
    注意:directive之前不能有多余字符;顶格写

  • 匿名用户设置:

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES是否支持匿名账户只有下载权限
anon_upload_enable=YES上传权限只能上传文件
anon_mkdir_write_enable=YES创建目录
anon_other_write_enable=YES修改权限包括删除目录
anon_umask=077                  

* 系统用户设置:                   

local_enable=YES是否本地用户
write_enable=YES写权限
local_umask=022默认权限644
                    
chroot_local_user=YES#禁锢所有本地用户于其家目录;需要事先去除用户对家目录的写权限;
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list#禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限;
                        
* 传输日志设置:
                    
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES

* 上传下载速率:
                
anon_max_rate=0    0代表无限制
local_max_rate=0

* 并发连接数限制:
                    
max_clients=2000最大并发连接数
max_per_ip=50单个(一个客户端)ip最大连接数

辅助配置文件/etc/vsftpd/ftpusers;列在此文件中的用户均禁止使用ftp服务;

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

# Users that are not allowed to login via ftp
root
bin
-省略-
  • 控制可登录vsftpd服务的用户列表:
userlist_enable=YES
启用/etc/vsftpd/user_list文件来控制可登录用户;
    userlist_deny=
    YES:意味着此为黑名单;
    NO:白名单;

(3)配置pam_mysql认证ftp虚拟用户

image.png
  • 环境准备:
    ftp服务器:172.16.15.103
    mysql服务器:172.16.15.107

1)mysql服务器安装及设置

  • 首先关闭selinux和防火墙
[root@mariadb-107 ~]# systemctl stop firewalld
[root@mariadb-107 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@mariadb-107 ~]# vim /etc/selinux/config 
 SELINUX=disabled
[root@mariadb-107 ~]# systemctl reboot  #重启生效

  • 安装mariadb服务
[root@mariadb-107 ~]# yum install  mariadb-server -y
  • 编辑/etc/my.cnf.d/server.cnf配置文件
[root@mariadb-107 ~]# vim /etc/my.cnf.d/server.cnf
 
 [mysqld]
skip_name_resolve=ON               #添加
innodb_file_per_table=ON          #添加
  • 开启mariadb服务
 
[root@mariadb-107 ~]# systemctl start mariadb.service
[root@mariadb-107 ~]# systemctl enable mariadb.service
[root@mariadb-107 ~]# ss -tnl
  • 授权一个ftp用户
[root@mariadb-107 ~]# mysql                    #登录数据库
  MariaDB [(none)]>CREATE DATABASE vsftpd;
  MariaDB [(none)]> use vsftpd;
  MariaDB [vsftpd]> GRANT SELECT ON vsftpd.* TO vsftp@'172.16.15.%' IDENTIFIED BY 'vpass';#创建ftp授权用户                                           
  MariaDB [vsftpd]> FLUSH PRIVILEGES;               #刷新
  MariaDB [vsftpd]> CREATE TABLE users (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) BINARY NOT NULL,password CHAR(48) BINARY NOT NULL);#创建users表,id列为无符号整型,该列值不可以为空,并不可以重复,而且自增;
MariaDB [vsftpd]> INSERT INTO users(name,password) VALUES ('test1',password('123')),('test2',password('456'));#插入test1和test2用户名密码
MariaDB [vsftpd]> select * from users;
+----+-------+-------------------------------------------+
| id | name  | password                                  |
+----+-------+-------------------------------------------+
|  1 | test1 | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
|  2 | test2 | *531E182E2F72080AB0740FE2F2D689DBE0146E04 |
+----+-------+-------------------------------------------+
MariaDB [vsftpd]> exit

2)ftp服务器安装及设置

  • 首先关闭selinux和防火墙
[root@fpt-103 ~]# systemctl stop firewalld
[root@fpt-103 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@fpt-103 ~]# vim /etc/selinux/config 
 SELINUX=disabled
[root@fpt-103 ~]# systemctl reboot  #重启生效

  • 安装vsftpd和pam_mysql
[root@fpt-103 ~]#  yum groupinstall -y "Development Tools" "Server PlatformDevelopment"   #安装编辑包组
[root@fpt-103 ~]#  yum install -y  vsftpd ftp wget    #安装vsftp、wget、ftp客户端
[root@fpt-103 ~]# yum install -y mariadb-devel pam-devel  openssl-devel    #安装相关扩展

[root@fpt-103 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz --no-check-certificate    #下载源码包
[root@fpt-103 ~]#  tra xf pam_mysql-0.7RC1.tar.gz  #解压缩包
[root@fpt-103 ~]# cd pam_mysql-0.7RC1   #切换到pam_mysql目录下
[root@ftp-103 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security  #设置预编译
[root@ftp-103 pam_mysql-0.7RC1]#  make && make install #编译并安装
[root@fpt-103 ~]# ll /lib64/security/ | grep mysql     #查询是否安装成功
-rwxr-xr-x  1 root root    882 Jun 24 23:49 pam_mysql.la
-rwxr-xr-x  1 root root 141752 Jun 24 23:49 pam_mysql.so
[root@fpt-103 ~]# vim /etc/pam.d/vsftpd.mysql #创建pam认证文件

auth required /usr/lib64/security/pam_mysql.so user=vsftp passwd=vpass host=172.16.15.107 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /usr/lib64/security/pam_mysql.so user=vsftp passwd=vpass host=172.16.15.107 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

[root@fpt-103 ~]# useradd -s /sbin/nologin -d /var/ftproot vuser
[root@fpt-103 ~]#  chmod go+rx /var/ftproot          #更改权限
[root@fpt-103 ~] vim /etc/vsftpd/vsftpd.conf        #设置配置文件

chroot_local_user=YES
allow_writeable_chroot=YES
pam_service_name=vsftpd.mysql
userlist_enable=YES
guest_enable=YES
guest_username=vuser
user_config_dir=/etc/vsftpd/vusers_conf
  • 配置虚拟用户具有不同的访问权限:
    vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。

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

[root@fpt-103 ~]#  mkdir /etc/vsftpd/vusers_conf  #创建虚拟用户配置目录
[root@fpt-103 ~]#  cd /etc/vsftpd/vusers_conf#切换目录
[root@ftp-103 vusers_conf]#  vim test1#创建测试1用户配置

anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

 [root@ftp-103 vusers_conf]# vim test2#创建测试2用户配置

 anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

 [root@fpt-103 ~]# systemctl start vsftpd  启动vsftp

(4)在客户端测试

  • 客户端主机要安装ftp工具
    yum -y install ftp

  • 状态响应码

  • 1xx:信息码

  • 2xx:成功状态码

  • 3xx:进一步提示补全信息的状态码

  • 4xx:客户端错误

  • 5xx:服务器端错误

  • 测试test1用户

[root@client-90 ~]# ftp 172.16.15.103
Connected to 172.16.15.103 (172.16.15.103).
220 (vsFTPd 3.0.2)
Name (172.16.15.103:root): test1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /etc
Local directory now /etc
ftp> put issue
local: issue remote: issue                  #上传issue
227 Entering Passive Mode (172,16,15,103,119,150).
150 Ok to send data.                        #上传成功
226 Transfer complete.
23 bytes sent in 9e-05 secs (255.56 Kbytes/sec)
ftp> mkdir test
257 "/test" created                       #创建test目录成功
ftp> rm test
250 Remove directory operation successful.  #删除成功
ftp> exit
221 Goodbye.
  • 测试test2用户
[root@client-90 ~]# ftp 172.16.15.103
Connected to 172.16.15.103 (172.16.15.103).
220 (vsFTPd 3.0.2)
Name (172.16.15.103:root): test2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /etc
Local directory now /etc
ftp> put issue             #上传issue 
local: issue remote: issue
227 Entering Passive Mode (172,16,15,103,47,230).
550 Permission denied #上传被拒绝
ftp> mkdir test
550 Permission denied #创建目录被拒绝

相关文章

网友评论

      本文标题:ftp的主动和被动模式,并实现基于pam认证的vsftpd

      本文链接:https://www.haomeiwen.com/subject/tmngyftx.html