![如何为 vsftpd 设置能够访问特定子目录的虚拟用户?](https://linux22.com/image/978082/%E5%A6%82%E4%BD%95%E4%B8%BA%20vsftpd%20%E8%AE%BE%E7%BD%AE%E8%83%BD%E5%A4%9F%E8%AE%BF%E9%97%AE%E7%89%B9%E5%AE%9A%E5%AD%90%E7%9B%AE%E5%BD%95%E7%9A%84%E8%99%9A%E6%8B%9F%E7%94%A8%E6%88%B7%EF%BC%9F.png)
我需要能够向 vsftpd 添加仅有权访问子文件夹的虚拟用户。我想使用虚拟用户的原因是我只希望服务器上有 1 个真实用户。
FTP结构为:
www
website_name1
sub_folder1
website_name2
sub_folder2
sub_folder3
website_name3
website_name4
主帐户有权访问 www 文件夹及其所有子目录,我想添加一个可以访问子文件夹1并且仅子文件夹1
另外为了避免混淆,我还要求另一个用户访问子文件夹3并且仅子文件夹3。我的观点是我需要能够根据用户选择文件夹和子文件夹。
我找到了添加用户来查看整个结构或设置用户命名文件夹的方法,但这两种方法对我来说都没用。
我发现这里发布了类似的问题:
但它建议proftpd
我这样做,但我认为这样做总体上不太安全。
还是我错过了重点?
答案1
经过一番尝试,我终于想出了一个半解决方案(虽然不完美,但足够好了)
使用 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
用户必须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
您现在应该能够以用户 1 的身份登录,并且只能查看
var/www/website_name1/sub_folder1
其中的任何文件夹和文件。
就这样,您现在可以添加任意数量的用户,并限制他们对您希望的任何文件夹的访问。
需要记住的是,如果您不创建用户配置文件,它将默认以 root 身份使用 var/www 文件夹(在上面的示例中)
如果子文件夹希望由用户修改,则可能需要更改共享子文件夹的所有者:
chown vsftpd:nogroup /var/www/website_name1/sub_folder1
答案2
尝试一下本手册。也许会对你有用。
怎么做
安装 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
- 在中配置 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
- 创建没有 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
。
重新启动服务器就完成了!
答案3
除了 @Avenyet 和 @2707974 的答案之外,您还可以使用更安全的方式来创建虚拟用户密码文件(/etc/vsftpd/ftpd.passwd
)。除了使用命令之外,htaccess
您还可以使用包mkpasswd
中的命令whois
(至少在 Ubuntu 上)。mkpasswd
不会像那样为您更新密码文件htaccess
,它只会生成密码哈希。因此,您需要自己创建和更新密码文件。
幸运的是,密码文件语法非常简单,它仅由冒号分隔的用户名和密码哈希组成,每个用户一行。例如:
user1:6Gshac7jdk01U
这是密码foo
,使用基本的加密哈希算法。
Linux crypt 支持比基本 des crypthtaccess
和命令使用的 md5更好的哈希算法openssl passwd
。使用mkpasswd -m help
查看您crypt
支持的算法列表。在当今的系统上,最好的算法是 SHA-256 或 SHA-512。与默认 des crypt 哈希(也htaccess
使用)不同,它们使用密码中的所有字符,与 des 和不同,openssl passwd
它们具有可配置的轮数。
轮数越多,计算哈希值所需的时间就越长,如果攻击者获得密码哈希值的访问权限,则反转哈希值的难度就越大。对于不在公共互联网上的服务器,我会建议选择尽可能高的轮数,但哈希值计算的时间不要太长,因此少于 0.1 秒。如果服务器在互联网上,这可能会成为拒绝服务向量,因为有人可能会尝试使用随机密码进行大量登录并耗尽 CPU 资源。如果这对您的配置来说是一个风险,您应该使用较低的值。
SHA 变体的默认值为 5000,这个数字相当低。我在我的安装中使用了 100000(不可公开访问)。
要生成这样的哈希,请输入mkpasswd -m sha-512 -R 100000
。这将要求您输入密码并打印出哈希。使用 passwd 文件中的哈希,而不是简单的加密哈希,如下所示:
user1:$6$rounds=100000$HRZdUPD8$GVBmHg91rjNm.WlcMCcLp41Ewz6XXJ1ktKzS8Zmr8cmyVGR28URVY1A9N3Nz4W9zl6lDGjwVbz94N/JQVSGOh/
哈希值中嵌入了哈希类型和轮数,因此crypt
可以看到使用哪种方法来检查密码。甚至可以在单个密码文件中混合不同类型的哈希。这些密码文件可用于当前提供的/etc/vsftpd/ftpd.passwd
最高安全级别crypt
。对于其余配置,我参考了其他答案。
(我仍在等待crypt
支持更好的密码哈希算法,如 scrypt 或 Argon2 变体之一。)
答案4
是的,你可以,为了灵活性,创建一个用户配置目录和文件,
mkdir /var/www/userconfs
或者任何你想更改的用户配置名称,然后创建一个特定的文件
vi /var/www/userconfigs/ftpuseraccount
内部类型,local_root=/var/www
(或任何你想通过目录访问的内容)
guest_username=www-data
(文件顶部编辑的 ubuntu 所有者
更新 vsftpd.conf 后,添加user_config_dir=/var/www/userconfigs
(或将其替换为其他任何内容,此帐户将访问您指定的任何 sdir)