vsftp全功略(转)

vsftp全功略(转)

一、资料参考与准备:
本文参考了vsftpd安装文档,vsftpd的EXAMPLE及引用网上众多网友的文章。
FTP (File Transfer Protocol)是文件传输协议的简称。主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)察看远程计算机有哪些文件, 然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。
Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器
   和其他很多的服务器程序一样,vsftpd 可以为 inetd 或者 xinetd 这两个超级服务器(个么就是服务器的服务器嘛!)启用(这种方式启动较慢,但是对于不频繁使用并且机器的内存紧张的情况还是有用的),也可以作为 standalone 的启用。这个 standalone 模式需要在配置文件中使用 listen=YES 。主配置文件只有一个 vsftpd.conf 。启用的命令行很简单
vsftpd [configuration-file]

vsftp.conf配置文件的风格基本都是 option=value 的模式。那么,我们看看有哪些值得我们试用的 options 。这些是 bool 值(YES 或者 NO):

options             解释                       默认值

allow_anon_ssl     当 ssl_enable 时,允不允许匿名用户使用 ssl 连接。    NO
anon_mkdir_write_enable    当 anonymous 可写目录时是否允许创建子目录    NO
anon_other_write_enable    是否允许 anonymous 进行除了 upload 和 mkdir 之外的 deletion 和 renaming 操作。    NO
anon_upload_enable    当允许 write_enable 时,是否允许 upload 。    NO
anon_world_readable_only    anonymous 是否可以下载全部可读文件。    YES
anonymous_enable    使用允许是用 anonymous 和 ftp 用户匿名登录。    YES
ascii_download_enable    允许使用 ASCII 方式下载    NO
ascii_upload_enable    允许使用 ASCII 方式上载    NO
async_abor_enable    某些 ftp client 使用的特性    NO
background    在 Listen 态,该选项决定是否在后台执行监听    NO
check_shell    在 vsftpd 是编译时支持 PAM 则该选项决定是否根据 /etc/shell 判断用户是否具有合法的 shell    YES
chmod_enable    给 local users 以 SITE CHMOD 权限,anonymous 不会收到影响(没有这个权限)    YES
chown_uploads    anonymous 上传文件是否 chown 为 chown_username 所设置用户    NO
chroot_list_enable    是否启用将 chroot_list_file 中用户限制仅在用户目录中    NO
chroot_local_user    是否将 local user 限制在用户目录中    NO
connect_from_port_20    是否用 20 端口传输数据    NO
deny_email_enable    使得使用 banned_email_file 中作为 anonymous 的用户无法登录    NO
dirlist_enable    是否取消 list 命令    NO
dirmessage_enable    是否列出目录消息,每个目录的 .message 可以被此处的 message_file 所设定的覆盖    NO
download_enable    是否允许下载    YES
dual_log_enable    是否在 /var/log/xferlog 和 /var/log/vsftpd.log 两处记录日志    NO
force_dot_files    是否使用 .. 和 . 文件    NO
force_anon_data_ssl    anonymous 是否数据通过 ssl 传送    NO
force_anon_logins_ssl    强制 anonymous 使用 ssl 登录    NO
force_local_data_ssl    local users 强制使用 ssl 传输数据    NO
force_local_logins_ssl    local users 强制使用 ssl 登录    NO
guest_enable    非匿名登录被映射成为 guest_username 对应用户    NO
hide_ids    将所有目录文件的属主都显示为 ftp 以掩盖 id    NO
listen    使用 standalone 模式    NO
listen_ipv6    使用 ipv6 的 standalone 模式    NO
local_enable    允许本地用户登录    NO
log_ftp_protocol    是否记录所有的 ftp 交互过程    NO
ls_recurse_enable    是否允许使用 ls -R    NO
no_anon_password    anonymous 用户是否不需要密码    NO
no_log_lock    log 文件是否加锁(排除其他进程的文件写)    NO
one_process_model    每次连接仅允许一个进程    NO
passwd_chroot_enable    将 chroot_local_user 中用户依照 /etc/passwd 中使用 ./ 技术指明的目录禁闭    NO
pasv_enable    开启 PASV 模式    YES
pasv_promiscuous    是否进行 PASV 安全检查,这主要和 FXP 使用的模式相关,我不懂    NO
port_enable    允许使用 PORT 命令获得传输端口    YES
port_promiscuous    是否进行 PORT 安全检查    NO
run_as_launching_user    以启用 vsftpd 的用户身份执行,这会使得需要 root 权限的某些功能不能完成    NO
secure_mail_list_enable    使得 anonymous 账户只能用 email_password_file 中密码登陆    NO
session_support    在会话期间只需要一次输入密码,仅在支持 PAM 的情况下有用    NO
setproctitle_enable    显示系统状态    NO
ssl_enable    支持使用 ssl 的连接,但是 vsftpd 必须连接到 Open SSL 库。    NO
ssl_sslv2    支持 SSL v2 协议    NO
ssl_sslv3    支持 SSL v3 协议    NO
ssl_tslv1    支持 TLS v1 协议    YES
syslog_enable    原先记录到 /var/log/vsftpd.log 转为系统日志。    NO
tcp_wrappers    如果编译时支持 tcp_wrappers ,则可利用基于 IP 地址的控制来处理连接    NO
text_userdb_names    使用用户名组名而不是 UID 和 GID    NO
tilde_user_enable    支持 ~name 方式访问用户主目录    NO
use_localtime    使用本地时间(默认为 GTM)    NO
use_sendfile    使用系统 sendfile() 调用    YES
userlist_deny    当 user_list_enable 时,仅仅允许在 userlist_file 文件中指明用户方可登陆    YES
userlist_enable    如果启用将使 userlist_file 内用户不能登陆    NO
virtual_use_local_privs    虚拟用户是否享用 local user 相同的权利(默认是 anonymous 的权利)    NO
write_enable    影响 STOR、DELE、RNFR、RNTO、MKD、RMD、APPE、SITE    NO
xferlog_enable    是否记录日志到 vsftpd_log_file 指定的文件中(默认为 /var/log/vsftpd.log)    NO
xferlog_std_format    使用标准的 xferlog 格式记录    NO

