如何为具有特定子目录访问权限的vsftpd设置虚拟用户?


24

我需要能够将仅有权访问子文件夹的虚拟用户添加到vsftpd。我想使用虚拟用户的原因是我只希望服务器上有1个真实用户。

FTP结构为:

  • www
    • website_name1
      • sub_folder1
    • website_name2
      • sub_folder2
      • sub_folder3
    • website_name3
    • website_name4

主帐户可以访问www文件夹和所有子目录,我想添加一个虚拟用户,该用户可以访问sub_folder1并且只能访问sub_folder1

另外,为了避免混淆,我还要求另一个用户访问sub_folder3并且仅访问sub_folder3。我的观点是我需要能够根据用户选择一个用户的文件夹和子文件夹。

我找到了添加用户以查看整个strucutre或设置用户命名文件夹的方法,这两种方法对我都没有用。

我在这里发现了类似的问题:

如何为多个用户设置VSFTPD,包括添加特定目录

但它建议proftpd我虽然一般不太安全。
还是我错过了重点?


在找到该serverfault.com/questions/450214/之前,我一直在进行身份验证问题,直到很长时间为止。显然,PAM的MD5哈希存在问题。本指南解决了该问题。

Answers:


31

经过一些尝试,我设法提出了一个半解决方案(不完美,但足够好)

使用2707974的答案和信息,我从其他地方获得了所需的信息。

首先,您需要安装vsftp和PAM

apt-get install vsftpd libpam-pwdfile

编辑/etc/vsftpd.conf

nano /etc/vsftpd.conf

然后粘贴以下内容

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
local_root=/var/www
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES

#virutal user settings
user_config_dir=/etc/vsftpd_user_conf
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
nopriv_user=vsftpd
guest_username=vsftpd

根据您的确切需求进行编辑对于虚拟用户而言,最重要的一点是虚拟用户设置注释后的所有内容

建立使用者

您可以使用数据库,也可以htpasswd发现我htpasswd使用起来更快,更容易。

创建一个目录来存储您的用户

mkdir /etc/vsftpd
htpasswd -cd /etc/vsftpd/ftpd.passwd user1

添加其他用户只是忽略了 -c

htpasswd -d /etc/vsftpd/ftpd.passwd user2

我只设法使用CRYPT使其工作,它限制为8个字符 以使用8个以上的字符使用openssl生成兼容的哈希并将其直接传递到htpasswd

htpasswd -c -p -b /etc/vsftpd/ftpd.passwd user1 $(openssl passwd -1 -noverify password)

创建用户后,您现在可以更改PAM配置文件

nano /etc/pam.d/vsftpd

并删除此文件中的所有内容并替换为以下内容

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so

这将为您在中定义的虚拟用户启用登录,/etc/vsftpd/ftpd.passwd并禁用本地用户

接下来,我们需要添加一个用户供这些虚拟用户使用。这些用户将无权访问外壳程序,并且将被调用vsftpd

useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

用户必须guest_username=vsftpd在vsftpd conf文件中匹配

定义目录访问

重要的一行如下

user_config_dir=/etc/vsftpd_user_conf

这意味着user1登录时将查找以下文件

/etc/vsftpd_user_conf/user1

该文件与相同,vsftpd.conf因此您可以定义一个新文件local_root

回到我们只想user1访问的问题var/www/website_name1/sub_folder1,因此我们需要创建vsftpd_user_conf文件夹:

mkdir /etc/vsftpd_user_conf

现在创建用户文件:

nano /etc/vsftpd_user_conf/user1

然后输入以下行

local_root=/var/www/website_name1/sub_folder1

现在重启vsftp

service vsftpd restart

您现在应该能够以user1身份登录,该用户只能看到 var/www/website_name1/sub_folder1其中的任何文件夹和文件。

就是这样,您现在可以根据需要添加任意数量的用户,并将他们的访问权限限制为所需的任何文件夹。

重要的是要记住,如果不创建用户conf文件,它将默认以root用户身份位于var / www文件夹(在上面的示例中)

如果打算由用户修改子文件夹,则可能有必要更改共享子文件夹的所有者:

chown vsftpd:nogroup /var/www/website_name1/sub_folder1

这可以进行一些修改:1)使用绝对路径(用“ / var”替换从“ var /”开始的路径。2)Ubuntu 12.04中的vsftpd 2.3.5不支持allow_writeable_chroot选项,您可以通过安装补丁来解决vsftpd
gadelat 2015年

您好,使用ssl密码,我们是否会再次使用-d省略-c或只是省略-c?另外请注意,我们是否只是重新运行查询以更改密码?还是有另一种方法。谢谢
mdixon18 '16

为什么需要使用useradd --home创建主目录?有必要?
e-info128 '17

1
附加:启用安全的TLS连接。digitalocean.com/community/tutorials/...
电子info128

1
某些安装可能需要apache2-utils,我没有将其包含在答案中,因为它与所有人都不相关。
Avenyet

12

