在亚马逊云服务器上设置FTP

265

我正在尝试在Amazon云服务器上设置FTP,但是一直没有成功。

我在网上搜索了很多,但没有找到确切的步骤。

我找到了这些命令需要运行:

$ yum install vsftpd
$ ec2-authorize default -p 20-21
$ ec2-authorize default -p 1024-1048
$ vi /etc/vsftpd/vsftpd.conf
#<em>---Add following lines at the end of file---</em>
    pasv_enable=YES
    pasv_min_port=1024
    pasv_max_port=1048
    pasv_address=<Public IP of your instance>
$ /etc/init.d/vsftpd restart
但是我不知道在哪里编写它们。

10
此问题应该迁移到 serverfault.com。 - Jérôme Verstrynge
12个回答

578

Jaminto已经很好地回答了这个问题,但我最近自己经历了这个过程,想要扩展一下Jaminto的答案。

我假设您已经创建了一个EC2实例,并将弹性IP地址与其关联。


步骤#1:安装vsftpd

SSH连接到您的EC2服务器。输入以下命令:

> sudo yum install vsftpd

这应该会安装vsftpd。

第二步:打开EC2实例上的FTP端口

接下来,你需要在EC2服务器上打开FTP端口。登录到AWS EC2管理控制台,从左侧导航树中选择“安全组”。选择分配给你的EC2实例的安全组。然后选择“Inbound”选项卡,再点击“编辑”:

enter image description here

添加两个自定义TCP规则,端口范围为20-21和1024-1048。源可以选择“任何地方”。如果你决定将源设置为自己的IP地址,请注意如果通过DHCP分配IP地址,则您的IP地址可能会更改。

enter image description here

第三步:更新vsftpd.conf文件

通过输入以下命令来编辑你的vsftpd conf文件:

> sudo vi /etc/vsftpd/vsftpd.conf

通过更改以下行来禁用匿名FTP:

anonymous_enable=YES
为确保理解正确,您需要提供更多上下文信息和要求。当前的输入 "

to

" 翻译后可能不具备意义或缺乏完整性。请提供更多信息以便我能够更好地理解您的请求并提供准确的翻译。
anonymous_enable=NO

然后在 vsftpd.conf 文件的底部添加以下行:

pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1048
pasv_address=<Public IP of your instance> 

您的vsftpd.conf文件应该看起来像下面的示例 - 请确保用您的公共IP地址替换pasv_address:

输入图像描述

要保存更改,请按Esc键,然后键入:wq,然后按Enter键。



第4步:重启vsftpd

键入以下命令以重新启动vsftpd:

> sudo /etc/init.d/vsftpd restart

你应该会看到如下的信息:

输入图像描述


如果这不起作用,请尝试:

> sudo /sbin/service vsftpd restart

第五步:创建FTP用户

如果你查看 /etc/vsftpd/user_list 文件,你会看到以下内容:

# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

这基本上是在说:“不允许这些用户使用FTP访问。” vsftpd将允许任何未列在此列表中的用户访问FTP。

因此,为了创建一个新的FTP帐户,您可能需要在服务器上创建一个新用户。(或者,如果您已经拥有一个未列在/etc/vsftpd/user_list中的用户帐户,则可以跳过下一步。)

在EC2实例上创建新用户非常简单。例如,要创建名为“bret”的用户,请键入:

> sudo adduser bret
> sudo passwd bret

以下是将要呈现的内容:

enter image description here



第六步:限制用户访问其家目录

到这一步,你的FTP用户并没有被限制在访问它们自己的家目录中。这样不是很安全,但我们可以轻松地解决它。

通过输入以下命令编辑你的vsftpd配置文件:

> sudo vi /etc/vsftpd/vsftpd.conf

取消注释这一行代码:

chroot_local_user=YES

完成后,它应该看起来像这样:

在此输入图片描述

再次像这样重新启动vsftpd服务器:

> sudo /etc/init.d/vsftpd restart

全部完成!


附录A:在重启时保证vsftpd可用

vsftpd不会自动启动,当您的服务器重新启动时。如果您和我一样,那么这意味着在重新启动EC2实例后,FTP似乎无法使用,但实际上只是没有运行!以下是一个方便的解决方法:

> sudo chkconfig --level 345 vsftpd on

另外,如果您使用的是RedHat系统,则可以使用这个方便的图形用户界面来管理服务并控制哪些服务应该自动启动:

>  sudo ntsysv

在此输入图片描述

现在,vsftpd将自动启动,当你的服务器启动时。


附录B:更改用户的FTP主目录

* 注意:Iman Sedighi已发布了一种更优雅的解决方案,用于限制用户访问特定目录。 请参考他作为答案发布的出色解决方案 *

您可能想创建一个用户,并将其FTP访问权限限制为特定文件夹,例如/var/www。 为此,您需要更改用户的默认主目录:

> sudo usermod -d /var/www/ username

在这个特定的例子中,通常会将用户权限赋予'www'组,该组通常与/var/www文件夹相关联:

> sudo usermod -a -G www username

3
在“步骤3”中添加完文件中的行后,我该如何保存? - Sumit Bijvani
3
好的,全部完成了,现在我该如何连接到ftp? - Sumit Bijvani
7
嗨,Sumit. Vi编辑器相当棘手。要保存您的工作,请键入escape,然后输入“:wq”(不包括引号),然后按回车键。至于FTP,这很难回答,因为它将基于您的FTP客户端。如果有时间,我会尝试在我的回答中追加一些设置一些流行FTP客户端的指令。个人而言,我使用Aptana Studio。在Aptana中,您可以创建一个SFTP站点,并提供公钥认证文件给Aptana,该文件是您创建EC2实例时获得的。如果您使用Filezilla,请尝试使用pageant.exe。干杯! - clone45
6
非常优秀,表述很清晰。非常感谢你。 - cdcdcd
11
实际上,也许他可以给我点赞。他在1月13日转载了我的回答。 - clone45
显示剩余29条评论

27

要在EC2服务器上启用被动FTP,您需要配置FTP服务器应使用哪些入站连接端口,然后打开一系列可用于FTP客户端数据连接的端口列表。

我对Linux不是很熟悉,但您发布的命令是安装FTP服务器、通过AWS API配置EC2防火墙规则,然后配置FTP服务器使用您在EC2防火墙上允许的端口的步骤。

因此,以下步骤安装FTP客户端(VSFTP):

> yum install vsftpd

以下步骤配置FTP客户端:

> vi /etc/vsftpd/vsftpd.conf
--    Add following lines at the end of file --
     pasv_enable=YES
     pasv_min_port=1024
     pasv_max_port=1048
     pasv_address=<Public IP of your instance> 
> /etc/init.d/vsftpd restart

但是另外两个步骤可以更容易地在EC2安全组下的亚马逊控制台中完成。在那里,您需要配置分配给服务器的安全组以允许端口20、21和1024-1048上的连接。


我知道那些代码的意思,但是不知道在哪里输入它们... 这就是问题所在... - SharkTheDark
1
你是在安装FTP服务器的服务器上的命令行界面吗? - jaminto
2
通过SSH连接到您的服务器:http://blog.taggesell.de/index.php?/archives/73-Managing-Amazon-EC2-SSH-login-and-protecting-your-instances.html - jaminto
如果您仍然遇到错误(500 OOPS:vsftpd:拒绝在chroot内部运行可写根目录),这个链接可以解决问题:https://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/ - kaore
我很震惊匿名FTP默认是开启的! - jeffkee

16

感谢@clone45提供的好解决方案。但是,他的解决方案附录b中有一个非常重要的问题。在我将主目录更改为var/www/html后,我无法通过ssh和sftp连接到服务器,因为它总是显示以下错误

permission denied (public key)

或者在FileZilla中我收到了这个错误:

No supported authentication methods available (server: public key)

但我可以通过普通的FTP连接访问服务器。

如果你遇到了同样的错误,那么只需要撤销@clone45解决方案中的附录b,通过为用户设置默认主目录来实现:

sudo usermod -d /home/username/ username

但是当你设置用户的默认主目录时,用户将可以访问/var/www/http之外的许多其他文件夹。因此,为了保护您的服务器,请按照以下步骤进行:

1- 创建sftponly组 创建一个组,用于限制您要将其访问权限仅限于FTP和SFTP访问var/www/html的所有用户的访问。创建组:

sudo groupadd sftponly

2- 监禁 chroot 为了限制该组通过 sftp 访问服务器,您必须监禁 chroot,以防止组的用户访问其主目录中除 html 文件夹以外的任何文件夹。要做到这一点,请使用 sudo 以 vim 打开 /etc/ssh/sshd.config。 请在文件结尾处注释以下行:

Subsystem sftp /usr/libexec/openssh/sftp-server

然后在下面添加这一行:

Subsystem sftp internal-sftp

因此,我们用internal-sftp替换了子系统。然后在其下添加以下行:

 Match Group sftponly
        ChrootDirectory /var/www
        ForceCommand internal-sftp
        AllowTcpForwarding no

添加完这行后,我保存了更改并通过以下方式重新启动ssh服务:

sudo service sshd restart

3- 将用户添加到 sftponly 组 任何你想限制其访问的用户必须是 sftponly 组的成员。因此,我们通过以下方式将其加入到 sftponly 组中: sudo usermod -G sftponly 用户名

4- 限制用户访问仅限于 var/www/html 目录 为了将用户访问权限限制在只有 var/www/html 文件夹,我们需要在该用户的家目录中创建一个名为“html”的目录,然后将 /var/www 挂载到 /home/用户名/html 中,具体方法如下:

sudo mkdir /home/username/html
sudo mount --bind /var/www /home/username/html

5- 设置写入权限 如果用户需要对 /var/www/html 进行写入操作,那么您必须将该用户隔离在 /var/www 目录下,/var/www 目录的所有者和权限必须为 root:root 和 755。然后,您需要通过添加以下行将 /var/www/html 的所有权设置为 root:sftponly 并设置权限为 775:

sudo chmod 755 /var/www
sudo chown root:root /var/www
sudo chmod 775 /var/www/html
sudo chown root:www /var/www/html

6- 阻止 shell 访问 如果您想限制对 shell 的访问以提高安全性,只需按以下方式更改默认 shell 为 bin/false 即可:

sudo usermod -s /bin/false username

在您的“sudo mount --bind /var/www /home/username/html”命令中,我被告知没有www文件夹。我假设这是从根目录(即/home文件夹所在的位置)执行的? - elliotrock
1
“sudo chown root:www /var/www/html” 表示 chown: invalid group: ‘root:www’。 - elliotrock
2
第六部分最好使用sudo usermod -s /sbin/nologin username,因为vsftpd的pam模块默认限制了shell(在我的情况下似乎效果更好)。而第四部分的mount需要在每次重启时执行,所以将其放置在rc.local中是个好主意。 - phy25

11

很棒的文章...在亚马逊Linux AMI上轻松使用。

还有两个有用的命令:

更改默认FTP上传文件夹的方法

步骤1:

edit /etc/vsftpd/vsftpd.conf

步骤2:在页面底部创建一个新条目:

local_root=/var/www/html

为了使用FTP设备管理文件夹下的文件,需要对这些文件应用读取、写入和删除权限

find /var/www/html -type d -exec chmod 777 {} \;

12
将每个文件和文件夹的权限都修改为777并不安全,这对于一个网站来说是有风险的。 - sergiogx
好的。那么您建议对此进行什么更改? - Ravi Shanker
3
您应该分配所需的权限,不要将所有权限都开放给所有内容,否则您就会招惹麻烦。例如,使用chmod -R ug+rw /var/www/html将为用户和组中的所有文件授予读取和写入权限,而不会授予不需要的执行权限和其他权限。然后根据需要设置用户和组别,以便您不需要修改其他设置。如果您的FTP用户可以读取和写入所有文件,并且您的Web服务器可以读取,则您已经完成了。将这两个用户放在同一组中,并为用户添加rw权限和为组添加r权限即可。 - AaronM
你应该将775权限应用于/var/www/html目录。其余的子文件夹和文件可以根据需要获得权限。777非常不安全。 - Iman Sedighi

6

只有通过以下命令将用户添加到www组,才能使其正常工作:

sudo usermod -a -G www <USER>

这解决了权限问题。

通过添加以下内容来设置默认路径:

local_root=/var/www/html

6

如果您启用了ufw,记得添加ftp:

> sudo ufw allow ftp

我花了两天时间才意识到我启用了ufw。


或者iptables,或者...是的,我总是忘记! - jsh

4

如果您有iptables防火墙,请不要忘记更新以允许20-21和1024-1048范围的端口。

请从/etc/sysconfig/iptables中操作此项更改。

添加如下行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 20:21 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 1024:1048 -j ACCEPT

之后使用以下命令重新启动iptables:

sudo service iptables restart


4
我已经简化了clone45的步骤:
按照他提到的方式打开端口。
sudo su
sudo yum install vsftpd
echo -n "Public IP of your instance: " && read publicip
echo -e "anonymous_enable=NO\npasv_enable=YES\npasv_min_port=1024\npasv_max_port=1048\npasv_address=$publicip\nchroot_local_user=YES" >> /etc/vsftpd/vsftpd.conf
sudo /etc/init.d/vsftpd restart

2

我完全按照clone45的答案操作了一遍,这是一篇很棒的文章!由于我需要FTP访问权限来为我的WordPress站点安装插件,因此我将主目录更改为/var/www/mysitename。然后我继续像这样将我的FTP用户添加到apache(或www)组中:

sudo usermod -a -G apache myftpuser

在此之后,我在WordPress插件安装页面上仍然看到了这个错误:“无法找到WordPress内容目录(wp-content)”。在wp.org的问答会话中搜索并找到了这个解决方案:https://wordpress.org/support/topic/unable-to-locate-wordpress-content-directory-wp-content,并在wp-config.php的末尾添加了以下内容:
if(is_admin()) {
    add_filter('filesystem_method', create_function('$a', 'return "direct";' ));
    define( 'FS_CHMOD_DIR', 0751 );
}

安装成功后,我的WP插件已经成功安装。

0

也许值得一提的是,除了clone45的答案之外:

Fixing Write Permissions for Chrooted FTP Users in vsftpd

The vsftpd version that comes with Ubuntu 12.04 Precise does not permit chrooted local users to write by default. By default you will have this in /etc/vsftpd.conf:

chroot_local_user=YES
write_enable=YES

In order to allow local users to write, you need to add the following parameter:

allow_writeable_chroot=YES

注意:写权限问题可能会显示为以下FileZilla错误:

Error: GnuTLS error -15: An unexpected TLS packet was received.
Error: Could not connect to server

参考资料:
在vsftpd中修复chrooted FTP用户的写入权限
更新后VSFTPd停止工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接