Debian+vsftpd+MySQL实现虚拟用户

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: http://linux.vbird.org/linux_server/0410vsftpd.

http://linux.vbird.org/linux_server/0410vsftpd.php#ftp_recommand

 

 

前些天用vsftpd+mysql实现虚拟用户登录,把偶的菜鸟笔记和大家分享一下,有什么问题请指正
特别申明:本文不适合Linux老鸟们
HTML版本:http://guitarbug.googlepages.com/vsftpdmysql.html

-----------------------------

Debian+vsftpd+MySQL实现虚拟用户
(posted by guitarbug @ 2006.6.12)

一,需求

1,虚拟用户登录
由于之前配置成功了postfix+MySQL虚拟用户登录,体会到了使用虚拟用户的好处和灵活性,所以这次也考虑采用虚拟用户,并且将FTP虚拟用户的信息也存储在MySQL中,这样以后用PHP等写一些WEB GUI的管理程序,统一管理用户,还是蛮方便的.

2,限制IP的匿名登录
开放匿名登录,但是只允许特定的IP可以匿名登录

3,不同用户,不同目录,不同权限
听起来有点像绕口令吧,举例来说,有2个用户,分别是普通用户(normal)和管理员(admin),FTP有2个目录,分别是incoming和pub,要实现如下权限设置:

代码:
 
  
incoming pub normal 读/写 只读 admin 读/写 读/写

4,通过FTP管理Web站点
服务器上还架设了Apache,而网站管理员对Linux又不是很熟悉,而且也不想开放一个帐号给网站管理员,以免他登录到系统上去,把系统搞的乱78糟,所以参考Internet上提供虚拟主机的流行做法,就是通过FTP来管理网站,所以需要提供一个可供网站管理员登录FTP进行网站管理的帐号.

5,扩展功能
待定..

二,选择FTP服务器软件
Linux下架设FTP站点,有很多优秀的FTP服务器软件可供选择,例如Wu-FTPD,Pure-FTPD,ProFTPD以及vsFTPD等等,要想选择一个适合自己需求的FTP服务器软件,也需要费点脑筋才行,对于我来说,选择 vsftpd(very secure FTP daemon),主要有以下两点原因:

1,选择原则一
有人说,哪个FTPD是你最熟悉的就用哪个,不过由于我之前没有在Linux下架设FTP站点的经验,所以,对我来说,一切都是新的起点.在vsftpd的官方主页上看到了Debian官方FTP,RH官方FTP等都使用了vsftpd,于是"随波逐流"吧,这样看起来会有面子些~

2,选择原则二
第二点很大程度取决于vsftpd(very secure FTP daemon)的名字,因为它是很安全的FTP软件嘛,哈哈,再说Debian官方等FTP都使用了vsftpd,选择它应该没错的~

PS:FTP服务器软件的选择可以参考" 鸟哥的Linux私房菜中的简易vsftpd服务器架设"一文.

三,实现
基于Debian GNU/Linux 3.1 Sarge 和 vsftpd-2.0.3

1,需要的软件包
1),vsftpd
very secure FTP daemon

2),mysql-server,mysql-client
前者是MySQL数据库服务器,用于存储虚拟用户信息,后者提供一个命令行的MySQL Client. 由于我之前配置postfix时,已经安装过了MySQL,所以我不必安装这个包了^_^

3),libpam-mysql
vsftpd是通过PAM验证用户信息的,这个包可以让PAM去读取MySQL完成验证.

2,安装
以root登录Debian,输入以下命令,搞定~
代码:
 
  
#apt-get install vsftpd,libpam-mysql

3,创建一个必要的本地用户
虽说是虚拟用户,不过,由于虚拟用户的信息存储在MySQL数据库中,所以还是需要一个能够读取MySQL数据库的本地用户.

1),创建本地用户的家目录,此目录也是FTP的家目录
代码:
 
  
#mkdir /home/ftp

