我完全是 Apache 菜鸟,经过一番苦思冥想和咬牙切齿,终于在被动模式下获得了对新 EC2 实例的 SFTP 访问权限。只能以“ec2-user”或“root”身份登录,无需密码,但不能使用我的用户名和/或密码...我在 /home/admin、/home/ec2-user 和 /home/myusername 目录中创建了一个 .htaccess 文件...我调整了 /etc/httpd/conf/httpd.conf、/etc/vsftpd/vsftpd.conf,并根据这些调整更改了 AWS 安全组设置和端口/协议,并为上述每个用户目录创建了 .ssh/authorized_keys 文件。我无法通过 FTP 客户端(Filezilla)从本地计算机拖放到 EC2 实例,因此显然,虽然我可以以 ec2-user 身份登录,但我没有写入权限。怀疑我需要 chown...什么的?
我使用这里推荐的 vsftpd 设置
关于我需要进行哪些更改以便 1) 以“myusername”而不是“ec2-user”或“root”身份通过 Filezilla 登录,您有什么想法吗?
附言:我已经安装了大多数相关的 AWS 命令行工具并且可以运行......
答案1
您提到(并且可能混淆)了一些不同的事情 - 因此不幸的是,您的目标并不十分明确。
- SFTP - 不存在“被动 SFTP” - SFTP 协议与 FTP 完全不同,由 /usr/libexec/openssh/sftp-server(在 /etc/ssh/sshd_config 中设置)处理,而不是 vsFTPd
- Apache .htaccess 文件与 FTP 无关 - 它们定义了您的 Web 服务器如何传递内容(即向您的网站访问者)的规则。
- 您是否尝试使用 FTP 转到 SFTP?
- 您是否尝试从 /home/admin、/home/ec2-user 等位置提供网站服务?在 Amazon 的 Linux 上,Apache 的默认 Web 根目录是 /var/www/html。通常,您会将内容添加到那里,或者您必须更改 httpd.conf 中的 DocumentRoot。
可以设置 vsFTPd 使用本地用户。操作如下:
- 设置 local_enable=YES 和 chroot_local_user=YES (vsftpd.conf)
- 创建系统用户(useradd)(使用 /sbin/nologin 作为 shell) - 用户将被限制在其主目录中(上面的 chroot 指令)
- 设置密码(passwd)
- 重新启动 vsftpd 以使配置更改生效
- 通过 FTP(不是 SFTP)登录
对于 SFTP(不使用 vsftpd!):
- 将 /usr/libexec/openssh/sftp-server 附加到 /etc/shells
- 使用 shell /usr/libexec/openssh/sftp-server 创建新用户
- 为新用户设置密码
- 通过 SFTP 登录。在这里,您不会被限制在您的主目录中,但无法写入您的用户没有权限的位置
现在您面临的权限问题:
- 首先,不要因为无法写入目录而去更改文件的权限或所有权。大多数目录归 root 所有,并且只有所有者可以写入。
- 对于 Web 服务器,请限制您的权限 - 644(rw-r--r--)或更少 - (组和其他人不需要写权限;并且在大多数情况下没有人需要执行权限)
- 将文件所有权设置为与运行 Web 服务器的用户相同,就像使用动态文件(例如 PHP)一样。
因此,您的选择是:
- 从用户的主目录(而不是 /var/www/html)提供文件 - 保持用户的 chroot 状态,并将 httpd.conf 中的 DocumentRoot 设置为指向正确的路径。这是一种很好的(安全的)方法,但通常所做的更改是将用户的主目录设置为 /var/www/html 下的路径(例如,对于拥有自己网站的多个人,/var/www/html/USERNAME - 并相应地设置 DocumentRoot)
- 授予您的 Apache 用户 FTP/SFTP 访问权限 - 这听起来合理,但使用 FTP 尤其不安全。
- 使用 SCP 并将您的用户切换为 root(sudo) - 它有其用途,但不能用于将文件保存到 Web 服务器目录 - 所有创建的文件都归 root 所有
我的建议是使用带有证书的 SFTP,并且您的主目录位于 /var/www/html 下
在Amazon的Linux上添加SFTP用户的具体命令:
免责声明:使用证书比密码更安全 - 并且您应该保持 PasswordAuthentication 处于禁用状态。
#Add the shell
echo /usr/libexec/openssh/sftp-server >> /etc/shells
#Create a user with the shell, I have not setup a home folder
useradd -M -s /usr/libexec/openssh/sftp-server USERNAME
#Set the password
passwd USERNAME
Edit /etc/ssh/sshd_config:
Change: PasswordAuthentication no to PasswordAuthentication yes (line 69), save and quit
#Restart SSH
service sshd restart
要将用户限制在一个目录(即 chroot):
由于 sftp-server 不会在你的 chroot 路径中,我们需要更改它:更改(在 sshd_config 中):
Subsystem sftp /usr/libexec/openssh/sftp-server
到:
Subsystem sftp internal-sftp
将以下内容添加到 sshd_config 的末尾(例如,用 /var/www 替换路径):
Match User USERNAME
ChrootDirectory /path/to/restrict/to
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp
Match
重新启动 SSH:
service sshd restart