首页 > 文章 > FTP > 正文

Linux之Vsftp服务器架设
2011-07-03 20:14:35   来源:   评论:0 点击:

Linux之Vsftp服务器架设

Linux之Vsftp服务器架设
 

环境:RHEL5
Server: 10.5.9.52   Vsftpd服务器
Client: 10.5.9.50   Client客户端

目标:
1.简单Vsftpd服务器搭建(匿名登录访问)
2.本地用户访问FTP方式(安全)
3.虚拟用户访问FTP方式(安全性最高)
4.Chroot安全机制,禁锢用户只在自己的目录下活动,不可以切到别的目录
5.访问控制机制

一.检查所需的软件安装包
[root@master ~]# rpm -qa|grep vsftpd
vsftpd-2.0.5-16.el5_4.1
如果没安装服务端软件 可以使用yum安装或者rpm安装

Vsfpd相关配置文件说明:
/etc/vsftpd/vsftpd.conf:核心配置文件。
/etc/vsftpd/ftpusers:   默认用于指定那些用户不能登录FTP
/etc/vsftpd/user_list:  默认指定允许访问的用户列表文件
/var/ftp:               默认的匿名用户登录FTP后的根目录

[root@master ~]# service vsftpd restart    
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]
默认情况下 vsftpd安装好启动后就可以匿名访问

二.实现目标2之本地用户访问FTP
1.切服务器端10.5.9.52
编辑/etc/vsftpd/vsftpd.conf文件 关闭默认允许的匿名访问方式
将anonymous_enable=YES选项YES改成NO 并重启Vsftpd服务,再访问的时候就需要账户登录啦

2.创建服务端本地账户
创建一个本地账户f5ha_vsftp并指定组为ftp,另外为安全起见限制f5ha_vsftp不可以登录系统
[root@master ~]# useradd -g ftp -s /sbin/nologin f5ha_vsftp
[root@master ~]# passwd f5ha_vsftp  
Changing password for user f5ha_vsftp.
New UNIX password:
BAD PASSWORD: it does not contain enough DIFFERENT characters
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

[root@master f5ha_vsftp]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

3.切Client 10.5.9.50验证登录vsftp服务器
[root@clien ~]# ftp 10.5.9.52
Connected to 10.5.9.52.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.5.9.52:root): f5ha_vsftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/f5ha_vsftp"
ftp> ls
227 Entering Passive Mode (10,5,9,52,43,19)
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd /etc
250 Directory successfully changed.
ftp> pwd
257 "/etc"

这个时候就不可以匿名登录了 需要使用系统本地账户f5ha_vsftp登录,我想细心的你
肯定会留意到通过切换 居然可以切换到/etc目录下面!试想下,要是可以随便切换目录.
那下载passwd文件肯定是没问题的了!为此为了安全起见,必须要将用户禁锢在自己的家目录下!

三.实现目标之禁锢用户在自己的家目录
为了将用户禁锢在自己的家目录,我们需要将vfstp启用chroot机制
1.编辑/etc/vsftpd/vsftpd.conf文件 启用chroot
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
要手工建立此文件(如果不存在)/etc/vsftpd/chroot_list
在此文件中写入ftp账户名 重启vsftpd服务即可
[root@master vsftpd]# cat /etc/vsftpd/chroot_list
f5ha_vsftp

[root@master vsftpd]# service  vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

2.切换Clien验证
[root@clien ~]# ftp 10.5.9.52
Connected to 10.5.9.52.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.5.9.52:root): f5ha_vsftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> cd /etc    
550 Failed to change directory.

切换不了目录啦  成功
注意:如果你启动了chroot机制,却没有子啊/etc/vsftpd/下建立chroot_list 这个文件,那么当你登陆的时候会出现失败的字样具体

如下:421 Service not available, remote server has closed connection,所以启用之后一定要建立chroot_list 文件的哦


四.实现目标之用虚拟用户访问FTP服务器
1.创建文件/etc/vsftpd/vlogin.txt 往里面添加虚拟账户以及对应的密码 单行账户 双行密码
[root@master vsftpd]# cat /etc/vsftpd/vlogin.txt
f5ha_ftp1
123123
f5ha_ftp2
123456

2.使用指令建立虚拟账户数据库
先确认系统安装有db4软件
[root@master vsftpd]# rpm -qa|grep db4                                         
db4-devel-4.3.29-10.el5
db4-4.3.29-10.el5
db4-utils-4.3.29-10.el5

[root@master vsftpd]# db_load -T -t hash -f /etc/vsftpd/vlogin.txt /etc/vsftpd/vlogin.db
[root@master ~]# ls -l /etc/vsftpd/
total 36
-rw-r--r-- 1 root root    13 Jun  8 17:37 chroot_list
-rw------- 1 root root   125 Dec 16  2009 ftpusers
-rw------- 1 root root   361 Dec 16  2009 user_list
-rw-r--r-- 1 root root 12288 Jun  9 15:00 vlogin.db
-rw-r--r-- 1 root root    38 Jun  9 14:47 vlogin.txt
-rw------- 1 root root   825 Jun  8 17:00 vsftpd.conf
-rwxr--r-- 1 root root   338 Dec 16  2009 vsftpd_conf_migrate.sh
可以看到生成了一个数据库文件vlogin.db,另外需要修改权限,设置为止对root用户可读可写 即600权限