下表是一些数值形式的变量:
options    说明    默认值
accept_timeout    建立 session 超时,单位 s    60
anon_max_rate    匿名用户下载限制,单位 bytes/s    0
anon_umask    匿名用户上传的 umask    077
connect_timeout    连接超时,单位 s    60
data_connection_timeout    传输数据超时,单位 s    300
file_open_mode    上文件的 umask    0666
ftp_data_port    当 connect_from_port_20 激活时使用的端口号    20
idle_session_timeout    idle 超时,单位 s    300
litsten_port    监听端口    21
local_max_rate    本地用户最大传输限额,单位 bytes/s    0
local_umask    本地用户上传 umask    077
max_clients    最大连接用户数    0
max_per_ip    每个 ip 连接的最大数目    0
pasv_max_port    使用 PASV 时使用的 port 号的最大值    0
pasv_min_port    使用 PASV 时使用的 port 号的最小值    0
trans_trunk_size    每段数据块大小(最好根据网络特性来设置)    0

字符串类型的选项
options    说明    默认值
anon_root    anonymous 的用户目录位置    (none)
banned_email_file         /etc/vsftpd.banned_emails
banner_file    连接时显示出的文字,如果设置将会覆盖 ftpd_banner 设置的字符串    (none)
chown_username         root
chroot_list_file         /etc/vsftpd.chroot_list
cmds_allowed    值为允许使用的 ftp 命令,用逗号分割。一般可用的有 USER,PASS,QUIT,其余的可以用该命令添加    (none)
deny_file    该命令将会过滤掉匹配上的所有文件名,可使用正则表达式    (none)
dsa_cert_file    使用 SSL 连接时的证书    (none-use rsa)
dsa_private_key_file    SSL 连接时 DSA 的 private key    (none)
email_password_file         /etc/vsftpd.email_passwords
ftp_username         ftp
ftpd_banner         (none)
guest_username         ftp
hide_file    匹配上的文件将被隐藏    (none)
listen_address    Listen 模式下监听的地址,应写一个合法的 IP 地址    (none)
listen_address6    同上但是为 IP v6    (none)
local_root    本地用户登陆后自动转到该目录下    (none)
message_file         .message
non-priv_user    不需特权时执行任务的用户名    nobody
pam_service_name    如其意    vsftpd
pasv_address    使用 PASV 模式下传输使用的 IP 地址    (none)
rsa_cert_file    使用 SSL 的 RSA 的证书    /usr/share/ssl/certs/vsftpd.pem
rsa_private_key_file    使用 SSL 的 RSA 的 private key 位置    (none)
secure_chroot_dir    多为一个空目录,用户没有写权限    /var/run/vsftpd
ssl_ciphers    SSL 使用的加密算法    DES-CBC3-SHA
user_config_dir    允许对每个用户使用独立的配置文件,配置文件所放的目录为此变量声明,该目录中任意文件名和对应的用户名相同    (none)
user_sub_token    虚拟用户名,没看明白怎么用 -,-    (none)
userlist_file         /etc/vsftpd.user_list
vsftpd_log_file         /var/log/vsftpd.log
xferlog_file         /var/log/xferlog

