前些天用vsftpd+mysql实现虚拟用户登录
把偶的菜鸟笔记和大家分享一下
有什么问题请指正
特别申明:本文不适合Linux老鸟们
HTML版本:
Debian+vsftpd+MySQL实现虚拟用户
(posted by guitarbug @ )
一需求
虚拟用户登录
由于之前配置成功了postfix+MySQL虚拟用户登录体会到了使用虚拟用户的好处和灵活性所以这次也考虑采用虚拟用户并且将FTP虚拟用户的信息也存储在MySQL中这样以后用PHP等写一些WEB GUI的管理程序统一管理用户还是蛮方便的
限制IP的匿名登录
开放匿名登录但是只允许特定的IP可以匿名登录
不同用户不同目录不同权限
听起来有点像绕口令吧举例来说有个用户分别是普通用户(normal)和管理员(admin)FTP有个目录分别是incoming和pub要实现如下权限设置:
代码:
incoming pubnormal 读/写 只读admin 读/写 读/写
通过FTP管理Web站点
服务器上还架设了Apache而网站管理员对Linux又不是很熟悉而且也不想开放一个帐号给网站管理员以免他登录到系统上去把系统搞的乱糟所以参考Internet上提供虚拟主机的流行做法就是通过FTP来管理网站所以需要提供一个可供网站管理员登录FTP进行网站管理的帐号
扩展功能
待定
二选择FTP服务器软件
Linux下架设FTP站点有很多优秀的FTP服务器软件可供选择例如WuFTPDPureFTPDProFTPD以及vsFTPD等等要想选择一个适合自己需求的FTP服务器软件也需要费点脑筋才行对于我来说选择 vsftpd(very secure FTP daemon)主要有以下两点原因:
选择原则一
有人说哪个FTPD是你最熟悉的就用哪个不过由于我之前没有在Linux下架设FTP站点的经验所以对我来说一切都是新的起点在vsftpd的官方主页上看到了Debian官方FTPRH官方FTP等都使用了vsftpd于是随波逐流吧这样看起来会有面子些~
选择原则二
第二点很大程度取决于vsftpd(very secure FTP daemon)的名字因为它是很安全的FTP软件嘛哈哈再说Debian官方等FTP都使用了vsftpd选择它应该没错的~
PS:FTP服务器软件的选择可以参考鸟哥的Linux私房菜中的简易vsftpd服务器架设一文
三实现
基于Debian GNU/Linux Sarge 和 vsftpd
需要的软件包
)vsftpd
very secure FTP daemon
)mysqlservermysqlclient
前者是MySQL数据库服务器用于存储虚拟用户信息后者提供一个命令行的MySQL Client 由于我之前配置postfix时已经安装过了MySQL所以我不必安装这个包了^_^
)libpammysql
vsftpd是通过PAM验证用户信息的这个包可以让PAM去读取MySQL完成验证
安装
以root登录Debian输入以下命令搞定~
代码:
#aptget install vsftpdlibpammysql
创建一个必要的本地用户
虽说是虚拟用户不过由于虚拟用户的信息存储在MySQL数据库中所以还是需要一个能够读取MySQL数据库的本地用户
)创建本地用户的家目录此目录也是FTP的家目录
代码:
#mkdir /home/ftp
)创建名为ftpguest的本地用户
代码:
#useradd ftpguest d /home/ftp
)修改FTP家目录的所有者和组
代码:
#chown ftpguestnogroup /home/ftp
配置MySQL数据库
)创建用于存储虚拟用户信息的数据库ftpvuser
代码:
#mysqladmin u root p create ftpvuser
)连接数据库
代码:
#mysql u root p
)创建用于存储虚拟用户信息的表users
代码:
mysql>use ftpvuser; mysql>CREATE TABLE users (username varchar() NOT NULL
password varchar() NOT NULL
PRIMARY KEY (username)) TYPE=MyISAM;
)让本地用户ftpguest能读取ftpvuser数据库的users表的内容
注:YourPassword用于设定ftpguest访问数据库的密码
代码:
mysql>grant select on ftpvuserusers to ftpguest@localhost identified
by YourPassword; mysql>flush privileges;
)建立虚拟用户
代码:
mysql>insert into users (usernamepassword) values (normal); mysql>insert into users (usernamepassword) values (admin); mysql>insert into users (usernamepassword) values (webmaster);
)完成MySQL的配置
代码:
mysql>quit;
配置vsftpd的PAM验证
)打开PAM配置文件
代码:
#nano /etc/pamd/vsftpd
)将以前的内容注释掉然后添加下面行内容
注:YourPassword就是刚才在前面设定的ftpguest访问数据库的密码
代码:
auth required pam_mysqlso user=ftpguest passwd=YourPassword host=localhost
db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=
account required pam_mysqlso user=ftpguest passwd=YourPassword host=localhost
db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=
配置vsftpd
)打开vsftpd的配置文件
代码:
#nano /etc/nf
注意:一旦修改了/etc/nf文件的内容
必须重启vsftpd才能使新的设置生效
方法是:
代码:
#/etc/initd/vsftpd stop#/etc/initd/vsftpd start
直接#/etc/init
d/vsftpd restart
好像不起作用?
)修改nf文件如下
代码:
#关闭匿名用户访问#anonymous_enable=YES#开启本地用户访问local_enable=YES #开启虚拟用户访问guest_enable=YESguest_username=ftpguest#将本地用户限制在自己的家目录这样可避免FTP用户访问到其他的系统目录chroot_local_user=YES
) OOPS: cap_set_proc
赶快登录FTP试一下吧不过为什么无法登录呢?服务器返回错误: OOPS: cap_set_proc
Google之这个错误似乎与SELinux有关解决办法是加载capability模块:
代码:
#modprobe capability
为了让Linux在启动时自动加载此模块把这个模块放到/etc/modules中即可
)限制IP的匿名登录
要想限制登录vsftpd的客户端的IP地址要用到一个叫TCP Wrappers的东东对于TCP Wrappers我的理解是如果在vsftpd中启用了TCP Wrappers的话每次客户端向vsftpd发起一个连接请求的时候vsftpd首先会把这个连接请求交给TCP Wrappers处理如果客户端的IP被TCP Wrappers放行的话才能继续与vsftpd继续会话否则直接就被拒绝服务了不知道对不对?
a修改/etc/nf
代码:
#启用TCP Wrapperstcp_wrappers=YES
b修改/etc/hostsdeny
拒绝所有向vsftpd发起连接请求的IP不过如果hostsdeny与hostsallow沖突的话以hostsallow优先处理这好像就是先deny所有然后在hostsallow开放特权呵呵
代码:
#拒绝所有连入vsftpd的IP先vsftpd: ALL
c修改/etc/hostsallow
在这里开放允许登录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: : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpdanonymous#允许vsftpd的虚拟用户以任何IP连接FTPvsftpd: ALL : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpdvirtual
d修改/etc/vsftpd/vsftpdanonymous
代码:
#mkdir /etc/vsftpd/#nano /etc/vsftpd/vsftpdanonymous#允许匿名登录anonymous_enable=YES
e修改/etc/vsftpd/vsftpdvirtual
代码:
#nano /etc/vsftpd/vsftpdvirtual#不允许匿名登录anonymous_enable=NO
)为不同的用户设置不同的访问权限
a激活单个用户配置功能增加以下配置行到vsftpd的配置文件:
代码:
#nano /etc/nf#指定不同用户配置文件的存放路径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=YESanon_upload_enable=YESanon_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的用户#wwwdata无法访问/var/www下的文件造成的把umask设置成甚至即可解决这个问题local_umask=
e为normaladmin用户设置对incomingpub目录不同的权限
阅读了一遍vsftpd man中关于权限的相关设置似乎没有单独设置每个目录权限的地方?后来想到是不是可以利用Linux文件系统的文件权限设置来达到此目的以前在Windows下利用IIS来架设站点时我就是利用NTFS权限设置来达到控制不同用户对目录的访问权限不过试了一下还是无法完美的实现以下的权限控制:
代码:
incoming pubnormal 读/写 只读admin 读/写 读/写
举例来说
可以通过把pub设置成只读来控制normal用户只读pub的权限
不过admin对pub也是只读了不过
还好
因为admin拥有修改目录属性的权限
如果admin用户想要通过FTP来完成管理pub目录的话
可以临时把pub目录修改成读/写属性
四小结
vsftpd的目标是完成一个简易而且安全性不低的FTPD功能嘛似乎还是有点不足特别是目录权限这方面的设置如果是对目录权限有比较复杂的需求的话可以考虑一下Proftpd
在测试的时候除了使用FTP Client工具以外最好再使用Sniffer类的软件作为辅助因为有时候FTP Client并不会完全把FTPD返回信息呈现在你面前而有时候这些信息对排除FTPD故障会有很大帮助的而一旦使用Sniffer类的软件所有的客户端与服务器端交互的信息都不会漏掉的
五参考
Manpage of VSFTPDCONF:
vsftp配置大全:
?tid=