快速搭建简易 ftp 服务

1. 安装 vsftpd

Debian/Ubuntu 下:

$ sudo apt-get install vsftpd

安装完后,会自动向 /etc/passwd 和 /etc/group 添加一个 ftp 用户,一个 ftp 组

 

2. 使用匿名用户

配置文件 /etc/vsftpd.conf

vsftpd 的匿名用户 (anonymous) 需要对应系统的本地用户,默认情形下对应 ftp,可通过如下选项控制:

ftp_username = ftp

# 允许匿名用户登录,无须密码
anonymous_enable=YES
no_anon_password=YES

# 允许匿名用户建立目录
anon_mkdir_write_enable=YES
# 允许匿名上传文件
anon_upload_enable=YES

上述匿名用户的 mkdir 和 upload 权限,必须打开这个选项才能生效:
write_enable=YES
而且匿名用户在系统中对应的用户,必须对操作的目录有写权限

# 改变匿名用户上传之文件属于系统本地用户 ftp
chown_uploads=YES # 此选项默认为 NO,则匿名用户上传的文件自己没法下载没法查看
chown_username=ftp

# 匿名上传之文件的权限
chown_upload_mode=0744

如果 chown_upload_mode=0222
则 匿名用户不能查看和下载自己上传的文件

# 不允许 /etc/passwd 中的本地用户登录 ftp
local_enable=NO

 

3. vsftpd 一般默认使用 /srv/ftp 作为匿名用户登录后的主目录

这个目录一般在安装完成后会自动建立,大多数情形下我们还是用自己的目录:

$ su root
$ mkdir /data/ftp

在配置文件中重新指定匿名用户的根目录:

anon_root=/data/ftp

不管 /data/ftp 属于谁,anonymous 对应的用户 ftp 不能对该目录有写权限(安全考虑),否则连接后会报:
OOPS: vsftpd: refusing to run with writable anonymous root

因此,为保证匿名用户的上传权限,可在 /data/ftp 目录下,再建立一个 upload 目录,赋予 ftp 读写执行的权限即可:

$ mkdir -p /data/ftp/upload
$ chown ftp /data/ftp/upload

4. 允许匿名用户更多的权限

以上配置下,即使匿名用户自己上传的文件权限是 744,其也不能删除和重命名自己上传的文件,除非打开如下选项:

#除了上传和创建目录外,还可以重命名,删除文件
anon_other_write_enable=YES (经测试,不可用)

 

5. 本地用户

要使用本地用户,则修改配置为:

local_enable=YES

本地用户的登录控制,通过 /etc/ftpuser 文件控制:

root@hahaha:/var/data# cat /etc/ftpusers
# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).
root
daemon
bin
sys
sync
man
lp

在其中挂名的,不能从 vsftpd 登录

对于本地用户,其 vsftpd 用户主目录默认为其 home 目录,如 jjyy,则客户端登录后直接到 /home/jjyy

可通过配置选项来改变这个用户登录后的 vsftpd 主目录:

local_root=/var/ftp

对本地用户没有权限限制

默认情形下配置选项 chroot_local_user=NO,表示本地用户可以随意访问整个系统的文件系统,即:对可登录的本地用户来说,其根目录就是整个 Linux 系统的根目录,没有被 chroot 到用户主目录下,这是一个安全隐患:

chroot_local_user=YES

则将可登录的本地用户根目录 chroot 到其的用户主目录下,这样其就不能看到和访问整个文件系统的根目录

对于需要开放整个文件系统的本地用户,可以通过如下选项控制之:

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

在 /etc/vsftpd.chroot_list 列上需要的用户名即可

 

6. 磁盘配额

为特定用户配额适当的磁盘空间,以防服务被滥用

$ apt-get install quota
$ mount -o usrquota,grpquota /dev/xvdb /mnt

$ quota -uvs ftp # 查看 ftp 配额
$ edquota -u ftp # 编辑配额
Disk quotas for user hom (uid 501):

Filesystem blocks soft hard inodes soft hard

/dev/sdb5 16 0 1024 4 0 0

改列 hard,单位为 KB

$ quotaon -avu # 打开磁盘配额监控进程
$ quota -uvs ftp # 查看 ftp 配额
Disk quotas for user ftp (uid 104):
Filesystem space quota limit grace files quota limit grace
/dev/xvdb 30768K 0K 4883M 6 0 0

$ quotaoff -vug /dev/xvdb # 关闭 xvdb 的配额