2),创建名为ftpguest的本地用户
代码:
 
  
#useradd ftpguest -d /home/ftp

3),修改FTP家目录的所有者和组
代码:
 
  
#chown ftpguest.nogroup /home/ftp

4,配置MySQL数据库

1),创建用于存储虚拟用户信息的数据库ftpvuser
代码:
 
  
#mysqladmin -u root -p create ftpvuser


2),连接数据库
代码:
 
  
#mysql -u root -p

3)创建用于存储虚拟用户信息的表users
代码:
 
  
mysql>use ftpvuser; mysql>CREATE TABLE users (username varchar(20) NOT NULL,password varchar(40) NOT NULL,PRIMARY KEY (username)) TYPE=MyISAM;

4)让本地用户ftpguest能读取ftpvuser数据库的users表的内容
注:YourPassword用于设定ftpguest访问数据库的密码.
代码:
 
  
mysql>grant select on ftpvuser.users to ftpguest@localhost identified by 'YourPassword'; mysql>flush privileges;

5),建立虚拟用户
代码:
 
  
mysql>insert into users (username,password) values ('normal','555555'); mysql>insert into users (username,password) values ('admin','666666'); mysql>insert into users (username,password) values ('webmaster','777777');


6),完成MySQL的配置
代码:
 
  
mysql>quit;

5,配置vsftpd的PAM验证

1),打开PAM配置文件
代码:
 
  
#nano /etc/pam.d/vsftpd


2),将以前的内容注释掉,然后添加下面2行内容
注:YourPassword就是刚才在 前面设定的ftpguest访问数据库的密码.
代码:
 
  
auth required pam_mysql.so user=ftpguest passwd=YourPassword host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0 account required pam_mysql.so user=ftpguest passwd=YourPassword host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0

6,配置vsftpd

1),打开vsftpd的配置文件
代码:
 
  
#nano /etc/vsftpd.conf
注意:一旦修改了/etc/vsftpd.conf文件的内容,必须重启vsftpd才能使新的设置生效,方法是:
代码:
 
  
#/etc/init.d/vsftpd stop #/etc/init.d/vsftpd start
直接#/etc/init.d/vsftpd restart,好像不起作用?

2),修改vsftpd.conf文件如下
代码:
 
  
#关闭匿名用户访问 #anonymous_enable=YES #开启本地用户访问 local_enable=YES #开启虚拟用户访问 guest_enable=YES guest_username=ftpguest #将本地用户限制在自己的家目录,这样可避免FTP用户访问到其他的系统目录 chroot_local_user=YES


3),500 OOPS: cap_set_proc
赶快登录FTP试一下吧,不过为什么无法登录呢?服务器返回错误:500 OOPS: cap_set_proc
Google之,这个错误似乎与SELinux有关,解决办法是加载capability模块:
代码:
 
  
#modprobe capability
为了让Linux在启动时自动加载此模块,把这个模块放到/etc/modules中即可.

4),限制IP的匿名登录
要想限制登录vsftpd的客户端的IP地址,要用到一个叫TCP Wrappers的东东,对于TCP Wrappers,我的理解是,如果在vsftpd中启用了TCP Wrappers的话,每次客户端向vsftpd发起一个连接请求的时候,vsftpd首先会把这个连接请求交给TCP Wrappers处理,如果客户端的IP被TCP Wrappers放行的话,才能继续与vsftpd继续会话,否则,直接就被拒绝服务了,不知道对不对?

a,修改/etc/vsftpd.conf
代码:
 
  
#启用TCP Wrappers tcp_wrappers=YES

b,修改/etc/hosts.deny
拒绝所有向vsftpd发起连接请求的IP,不过,如果hosts.deny与hosts.allow冲突的话,以hosts.allow优先处理,这好像就是,先deny所有,然后在hosts.allow开放特权,呵呵
代码:
 
  
#拒绝所有连入vsftpd的IP先. vsftpd: ALL

