LAMPセキュリティを向上させる方法

Security 3月 21, 2008
(Last Updated On: 2008年3月24日)

LAMPはLinux, Apache, MySQLとPHPまたはPerl, Pythonを利用したWebシステムの総称として利用されている用語です。

特にLinux/Apache/MySQL/PHPはよく見かけるシステム構成です。ホスティングサービスを提供する会社でこの構成をサポートしていない会社を探すのが難しいくらいではないかと思います。広く使われていますが、「十分に安全な状態」と言える状況で運用されているケースはほとんどありません。

関連エントリ
LAMPのPをPHPからPerl/Python/Rubyに替えるだけではセキュリティは向上しない証拠
誤解を招く記事 – LAMPセキュリティを強化する4つの方法

脆弱性情報を収集する

全てのソフトウェアにセキュリティ上の問題が含まれている、と考えて間違いありません。利用しているソフトウェアの脆弱性情報を収集し、脆弱性がシステムに影響するか、影響する場合どの程度のリスクが予測できるか評価する事が重要です。

例えば、コミュニティ版のMySQLは有償版で提供されているセキュリティパッチが含まれていません。コミュニティ版を利用しているなら、システムに影響があるかどうか評価しなければなりません。

Apacheにも脆弱性が発見されています。明らかに脆弱性があるバージョンを利用しているサイトもありますが、脆弱性が発見されたモジュールをロードしていないのであれば、多少古いApacheを使っていても安全でしょう。

LAMPの脆弱性情報も重要ですが、LAMP上で動作しているアプリケーションの脆弱性情報の収集も書かせません。利用しているアプリケーション全ての脆弱性情報に注意する必要があります。

バージョンアップを行う

脆弱性が無いバージョンにバージョンアップするのはセキュリティ対策の基本中の基本です。

しかし、共有型のホスティングサービスはタイムリーなバージョンアップは期待できません。バージョンアップを行うと、バグフィックスやセキュリティ向上の為の仕様変更により、今まで動作していたアプリケーションが期待通りに動作しなくなる可能性があるからです。動作しなくなるとクレームになるためアップグレードは時々しか行われません。

バージョンアップにはライブラリやフレームワークのバージョンアップも含まれます。ほとんどのホスティングサービスではライブラリ/フレームワークはインストールされたままである場合が多いと思われます。

  • Linux/Apache/MySQL/PostgreSQL/PHP/Perl/Python/Rubyなどのインフラ
  • フレームワーク/ライブラリ
  • アプリケーション

全ての既知の脆弱性がシステムに影響しないように管理しなければなりません。

脆弱性が報告されていなくてもバージョンアップが可能な場合、バージョンアップを行う方が良いです。バージョンアップを行っておくと脆弱性が報告された時にシステムにとって必須の脆弱にだけは直ぐに対処する事が容易になります。

仮想プライベートサーバ以上のサービスを利用する

適切にバージョンアップを行うにはソフトウェアを自前で管理するしかありません。共有型のサービスでは適切なバージョン管理は期待できません。仮想プライベートサーバ以上のでなければ安全に運用できません。

共有型サービスの場合、バージョンアップ以外にもファイルのセキュリティなど十分なセキュリティを維持することが難しいです。

利用可能なセキュリティ対策を利用する

例えば、Perl等にはtaintモードがあります。taintモードはセキュリティ対策として完全ではありませんが、安全性向上に有用です。taintモードを有効にしてもプログラムの実行やパフォーマンスに問題ない場合は有効にすると良いでしょう。

PHPにはopen_basedir設定でPHPが開けるディレクトリを制限する機能があります。この機能も完全ではありませんが、スクリプト実行の脆弱性がある場合、ログを監視する事で被害が発生する前に脆弱性を検出する事が可能となる場合もあります。

エラーを厳格に処理することもセキュリティ対策として有用です。アプリケーションが厳格なエラーチェックを行っても動作に支障が無いのであれば、可能な限り多くのエラー情報を有効にすると良いでしょう。

SELinuxは管理が面倒と思われるかもしれませんが、既にポリシーがありtargetedモードで運用するならそれほど難しい設定なしに利用できます。

iptablesによるパケットフィルタリングは必須です。Webサーバポートなど必要なポートにのみアクセスを許可します。FTP, SSHのポートへ接続できるIPアドレスを指定できるのであれば指定すると安全性が向上します。

Linuxサーバの安全性を確保する

クラッカーにログインを許してしまうと、Linuxカーネルのローカル権限昇格脆弱性を利用してroot権限を取得されてしまう事は少なくありません。root権限を取得しカーネルレベルで動作するマルウェアをインストールする攻撃も一般的です。

リスクを可能な限り少なくするために、サーバには不要なプログラム・サービスをインストールすべきではありません。可能であればSSHとWebサーバのポート以外は閉じておくべきです。サーバにはGUIもインストールする必要はありません。Xサーバもインストールしないようにします。

Apacheのモジュールにも時々脆弱性が発見されます。デフォルトでは多くのモジュールがロードされているので不要なモジュールはロードしないようにします。PHPのモジュールも同じように不必要なモジュールはロードしないようにします。

