ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由:
Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.

代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

序章


Apache Webサーバーは、世界で最も人気のあるWebサーバーです。 さまざまなコンテキストの訪問者に静的および動的なWebコンテンツを配信するために使用できます。

動的コンテンツを生成する最も一般的な方法の1つは、CGIまたはCommonGatewayInterfaceを使用することです。 これは、さまざまなプログラミング言語で記述できるWebコンテンツを生成するスクリプトを実行する標準的な方法を提供します。

Webスペース内であらゆる種類の実行可能コードを実行するには、ある程度のリスクが伴います。 このガイドでは、suexecモジュールを使用してCGIスクリプトを実装する方法を示します。これにより、特権を不必要に昇格させない方法でスクリプトを実行できます。

前提条件


このガイドでは、標準のLAMP(Linux、Apache、MySQL、PHP)をインストールしてUbuntu12.04VPSを構成します。 これらの基本コンポーネントがすでにインストールされており、基本構成で動作していることを前提としています。

Ubuntu にLAMPスタックをインストールする方法については、ここをクリックしてください。

そのチュートリアルに続いて、初期状態のソフトウェアを参照します。

CGIスクリプトを有効にする方法


UbuntuのApache構成では、CGIスクリプトは実際には特定のCGIディレクトリ内ですでに構成されています。 このディレクトリはデフォルトでは空です。

CGIスクリプトは、WebブラウザがレンダリングできるHTMLまたはその他のオブジェクトまたは形式を出力する機能を備えた任意のプログラムにすることができます。

Apache構成ディレクトリに移動し、mods-enabledディレクトリでApacheが有効にしたモジュールを見ると、この機能を有効にするファイルが見つかります。

less /etc/apache2/mods-enabled/cgi.load

LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so

このファイルには、CGIモジュールを有効にするディレクティブが含まれています。 これにより、構成でこの機能を使用できるようになります。

モジュールはロードされますが、実際にはそれ自体でスクリプトコンテンツを提供することはありません。 特定のWeb環境内で明示的に有効にする必要があります。

デフォルトのApache仮想ホストファイルを見て、これがどのように行われるかを確認します。

sudo nano /etc/apache2/sites-enabled/000-default

ここにいる間に、ドメイン名またはIPアドレスを参照するようにサーバー名を設定しましょう。

ServerName your_domain_or_IP_addressServerAdminyour_email_address 。 . . 

ファイルには、CGIスクリプトに適用できる部分が少しあります。

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

構成のこの部分が行っていることを分析してみましょう。

ScriptAliasディレクティブは、特定のディレクトリに含まれるスクリプトを実行するためのApache権限を付与します。 この場合、ディレクトリは/usr/lib/cgi-bin/です。 2番目の引数はスクリプトディレクトリへのファイルパスを提供しますが、最初の引数/cgi-bin/はURLパスを提供します。

これは、/usr/lib/cgi-binディレクトリにある「script.pl 」というスクリプトが、次の場所にアクセスしたときに実行されることを意味します。

your_domain.com /cgi-bin/script.pl

その出力は、ページをレンダリングするためにWebブラウザに返されます。

Directoryコンテナには、/usr/lib/cgi-binディレクトリに適用されるルールが含まれています。 CGIに言及しているオプションに気付くでしょう:

Options +ExecCGI ...

ScriptAliasによってすでにCGIディレクトリとして宣言されているディレクトリのオプションを設定しているため、このオプションは実際には不要です。 でも痛くないのでそのままで構いません。

ScriptAliasの外部のディレクトリにCGIファイルを配置する場合は、次の2つのオプションをディレクトリセクションに追加する必要があります。

オプション+ExecCGIAddHandler cgi-script .pl.rb[CGIスクリプトとして扱われる拡張機能]

ファイルの調査が終了したら、ファイルを保存して閉じます。 変更を加えた場合は、Webサーバーを再起動します。

sudo service apache2 restart

テストCGIスクリプトを作成する


スクリプトを正しく実行するために必要な手順を示すために、基本的な簡単なCGIスクリプトを作成します。

前のセクションで見たように、CGIスクリプトの構成で指定されたディレクトリは/usr/lib/cgi-binです。 このディレクトリはroot以外のユーザーが書き込むことはできないため、sudoを使用する必要があります。

sudo nano /usr/lib/cgi-bin/test.pl

これはPerlスクリプトになるため、ファイルに「.pl」拡張子を付けましたが、Apacheはこのディレクトリ内の任意のファイルを実行しようとし、最初の行に基づいて適切なプログラムに渡します。

スクリプトを次のコマンドで開始して、スクリプトをPerlで解釈するように指定します。

#!/usr/bin/perl

これに続いて、スクリプト must が最初に出力するのは、生成されるコンテンツタイプです。 これは、Webブラウザが与えられた出力を表示する方法を知るために必要です。 Perlの通常の印刷機能を使用して、「text/html」であるHTMLコンテンツタイプを印刷します。

print "Content-type: text/html\n\n";

この後、Webサイトで必要なテキストを生成するために必要な機能や計算を実行できます。 この例では、単なるHTMLのように簡単ではないものは作成しませんが、スクリプトがより複雑な場合は、これにより動的コンテンツが可能になることがわかります。

前の2つのコンポーネントと実際のHTMLコンテンツを組み合わせて、次のスクリプトを作成します。