c,修改/etc/hosts.allow
在这里开放允许登录vsftpd的IP地址关于VSFTPD_LOAD_CONF环境变量,vsftpd的man是这么说的:
"If tcp_wrappers sets the VSFTPD_LOAD_CONF environment variable, then the vsftpd session will try and load the vsftpd configuration file specified in this variable. "
代码:
 
  
#限制可以匿名登录vsftpd的IP地址 vsftpd: 192.168.0.,210.83.200.200 : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd.anonymous #允许vsftpd的虚拟用户以任何IP连接FTP vsftpd: ALL : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd.virtual

d,修改/etc/vsftpd/vsftpd.anonymous
代码:
 
  
#mkdir /etc/vsftpd/ #nano /etc/vsftpd/vsftpd.anonymous #允许匿名登录 anonymous_enable=YES

e,修改/etc/vsftpd/vsftpd.virtual
代码:
 
  
#nano /etc/vsftpd/vsftpd.virtual #不允许匿名登录 anonymous_enable=NO

5),为不同的用户设置不同的访问权限

a,激活单个用户配置功能,增加以下配置行到vsftpd的配置文件:
代码:
 
  
#nano /etc/vsftpd.conf #指定不同用户配置文件的存放路径 user_config_dir=/etc/vsftpd/vsftpd_user_conf

b,普通用户:下载/上传
编辑/etc/vsftpd/vsftpd_user_conf/normal
注意:用户的配置文件名与用户名一致,不过匿名用户的配置文件名为ftp,而不是anonymous
代码:
 
  
#mkdir /etc/vsftpd/vsftpd_user_conf #nano /etc/vsftpd/vsftpd_user_conf/normal
加入以下内容:
#允许下载
代码:
 
  
anon_world_readable_only=NO #允许写入,上传以及建立目录 write_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES

c,管理员用户:下载/上传/删除等.
代码:
 
  
#cp /etc/vsftpd/vsftpd_user_conf/normal /etc/vsftpd/vsftpd_user_conf/admin
编辑admin的配置文件:
代码:
 
  
#nano /etc/vsftpd/vsftpd_user_conf/admin
管理员除了拥有普通用户的权限以外,还拥有删除/重命名/改变文件属性的权限
加入以下内容:
代码:
 
  
#允许重命名和删除文件 anon_other_write_enable=YES #虚拟用户拥有与本地用户相同的权限(由于chmod仅仅对本地用户有效,所以如果想要虚拟用户拥有chmod的权限,这一项必须激活) virtual_use_local_privs=YES #允许修改文件属性 chmod_enable=YES

d,网站管理员
代码:
 
  
#cp /etc/vsftpd/vsftpd_user_conf/admin /etc/vsftpd/vsftpd_user_conf/webmaster
编辑webmaster的配置文件:
代码:
 
  
#nano /etc/vsftpd/vsftpd_user_conf/webmaster

加入以下内容:
代码:
 
  
#将FTP家目录指向网站的家目录(我的www目录使用Apache默认的目录) local_root=/var/www #默认情况下,上传到FTP站点的文件的拥有者都是ftpguest,其他用户是没有访问权限的 #所以,当访问网站的时候,会出现"没有权限访问该文件的错误",这是由于Apache的用户 #www-data无法访问/var/www下的文件造成的,把umask设置成033甚至000即可解决这个问题. local_umask=033

e,为normal,admin用户设置对incoming,pub目录不同的权限
阅读了一遍vsftpd man中关于权限的相关设置,似乎没有单独设置每个目录权限的地方?后来想到是不是可以利用Linux文件系统的文件权限设置来达到此目的,以前在Windows下利用IIS来架设站点时,我就是利用NTFS权限设置来达到控制不同用户对目录的访问权限.不过试了一下,还是无法完美的实现以下的权限控制:
代码:
 
  
incoming pub normal 读/写 只读 admin 读/写 读/写
举例来说,可以通过把pub设置成只读来控制normal用户只读pub的权限,不过admin对pub也是只读了不过,还好,因为admin拥有修改目录属性的权限,如果admin用户想要通过FTP来完成管理pub目录的话,可以临时把pub目录修改成读/写属性.

