これは 標準的な質問 LAMPスタックの保護についてです
LAMPサーバーを保護するための絶対的なガイドラインは何ですか?
Davidの答えは、サーバー強化の一般原則の良い基準です。デビッドが示したように、これは大きな問題です。採用する具体的な手法は、環境とサーバーの使用方法に大きく依存します。警告、これをテスト環境で構築して正しく実行するには、多くの作業が必要になる場合があります。その後、実稼働環境、さらに重要なのはビジネスプロセスに統合するための多くの作業が続きます。
ただし、最初に、組織に強化ポリシーがあるかどうかを確認します。強化ポリシーが最も直接的に関連する可能性があるためです。そうでない場合は、役割によっては、これらを構築する絶好の機会かもしれません。また、各コンポーネントにボトムアップで個別に取り組むことをお勧めします。
L
あなたを助けるために利用できる良いガイドがたくさんあります。このリストは、ディストリビューションによっては役立つ場合とそうでない場合があります。
A
Apacheはセキュリティで保護するのが楽しい場合があります。私は、ApacheやPHPよりOSを強化して使いやすさを維持する方が簡単だと思います。
M
P
これは、独自の規律であるセキュアプログラミングプラクティスの全体的なアイデアに真っ向からぶつかります。 SANSとOWASPには、この件に関する馬鹿げた情報が含まれているので、ここでは再現しません。ランタイム構成に焦点を当て、残りは開発者に任せます。 LAMPの「P」はPerlを指す場合もありますが、通常はPHPを指します。私は後者を想定しています。
あなたは非常に率直に言って、このトピックに関する数冊の本に値する質問をしました。しかし、うまくいくいくつかの一般的な基本的なガイドラインがあります:
あなたが始めるのに役立つことを願っています。
ここに、私が始めたい良いチェックリストがあります。
Davidの提案に加えて、インストールがよりモジュール化されているため、特定のユーザー/グループへのアクセスを1つのタスク用に特別に作成し、それらのスコープを制限することで、LAMPスタックの安全性が高まります。例として、Apacheユーザーがいます。アクセス許可が適切に設定され、重要なシステムファイル/フォルダーにアクセスできるグループに属していないApacheファイル/フォルダー用。提供するWebサイトに関連付けられているMySqlテーブルにアクセスできるユーザーと、それらのテーブルのみ。さらに、アクセスを制限して、PHP呼び出しからの最小量のアクセスを与えることができます。また、MySQLユーザー名がPHP =ファイルは別のユーザーに使用されているのと同じユーザー名またはパスワードではありません。
これが意味すること:ApacheユーザーまたはMySqlユーザーのいずれかが危険にさらされた場合、Apacheがアクセスできるフォルダーの範囲外(Apacheユーザーの場合)とテーブルの外で害を及ぼすことはできません( s)/ database(s)(MySQLデータベースのユーザーの場合)。
どういうわけか、MySQLユーザーが危険にさらされた場合、彼らは、たとえば、データベースにアクセスして、MySQLからすべてのデータベースを削除し、すべてのデータを破壊することができませんでした。状況によっては、隔離されたデータベースのテーブルを削除したり、テーブルに情報を挿入したりできる場合があります。そのため、絶対に必要な場合にのみテーブルアクセスを許可し、必要な権限のみを許可することが重要です...テーブルの削除特権または更新特権を持っている必要があり、それらをそのユーザーに与えないでください。
また、何らかの理由でMySQLの管理アカウントのユーザー名とパスワードが見つかった場合、システム上のユーザー名とは異なるユーザー名を使用すると、データベースにアクセスして損害を与える前に、システムのセキュリティを破る必要があります。 Apacheユーザーとファイルへのアクセスについても同じことが言えます。
時間例!アイデアを簡単にするためのシステム例を紹介します。
システムにユーザーがいるとします(rootはumod -lやpasswd -lなどのセキュリティを確保するために無効にする必要があります):john、barney、terence、Lisa。
mySQLでbigbirdという名前のユーザーを作成できます(必ずハッシュ化パスワードを使用してください)。 Bigbirdには選択権限と更新権限しかありませんが、ドロップや作成はできません。さらに、MySQLデータベースで作業するためにgarfieldという名前の別の管理MySQLユーザーを作成し、rootユーザーを削除しますMySQLデータベースから変更して、妥協できないようにします。 garfieldには、MySQL全体で。特権が付与されています(事実上、これはルートの名前を変更するだけです)。
ここで、Apacheグループまたはユーザーを作成し、apweb2と呼びます。 Appweb2は他のグループのメンバーではなく、Apacheのすべてのファイル/フォルダーは/ home/apweb2 /に保存されます。各仮想ホストには独自のサブフォルダーがあり、これらの各ホストにはそのサブフォルダーに設定されたドキュメントルートがあります。システムの残りの部分へのアクセスを誤って提供しないために、シンボリックリンクは無効になります。
また、sshアクセスを特定のユーザーのみ(または特定のグループ、sshグループに入れて、sshを使用できる唯一のものにする)に制限することもできます。
また、Sudo権限を持つユーザーを選択して、さらに制限することもできます。あなたがそれをさらに進めることができるもう1つのステップは、sshユーザーがSudoを実行できないようにすることです.sshを使用できないSudoを使用できる特別なユーザーを作成できます。そのため、sshにログインしたら、別のユーザーにログインする必要がありますSudoへのアクセス。
したがって、各セグメントをモジュール化することで、1つが危険にさらされてもスタック全体が危険にさらされることはなく、最初からやり直す必要がなく、1つの問題を解決できます。
SANS.orgからのこのドキュメントは本当に役に立ちました http://www.sans.org/score/checklists/linuxchecklist.pdf
現時点では、コンテナー仮想化、つまりDocker、systemd-nspawn、およびそれらが構築されているコンテナー仮想化のメカニズム(名前空間、cgroup)を無視しないでください。コンテナーの仮想化を使用すると、プロセスを分離できます。たとえば、サービスの1つが侵害された場合、攻撃者は他のサービスにアクセスできません。
LAMPの場合、たとえば、SSHサーバー、Apache、MySQL、PHP-FPM/Python/Perl/etcを備えた4つのDockerコンテナーを使用できます。