最近做助教,需要搭建一个ftp服务器。需求如下:需要一个stu、teacher、admin和匿名用户anon,
其中 anon可以自由的到特定的目录里下载东东;
stu则可以到特定的目录里上传东东;
而tearcher,则可以对特定的目录里上传、下载东东;
admin则可以对stu、teacher的数据进行统一的管理。
另外,做为系统上已经有的本地用户则可以登录自己的home目录。
针对上面的需求,ftp需要开通对匿名用户、本地用户、及虚拟用户的支持。并且特别对虚拟用户中的(stu、teacher、admin)分别授予不同的权限。
下面就vsftpd支持三类用户加以说明:
1.匿名用户,也就是不需要输入密码就可登录ftp服务器的用户,这个用户名通常是ftp或anonymous; 与匿名用户有关的设置多以anon_选项开头。
2.本地用户,也就是你Linux系统上可登录到系统的用户,这些用户是在系统上实实在在存在的用户。通常会有自己的home,shell等。与本地用户有关的设置多以local_开头或包含local_的选项。
3.虚拟用户,只对ftp有效的用户。这些用户不可以登录Linux系统,只可以登录ftp服务器。其实就是一个本地用户映射成多个只对ftp服务器有效的虚拟用户。虚拟用户可以有自己的ftp配置文件,因此通常利用虚拟用户来对ftp系统的不同用户制定不同的权限,以达到安全控制的目的。与虚拟用户有关的设置以guest_开头。
如果你只是想用ftp实现对自己的共享,你可以开启本地用户;
如果你想对很多人共享,那你可以用匿名用户;
如果你需要针对不同的用户群给予不同的权限,那你就要设置更复杂的虚拟用户了。
闲话少叙,开始安装vsftpd服务器。而对于全新安装的vsftpd,它是默认支持本地用户登录的,而且匿名用户是无法使用的。所以我先要在安装之后,开启匿名登录。
1. 安装vsftpd:
代码: sudo apt-get install vsftpd
现在你就可以用你Ubuntu的用户名和密码登录ftp服务器了,登录目录是用户对应的Home目录。
可以在终端测试一下,输入用户名和密码,蓝色是需要输入的:
引用: ftp localhost
Connected to localhost.
220 (vsFTPd 2.3.2)
Name (localhost:crazier):crazier
331 Please specify the password.
Password:
230 Login successful.
默认的/etc/vsftdp.conf中有效的选项如下:
代码: cat /etc/vsftpd.conf | grep -v '^#'
代码: listen=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
各选项的意义是:
引用: listen:vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
anonymous_enable:不允许匿名访问
local_enable:允许本地用户访问,即系统上已经有的用户可以直接登录
dirmessage_enable:是否激活目录欢迎信息功能。 当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息。默认情况下,欢迎信息是通过该目录下的.message文件获得的。此文件保存自定义的欢迎信息,由用户自己建立
use_localtime:是否使用本地时间,默认是使用GMT时间,和中国的标准时间大概相差8个小时
xferlog_enable:让系统自动维护上传和下载的日志文件,默认情况该日志文件为/var/log/vsftpd.log
connect_from_port_20:是否采用ftp的默认端口来控制和传送数据
secure_chroot_dir:这个选项必须指定一个空的资料夹且任何登入者都不能有写入的权限,当vsftpd不需要file system 的权限时,就会将使用者限制在此资料夹中。
pam_service_name:设置PAM外挂模块提供的认证服务所使用的配置文件名,该文件是在/etc/pam.d/目录下查询的。
rsa_cert_file:指定SSL中RSA认证证书的位置
2.我们先来开通匿名用户:
因为vsftpd的匿名用户的登录目录默认是ftp的home目录,所以我们先看看Ubuntu系统里的ftp用户的Home目录是什么?
引用: cat /etc/passwd | grep ftp
ftp:x:117:125:ftp daemon,,,:/srv/ftp:/bin/false
可以看到ftp的home是/srv/ftp,但是/srv/ftp这个目录并不我想放文件的地方,我要放在/var/ftp/anon ,所以在这里需要修改一个ftp的home目录。
引用: sudo usermod -d /var/ftp/anon ftp
cat /etc/passwd | grep ftp
ftp:x:117:125:ftp daemon,,,:/var/ftp/anon:/bin/false
要开启匿名用户需要添加下面几项:
引用: chroot_local_user=YES #把本地用户限制在自己的home文件夹中,这样子登录之后就不能访问自己home之外的文件了,这样子是出于安全上的考虑
anonymous_enable=YES #开启匿名访问
anon_root=/var/ftp/anon #指定匿名登录后的根文件夹,也就是对于匿名用户,会把/var/ftp/anon映射为它的根目录,
执行修改前先备份一下文件:
代码: sudo cp /etc/vsftpd.conf{,.bak}
完整的vsftpd.conf文件如下:
引用: cat /etc/vsftpd.conf | grep -v '^#'
listen=YES
local_enable=YES
chroot_local_user=YES
anonymous_enable=YES
anon_root=/var/ftp/anon
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
pam_service_name=vsftpd
secure_chroot_dir=/var/run/vsftpd/empty
use_localtime=YES
rsa_cert_file=/etc/ssl/private/vsftpd.pem
到现在为止,你可以做一下测试 :
代码: ftp localhost
输入你的Ubuntu用户名,然后再输入密码就可以登录到ftp服务器了,默认的是用户名对应的home目录里了。这个是本地用户登录。
或者在用户名里,你还可以直接输入ftp或anonymous,不用输入密码就可以匿名登录了。
3. 建立本地虚拟用户
就像上面的分析的,我需要三个用户stu、teacher、admin,分别赋予不同的权限,那我们就要开始建立虚拟用户了。我们要先在系统上建建立一个真实的用户(guest),以供ftp的虚拟用户进行映射。但是为了安全其间,我们要让这个新建的用户并不能登录Ubuntu,这样子我们就可以把ftp的用户和ubuntu系统的用户分隔开来了,即使你ftp的密码丢了,也不会对你的系统造成太大的影响 。
而建立虚拟用户主要与下面两项相关(在vsftpd.conf里加上下面两句):
代码: guest_enable=YES#开启虚拟用户
guest_username=guest #把虚拟用户映射到哪个本地用户上,这个是可以自定义的,我取guest.
创建本地无法登录的用户:
代码: sudo useradd guest -d /var/ftp -s /bin/nologin
其中 -s /bin/nologin是为禁止使用guest登录ubuntu
接着新建guest的登录目录:
代码: sudo mkdir /var/ftp/guest
再做一些发票的准备,创建虚拟用户的文件夹:
代码: sudo mkdir -p /var/ftp/anon /var/ftp/admin /var/ftp/teacher /var/ftp/stu
修改目录权限,让/var/ftp目录的属主是guest,要不然会登录不上的。
代码: sudo chown guest:guest -R /var/ftp
4.建立ftp虚拟用户及认证文件
4.1新建一些必要的配置文件
在ubuntu中,vsftpd的所有的配置文件都是直接放在/etc目录下面的,这样子不方便管理,还有备份的时候也不方便,所以我就再建一个文件夹,专门来放那些配置文件:
代码: sudo mkdir /etc/vsftpd
新建虚拟用户的配置文件:
代码: sudo touch /etc/vsftpd/stu /etc/vsftpd/admin /etc/vsftpd/teacher
4. 2 建立用户数据库ftpguests
因为我们要用ftp虚拟用户登录ftp服务器,这些ftp虚拟用户又是映射到前面新建的guest本地用户的,但是虚拟用户又不归Ubuntu系统管理,它们不是用useradd命令生成的。而是需要我们专门建立一个存放这些虚拟用户及它们密码的数据库ftpguests。这个数据库的格式是一行放用户名,一行对应它的密码,一个数据库文件中可以存放多个用户名及其密码。
ftpguests文件内容如下cat ftpguests:
引用: stu
stu_passwd
teacher
teacher_passwd
admin
admin_passwd
4.3生成用户数据库ftpguests.db:
安装数据库生成工具db-util:
代码: sudo apt-get install db-util
把上一步建立的用户文件生成数据库,并放到/etc/vsftpd/文件夹中:
代码: sudo db_load -T -t hash -f ftpguests /etc/vsftpd/ftpguests.db
修改用户数据库的权限
代码: sudo chmod 600 /etc/vsftpd/ftpguests.db
4.4修改pam认证文件:
vsftpd借助PAM认证工具来帮忙认证了,我们的本地用户登录ftp也是需要PAM来帮忙的。安装vsftpd的时候,它会有/etc/pam.d/目录里生成一个认证的配置文件:vsftpd,而之前的vsftpd.conf里的选项 pam_service_name=vsftpd 指的正是PAM使用/etc/pam.d/下的vsftpd配置文件来认证。
先备份一下 /etc/pam.d/vsftpd
代码: sudo cp /etc/pam.d/vsftpd{,bak}
然后在/etc/pam.d/vsftpd的第一行处添加下面的内容,
代码: auth sufficient pam_userdb.so db=/etc/vsftpd/ftpguests
account sufficient pam_userdb.so db=/etc/vsftpd/ftpguests
说明:上面的内容一定要放在第一行,要不然不能同时支持虚拟用户和本地用户的,这一步是关键。上面的/etc/vsftpd/ftpguests文件指的就是我们刚刚生成的用户数据库。另外,这里选择sufficient而不是required的原因是,sufficient表示充分条件,可以让vsftpd同时支持虚拟用户和本地用户。
添加后的/etc/pam.d/vsftpd的文件是这样子的:
引用: # Standard behaviour for ftpd(8).
auth sufficient pam_userdb.so db=/etc/vsftpd/ftpguests
account sufficient pam_userdb.so db=/etc/vsftpd/ftpguests
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
# Standard pam includes
@include common-account
@include common-session
@include common-auth
auth required pam_shells.so
4.5建立每个虚拟用户的配置文件
为每个虚拟用户(stu、teacher、admin)建立它们各自的配置文件,以便对不同的用户进行不同的权限分配。可以理解成虚拟用户的配置文件是对vsftpd.conf的扩展,vsftpd.conf是对全局的控制,而每个虚拟用户的配置文件则是方便进行更精细、更个性的控制。
stu用户的配置文件:只能在自己的home目录下进行上传操作,并且不能下载,不能查看其它用户上传的内容,也不能修改。
引用: cat /etc/vsftpd/stu | grep -v '^#'
local_root=/var/ftp/stu
write_enable=YES #可以进行写操作,是下面设置的基础
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES #可以创建文件夹
download_enable=NO #不能下载
teacher用户的配置文件:可以在自己的home目录里上传、下载文件,也可对文件夹重命名,拥有所有权限
引用: cat /etc/vsftpd/teacher | grep -v '^#'
local_root=/var/ftp/teacher
anon_world_readable_only=NO #对文件夹是否有读的权限,为YES时,没有读的权限,为NO时,可以查看文件夹内有哪些文件
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES #可以对文件夹进行修改
admin用户的配置文件:可以对teacher,stu进行任何操作。它与teacher是不同在于local_root指定的文件夹包含了stu和teacher的home目录
引用: cat /etc/vsftpd/admin | grep -v '^#'
local_root=/var/ftp
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
4.6全局配置文件/etc/vsftpd.conf:
现在再一次修改vsftpd.conf,该文件的内容为: cat /etc/vsftpd.conf | grep -v '^#'
代码: listen=YES
anonymous_enable=YES
local_enable=YES
local_root=/home/crazier #把本地用户的登录目录限制在/home/crazier,这个根据你自己的要求进行修改
anon_root=/var/ftp/anon #把匿名用户限制在/var/ftp/anon目录里
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
chroot_local_user=YES#为了安全期间,开启用户的监牢限制
guest_enable=YES #开启vsftpd对虚拟用户的支持
guest_username=guest#把虚拟用户映射到本地用户guest,这个值取决于 (第3步: 建立本地虚拟用户)中的值
user_config_dir=/etc/vsftpd #指定虚拟用户的配置文件所有的目录,确保/etc/vsftpd文件夹里有(第4.5步:建立每个虚拟用户的配置文件)中生成的stu teacher、 admin 文件
pam_service_name=vsftpd #指定PAM使用的配置文件,在/etc/pam.d文件夹里
secure_chroot_dir=/var/run/vsftpd/empty
use_localtime=YES
rsa_cert_file=/etc/ssl/private/vsftpd.pem
到现在为止,已经可以通过匿名、本地、虚拟用户访问ftp服务器了。其中有一些是我自己的理解,有那么点意思,但是不一定正宗,如果如什么不对的地方,还希望能够指出来。
PS: 咱们 ubuntu坛子里的帖子还真不好写,光搞这些个格式花了一天时间。还要很耐心呀,不知道有什么好办法没有。
引用:
关于vsftpd同时使用系统用户和虚拟用户验证/forum.php?mod=viewthread&tid=658533
鳥哥的 Linux 私房菜 FTP 伺服器/linux_server/0410vsftpd.php#theory_who
Vsftpd虚拟用户设置.cn/Vsftpd%E8%99%9A%E6%8B%9F%E7%94%A8%E6%88%B7%E8%AE%BE%E7%BD%AE
玩转vsftpd服务器的四大高级配置/art/08/221633.htm
/Vsftpd