在Ubuntu 18.04 LTS上安装FTP Server及添加FTP虚拟用户
Linux上的FTP server软件挺多的,很多都是优秀的而且免费或开源的,比如ProFTPd, pureFTPD或vsftpd等等。这些FTP server都很成熟,而且稳定,但也许是因为成熟,很多都很久不更新了,比如pureFTPD或vsftpd都有几年没有新版本发布了。不过ProFTPd这个软件却一直在更新。所以它就成为了我今天要在Ubuntu vps服务器是安装FTP Server的首选了。
安装ProFTPd Server
ProFTPd虽然很强大,但却很容易安装和配置。Ubuntu官方程序库中提供了ProFTPD FTP server安装包,直接使用APT工具就可以轻松下载和安装。
首选,我们更新APT package repository cache,使用下面的命令:
然后,安装 ProFTPd :
$ apt install proftpd-basic
此时,输入y,然后回车继续。
这样,ProFTPd 就安装完成了。
ProFTPd在Ubuntu上安装完成后,配置文件会存放在/etc/proftpd目录下。主配置文件叫做proftpd.conf,其它配置文件是通过在proftpd.conf里include引入。
ProFTPd服务的名称就叫做proftpd。每次当我们更改了ProFTPd配置文件后,都需要重启proftpd服务。
重启proftpd服务,可以使用下面的命令:
$ systemctl restart proftpd
运行重启命令后,通过下面的命令来检查proftpd服务是否正确的运行了:
$ systemctl status proftpd
可以看到,proftpd服务运行正常。
测试ProFTPD服务
ProFTPD服务安装完成后,你不需要对它进行配置,缺省的配置就可以很好的使用。我们可以使用Ubuntu系统里现有的用户登录FTP Server。
添加FTP专用用户
虽然现有的Ubuntu用户可以当做FTP用户,但新建FTP专用用户是有必要的。我们要做的就是在Ubuntu系统里新建用户。
我们用下面的命令新建一个ftp2用户:
$ useradd -m ftp2
现在给新建的ftp2用户设置密码:
$ passwd ftp2
现在,输入密码,回车。
再次输入密码,回车。
这样,密码就设置好了。
ftp2用户可以登录FTP服务了。
禁止FTP用户通过SSH访问系统
出于安全考虑,我们通常不希望FTP专用用户通过SSH登录我们的服务器。可是,我们系统里新建的用户都是可以使用SSH登录系统的,如下图:
为了禁止他们使用SSH,我们需要将他们默认的登录shell替换成/bin/false。
首先,使用文本编辑器打开配置文件/etc/shells,命令如下:
$ ne /etc/shells
现在,将一行/bin/false添加到文件的末尾。
下面,把用户ftp2的login shell修改成/bin/false,命令如下:
$ usermod -s /bin/false ftp2
这样一来,用户ftp2就被禁止通过SSH登录了。
但FTP登录仍然可以。
限制FTP用户只能看到自己的HOME目录
默认情况下,FTP用户可以浏览系统根目录。虽然只有浏览没有修改的权限,但将系统根目录暴露给FTP用户毕竟不是一个好的安全策略。这时,chroot jail就派上用场了。这上ProFTPd内置的一个功能特征,缺省状态是没有开启的。
要开启chroot jail,就需要修改/etc/proftpd/proftpd.conf这个配置文件,命令如下:
$ nano /etc/proftpd/proftpd.conf
如下图,在里面找到这样一行:
把行首的#删除掉,改成下图的模样,保存文件。
修改了配置文件后要重启proftpd服务:
$ systemctl restart proftpd
现在,FTP用户就只能看到自己的home目录了。
创建FTP虚拟用户
很多时候我们的FTP服务器是为WEB服务器服务的。比如系统里有Apache,我们使用FTP向WEB目录上传文件。这个时候,我们希望上传的文件的所有者应该是Apache的www-data。这个时候FTP虚拟用户的作用就显现出了。
什么是虚拟用户?很简单,它是没有出现在系统/etc/passwd文件里的用户。这个/etc/passwd就是一个文本文件,里面存放了可以登录系统的所有用户的信息,包括它们的唯一ID和组ID。而虚拟用户定义在其它文件里,或数据库、ldap服务器里。
很神奇的是,虚拟用户可以拥有和系统现有用户相同的UID和GID,也就可以拥有相同UID用户同样的权限。此时,需要在proftpd.conf里开启DefaultRoot ~配置来限制它们只能访问自己的目录。
ftpasswd
创建和管理proftpd虚拟用户,我们需要使用ftpasswd这个工具,它能把虚拟用户的信息存放到/etc/proftpd/ftpd.passwd和/etc/proftpd/ftpd.group文件里。这两个文件对应的是ProFTPD配置文件里AuthUserFile和AuthGroupFile这两个配置项。
假设我们创建一个拥有和www-data用户相同UID的FTP虚拟用户,先找到它的 UID 值:
~]$ cat /etc/passwd | grep www-data www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
可以看到,www-data的UID是33,组id GID也是33。
创建user1和user2两个虚拟用户:
~]$ ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=user1 --uid=33 --gid=33 --home=/var/www/html/user1 --shell=/bin/false ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd ftpasswd: creating passwd entry for user user1 ftpasswd: /bin/false is not among the valid system shells. Use of ftpasswd: "RequireValidShell off" may be required, and the PAM ftpasswd: module configuration may need to be adjusted. Password: Re-type password: ftpasswd: entry created
~]$ ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=user2 --uid=33 --gid=33 --home=/var/www/html/user2 --shell=/bin/false ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd ftpasswd: creating passwd entry for user user2 ftpasswd: /bin/false is not among the valid system shells. Use of ftpasswd: "RequireValidShell off" may be required, and the PAM ftpasswd: module configuration may need to be adjusted. Password: Re-type password: ftpasswd: entry created
创建的过程中有提示让我们把RequireValidShell off这个配置项打开。这个配置项可以在/etc/proftpd/proftpd.conf配置文件里找到。
下面创建组文件:
~]$ ftpasswd --group --name=www-data --file=/etc/proftpd/ftpd.group --gid=33 --member user1,user2 ftpasswd: using alternate file: /etc/proftpd/ftpd.group ftpasswd: updating group entry for group www-data ftpasswd: entry updated
我们来看看这两个文件里都有什么内容:
~]$ cat ftpd.passwd user1:$1$elbFOuqM$Z0FfP9GhwMLIZza4m27ie.:33:33::/var/www/html/user1:/bin/false user2:$1$RQfV4FlC$dOVVecDeUlSpKkvwUz4dow:33:33::/var/www/html/user2:/bin/false
~]$ cat /etc/proftpd/ftpd.group www-data:x:33:user1,user2
ftpasswd工具的其它用法
密码是加密的,修改密码还是要通过ftpasswd工具:
~]$ ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=test --change-password
ftpasswd锁住、解锁用户
~]$ ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=test2 --lock ~]$ ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=test2 --unlock
ftpasswd删除用户
~]$ ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=test --delete-user
有了虚拟用户信息后,我们需要在/etc/proftpd/proftpd.conf配置文件做相应的关联,添加下面的配置信息:
DefaultRoot ~ RequireValidShell off AuthUserFile /etc/proftpd/ftpd.passwd AuthGroupFile /etc/proftpd/ftpd.group AuthOrder mod_auth_file.c
重启proftpd后台服务
~] systemctl restart proftpd.service
遇到530 Login incorrect问题
如果你在使用的ftp client登录时遇到,530 Login incorrect错误,无法登录ftp服务。可以打开服务器上的/var/log/proftpd/proftpd.log日志文件,也许会看到user not found的信息。这个时候,有可能你忘了在配置文件里添加AuthOrder mod_auth_file.c这行信息了。