尝试使用本手册。也许会为您工作。

怎么做

安装vsftpd和PAM库

编辑/etc/vsftpd.conf/etc/pam.d/vsftpd

使用自定义目录创建用户帐户(例如,在/ var / www /中)

设置目录用正确的chmodchown

创建对服务器具有完全访问权限的管理员用户

  1. 安装vsftpd(非常安全的FTP Deamon)并libpam-pwdfile创建虚拟用户

我想创建FTP用户,但是我不想添加本地unix用户(没有外壳程序访问,没有主目录,等等)。PAM(可插入身份验证模块)将帮助您创建虚拟用户。

sudo apt-get install vsftpd libpam-pwdfile

  1. 编辑 vsftpd.conf

首先,您需要备份原始文件

sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak

然后创建一个新的

sudo vim /etc/vsftpd.conf

复制并粘贴以下行。该文件应仅包含以下几行:

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
nopriv_user=vsftpd
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/var/www/$USER
chroot_local_user=YES
hide_ids=YES
guest_username=vsftpd
  1. 注册虚拟用户

要注册您使用的用户htpasswd,因此我假设您apache2正在服务器上工作。创建一个vsftpd文件夹,然后将配置文件放入其中。

sudo mkdir /etc/vsftpd

然后

sudo htpasswd -cd /etc/vsftpd/ftpd.passwd user1

-c表示如果尚不存在,我们将创建该文件-d强制MD5,您需要在ubuntu 12.04上使用它,始终使用它

该命令将提示您输入密码。

如果您之后要添加新用户:

sudo htpasswd -d /etc/vsftpd/ftpd.passwd user2

  1. 在中配置PAM /etc/pam.d/vsftpd

同样,您需要备份原始文件

sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

并创建一个新的

sudo vim /etc/pam.d/vsftpd

复制并粘贴这两行(这应该是唯一的内容)。我坚持只使用这两行,我浪费了很多时间保存原件,只是添加了这些。

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so
  1. 创建没有外壳访问权限的本地用户

sudo useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

您可以使用id命令:id vsftpd来检查它是否已创建。由于使用check_shell参数,我们使用/ bin / false shell定义了用户(即使您不使用它)。最终用户连接到FTP服务器时,将使用它们的权限和所有权:

chmodchown

  1. 重新开始 vsftpd

常见的方法是像所有守护进程一样使用init.d

sudo /etc/init.d/vsftpd restart

sudo service vsftpd restart

  1. 创建目录

根据配置,所有用户都将放置在此文件夹中:/ var / www / user1。

您需要使用特殊权限创建它们:根文件夹不可写!

 / [root = /var/www/user1] => 555
www [ /var/www/user1/www ] => 755
docs [ /var/www/user1/docs ] => 755

注意:用户无法在根目录中创建文件或文件夹。

vsftpd.conf我们chroot_local_user=YES这样的用户不能看到他的文件夹的东西之外。对他来说,服务器看起来像这样:

因此,只需运行以下命令:

mkdir /var/www/user1`
chmod -w /var/www/user1
mkdir www/user1/www
chmod -R 755 /var/www/user1/www
chown -R vsftpd:nogroup /var/www/user1

/var/www/user1文件夹已存在或连接失败。

现在,您可以尝试连接FTP

  1. 创建一个管理员用户以访问整个服务器

要创建管理员用户,我们需要向注册一个新用户htpasswd

在执行此操作之前,我建议您检入/etc/ftpusers定义了不允许与ftp连接的某些用户的文件。我认为这仅适用于本地用户,不适用于虚拟用户,以防万一不要选择此文件中包含的名称。

sudo htpasswd -d /etc/vsftpd/ftpd.passwd theadmin

现在我们需要在其中添加新行 /etc/vsftpd.conf

chroot_list_enable=YES

这意味着,除了/ etc /中的用户以外,您的用户将被放置在其文件夹中(作为监狱)。

vsftpd.chroot_list

让我们创建此文件并添加我们的用户,该文件是包含“ theadmin”的简单行。每行添加一个用户。这意味着您无需创建/var/www/theadmin文件夹,用户将登录并开始于/home/vsftpd

重新启动服务器,您就完成了!


由于强制执行local_root = / var / www / $ USER,因此已经非常僵化了。它不允许我为一个或多个用户指定一个目录。该目录通常具有不同的用途和位置,具体取决于客户端。感谢您的回复。
Avenyet

0

是的,您可以,并且为了灵活起见,创建一个userconfig目录和文件, mkdir /var/www/userconfs或者将您想要将userconfs名称更改为任何名称,然后创建一个特定文件

vi /var/www/userconfigs/ftpuseraccount

内部类型,local_root=/var/www(或您要通过目录访问的任何内容) guest_username=www-data(文件顶部的ubuntu所有者,编辑

更新后,您通过添加vsftpd.conf user_config_dir=/var/www/userconfigs(或将其替换为任何内容,此帐户将访问指定的任何sdir)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.