我在 Amazon 上有一个运行 LAMP 和 WordPress 网站的 Ubuntu 服务器。我创建了一个名为 ftpuser 的用户,该用户将通过 SFTP 协议从 FTP 客户端连接到并/var/www/html/site/
对其拥有权限。
- 我已经创建了 SSH 密钥,并且用户连接到他的
/home/ftpuser/
文件夹。 我已经设置了
usermod -m -d /var/www/html/site/ ftpuser
复制
/home/ftpuser/.ssh/
到/var/www/html/site
。我将所有权设置为 ftpuser。- 已添加
ftpuser
到www-data
群组。
但这对我来说不起作用。FTP 用户甚至没有连接。用户实际上只连接了用户的初始主目录。
我是否必须将的所有权更改/var/www/html/site/
为ftpuser
,但在这种情况下,WordPress 网站是否会因为www-data
设置为运行 Apache 而停止工作,或者我错了?
在一些手册中这样说:
chmod ug+w /var/www/html/site/
chmod g+s /var/www/html/site/
setfacl -d -m g::rwx /var/www/html/site/
我不确定这是否会对我有帮助,而且我不想错误配置目录并停止网站的工作。
有什么帮助吗?以下是有关目录的一些信息:
ls -l /var/www/html/
drwxr-xr-x 12 www-data www-data 4096 Jan 29 13:16 site
ls -al /var/www/html/site/
drwx-w---- 2 ftpuser www-data 4096 Jan 29 13:16 .ssh
ls -l /var/www/html/site/.ssh/
-rw-r--r-- 1 ftpuser www-data 407 Jan 29 13:16 authorized_keys
-rw------- 1 ftpuser www-data 1675 Jan 29 13:16 id_rsa
-rw-r--r-- 1 ftpuser www-data 406 Jan 29 13:16 id_rsa.pub
getfacl /var/www/html/site/
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/site/
# owner: www-data
# group: www-data
user::rwx
group::r-x
other::r-x
getfacl /var/www/html/site/.ssh/
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/site/.ssh/
# owner: ftpuser
# group: www-data
user::rwx
group::-w-
other::---
解决了。就我而言,我还必须这样做:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
答案1
首先,您说“FTP 用户甚至没有连接”。如果用户收到类似这样的错误Connection timed out
,则很可能是防火墙/iptables 出了问题,您需要先修复它。SFTP 使用与 SSH 相同的 TCP 端口:默认情况下为 22。
其次,出于安全原因,普通用户的主目录通常由用户自己(正常情况)或 root(特殊用途用户)拥有。此外,为了访问其主目录,用户至少需要拥有 x (目录访问) 权限,授予其主目录的所有(祖父)父目录,直至根目录。如果这些要求不满足,sshd
可能会认为存在违规行为并禁止该用户登录(shell 和 SFTP)。如果 SFTP 客户端成功收到服务器的主机密钥,但随后断开连接,则可能正在发生这种情况。
sshd
还要求用户的主目录、所有(祖父)父目录一直到根目录、子目录.ssh
和authorized_keys
其中的文件都是不可写否则,sshd
将认为任何“授权密钥”都是由其他用户插入的,并且不会信任他们。将用户的主目录放在 HTTP 服务器子树的中间会使满足这些要求变得更加困难。
如果系统启用了 SELinux 或其他额外的安全措施,尝试将用户的主目录放入非标准位置可能需要额外的步骤。通常,只需创建指向 主ftpuser
目录的符号链接,指向站点的实际位置,就会容易得多。用户需要处理一个子目录,但这通常是可以忍受的。
我建议首先将用户的主目录位置恢复正常:
usermod -d /home/ftpuser ftpuser
然后创建符号链接:
ln -s /var/www/html/site /home/ftpuser/site
然后开始测试。首先尝试让 FTP 用户至少进行连接:检查服务器的日志以查看是否建立了网络连接。然后确保 SSH 密钥身份验证有效。只有在此之后才需要担心文件权限。您最好就这些问题单独写一个问题。
如果你希望ftpuser
只看到网站的内容而不看到系统的其他部分,那就是一种特殊情况:那就是chrooted SFTP 帐户sshd
并且它有一些额外的要求,具体取决于系统中使用的版本。ftpuser
将用户限制在其标准主目录中可能会更容易,然后使用绑定挂载:
mkdir /home/ftpuser/site #empty directory for a mount point
mount -o bind,rw /var/www/html/site /home/ftpuser/site
与符号链接类似,这只是另一种与 chroot 兼容的方式,将ftpuser
站点目录“视为”其主目录的子目录:它根本不会影响站点的操作。
(符号链接不能从 chroot jail 内部指向外部世界,但绑定挂载可以使 jail 内其他文件系统的部分可访问。)
设置由非 root 用户维护的网站目录树时,可能需要考虑多个访问类别:
- a) 您希望 Web 服务器和维护人员均可读取但无法修改的目录和文件:这可能包括特权 CGI 脚本或网站基础设施的其他类似部分。
- b) 您希望网站维护者可以修改但只有 Web 服务器可以读取的目录和文件:即使入侵者发现新的 WordPress 漏洞或其他攻击媒介,这也是您希望保护其免遭破坏的静态内容。
- c) 需要由 WordPress 和/或作为 Web 服务器一部分运行的其他进程以及站点维护者修改的目录和文件。这基本上是 WordPress 及其管理的所有内容。
- d) WordPress 可修改的目录和文件仅有的默认情况下,WordPress 会自动确保其数据库文件受到这样的保护。
类别 a) 和 b) 中的文件和目录很简单:它们可以由任何用户/组拥有以外 www-data
. 唯一的要求是他们可读由www-data
用户定义,并且世界可读/可访问的权限位将覆盖这一点。
类别 a) 中的文件和目录可能由用户 root、组 root 拥有,并具有-rw-r--r--
与常规文件、-rwxr-xr-x
可执行文件和drwxr-xr-x
目录相同的权限。
如果您的网站包含 b) 类文件,您可能需要创建第二个组wwwadmin
并让其ftpuser
也成为该组的成员。对于该组,重要的是www-data
用户不是成员。
b) 类别中的文件和目录将归用户ftpuser
(或任何人)、组所有wwwadmin
,并-rw-rw-r--
具有常规文件、-rwxrwxr-x
可执行文件和drwxrwxr-x
目录的权限。
如果 Apache 作为www-data
用户,WordPress 和/或任何其他站点组件创建的任何新文件都将归用户www-data
、组所有www-data
。由于您ftpuser
已经是该组的成员www-data
,因此您只需确保在类别 c) 中所有文件都具有基本权限 rw-rw-r-- 和任何目录权限 drwxrwxr-x。这意味着将组写入权限添加到所有文件,并www-data
配置 Apache 和/或 WordPress 以使用umask 002
。在 Ubuntu 中,我认为可以在文件中设置 Apache umask。WordPress/etc/apache2/envvars
可能会覆盖 Web 服务器默认的 umask,因此您可能需要单独配置它。
要使该www-data
组拥有的所有文件和目录都具有正确的组访问权限,请运行以下命令:
find /var/www/html/site -group www-data -exec chmod g+rwX {} \+
您可能还希望将setgid
权限位添加到用户拥有的所有目录www-data
,以确保添加到其中的所有新文件和子目录都将自动归该www-data
组所有,即使该组不是添加文件/目录的用户的主要组:
find /var/www/html/site -type d -group www-data -exec chmod g+s {} \+
这会将组权限更改drwxrwxr-x
为drwxrwsr-x
,并且无需在添加任何新文件后ftpuser
手动使用。chgrp www-data
如果您将默认umask
设置更改为ftpuser
002(如果尚未更改),则他们创建的任何新文件默认都具有组写入权限。这有助于修改类别 c) 文件,并且不会影响常规 Ubuntu 中的任何其他文件。当然,他们的 SFTP 客户端可能会尝试在传输文件时维护文件的现有权限,这可能需要在客户端进行一些调整。
如果要允许ftpuser
操作 d) 类文件,则用户需要知道,只要他们对文件所在目录具有写权限,并且该文件可读,他们就始终可以通过复制该文件然后删除原始文件来取得该文件的所有权。