#!/usr/bin/perl
print "Content-type: text/html\n\n";

print "<html><head><title>Hello There...</title></head>";

print "<body>";
 
print "<h1>Hello, World.</h1><hr>";
print "<p>This is some regular text.</p>";
print "<p>The possibilities are great.</p>";

print "</body></html>";

ファイルを保存して閉じます。

これでファイルができましたが、実行可能としてマークされていません。 それを変えましょう:

sudo chmod 755 /usr/lib/cgi-bin/test.pl

ここで、ドメイン名、CGIディレクトリ(/ cgi-bin /)、スクリプト名( test.pl )の順に移動すると、スクリプトの出力が表示されます。

ブラウザで次の場所を指定します。

your_domain.com /cgi-bin/test.pl

次のようなものが表示されます。

Sample CGI application

あまりエキサイティングではありませんが、正しくレンダリングされます。

ページのソースを表示することを選択した場合、コンテンツタイプヘッダーを除いた、print関数に指定された引数のみが表示されます。

CGI page source

SuExecを有効にする方法


スクリプトを誰でも実行可能として設定することには、セキュリティ上の懸念が暗黙のうちにあります。 理想的には、スクリプトは1人のロックダウンされたユーザーのみが実行できる必要があります。 suexecモジュールを使用して、この状況を設定できます。

実際に、それが動作するディレクトリを構成できるようにする変更されたsuexecモジュールをインストールします。 通常、これはソースから再コンパイルしないと構成できません。

次のコマンドを使用して代替モジュールをインストールします。

sudo apt-get install apache2-suexec-custom

これで、次のように入力してモジュールを有効にできます。

sudo a2enmod suexec

次に、スクリプトファイルを所有する新しいユーザーを作成します。 複数のサイトが提供されている場合、それぞれが独自のユーザーとグループを持つことができます。

sudo adduser script_user

すべてのプロンプト(パスワードプロンプトを含む)から自由に入力してください。 このユーザーは肉付けする必要はありません。

次に、この新しいユーザーのホームディレクトリ内にscriptsディレクトリを作成しましょう。

sudo mkdir /home/script_user/scripts

Suexecでは、誰がディレクトリに書き込むことができるかを非常に厳密に制御する必要があります。 所有権をscript_userユーザーに譲渡し、他の誰もディレクトリに書き込めないように権限を変更しましょう。

sudo chown script_user:script_user /home/script_user/scripts
sudo chmod 755 /home/script_user/scripts

次に、スクリプトファイルを作成し、スクリプトをコピーして上から貼り付けます。

sudo -u script_user nano /home/script_user/scripts/attempt.pl

#!/usr/bin/perl
print "Content-type: text/html\n\n";

print "<html><head><title>Hello There...</title></head>";

print "<body>";
 
print "<h1>Hello, World.</h1><hr>";
print "<p>This is some regular text.</p>";
print "<p>The possibilities are great.</p>";

print "</body></html>";

次に実行可能にします。 script_userにファイルに対する権限のみを付与します。 これは、suexecモジュールで実行できることです。

sudo chmod 700 /home/script_user/scripts/attempt.pl

次に、Apache仮想ホスト構成を編集して、新しいユーザーがスクリプトを実行できるようにします。

デフォルトの仮想ホストファイルを開きます。

sudo nano /etc/apache2/sites-enabled/000-default

まず、CGIディレクトリを作成しましょう。 上記のようにScriptAliasディレクティブを使用する代わりに、通常のAliasディレクトリをExecCGIオプションおよびSetHandlerディレクティブと組み合わせて使用する方法を示しましょう。 。

このセクションを追加します。

Alias /scripts/ /home/script_user/scripts/
<Directory "/home/script_user/scripts">
    Options +ExecCGI
    SetHandler cgi-script
</Directory>

これにより、「/scripts」サブディレクトリに移動してCGIスクリプトにアクセスできます。 suexec機能を有効にするには、「Directory」セクションの外で、「VirtualHost」セクション内に次の行を追加します。

SuexecUserGroup script_user script_user

ファイルを保存して閉じます。

また、suexecが有効なディレクトリと見なす場所を指定する必要があります。 これは、カスタマイズ可能なバージョンのsuexecで実行できることです。 suexec構成ファイルを開きます。

sudo nano /etc/apache2/suexec/www-data

このファイルの先頭に、scriptsディレクトリへのパスを追加する必要があります。

/home/script_user/scripts/

ファイルを保存して閉じます。

これで、あとはWebサーバーを再起動するだけです。

sudo service apache2 restart

ブラウザを開いてここに移動すると、スクリプトの結果を確認できます。

your_domain.com /scripts/attempt.pl

Suexec example page

suexecが設定されていると、suexecが必要とする厳密なテストに合格しないため、通常のCGIディレクトリは正しく機能しないことに注意してください。 これは、スクリプトが持つ権限を制御するための動作を目的としています。

結論


これで、スクリプトを作成して、比較的安全な方法で実行できます。 CGIスクリプトは、動的コンテンツをサイトにすばやく含めるのに非常に役立ちます。 Suexecを使用すると、この機能をロックダウンしてセキュリティを強化できます。

suexecを使用するときは注意してください。正しく構成されていない場合、実際にはセキュリティの脆弱性が増える可能性があります。 このセットアップの潜在的な脆弱性について知るには、setuid構成を調べてください。

ジャスティン・エリングウッド