问题描述
我需要能够将虚拟用户添加到只能访问子文件夹的 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。我的观点是我需要能够逐个用户选择哪个文件夹和子文件夹。
我找到了添加用户以查看整个结构或设置用户命名文件夹的方法,这对我来说都没有用。
我在这里发现了一个类似的问题:
How to setup VSFTPD for multiple users including adding specific directories
但它推荐 proftpd
,但我认为它通常不太安全。还是我错过了这里的重点?
最佳答案
经过一番尝试,我设法想出了一个半解决方案(不完美但足够好)
使用 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
中定义的虚拟用户启用登录,并将禁用本地用户
接下来我们需要为这些虚拟用户添加一个用户来使用。这些用户将无权访问 shell,将被称为 vsftpd
useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
用户必须匹配 vsftpd conf 文件中的 guest_username=vsftpd
定义目录访问
这里重要的一行如下
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
次佳答案
试试这本手册。也许会为你工作。
怎么做
安装 vsftpd 和 PAM 库
编辑 /etc/vsftpd.conf
和 /etc/pam.d/vsftpd
使用自定义目录创建用户帐户(例如在 /var/www/中)
使用正确的 chmod
和 chown
设置目录
创建对服务器具有完全访问权限的管理员用户
-
安装
vsftpd
(非常安全的 FTP 守护程序)和libpam-pwdfile
以创建虚拟用户
我想创建 FTP 用户,但不想添加本地 unix 用户(没有 shell 访问权限,没有主目录等)。 PAM(可插入身份验证模块)将帮助您创建虚拟用户。
sudo apt-get install vsftpd libpam-pwdfile
-
编辑
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
-
注册虚拟用户
要注册用户,您使用 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
-
在
/etc/pam.d/vsftpd
中配置 PAM
同样,您需要备份原始文件
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
-
创建没有 shell 访问权限的本地用户
sudo useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
您可以使用 id 命令检查它是否已创建:id vsftpd。由于 check_shell 参数(即使您不使用它),我们使用 /bin/false shell 定义用户。当最终用户连接到 FTP 服务器时,他们将用于权利和所有权:
chmod
和 chown
。
-
重启
vsftpd
常见的方法是像所有的守护进程一样使用 init.d
sudo /etc/init.d/vsftpd restart
sudo service vsftpd restart
-
创建目录
根据配置,所有用户都将放置在此文件夹中:/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
-
创建一个管理员用户来访问整个服务器
要创建管理员用户,我们需要使用 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
中启动。
重启服务器,大功告成!