1. 匿名及本地用户共同参数
write_enable=yes/no //是否允许全局可写
download_enable=yes/no //是否允许所有用户可以下载
dirlist_enable=yes/no //是否允许所有用户可以浏览(列出文件列表)
ftpd_banner=欢迎语字符串
banner_file=文件
dirmessage_enable=yes/no
message_file=文件
参数ftpd_banner设置的欢迎语字符串将在登录时看到,如果想做出多行欢迎语,就要把内容单独存为banner_file参数指定的文件,应用中这两个参数二选一即可。dirmessage_enable和message_file参数是进入某个目录后显示的欢迎信息,用法与前两个参数一样
2. 本地用户管理
2.1 本地用户常规配置参数
local_root=/path //本地用户登陆服务器后直接进入的目录
local_umask=八进制数 //本地用户上传档案权限的 umask值
local_max_rate=数字 //本地用户传输速率单位为 bps
chmod_enable=yes/no // 是否允许本地用户改变ftp 服务器上档案的权限
我们知道使用本地用户登录ftp后进入的是用户的主目录,locla_root这个参数允许我们登录服务器后直接进入其它的目录。此功能结合Apache的userdir模块来实现网站内容更新上传是非常方便的。Linux系统中的任何文件都是有权限值的,上传的文件也不例外,这个默认的权限值就由local_umask参数指定。其计算方法为:
默认建立文件的权限+local_umask =0666
默认建立目录的权限+local_umask =0777
由此我们可以看出,上传的文件无论如何都不可能有执行权限的。这也是vsftp安全性的体现啊!
local_max_rate参数限定了数据传输速率,包括上传和下载。chmod_enable参数限制用户是否可以改变档案权限(使用chmod, site命令)。
我们可能想让为每个用户进行单独的配置,或者想配置个别用户的权限。这样就得为每个本地用户配置一个文件。这些配置文件必须是在同一个目录下,所以我们可以设置本地用户单独配置文件所在的目录:
user_config_dir=/path //用户单独配置文件所在目录
我们在配置文件中加入以下几行:
local_umask=077
local_max_rate=20000
user_config_dir=/etc/vsftpd/vsftpd_user_dir
给予用户上传权限:
write_enable=yes
新建一个普通用户ioo,再新建一个目录/etc/vsftpd/vsftpd_user_dir,其下建一个文件ioo,里面加入下面几行:
local_root=/var/www/html
local_umask=022
local_max_rate=50000
把/var/www/html的所有者改为ioo:
chown ioo:ioo /var/www/html
测试之后我们发现,使用ioo用户登录后就直接进入var/www/html了,上传的文件(夹)权限为644(755),传输速率为50k,自定义的设置覆盖了主配置文件中的设置。
2.2 本地用户登录限制参数
在我们的服务器上本来就有很多的本地用户,这些本地用户应该都是可以登陆 ftp 服务器的。但是 ftp 服务是以明文传输的,如果允许管理员登陆的话,这种机制显然不好。又或者我们想让一些本地用户可以登陆,或者一些不能登陆我们的 ftp 服务器,这样我们可以怎么设置呢?
Vsftpd 提供了 userlist 功能。它使用一个文件来保存一些用户名,然后根据配置来决定是文件中的用户可以登录还是文件中没有列出的用户可以登陆 ftp 服务器,这样就对本地用户的登陆起到了限制作用。其配置参数有如下几个:
userlist_enable=yes/no //是否启用 userlist 功能模块
userlist_deny=yes/no //是否拒绝 userlist 文件中用户登陆 ftp 服务
userlist_file=/path/to/file //指定的 userlist 文件名
当第1个参数值为yes时,第2、3行才起作用。我们将配置文件加上如下3行:
userlist_enable=yes
userlist_deny=yes
userlist_file=/etc/vsftpd/vsftpd.userlist
然后再新建一个文件/etc/vsftpd/vsftpd.userlist,在里面加入用户名,每个用户名一行,比如我这里加入用户root,再登录服务时出现以下信息:
# ftp 127.0.0.1
Connected to 127.0.0.1.
……
Name (127.0.0.1:root): root
530 Permission denied.
Login failed.
root用户已经不能登录了,在输入密码之前就被拒绝,但其它用户还可以登录的。如果把userlist_deny的值改为no,则只有文件中的用户才可以登录服务器。
2.3 本地用户的根目录参数
大家再来看下面这一段:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): ioo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/ioo"
ftp> cd /
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (127,0,0,1,163,193)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 May 12 21:22 bin
drwxr-xr-x 3 0 0 4096 Apr 30 19:57 boot
drwxr-xr-x 12 0 0 3840 May 13 10:29 dev
……
是不是感到吃惊了!我们用本地用户登录ftp服务器,却可以看到整个服务器的目录和文件,甚至还可以把/etc/passwd文件下载下来,这是非常不安全的,我们应该禁止这个功能,限制用户只能在自己的目录里浏览,这就要用到chroot功能。看下面三个参数:
chroot_list_enable=yes/no //是否启用 chroot_list 文件
chroot_local_user=yes/no //是否限制本地用户的根目录为自己的主目录
chroot_list_file=/path/to/file //设置 chrootlist 文件名
我们新建一个用户woo,再新建一个文件/etc/vsftpd/vsftpd.chroot_list,其中加入woo。然后在配置文件中添加以下几行:
chroot_list_enable=yes
chroot_local_user=yes
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
登录服务器测试:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): woo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/woo"
Name (127.0.0.1:root): ioo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
我们看到,在文件中的用户woo根目录仍然是系统根目录,但文件外的用户根目录已经变成了“/”,就是说列在文件外的用户已经不能在自己主目录范围外浏览了。
更改chroot_list_enable和chroot_local_user的值,得到以下几种组合:
参数
取值
取值
取值
取值
chroot_list_enable
yes
yes
no
no
chroot_local_user
yes
no
yes
no
意义
文件中列出的用户根目录为系统根目录,其它用户根目录为自己主目录。
文件中列出的用户根目录为自己主目录,其它用户根目录为系统根目录。
全部用户根目录都是自己主目录。
全部用户根目录都是系统根目录。
3. 匿名用户参数
我们可以认为,本地用户进入自己主目录本身就应有比较大的权限,所以我们看到本地用户受限的语句不多。但是匿名用户通常涉及到一个公开、公共的互联网环境,所以限制匿名用户的权限语句就比较多,限制也比较细致。看看这一组参数:
anon_upload_enable=yes/no //是否允许匿名用户上传
anon_mkdir_write_enable=yes/no //是否允许匿名用户建立文件夹
anon_other_write_enable=yes/no //是否允许匿名用户可以使用除了建立文件夹和上传文件以外其他的ftp写操作命令。例如:delete、rename 等等
anon_world_readable_only=yes/no //匿名用户是否允许下载所有用户都可以访问的文件
我们先把配置文件清理一下,现在配置文件只有下面几行:
listen=yes
anonymous_enable=yes
write_enable=yes
download_enable=yes
dirlist_enable=yes
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
我们希望匿名用户有上传文件的权限,但这里还只是在ftp服务里给了写权限,还必须在文件权限考虑实现。于是我们给/var/ftp加上写权限:
chmod a+w /var/ftp
然后登录服务器:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root
Login failed.
421 Service not available, remote server has closed connection
结果我们连服务器都登陆不了了!这是因为vsftpd出于在安全方面的考虑,不允许匿名用户对根目录有写权限。为此,我们只有去掉/var/ftp的写权限,再在其中新建一个目录,给予其写权限,让匿名用户上传文件到这个目录中。
# chmod 755 /var/ftp
# mkdir /var/ftp/upload
# chmod 777 /var/ftp/upload
现在我们可以匿名在upload里上传文件、建立文件夹、还可以删除改名等,但是却无法将上传的文件下载回来。如果你上传的文件是在一个新建的文件夹里,那么上传的文件不但下载不下来,而且连看都看不到:
ftp> mkdir asm
257 "/upload/asm" created
ftp> cd asm
250 Directory successfully changed.
ftp> put file1
local: file1 remote: file1
227 Entering Passive Mode (127,0,0,1,135,56)
150 Ok to send data.
226 File receive OK.
5 bytes sent in 0.063 seconds (0.077 Kbytes/s)
ftp> get file1
local: file1 remote: file1
227 Entering Passive Mode (127,0,0,1,20,101)
550 Failed to open file.
ftp> ls
227 Entering Passive Mode (127,0,0,1,133,186)
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp>
这就要研究anon_world_readable_only这个参数了,它的默认值是yes。如果其值为yes,则匿名用户只可以下载所有用户都可访问的文件。比如:
# ll
total 40
-rw----r-- 1 ftp ftp 34935 05-13 17:38 install.log
-rw------- 1 ftp ftp 209 05-13 18:16 scsrun.log
这里install.log文件权限其它位上有r权限,那么这个文件就可以被下载;scsrun.log文件其它位上没有任何权限,所以这个文件就不能被匿名用户下载。
因此解决方法有两个,一是把参数anon_world_readable_only的值改为no;二是把上传文件默认权限的其它位上加上执行权限,这就用到下面这个参数:
anon_umask=八进制数
这个参数值的计算方法与本地用户local_umask参数一样,不在赘述。
在以上的实验中,大家可能已经注意到匿名用户上传的档案所有者为ftp,这们也可能用下面两个参数来改变档案所有者:
chown_uploads=yes/no //是否开启修改默认匿名上传档案所有者的功能
chown_username=本地用户名 //匿名上传档案的所有者名
匿名用户使用任何密码都是可以登陆服务器的,那么我们可以免了匿名用户登陆必须输入密码的步骤,只要我们在配置文件中加入:
no_anon_password=yes
匿名用户的参数还有很多,我们就不一一介绍了
到此,我们已经可以达建出的ftp服务器已经可以满足很多场合的需要了,如果有要求更加苛刻的场合,那就还需要进一步设置
3. 关于TCP Wrappers
TCP Wrappers的作用,就是通过分析TCP网络数据包,根据其包头的IP地址和端口号,决定是否让这个数据进入到主机之中,因此我们也可以把它当成一个最内层的防火墙。数据包要进入ftp服务器,首先经过netfilter的过滤,通过TCP Wrappers筛选,守护进程(xinetd模式)限制,最后才能交由vsftpd进程来处理。
我们可以设置TCP Wrappers来限制某些主机能或者不能访问ftp服务器,这需要编辑两个文件:
/etc/hosts.allow
/etc/hosts.deny
当数据包通过TCP Wrappers筛选时,/etc/hosts.allow文件会首先读取,然后再读取/etc/hosts.deny文件,就是说/etc/hosts.allow优先级要高一些。这两个文件设置规则如下:
<service_name>:<IP, domain,hostname,network>:<allow|deny>
<service_name>字段是服务名,也就是/etc/rc.d/init.d/目录下存在的文件名;第二个字段是可以是IP、域名、一台主机或者一个网段;第三个字段表示允许通过或者禁止。具体看下面的例子:
vsftpd:192.168.0.111:allow //允许主机192.168.0.111访问vsftpd服务器
httpd:10.100.1.0/255.255.255.0:deny //禁止10.100.1.0/24这个子网访问www服务
最后一个字段的:allow或:deny可以省略,写在/etc/hosts.allow文件里默认就是allow, /etc/hosts.deny文件里默认是deny。其实我们可以把所有语句都写在hosts.allow文件中,但建议大家把allow和deny的语句分别写到两个文件之中。
TCP Wrappers默认规则是允许所有数据包通过,所以大家在填写允许条目之后,一定还要加一条deny语句来拒绝其它的包。比如:
# vi /etc/hosts.allow
vsftpd:192.168.1.0/255.255.255.0 //允许192.168.1.0/24网段可以访问ftp
# vi /etc/hosts.deny
vsftpd:ALL //拒绝其它所有主机访问ftp
如果vsftpd工作在守护进程模式下,不但可以受到TCP Wrappers的筛选,还可以设置守护进程配置文件来进行同样的过滤,这使用下面两条语句:
only_from = <IP, host, domain, network> //限制可以访问的IP、主机、网络
no_access = <IP, host, domain, network> //限制不能访问的IP、主机、网络
下面我们将only_from语句加入/etc/xinetd.d/vsftpd文件中,实现只有子网192.168.0.128/25才可以登录ftp服务器:
service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/local/sbin/vsftpd
server_args = /etc/vsftpd/vsftpd.conf
nice = 10
only_from = 192.168.0.128/25
}
如果vsftpd工作在standalone模式下,必须在编译vsftpd之前修改头文件builddefs.h以支持TCP Wrappers,详情请参加软件安装小节。另外还需要在vsftpd主配置文件中加入tcp_wrappers=yes参数。