Amazon AWS EC2 微实例上的 Python CGI——操作方法!

Amazon AWS EC2 微实例上的 Python CGI——操作方法!

如何让 EC2 微型实例通过 lighthttpd 提供 CGI 脚本?例如 Python CGI?

好吧,花了半天时间,但我已经使用 lighttpd 服务器在免费的 Amazon AWS EC2 微型实例上运行了 Python cgi。我认为将所有步骤放在一个地方会帮助我的新手同伴。有了以下简单的步骤,您只需 15 分钟即可完成设置!

对于阅读本文的更有经验的用户,我的问题是:我所做的事情是否存在安全漏洞?(请参阅文件和目录权限。)

步骤 1:启动您的 EC2 实例并通过 ssh 进入。

[显然,您需要注册 Amazon EC2 并将密钥对保存到 *.pem 文件中。我不会详细介绍这一点,因为 Amazon 会告诉您如何操作。]

  1. 登录您的 AWS 账户并启动您的 EC2 实例。网上有关于如何操作的教程。请注意,亚马逊向您提供的默认实例大小为“小”。这不是“微型”,因此需要花钱。请务必手动选择“微型”。(微型实例仅在第一年免费……)

  2. 查找正在运行的实例的公共 DNS 代码。为此,请单击仪表板顶部窗格中的实例,最终您将看到底部窗格中填充了“公共 DNS”字段。(您可能需要稍微摆弄一下。)公共 DNS 看起来像这样:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. 启动您的 Unix 控制台程序。(在 Max OS X 上,它被称为终端,位于应用程序 -> 实用程序文件夹中。)

  4. cd 到桌面系统上包含您的 AWS 密钥对的 *.pem 文件的目录。

  5. 使用以下命令 ssh 到你的 EC2 实例:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    因此,对我来说,这是:
    ssh -i amzn_ec2_keypair.pem [email protected]

  6. 您的 EC2 实例应该允许您进入。

第 2 步:将 lighttpd 下载到您的 EC2 实例。

  1. 要安装 lighttpd,您需要在 EC2 实例上具有 root 访问权限。问题是:Amazon 不允许您以 root 身份登录。(至少不是直接登录。)但有一个解决方法。输入以下命令:
    sudo /bin/bash

  2. 系统提示符将从 $ 变为 #。直到整个过程的最后一步,我们才会退出“sudo”。

  3. 安装 lighttpd 应用程序(对我来说是版本 1.4.28-1.3.amzn1):
    yum install lighttpd

  4. 为 lighttpd 安装 FastCGI 库(不是需要,但为什么不呢?):
    yum install lighttpd-fastcgi

  5. 测试你的服务器是否正常运行:
    /etc/init.d/lighttpd start

步骤3:让外界看到您的服务器。

  1. 如果您现在尝试从桌面上的浏览器访问服务器,则会失败。原因:默认情况下,Amazon AWS 不会为您的 EC2 实例打开任何端口。因此,您必须手动打开端口。

  2. 在桌面浏览器中转到 EC2 仪表板。单击左侧窗格中的“安全组”。右上方窗格中将显示一个或多个安全组。选择启动实例时分配给 EC2 实例的安全组。

  3. 右下角窗格中会出现一个名为“允许的连接”的表格。弹出菜单会让您选择“HTTP”作为连接方法。

  4. 表格中该行的其他值应为:tcp、80、80、0.0.0.0/0

  5. 现在从浏览器的桌面访问您的 EC2 实例的服务器。使用您之前使用的公共 DNS 地址通过 SSH 登录。您应该会看到 lighttpd 通用网页。如果您看不到,我帮不了您,因为我是个菜鸟。:-(

步骤4:配置lighttpd来提供CGI服务。

  1. 回到控制台程序,进入 lighttpd 的配置目录:
    cd /etc/lighttpd

  2. 要启用 CGI,您需要取消注释 < modules.conf > 文件中的一行。(我本来可以启用 Fast CGI,但循序渐进是最好的!)您可以使用“ed”编辑器执行此操作,如下所示:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. 创建 CGI 程序所在的目录。(/etc/lighttpd/lighttpd.conf 文件确定该目录的位置。)我们将在默认位置创建目录,因此我们不必编辑任何配置文件:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. 快完成了!当然,你需要将一个测试 CGI 程序放入 cgi-bin 目录中。下面就是其中一个:
    cd cgi-bin
    ed
    a
    #!/usr/bin/python
    print "Content-type: text/html\n\n"
    print "<html><body>Hello, pyworld.</body></html>"
    .
    w hellopyworld.py
    q
    chmod 655 hellopyworld.py

  5. 重新启动 lig​​httpd 服务器:
    /etc/init.d/lighttpd restart

  6. 测试您的 CGI 程序。在桌面浏览器中,点击此 URL,替换您的 EC2 实例的公共 DNS 地址:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    对我来说,这是:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

第 5 步:就这样!清理,然后感恩!

  • 要退出之前给出的“sudo /bin/bash”命令,请输入:
    exit

  • 致谢:非常感谢:

    wiki.vpslink.com/Install_and_Configure_lighttpd

    www.cyberciti.biz/tips/lighttpd-howto-setup-cgi-bin-access-for-perl-programs.html

    aws.typepad.com/aws/2010/06/building-three-tier-architectures-with-security-groups.html

  • 祝你好运,朋友们!我很抱歉这个“问题”太不传统了,但我从 Stackoverflow 得到了太多帮助,所以我很想回馈一下。

答案1

(奇怪的帖子,所以希望这不会是一个奇怪的回复)。

关于安全漏洞:将 cgi-bin 脚本存储在 Web 服务器的文档根目录中被认为是一种普遍的不良做法。甚至 W3C 在其“编译语言(如 C)是否更安全……”中也避而不谈这一点。万维网安全常见问题解答

考虑以下场景。为了方便起见,您决定使用 .cgi 扩展名向服务器标识 CGI 脚本。稍后,您需要对解释的 CGI 脚本进行小幅更改。您使用 Emacs 文本编辑器打开它并修改脚本。不幸的是,编辑在文档树中留下了脚本源代码的备份副本。虽然远程用户无法通过获取脚本本身来获取源代码,但他现在可以通过盲目请求 URL 来获取备份副本:

    http://your-site/a/path/your_script.cgi~

(这是将 CGI 脚本限制到 cgi-bin 并确保 cgi-bin 与文档根目录分开的另一个很好的理由。)

这种威胁不像在文档根目录中写入文件那样严重。但是,攻击者可以获得 cgi 的源代码,设计针对它的定向攻击,并将其用作进入服务器的垫脚石。

为了缓解这种情况,您可以将以下行添加到 lighttpd.conf(或其中的某些变体),以将 cgi-bin 指向与 /var/www/lighttpd 文档根目录不同的目录。

$HTTP["url"] =~ "/cgi-bin/" { cgi.assign = ( "" => "" ) }
alias.url = ( "/cgi-bin/" => "/usr/lib/cgi-bin/" )

这需要 lighttpd 的 cgi 和 alias 模块。

相关内容