[root@master ~]# chmod 600 /etc/vsftpd/vlogin.db
[root@master ~]# ls -l /etc/vsftpd/vlogin.db         
-rw------- 1 root root 12288 Jun  9 15:00 /etc/vsftpd/vlogin.db

3.编辑认证相关文件/etc/pam.d/vsftpd 设定认证参数

[root@master pam.d]# cat /etc/pam.d/vsftpd (默认参数)
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      system-auth
account    include      system-auth
session    include      system-auth
session    required     pam_loginuid.so

我们要将/etc/pam.d/vsftpd的默认参数全部用#注释掉 在最后加上2行
auth     required /lib/security/pam_userdb.so  db=/etc/vsftpd/vlogin crypt=hash
account  required /lib/security/pam_userdb.so  db=/etc/vsftpd/vlogin crypt=hash


注意:如需使用访问控制ftpusers,则不要注释这行
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

[root@master pam.d]# cat /etc/pam.d/vsftpd
#%PAM-1.0
#session    optional     pam_keyinit.so    force revoke
#auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth       required    pam_shells.so
#auth       include     system-auth
#account    include     system-auth
#session    include     system-auth
#session    required     pam_loginuid.so
auth     required /lib/security/pam_userdb.so  db=/etc/vsftpd/vlogin crypt=hash
account  required /lib/security/pam_userdb.so  db=/etc/vsftpd/vlogin crypt=hash

4.添加一个系统账户用来给虚拟账户映射登录用,让所有的虚拟账户对应一个真实的系统账户
  当所有虚拟账户登录ftp后将会进入到系统实际账户的家目录.这样我们可以对虚拟账户分配权限啦
[root@master pam.d]# adduser -g f5ha_vsftp -s /sbin/nologin -d /var/share f5ha_vsftp
创建了一个f5ha_vsftp账户
-g指定用户的组为f5ha_vsftp -s指定用户的shell为不可登录系统 -d指定用户的家目录/var/share
目录权限是700的哟
[root@master pam.d]# ls -l /var/|grep share
drwx------  3 f5ha_vsftp f5ha_vsftp 4096 Jun  9 15:38 share

5.编辑/etc/vsftpd/vsftpd.conf文件 添加内容
pam_service_name=vsftpd   ----------------- 配置vsftpd使用的PAM模块为vsftpd
user_config_dir=/etc/vsftpd/vuserconfig --- 设置虚拟账户权限配置的主目录为vuserconfig
guest_enable=yes          ----------------- 允许使用虚拟用户登录FTP
guest_username=f5ha_vsftp --------------- 虚拟用户对应的系统用户为f5ha_vsftp
max_clients=1             ----------------- 设置FTP服务器最大接入客户端数为1 (实际应用根据自己需求设定))
max_per_ip=1             ------------------ 设置每个ip地址最大链接数为1      (实际应用根据自己需求设定)
userlist_enable=YES     
tcp_wrappers=YES

6.承上第5点配置 我们需建立目录/etc/vsftpd/vuserconfig,用于存放用户的权限配置
在/etc/vsftpd/vuserconfig目录下建立虚拟用户的权限配置文件,配置文件名必须要跟虚拟用户名一致
就是跟我们前面在vlogin.txt中定义的用户名一致

[root@master vuserconfig]# cat /etc/vsftpd/vlogin.txt
f5ha_ftp1
123123
f5ha_ftp2
123456
[root@master vuserconfig]# pwd
/etc/vsftpd/vuserconfig
[root@master vuserconfig]# touch f5ha_ftp1
[root@master vuserconfig]# touch f5ha_ftp2
[root@master vuserconfig]# ll
total 0
-rw-r--r-- 1 root root 0 Jun  9 16:00 f5ha_ftp1
-rw-r--r-- 1 root root 0 Jun  9 16:00 f5ha_ftp2

将权限参数写入配置文件即可 权限参数主要有以下这些:
anon_world_readable_only=no  允许匿名用户浏览器整个服务器的文件系统
write_enable=yes             允许在文件系统写入权限
anon_mkdir_write_enable=yes  允许创建文件夹
anon_other_write_enable=yes  允许用户改名和删除文件的权限
anon_upload_enable=yes       开启匿名帐号的上传功能
anon_max_rate=100000         限定传输速度为100KB/s(以字节为单位的)

[root@master vuserconfig]# cat f5ha_ftp1
anon_world_readable_only=no
write_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_upload_enable=yes
anon_max_rate=100000

[root@master vuserconfig]# cat f5ha_ftp2
anon_world_readable_only=no
write_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_upload_enable=yes
anon_max_rate=100000

7.重启服务 测试登录
服务端:
[root@master vuserconfig]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

