如何让 EC2 微型实例通过 lighthttpd 提供 CGI 脚本?例如 Python CGI?
好吧,花了半天时间,但我已经使用 lighttpd 服务器在免费的 Amazon AWS EC2 微型实例上运行了 Python cgi。我认为将所有步骤放在一个地方会帮助我的新手同伴。有了以下简单的步骤,您只需 15 分钟即可完成设置!
对于阅读本文的更有经验的用户,我的问题是:我所做的事情是否存在安全漏洞?(请参阅文件和目录权限。)
步骤 1:启动您的 EC2 实例并通过 ssh 进入。
[显然,您需要注册 Amazon EC2 并将密钥对保存到 *.pem 文件中。我不会详细介绍这一点,因为 Amazon 会告诉您如何操作。]
登录您的 AWS 账户并启动您的 EC2 实例。网上有关于如何操作的教程。请注意,亚马逊向您提供的默认实例大小为“小”。这不是“微型”,因此需要花钱。请务必手动选择“微型”。(微型实例仅在第一年免费……)
查找正在运行的实例的公共 DNS 代码。为此,请单击仪表板顶部窗格中的实例,最终您将看到底部窗格中填充了“公共 DNS”字段。(您可能需要稍微摆弄一下。)公共 DNS 看起来像这样:
ec2-174-129-110-23.compute-1.amazonaws.com
启动您的 Unix 控制台程序。(在 Max OS X 上,它被称为终端,位于应用程序 -> 实用程序文件夹中。)
cd 到桌面系统上包含您的 AWS 密钥对的 *.pem 文件的目录。
使用以下命令 ssh 到你的 EC2 实例:
ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>
因此,对我来说,这是:
ssh -i amzn_ec2_keypair.pem [email protected]
您的 EC2 实例应该允许您进入。
第 2 步:将 lighttpd 下载到您的 EC2 实例。
要安装 lighttpd,您需要在 EC2 实例上具有 root 访问权限。问题是:Amazon 不允许您以 root 身份登录。(至少不是直接登录。)但有一个解决方法。输入以下命令:
sudo /bin/bash
系统提示符将从 $ 变为 #。直到整个过程的最后一步,我们才会退出“sudo”。
安装 lighttpd 应用程序(对我来说是版本 1.4.28-1.3.amzn1):
yum install lighttpd
为 lighttpd 安装 FastCGI 库(不是需要,但为什么不呢?):
yum install lighttpd-fastcgi
测试你的服务器是否正常运行:
/etc/init.d/lighttpd start
步骤3:让外界看到您的服务器。
如果您现在尝试从桌面上的浏览器访问服务器,则会失败。原因:默认情况下,Amazon AWS 不会为您的 EC2 实例打开任何端口。因此,您必须手动打开端口。
在桌面浏览器中转到 EC2 仪表板。单击左侧窗格中的“安全组”。右上方窗格中将显示一个或多个安全组。选择启动实例时分配给 EC2 实例的安全组。
右下角窗格中会出现一个名为“允许的连接”的表格。弹出菜单会让您选择“HTTP”作为连接方法。
表格中该行的其他值应为:tcp、80、80、0.0.0.0/0
现在从浏览器的桌面访问您的 EC2 实例的服务器。使用您之前使用的公共 DNS 地址通过 SSH 登录。您应该会看到 lighttpd 通用网页。如果您看不到,我帮不了您,因为我是个菜鸟。:-(
步骤4:配置lighttpd来提供CGI服务。
回到控制台程序,进入 lighttpd 的配置目录:
cd /etc/lighttpd
要启用 CGI,您需要取消注释 < modules.conf > 文件中的一行。(我本来可以启用 Fast CGI,但循序渐进是最好的!)您可以使用“ed”编辑器执行此操作,如下所示:
ed modules.conf
/include "conf.d\/cgi.conf"/
s/#//
w
q
创建 CGI 程序所在的目录。(/etc/lighttpd/lighttpd.conf 文件确定该目录的位置。)我们将在默认位置创建目录,因此我们不必编辑任何配置文件:
cd /var/www/lighttpd
mkdir cgi-bin
chmod 755 cgi-bin
快完成了!当然,你需要将一个测试 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
重新启动 lighttpd 服务器:
/etc/init.d/lighttpd restart
测试您的 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 模块。