四,小结

1,vsftpd的目标是完成一个简易而且安全性不低的FTPD,功能嘛,似乎还是有点不足,特别是目录权限这方面的设置如果是对目录权限有比较复杂的需求的话,可以考虑一下Proftpd .

2,在测试的时候,除了使用FTP Client工具以外,最好再使用Sniffer类的软件作为辅助,因为有时候FTP Client并不会完全把FTPD返回信息呈现在你面前,而有时候,这些信息对排除FTPD故障会有很大帮助的,而一旦使用Sniffer类的软件,所有的客户端与服务器端交互的信息都不会漏掉的.

五,参考

1,Manpage of VSFTPD.CONF:
http://vsftpd.beasts.org/vsftpd_conf.html

2,vsftp配置大全:
http://bbs.chinaunix.net/viewthread.php?tid=561183

原文链接:http://bbs.et8.net/bbs/showthread.php?t=760123

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Prometheus 监控 Cloud Native
手把手教你Prometheus + Granafa实现mysql 性能监测部署
数据库性能监控可以说是十分重要,能否自行搭建环境实现像阿里云或是腾讯云那样直观的展示不同维度数据的功能?答案是肯定的。下面详细说明一下安装部署过程以及过程中出现的问题,希望对你有所帮助!
手把手教你Prometheus + Granafa实现mysql 性能监测部署
|
9月前
|
缓存 关系型数据库 MySQL
Debian 11 x64 安装 MySQL 8.0.33
本文提供了一个逐步指南,介绍了如何在 Debian 11 x64 上下载和安装 MySQL 8.0.33。此外,还提供了允许远程访问的说明。
849 1
Debian 11 x64 安装 MySQL 8.0.33
|
SQL 关系型数据库 MySQL
MySql字符串拆分实现split功能(字段分割转列、转行)
MySql字符串拆分实现split功能(字段分割转列、转行)
MySql字符串拆分实现split功能(字段分割转列、转行)
|
SQL 缓存 关系型数据库
MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
|
SQL 关系型数据库 MySQL
C语言连接并实现对MySQL的增删改查
C语言访问数据库并不如Java、Python那般容易。本文介绍C语言连接并实现对MySQL的增删改查的方法。
430 0
|
canal 关系型数据库 MySQL
基于 Docker 结合 Canal 实现 MySQL 实时增量数据传输
基于 Docker 结合 Canal 实现 MySQL 实时增量数据传输
基于 Docker 结合 Canal 实现 MySQL 实时增量数据传输
|
SQL 前端开发 关系型数据库
mysql实现一次将多条不同sql查询结果并封装到一个结果集
最近遇到一个统计查询需求,要求一次性查询多个统计信息,其中两个查询信息不在一个表中,也没有业务关联,表中也没有做连接处理。不考虑产品设计是否合理,完全是实际需求如此,需要一次性查询出来返回给前端进行展示,对于这种“非常规”的统计查询平常肯定会遇见,感觉有点代表性,所以简单记录一下。希望对有相同需求的同学可以作为参考。
mysql实现一次将多条不同sql查询结果并封装到一个结果集
|
SQL 关系型数据库 MySQL
mysql实现统计同一字段不同状态的总数量之case when
直接进入主题,简单说下case when的语法.
|
SQL 关系型数据库 MySQL
脚本实现:从 HIVE 中导入数据到 MYSQL
脚本实现:从 HIVE 中导入数据到 MYSQL
|
Ubuntu 关系型数据库 MySQL
Linux:Ubuntu安装jdk、tomcat、mysql,以及实现Tomcat开机自启动
Linux:Ubuntu安装jdk、tomcat、mysql,以及实现Tomcat开机自启动
275 0
Linux:Ubuntu安装jdk、tomcat、mysql,以及实现Tomcat开机自启动