如何为可以访问特定子目录的 vsftpd 设置虚拟用户?

Ave*_*yet 25 server permissions ftp vsftpd

我需要能够将只能访问子文件夹的虚拟用户添加到 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。我的观点是我需要能够按用户选择哪个文件夹和子文件夹。

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

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

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

但它建议proftpd我虽然一般不太安全。
或者我错过了这里的重点?

Ave*_*yet 33

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

使用 2707974 答案和信息,我在其他地方获得了我需要的东西。

首先你需要安装 vsftp 和 PAM

apt-get install vsftpd libpam-pwdfile
Run Code Online (Sandbox Code Playgroud)

编辑 /etc/vsftpd.conf

nano /etc/vsftpd.conf
Run Code Online (Sandbox Code Playgroud)

然后粘贴以下内容

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
Run Code Online (Sandbox Code Playgroud)

根据您的确切需求编辑虚拟用户最重要的一点是虚拟用户设置注释之后的所有内容

创建用户

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

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

mkdir /etc/vsftpd
htpasswd -cd /etc/vsftpd/ftpd.passwd user1
Run Code Online (Sandbox Code Playgroud)

添加其他用户只需省略 -c

htpasswd -d /etc/vsftpd/ftpd.passwd user2
Run Code Online (Sandbox Code Playgroud)

我只设法使用 CRYPT 使其工作,该 CRYPT 限制为 8 个字符 以使用超过 8 个字符使用 openssl 生成兼容的哈希并直接通过管道输入 htpasswd

htpasswd -c -p -b /etc/vsftpd/ftpd.passwd user1 $(openssl passwd -1 -noverify password)
Run Code Online (Sandbox Code Playgroud)

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

nano /etc/pam.d/vsftpd
Run Code Online (Sandbox Code Playgroud)

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

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so
Run Code Online (Sandbox Code Playgroud)

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

接下来我们需要为这些虚拟用户添加一个用户来使用。这些用户将无权访问 shell,将被调用vsftpd

useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
Run Code Online (Sandbox Code Playgroud)

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

定义目录访问

这里重要的一行是以下内容

user_config_dir=/etc/vsftpd_user_conf
Run Code Online (Sandbox Code Playgroud)

这意味着当user1登录时它会寻找以下文件

/etc/vsftpd_user_conf/user1
Run Code Online (Sandbox Code Playgroud)

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

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

mkdir /etc/vsftpd_user_conf
Run Code Online (Sandbox Code Playgroud)

现在创建用户文件:

nano /etc/vsftpd_user_conf/user1
Run Code Online (Sandbox Code Playgroud)

并输入以下行

local_root=/var/www/website_name1/sub_folder1
Run Code Online (Sandbox Code Playgroud)

现在重启vsftp

service vsftpd restart
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

chown vsftpd:nogroup /var/www/website_name1/sub_folder1
Run Code Online (Sandbox Code Playgroud)


270*_*974 12

试试这个手册。也许会为你工作。

怎么做

安装 vsftpd 和 PAM 库

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

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

使用正确的chmodchown

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

  1. 安装vsftpd(Very Secure FTP Deamon)并libpam-pwdfile创建虚拟用户

我想创建 FTP 用户,但我不想添加本地 unix 用户(没有 shell 访问权限,没有主目录等)。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
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

/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.

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