FTP 数字代码的意义
110 重新启动标记应答。
120 服务在多久时间内ready。
125 数据链路埠开启,准备传送。
150 文件状态正常,开启数据连接端口。
200 命令执行成功。
202 命令执行失败。
211 系统状态或是系统求助响应。
212 目录的状态。
213 文件的状态。
214 求助的讯息。
215 名称系统类型。
220 新的联机服务ready。
221 服务的控制连接埠关闭,可以注销。
225 数据连结开启,但无传输动作。
226 关闭数据连接端口,请求的文件操作成功。
227 进入passive mode。
230 使用者登入。
250 请求的文件操作完成。
257 显示目前的路径名称。
331 用户名称正确,需要密码。
332 登入时需要账号信息。
350 请求的操作需要进一部的命令。
421 无法提供服务,关闭控制连结。
425 无法开启数据链路。
426 关闭联机,终止传输。
450 请求的操作未执行。
451 命令终止:有本地的错误。
452 未执行命令:磁盘空间不足。
500 格式错误,无法识别命令。
501 参数语法错误。
502 命令执行失败。
503 命令顺序错误。
504 命令所接的参数不正确。
530 未登入。
532 储存文件需要账户登入。
550 未执行请求的操作。
551 请求的命令终止,类型未知。
552 请求的文件终止,储存位溢出。
553 未执行请求的的命令,名称不正确。

二、安装与配置


vsftpd安装篇:


环境:
匿名及本地用户:REDhat9+vsftpd1.1.3(或vftpd2.0.1)。
虚拟用户:vsftpd1.1.3+mysql3.23.54+pam_mysql0.5
不适用于vsftpd2.0.1+mysql4+pam0.5。[/b]


1、rpm安装:

代码:

[root@Linux_win vsftpd]#rpm -ivh vsftpd-1.1.3-8.i386.rpm



2、tar.gz的安装
解压后查看README和INSTALL文档

安装前的条件:

进入vsftpd目录
编辑 "builddefs.h"文件,里面定义了pam功能,tcp_wrappers功能,ssl功能,根据需要定义pam或tcpwrapper功能,以消ssl功能

然后键入 "make" .将编译出相应的二进制文件,你可以用以下命令查看
[chris@localhost vsftpd]$ ls -l vsftpd
-rwxrwxr-x 1 root root 61748 Sep 27 00:26 vsftpd

a、增加“nobody”用户。在系统中添加此用户,如果用户已经存在,useradd命令有相应提示。

代码:

[root@Linux_win vsftpd]# useradd nobody

useradd: user nobody exists

b、建立“/usr/share/empty”目录。在系统中此目录,如果目录已经存在,mkdir命令有相应提示。

代码:

[root@hpe45 root]# mkdir /usr/share/empty/


mkdir: cannot create directory '/usr/share/empty': File exists

c、匿名服务帐号:“ftp”用户和一个有效的匿名目录(默认为/var/ftp)。

代码:

[root@Linux_win vsftpd]# mkdir /var/ftp/
[root@Linux_win vsftpd]# useradd -d /var/ftp ftp



d、更改目录的所有者为root,并让ftp用户对自己的主目录不可写

代码:

[root@Linux_win vsftpd]# chown root.root /var/ftp
[root@Linux_win vsftpd]# chmod og-w /var/ftp


编译VSFTPD

代码:

[root@Linux_win vsftpd]# tar zxvf vsftpd-1.2.0.tar.gz
[root@Linux_win vsftpd]# cd vsftpd-1.2.0
[root@Linux_win vsftpd]# make


安装编译好的VSFTPD

执行“make,make install”将编译好的二进制文件、手册等复制到相应目录。可能需要手动执行以下复制:

代码:

[root@Linux_win vsftpd]# cp vsftpd /usr/local/sbin/vsftpd
[root@Linux_win vsftpd]# cp vsftpd.conf.5 /usr/local/share/man/man5
[root@Linux_win vsftpd]# cp vsftpd.8 /usr/local/share/man/man8


如果不存在man5和man8目录,要先建立这两个目录

代码:

[root@Linux_win vsftpd]#mkdir /usr/local/share/man/man5
[root@Linux_win vsftpd]#mkdir /usr/local/share/man/man8


make不会自己copy配置文件,如果make install有错,则必须手工更改
[root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf /etc

为本地用户设置PAM
如果允许本地用户登录VSFTPD,执行以下操作:

代码:

[root@Linux_win vsftpd]# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd


3、pam_mysql安装
如果使用mysql的二进制包,那么必须加个开始包,且要修改Makefile文件,指定mysql的lib位置。

代码:

[root@Linux_win vsftpd]# tar xvzf pam_mysql-0.5.tar.gz
[root@Linux_win vsftpd]# cd pam_mysql
[root@Linux_win vsftpd]# make
[root@Linux_win vsftpd]# cp pam_mysql.so /lib/security



4、mysql安装。请查看其它文档


vsftpd启动篇

vsftpd 有两种运行方式,一种是standalone 一种是 via an inetd (或者 inetd or xinetd).
1、如何启动
1)系统自带的

代码:

[root@Linux_win software]# service vsftpd restart


2)源包安装:
[root@Linux_win software]# /安装路径/vsftpd &

代码:

[root@Linux_win vsftpd]# /sbin/service xinetd restart  
或 
[root@Linux_win vsftpd]# /usr/local/sbin/vsftpd &


2、standlone启动
具体的运行方式由参数listen决定。当listen参数值为YES时,VSFTPD单独运行,我们可以使用脚本/etc/rc.d/init.d/vsftpd来启动、关闭以及重启VSFTPD。命令如下:
  

代码:

/etc/rc.d/init.d/vsftpd start|stop|restart


3、xinetd启动,首先要将vsftpd.conf配置文件中的listen参数值改为NO。
其次,生成一个/etc/xinetd.d/vsftpd文件

代码:

[root@Linux_win vsftpd]#vi /etc/vsftpd/vsftpd.conf或vi /etc/vsftp.conf
listen=NO

 

码:

[root@Linux_win vsftpd]vi /etc/xinetd.d/vsftpd
内容如下:
service vsftpd
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
port = 21
log_on_success += PID HOST DURATION
log_on_failure += HOST
}



通过修改disable值为no或yes,并重新启动xinetd,从而启动或停止VSFTPD。

配置安全匿名服务器

所要做的就是用vi修改vsftpd.conf文件

代码:

[root@Linux_win vsftpd]#vi /etc/vsftpd.conf或/etc/vsftpd/vsftpd.conf


修改后的vsftpd.conf文件看附件:

引用:

#使用单独模式,并指定监听的IP地址
listen_address=ip address

#只允许匿名访问,不允许本地用户访问
anonymous_enable=YES
local_enable=NO

#取消写权限
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

#启用详细的日志记录格式,设定记录传输日志的文件名。默认值为/var/log/vsftpd.log。
xferlog_enable=YES
xferlog_file=/var/log/vsftp.log

#对连接进行控制,还有超时时间,那就根据具体情况再说了。
connect_from_port_20=YES
pasv_min_port=50000
pasv_max_port=60000

#控制FTP最大并发数,限定每个IP地址的并发数。
max_clients=numerical value
max_per_ip=numerical value

#限定下载速度
anon_max_rate=80000


#使用ftpd_banner取代VSFTPD默认的欢迎词,免得泄漏相关信息
ftpd_banner=Welcome to xuanfei’s FTP Server

#只让匿名用户浏览可阅读的文件,不可以浏览整个系统
anon_world_readable_only=YES

#隐藏文件的所有者和组信息,匿名用户看到的文件的所有者和组全变为ftp
hide_ids=YES

 

代码:

附:vsftpd.conf
[root@Linux_win vsftpd]# cat vsftpd.conf
listen=YES
listen_address=192.168.1.2

anonymous_enable=YES
local_enable=NO

write_enable=NO
anon_root=/home
anon_upload_enable=NO
anon_other_write_enable=NO
anon_mkdir_write_enable=NO
anon_world_readable_only=YES

#dirmessage_enable=YES
ftpd_banner=welcome to xuanfei’s FTP server

xferlog_enable=YES
#xferlog_file=/var/log/vsftpd.log

connect_from_port_20=YES
#pasv_mix_port=50000
#pasv_max_port=60000
#xferlog_std_format=YES

max_clients=10
max_per_ip=10

hide_ids=YES

#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
#chroot_local_user=NO
#pam_service_name=/etc/pam.d/vsftpd

