web-dev-qa-db-ja.com

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

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

さて、半日かかりましたが、Python cgiをlighttpdサーバーを使用して無料のAmazon AWS EC2マイクロインスタンスで実行しています。仲間の初心者がすべてを置くのに役立つと思います手順は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ファイルがあるデスクトップシステムのディレクトリに移動します。

  5. 次のようなコマンドを使用してEC2インスタンスにsshします。
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    だから、私にとって、これは:
    ssh -i amzn_ec2_keypair.pem [email protected]

  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します。
    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プログラムをテストします。デスクトップのブラウザーで、EC2インスタンスのパブリックDNSアドレスを置き換えて次のURLにアクセスします。
    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

  • 頑張って、amigos!この「質問」の非伝統的な性質をお詫び申し上げますが、Stackoverflowから非常に多くの助けを得て、何かを返したいと思っていました。

23
user595585

(奇妙な投稿なので、うまくいけば、これは奇妙な返信にならないでしょう)。

セキュリティ上の欠陥に関して:cgi-binスクリプトをWebサーバーのドキュメントルート内に保存することは、一般的な悪い習慣と見なされています。 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モジュールとエイリアスモジュールの両方が必要です。

3
Jeff Stice-Hall