[root@master vuserconfig]# touch /var/share/test.txt
[root@master vuserconfig]# ls -l  /var/share/
total 0
-rw-r--r-- 1 root root 0 Jun  9 16:28 test.txt

客户端:
[root@clien ~]# ftp 10.5.9.52
Connected to 10.5.9.52.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.5.9.52:root): f5ha_ftp1  (虚拟账户登录)
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls   (看的到服务端的text.txt文件)
227 Entering Passive Mode (10,5,9,52,128,137)
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jun 09 08:28 test.txt
226 Directory send OK.
ftp> pwd
257 "/"
ftp> cd /etc  (不可以切目录)
550 Failed to change directory.


六.目标实现之FTP访问控制

1.基于客户端ip设置TCP Wrappers策略控制:
[root@www /]# vi /etc/hosts.allow
vsftpd:10.5.9.50,10.5.10.
[root@www /]# vi /etc/hosts.deny
vsftpd:all
上面的意思是 开通10.5.10.0整个网段 以及10.5.9.50这个主机可以登录ftp  其他主机全部拒绝

2.基于账户访问控制:
Vsftp用于访问控制的文件有/etc/vsftpd/ftpusers
凡是写在此文件下的账户,默认是拒绝登录,可以通过修改/etc/pam.d/vsftp中的sense值为allow 就表示允许登录
[root@master vsftpd]# cat /etc/pam.d/vsftpd
#%PAM-1.0
#session    optional     pam_keyinit.so    force revoke
#auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth       required    pam_shells.so
#auth       include     system-auth
#account    include     system-auth
#session    include     system-auth
#session    required     pam_loginuid.so
auth     required /lib/security/pam_userdb.so db=/etc/vsftpd/vlogin crypt=hash
account required /lib/security/pam_userdb.so  db=/etc/vsftpd/vlogin crypt=hash
=====================================================================================================
auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
调用这个模块/lib/security/pam_listfile.so 用来检测登陆进来的用户是不是记记载在/etc/vsftpd/ftpusers 中的用户

而item=user 很明显是说明要检测的是用户
sense=deny  则是处理方法deny就是就是拒绝的意思了(此值改成allow就会允许)

现在将f5ha_ftp1这个账户添加进/etc/vsftpd/ftpusers 看看是否还可以登录
[root@master vsftpd]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
f5ha_ftp1

客户端登录测试:
[root@clien ~]# ftp 10.5.9.52
Connected to 10.5.9.52.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.5.9.52:root): f5ha_ftp1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

测试结果登录失败

七.最后总结
Vsftpd的主配置文件/etc/vsftpd.conf的配置选项解释:
anonymous_enable=YES                            //允许匿名用户登陆
local_enable=YES                                //允许本地用户登陆 如果这个不打开的话 uid 500以下的人都被访问拒绝
write_enable=YES                                //允许客户端写命令
local_umask=022                                 //本地用户新文件的umask的值 就等于ground 和other 部分的可写部分去掉
anon_upload_enable=YES                          //允许匿名用户上传文件
anon_mkdir_write_enable=YES                     //允许匿名用户创建目录 这个最好不要打开否则会带来不可预测的后果
dirmessage_enable=YES                           //允许使用目录的消息
ftpd_banner=Welcome to weihua0722's FTP service.//登陆欢迎辞词
ls_recurse_enable=YES                           //允许使用ls -R命令
listen=YES                                      //监听模式 就是要服务器单独运行


FTP原理相关:
后台进程:vsftpd
类型:System V
服务使用端口:20(ftp-data),21(ftp)
所需RPM包:vsftpd
配置文件:/etc/vsftpd/vsftpd.conf


FTP的主动模式和被动模式很重要
主动模式:
client 先连接服务器的 21端口(命令端口),然后client开放一个大于1024的端口等待服务器的20端口连接,
21号端口的链接建立以后,服务器就用20去连接client开放的端口,简单来说就是服务器主动连客户端啦
基于上面的连接方式,如果client端有个防火墙,服务器的20端口就连接不进入,导致会连接失败

被动模式:
就是client开启大于1024的X端口连接服务器的21(命令端口),同时开启X+1端口
当21号端口连接成功后,client会发送PASV命令,通知服务器自己处于被动模式,服务器收到这个消息后,
就会开放一个大于1024的端口Y通知client,client接到通知后就会用X+1来连接服务器的Y端口,

 

常见问题:
1.500 OOPS: vsftpd: refusing to run with writable anonymous root
这表示ftp用户的家目录的权限不对,应该改过才对;
2.
500 OOPS: cannot change directory:/home/*******
500 OOPS: child died
[root@localhost ~]# setsebool ftpd_disable_trans 1
[root@localhost ~]# service vsftpd restart

3.有时候会遇到530的错误,一般都是因为你启用了虚拟用户之后编辑pam.d/vsftpd文件导致,
  内容出现错误的时候就会被拒绝登陆所有一定要认真。

 

相关热词搜索:Linux之Vsftp服务器架设

上一篇:ftp 451错误解决
下一篇:最后一页

分享到: 收藏
频道总排行
频道本月排行