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

23 python lighttpd cgi amazon-ec2

如何让 EC2 微实例从 lighthttpd 提供 CGI 脚本?例如Python CGI?

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

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

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

[显然,您需要注册 Amazon EC2 并将您的密钥对保存到 *.pem 文件中。我不会讨论这个,因为亚马逊会告诉你如何去做。]

  1. 登录您的 AWS 账户并启动您的 EC2 实例。网络上有关于这样做的教程。请注意,Amazon 提供给您的默认实例大小为“小”。这不是“微型”,因此它会花费您金钱。一定要手动选择“微”。(微型实例仅在第一年免费......)

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

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

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

  5. 使用如下命令通过 ssh 连接到您的 EC2 实例:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    所以,对我来说,这是:
    ssh -i amzn_ec2_keypair.pem ec2-user@ec2-174-129-110-23.compute-1.amazonaws.com

  6. 您的 EC2 实例应该可以让您进入。

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

  1. 要安装 lighttpd,您需要对 EC2 实例进行 root 访问。问题是:亚马逊不会让您以 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

第三步:让外界看到你的服务器。

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

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

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

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

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

第 4 步:配置 lighttpd 以提供 CGI 服务。

  1. 回到控制台程序,cd 到 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. 重启你的 lighttpd 服务器:
    /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 得到了很多帮助,我很想回馈一些东西。

小智 3

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

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

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

    http://your-site/a/path/your_script.cgi~
Run Code Online (Sandbox Code Playgroud)

(这是将 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/" )
Run Code Online (Sandbox Code Playgroud)

这需要 lighttpd 的 cgi 和 alias 模块。