Amazon AWS EC2マイクロインスタンス上のPython CGI —ハウツー!


23

EC2マイクロインスタンスでlighthttpdからCGIスクリプトを提供するにはどうすればよいですか?たとえば、Python CGI?

まあ、それは半日かかりましたが、lighttpdサーバーを使用して、無料のAmazon AWS EC2マイクロインスタンスでPython cgiを実行しています。仲間の初心者がすべてのステップを1か所にまとめるのに役立つと思います。以下の簡単な手順で準備を整えれば、セットアップに15分しかかかりません。

これを読んでいる経験豊富なユーザーに対する私の質問は、私がやったことにセキュリティ上の欠陥はありますか?(ファイルおよびディレクトリの許可を参照してください。)

ステップ1:EC2インスタンスを起動して、sshを実行します。

[明らかに、Amazon EC2にサインアップして、キーペアを* .pemファイルに保存する必要があります。Amazonがそれを行う方法を教えてくれるので、これについては触れません。]

  1. AWSアカウントにサインインし、EC2インスタンスを開始します。Webにはこれを行うためのチュートリアルがあります。Amazonが提示するデフォルトのインスタンスサイズは「小さい」ことに注意してください。これは「マイクロ」ではないため、費用がかかります。必ず手動で「マイクロ」を選択してください。(マイクロインスタンスは最初の1年間のみ無料です...)

  2. 実行中のインスタンスのパブリックDNSコードを見つけます。これを行うには、ダッシュボードの上部ペインでインスタンスをクリックすると、最終的に下部ペインに「パブリックDNS」フィールドが表示されます。(少し調整する必要があるかもしれません。)パブリックDNSは次のようになります。
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Unixコンソールプログラムを起動します。(Max OS Xでは、ターミナルと呼ばれ、アプリケーション->ユーティリティフォルダーにあります。)

  4. AWSキーペアを含む* .pemファイルがあるデスクトップシステムのディレクトリにcdします。

  5. 次のようなコマンドを使用してEC2インスタンスにsshします。
    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:EC2インスタンスにlighttpdをダウンロードします。

  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ダッシュボードに移動します。左ペインの[セキュリティグループ]をクリックします。右上のペインに1つ以上のセキュリティグループが表示されます。インスタンスを起動したときにEC2インスタンスに割り当てられたものを選択します。

  3. 「許可された接続」というテーブルが右下のペインに表示されます。ポップアップメニューを使用すると、接続方法として「HTTP」を選択できます。

  4. テーブルのその行の他の値は、tcp、80、80、0.0.0.0 / 0である必要があります。

  5. ブラウザのデスクトップからEC2インスタンスのサーバーにアクセスします。以前にSSHで使用したパブリックDNSアドレスを使用します。lighttpdの汎用Webページが表示されます。あなたがそうしなければ、私はそのような初心者なので私はあなたを助けることができません。:-(

ステップ4:CGIを提供するためにlighttpdを構成します。

  1. コンソールプログラムに戻り、lighttpdの構成ディレクトリに移動します。
    cd /etc/lighttpd

  2. CGIを有効にするには、<modules.conf>ファイルの1行のコメントを解除します。(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ディレクトリに配置する必要があります。以下がその1つです。
    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

  • 頑張って、アミゴス!この「質問」の非伝統的な性質をおizeび申し上げますが、Stackoverflowから多くの助けを得て、何かを返すことに熱心でした。


4
ガイドを投稿してくださったことを称賛しますが、質問をするのはSOです。これにはblogspotまたは同様のものをお勧めします。返事をしたい場合は、質問に答える必要があります:)

「方法」には暗黙的な質問、つまり「Xをどうやってやるの?」が含まれていることを提出します。将来は質問を明確に述べますが、最初はつまらないように見えました。しかし、それは検索エンジンを助け、読者の混乱を避けるかもしれないので、今は価値があると思います。ありがとう。

そのようなハウツーを投稿することは、新しいメンバーからとても親切です。とにかく、まだ尋ねられていない質問に答えます。ちなみに、それは数日前に必要な情報を提供してくれましたが、今ではこの種のサービスの存在を知っています。ちなみに、クラウドについて多くのことを話しているとき、この投稿は多くの人々にとって非常に役立つと思われます。だから彼は落胆するに値しない、私は賛成だ。

@ user595585承認されたプラクティスは、「How do I」と質問し、自分で答えることです。そのようにして、あなたはあなたの問題に対してより多くの担当者を得ることさえできます。FAQをご覧ください。「Jeopardyにいるふりをしている限り、自分の質問をしたり答えたりするのもまったく問題ありません。質問の形でそれを表現してください。」
C.ロス

3
@user編集は、あなたの質問それはそうある質問は、その後、あなたが提供するすべての詳細と、それに答えます。また、これらの括弧の一部をドロップします。これはLispではなくEC2でのPythonのホスティングについてです。
食い物

回答:


3

(奇妙な投稿ですので、これが奇妙な返事にならないことを願っています)。

セキュリティ上の欠陥に関しては、Webサーバーのドキュメントルート内にcgi-binスクリプトを保存することは一般的に悪い習慣と考えられています。W3Cでさえも、World Wide Web Security FAQの「Cなどのコンパイルされた言語は安全です...」の下にありません。

次のシナリオを検討してください。便宜上、.cgi拡張子を使用してサーバーに対してCGIスクリプトを識別することにしました。後で、解釈されたCGIスクリプトに小さな変更を加える必要があります。Emacsテキストエディターで開き、スクリプトを変更します。残念ながら、編集により、スクリプトのソースコードのバックアップコピーがドキュメントツリーに残っています。リモートユーザーはスクリプト自体を取得してソースコードを取得することはできませんが、盲目的にURLを要求することでバックアップコピーを取得できるようになりました。

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

(これは、CGIスクリプトをcgi-binに制限し、cgi-binがドキュメントルートから分離されていることを確認するもう1つの理由です。)

これは、ドキュメントルート内にファイルを書き込む機能ほど重大な脅威ではありません。しかし、攻撃者は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モジュールの両方が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.