#guest_enable=YES
#guest_username=vsftpdvirtual
#virtual_use_local_privs=NO
#user_config_dir=/etc/vsftpd/vsftpd_user_conf




配置可上传匿名服务器
[root@Linux_win vsftpd]#vi /etc/vsftpd/vsftpd.conf
修改文件,改后如下

代码:

[root@Linux_win ftp]# cat /etc/vsftpd/vsftpd.conf
listen=YES
listen_address=192.168.1.2

anonymous_enable=YES
local_enable=NO

write_enable=YES
#anon_root=
anon_upload_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
#anon_world_readable_only=YES


#dirmessage_enable=YES
ftpd_banner=welcome to xuanfei’s FTP server

xferlog_enable=YES
#xferlog_file=/var/log/vsftpd.log

connect_from_port_20=YES
#pasv_mix_port=50000
#pasv_max_port=60000
#xferlog_std_format=YES

max_clients=10
max_per_ip=10

hide_ids=YES

#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
#chroot_local_user=NO
#pam_service_name=/etc/pam.d/vsftpd

#guest_enable=YES
#guest_username=vsftpdvirtual
#virtual_use_local_privs=NO
#user_config_dir=/etc/vsftpd/vsftpd_user_conf

 

代码:

[root@Linux_win ftp]# mkidr /var/ftp/upload
[root@Linux_win ftp]# chmod o+w /var/ftp/upload



anon_root参数指定的目录或默认的/var/ftp主目录,ftp匿名用户不可有写权限,否则会出错。
办法是在/var/ftp下建立一个新目录,使得该目录对ftp匿名用户可写。才能上传。
或不用匿名上传,而使用本地用户或虚拟用户 。


关于匿名上传下载的实现;

关于匿名上传,其实也比较简单,首先我们要修改一下vsftpd.conf ,此文件位于 /etc/目录下,可能是/etc/vsftpd.conf,也可能是/etc/vsftpd/vsftpd.conf文件。以您的系统环境为准;

首先:我们要改一下vsftpd.conf,确保有以下几行;

anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_umask=022

 

其次:在ftp用户家目录的下建一个文件夹,并修改其权限为完全开放;

ftp用户的家目录在哪?我们前面已经说了,要通过/etc/passwd来查看;也可以通过finger ftp来查看;

# finger ftp
Login: ftp Name: FTP User
Directory: /var/ftp Shell: /sbin/nologin

这 说明ftp用户的家目录在/var/ftp ,我们要在这个目录下建一个目录,然后把他的权限设置为任何用户可读可写可执行就行了;一般的情况下,在发行版中,有一个/var/ftp/pub的目 录,如果没有,您也可以自己建一个;把配置文件改好后,只要把/var/ftp下的任何一个目录的权限打开,都可以用来匿名上传和下载;

比如您想让匿名用户上传和下载都在/var/ftp/pub,就可以把/var/ftp/pub的权限打开,如果没有这个目录,您要自己建一个;

[root@localhost ~]# mkdir /var/ftp/pub
[root@localhost ~]# chmod 777 /var/ftp/pub

这样上传的时候传到pub目录就OK了

配置本地用户
修改vsftpd.conf

代码:


[root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd.conf
listen=YES
listen_address=192.168.1.2

anonymous_enable=NO
local_enable=YES
#local_root=

write_enable=YES
#anon_root=
#anon_upload_enable=YES
#anon_other_write_enable=YES
#anon_mkdir_write_enable=YES
#anon_world_readable_only=YES
#anon_umask=777

#dirmessage_enable=YES
ftpd_banner=welcome to xuanfei’s FTP server

xferlog_enable=YES
#xferlog_file=/var/log/vsftpd.log

connect_from_port_20=YES
#pasv_mix_port=50000
#pasv_max_port=60000
#xferlog_std_format=YES

max_clients=10
max_per_ip=10

hide_ids=YES

#limit all users in it's owner dir
#chroot_local_user=YES

#or limit some
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

#use ownwer conf file
user_config_dir=/etc/vsftpd/vsftpd_user_conf

pam_service_name=/etc/pam.d/vsftpd

#guest_enable=YES
#guest_username=vsftpdvirtual
#virtual_use_local_privs=NO



由于上面了用户列表,因此须建立chroot_list文件,

代码:

[root@Linux_win vsftpd]# touch /etc/vsftpd/chroot_list


并加入以下内容,查看chroot_list文件内容,结果如下

代码:

[root@Linux_win vsftpd]# cat /etc/vsftpd/chroot_list
sam
gem


配置文件中指定了用户配置文件,因此建立此文件

代码:

[root@Linux_win vsftpd]# mkdir /etc/vsftpd/vsftpd_user_conf


并根据用户名建立文件

代码:

[root@Linux_win vsftpd]# touch sam
[root@Linux_win vsftpd]# touch gem
[root@Linux_win vsftpd]# ls -l /etc/vsftpd/vsftpd_user_conf
总用量 8
-rw-r--r--    1 root     root           21  1月  8 00:25 sam
-rw-r--r--    1 root     root           25  1月  8 00:17 gem



并在sam,gem文件加加入以下内容,可用vi编辑并保存,下面的虚拟用户也一样,不过只须更改文件内容就可以了

代码:

[root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/sam
local_root=/home/sam

 

代码:

[root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/gem
local_root=/home/gem




本地用户验证要用pam文件,内容是默认的。

代码:

[root@Linux_win vsftpd]# cat /etc/pam.d/vsftpd
#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers

onerr=succeed
auth       required     pam_stack.so service=system-auth
auth       required     pam_shells.so
account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth


关于添加本地用户及打开读写权限示例;

FTP 用户一般是不能登录系统的,这也是为了安全。在系统中,没有权限登录系统的用户一般也被称之为虚拟用户;虚拟用户也是要写进 /etc/passwd中;这只是一种虚拟用户的方法,但说实在的并不是真正的虚拟用户,只是把他登录SHELL的权限去掉了,所以他没有能力登录系统;

如果我们想把beinan这个用户目录定位在/opt/beinan这个目录中,并且不能登录系统;我们应该如下操作

# adduser -d /opt/beinan -g ftp -s /sbin/nologin beinan

# passwd beinan
Changing password for user beinan.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

其实这还是不够的,还要改一下配置文件vsftpd.conf ,以确保本地虚拟用户能有读写权限;

local_enable=YES
write_enable=YES
local_umask=022

 





配置虚拟用户(mysql)

  VSFTPD的本地用户本身是系统的用户,除了可以登录FTP服务器外,还可以登录系统使用其他系统资源,而

VSFTPD的虚拟用户则是FTP服务的专用用户,虚拟用户只能访问FTP服务器资源。对于只需要通过FTP对系统有读

写权限,而不需要其他系统资源的用户或情况来说,采用虚拟用户方式是很适合的。

  VSFTPD的虚拟用户采用单独的用户名/口令保存方式,与系统账号(passwd/shadow)分离,这大大增强了

系统的安全性。VSFTPD可以采用数据库文件来保存用户/口令,如hash;也可以将用户/口令保存在数据库服务器

中,如MySQL等。VSFTPD验证虚拟用户,则采用PAM方式。由于虚拟用户的用户名/口令被单独保存,因此在验证

时,VSFTPD需要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正

如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。

  配置虚拟用户分为几部分:guest用户的创建、用户/口令的保存、PAM认证配置、vsftpd.conf文件设置等

。在后面的例子中,假定存在虚拟用户win和wingger.



1、在系统中添加vsftpdvirtual用户,作为虚拟用户在系统中的代表。

代码:

[root@Linux_win vsftpd]# useradd vsftpdvirtual


  当虚拟用户登录后,所在的位置为vsftpdvirtual的自家目录/home/vsftpdvirtual。

2、配置文件vsftpd.conf: 加入以下内容
guest_enable=YES
guest_username=vsftpdvirtual
virtual_use_local_privs=YES|NO

3、虚拟用户的权限配置。
virtual_use_local_privs参数,
当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。所有虚拟用户的权限使用local参数。
当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,所有虚拟用户的权限使用anon参数。
这两者种做法相比,后者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)。

由于本人的vsftpd为1.1.3,只好用virtual_use_local_privs=NO了:
因此匿名用户的设置即是虚拟用户的设置,在改参数权限时,同时也要修改目录权限
如:让用户不能浏览目录,但仍可以对文件操作且虚拟用户目录的权限改为只能由vsftpdvirtual操作:

代码:

[root@Linux_win vsftpd]# chown vsftpdvirtual.vsftpdvirtual /home/vsftpdvirtual
[root@Linux_win vsftpd]# chmod 700 /home/vsftpdvirtual


由于这些设置对匿名用户生效。最好是禁止匿名用户登录。


在VSFTPD-1.2.0以上版本,当virtual_use_local_privs=YES时,只需write_enable=YES,虚拟用户就可以就拥

有写权限。应该与本地用户使用相同,有兴趣的可以去验证。

如果不同用户使用不同的目录,须加入权限

代码:

chown vsftpdvirtual.vsftpdvirtual /home/win
chown vsftpdvirtual.vsftpdvirtual /home/wingger


4、用MySQL保存虚拟用户

  1、虚拟用户的用户名/口令的保存。这部分在MySQL数据库中完成。
首先,创建数据库vsftpdvirtual以及表users,并插入虚拟用户win、wingger。执行以下命令:

代码:

[root@Linux_win vsftpd]# #mysql -uroot -p
mysql>create database vsftpdvirtual;
mysql>use vsftpdvirtual;
mysql>create table users(name char(16) binary,passwd char(16) binary);
mysql>insert into users (name,passwd) values ('win',password('123456'));
mysql>insert into users (name,passwd) values ('wingger',password('123456'));
mysql>quit



然后,授权vsftpdvirtual只能读vsftpdvirtual数据库的users表。执行以下命令:

代码:

[root@Linux_win vsftpd]# mysql -u root mysql -p
mysql>grant select on vsftpdvirtual.users to vsftpdvirtual@localhost identified by '123456';
mysql>quit



验证刚才的操作是否成功可以执行下面命令:

代码:

[root@Linux_win vsftpd]# mysql -u vsftpdvirtual -p123456 ftpdvirtual
mysql>select * from users;


如果成功,将会列出wing、wingger和加密后的密码。
如下所示:

引用:

mysql> select * from users;
+---------+------------------+
| name | passwd |
+---------+------------------+
| win | 23932fe477657768 |
| wingger | 23932fe477657768 |
+---------+------------------+
2 rows in set (0.00 sec)




  2、设置PAM认证。这里我们要用到一个利用mysql进行pam验证的开源项目(http://sourceforge.net/proj

ects/pam-mysql/)。首先从网站下载它的程序包pam_myql-0.5.tar.gz。在编译安装之前,要确保mysql-devel

的RPM包已经安装在你的机器上,如果没有请从RHL安装光盘中安装该包。然后,执行以下命令:

代码:

[root@Linux_win vsftpd]# tar xvzf pam_mysql-0.5.tar.gz
[root@Linux_win vsftpd]# cd pam_mysql
[root@Linux_win vsftpd]# make
[root@Linux_win vsftpd]# cp pam_mysql.so /bli/security



接下来,我们要设置vsftpd的PAM验证文件。打开/etc/pam.d/vsftpd文件,加入以下内容:

引用:

  auth required pam_mysql.so user=vsftpdvirtual passwd=123456 host=localhost db=vsftpdvirtual

table=users usercolumn=name passwdcolumn=passwd crypt=2
  account required pam_mysql.so user=vsftpdvirtual passwd=123456 host=localhost

db=vsftpdvirtual table=users usercolumn=name passwdcolumn=passwd crypt=2



具体可查看vsftpd源包里的EXAMPLE中的例子。



附:虚拟用户文档
1、vsftpd.conf配置文件

代码:


[root@Linux_win vsftpd]# cat vsftpd.conf
listen=YES
listen_address=192.168.1.2

anonymous_enable=NO
local_enable=YES

write_enable=YES
#anon_root=
anon_upload_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
#anon_world_readable_only=YES
#anon_umask=777

#dirmessage_enable=YES
ftpd_banner=welcome to xuanfei’s FTP server

xferlog_enable=YES
#xferlog_file=/var/log/vsftpd.log

connect_from_port_20=YES
#pasv_mix_port=50000
#pasv_max_port=60000
#xferlog_std_format=YES

max_clients=10
max_per_ip=10

hide_ids=YES

#limit all users in it's owner dir
#chroot_local_user=YES

#or limit some
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

#use ownwer conf file
user_config_dir=/etc/vsftpd/vsftpd_user_conf

pam_service_name=/etc/pam.d/vsftpd

guest_enable=YES
guest_username=vsftpdvirtual
#virtual_use_local_privs=NO

 

代码:

2、[root@Linux_win vsftpd]# cat /etc/pam.d/vsftpd
#%PAM-1.0
#auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers

onerr=succeed
#auth       required    pam_stack.so service=system-auth
#auth       required    pam_shells.so
#account    required    pam_stack.so service=system-auth
#session    required    pam_stack.so service=system-auth
auth       required     /lib/security/pam_mysql.so user=vsftpdvirtual    passwd=123456

host=localhost   db=vsftpdvirtual table=users  usercolumn=name  passwdcolumn=passwd  crypt=2
account    required     /lib/security/pam_mysql.so user=vsftpdvirtual     passwd=123456  

host=localhost   db=vsftpdvirtual table=users  usercolumn=name  passwdcolumn=passwd  crypt=2

 

代码:

3、[root@Linux_win vsftpd]# cat /etc/vsftpd/chroot_list
win
wingger

 

代码:

4、[root@Linux_win vsftpd]# ls -l /etc/vsftpd/vsftpd_user_conf
总用量 8
-rw-r--r--    1 root     root           21  1月  8 00:25 win
-rw-r--r--    1 root     root           25  1月  8 00:17 wingger

 

代码:

5、[root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/win
local_root=/home/win
[root@Linux_win vsftpd]# cat /etc/vsftpd/vsftpd_user_conf/wingger
local_root=/home/wingger

 

代码:

6、drwx------    6 vsftpdvirtual vsftpdvirtual    4096  1月  8 00:16 vsftpdvirtual
drwxrwxrwx    5 vsftpdvirtual vsftpdvirtual     4096  1月  8 01:47 win
drwxrwxrwx    3 vsftpdvirtual vsftpdvirtual     4096  1月  8 20:19 wingger



7、版本:(vsFTPd 1.1.3)、pam_mysql-0.5.tar.gz、mysql3.23.54

8、[root@Linux_win vsftpd]# mysql -u vsftpdvirtual -pchenwy vsftpdvirtual

mysql> select * from users;
+---------+------------------+
| name | passwd |
+---------+------------------+
| win | 23932fe477657768 |
| wingger | 23932fe477657768 |
+---------+------------------+
2 rows in set (0.00 sec)

 

下 面我们使用quota为ftpuser加入磁盘限额,避免恶意用户用垃圾数据塞满你的硬盘. 假设/var/ftp在根分区/(/dev/hda5)中,则将/etc/fstab中根分区的记录的第4个字段改成defaults, usrquota,这样这条记录看起来类似这样:

LABEL=/ / ext3 defaults,usrquota 1 1

接着重启系统后输入下列命令:
quotacheck -acu #检查启用了配额的文件系统,并为每个文件系统建立一个当前磁盘用来的表
quotacheck -avu #生成每个启用了配额的文件系统的当前磁盘用量表
edquota ftpuser #为用户ftpuser设置磁盘配额
这时系统会在默认文本编辑器(vi)中打开配额文件,显示类似这样:
Disk quotas for user ftpuser (uid 501):
Filesystem blocks soft hard inodes soft hard
/dev/hda5 0 0 0 0 0 0
第 一列是启用了配额的文件系统的名称。第二列显示了用户当前使用的块数。随后的两列用来设置用户在该文件系统上的软硬块限度。inodes 列显示了用户当前使用的i节点数量。最后两列用来设置用户在该文件系统上的软硬i节点限度.硬限是用户或组群可以使用的磁盘空间的绝对最大值。达到了该限 度后,磁盘空间就不能再被用户或组群使用了。软限定义可被使用的最大磁盘空间量。和硬限不同的是,软限可以在一段时期内被超过。这段时期被称为过渡期 (grace period)。过渡期可以用秒钟、分钟、小时、天数、周数、或月数表示。如果以上值中的任何一个被设置为 0,那个限度就不会被设置.按你的需要修改后存盘推出. 要校验用户的配额是否被设置,使用以下命令:

quota testuser
接着使用edquota -t来设置过渡期(grace period) 和另一个 edquota 命令相似,这个命令也会在文本编辑器中打开当前的文件系统配额:
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/hda5 7days 7days
按你的需要修改后存盘退出
这样我们就成功的为ftpuser增添了磁盘配额.而一个比较完整的FTP站点也配置完成了。

 三、启用与测试

也可以用下面的方法来启动vsFTPd

# /etc/init.d/vsftpd start
重新启动vsFTPd用下面的命令;

#/etc/init.d/vsftpd restart
关掉vsFTPd服务器,应该用下面的命令;

# /etc/init.d/vsftpd stop

您要设置一下防火墙,可以把防火墙关掉,或者在自定义中让ftp “通过”防火墙和SELINUX,进行设置命令:# system-config-securitylevel

 测试:无论是LINUX环境还是windows环境都可以用浏览器里边网址前边的http:换成ftp即可以或者都可用FTP命令工具来测试。

 

感谢wingger和demonstrate的原作

你可能感兴趣的:(linux,mysql,ssl,user,FTP服务器,File)