network

  IT博客 :: 首页 :: 联系 :: 聚合  :: 管理
  28 Posts :: 8 Stories :: 0 Comments :: 0 Trackbacks

一、资料参考与准备:

本文参考了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的原作

如以上内容有误或有不足之处,望朋友能给予意见或者建议!谢谢:)

posted on 2008-06-25 11:34 network 阅读(110) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。