FTPとSSHサーバのパスワードをブルートフォース方式(ユーザ名とパスワードを推測して侵入を試みる)でクラックする攻撃は非常に一般的で。FTPは可能であれば利用しないようにします。SSHは公開鍵認証のみ利用可能に設定します。秘密鍵には必ず推測が難しいパスフレーズを設定します。

sudoでsuの実行を制限したり、sudoでシェル類も実行できないよう設定します。rootのパスワードは非常に難しいパスワードを設定します。アカウントの共有は行わず、ユーザが簡単なパスワードパスワードを設定していないかパスワードクラッカーを利用して定期的に確認するようにします。パスワードの安全性確認は、FTPやSSHでパスワード認証を有効にしている場合は特に重要です。

エラーログを監視する

エラーログの監視は適切にバージョンアップを行う事と同じくらい重要です。攻撃が行われる場合、少なからず試行錯誤することが多いです。例えば、ディレクトリ遷移攻撃でファイルを不正に参照しようとすると、エラーが何度か発生します。ブラインドSQLインジェクションでデータベースの解析を行うと大量のSQLエラーが発生します。攻撃されても、エラーログを監視していると実際に被害が発生する前に対応できる場合もあります。

仮想ホストを利用する

実際にサービスを提供するシステムに仮想ホストを利用すると、バージョンアップのテストが容易になります。仮想ホストのコピーを作り新しいバージョンをテストする事が可能になります。大規模なシステムならテスト環境が完備されていますが、LAMPでOSSアプリを動かしているサイトで十分なテスト環境が整備されているケースはあまり多くないと思います。

仮想ホストを利用するには仮想プライベートサーバでなく、ホスト丸ごとかりる必要があります。

脆弱性が頻繁に発見されるアプリケーションを利用しない

このアドバイスは微妙です。脆弱性が報告されていないアプリケーションに問題が無いのではなく、セキュリティ研究者が調査していないだけの場合が多いからです。JSPWiki(JavaベースのWiki), Plone(PythonベースのCMS)等はセキュリティ研究者が調査していなかった為、最近致命的なセキュリティ問題が修正されています。脆弱性をレポートしているセキュリティ研究者がアプリケーション全体を監査する事はほとんどありません。この為、既に脆弱性が報告されているから安全とは言えない事が多いです。

しかし、あまりに頻繁にセキュリティ上の問題がレポートされるアプリケーションはアーキテクチャ上の欠陥がある場合が多いです。頻繁にセキュリティ問題が発見されるアプリケーションの利用は控えるべきです。

システム管理用のアプリケーションには十分なセキュリティ対策が施されていないアプリケーションが少なくありません。システム管理用のアプリケーションを利用する場合、HTTPのDigest認証と一緒に利用する方が良いでしょう。

パッケージを利用する

運用中のサーバには開発ツールをインストールするのはあまり好ましくありません。例えば、コマンドインジェクションに脆弱なWebアプリケーションがあり、サーバにコンパイラ等がインストールされているとカーネルのローカル権限昇格脆弱性を利用し、root権限を奪われる可能性が高くなります。パッケージを利用するとコンパイラなどの開発ツールをインストールしなくても、LAMPをインストールできます。よくメンテナンスが行き届いているディストリビューションならソースからインストールするよりタイムリーにアップデートが可能です。

色々な事情で自前でビルドしたい場合でもパッケージをカスタマイズして利用すれば比較的簡単に必要なバイナリをビルドできます。ディストリビューションのバージョンがサポートするプログラムのバージョンが古くても、互換性のあるディストリビューションから新しいバージョンのプログラムのパッケージをインポートすることも難しくはありません。

デマを信じない

「言語を替えるとセキュリティが向上する」といった趣旨の議論があります。基本的な機能が同等な言語であれば、言語を替えるだけでセキュリティが向上する事はありません。

言語を替えると、脆弱性が無いバージョンにバージョンアップした時と同じ様に、一時的にセキュリティ状態が向上します。しかし、インストールした後にバージョンアップしなければ同じ事です。

アプリを自分で作る場合はフレームワークを必ず利用する

PerlでもPHPで、サンプルスクリプトのコピー&ペーストで作られているようなサイトは100%と言ってよいくらい脆弱性があります。自分でアプリケーションを作る場合、Webアプリケーションフレームワークを利用すべきです。Webアプリケーションフレームワークを利用したからといって自動的に安全なWebアプリケーションは作れるようになりませんが、CGIインターフェースを直接利用するのと比べればはるかに容易に安全なアプリケーションが作れます。安全なアプリケーションの作り方は別途に習得する必要があります。Webアプリセキュリティ対策入門などを参考にしていただければと思います。

フレームワークを利用しても、しなくても、最も重要なセキュリティ対策は厳格な入力のバリデーションです。その次は、デフォルトで全ての出力をエスケープすることです。

既成のアプリケーションを選定する場合、入力バリデーションと出力エスケープがどのようになっているか確認するのは非常に良い選択方法だと思います。

投稿者: yohgaki