LinuxでのApacheのMySQL PHP WebサーバーのルートLAMP〜12の対策の安全な
ハッキングの頻度は数ヶ月で劇的に増加している。 特に大量のデータは、Webサーバー上のハッキングによってピックアップすることができます。 さらにソニーのPSNハックは、Apache Web Serverのパッチを適用していない脆弱性を利用した。 だからここに私は、サーバが外部からの攻撃を少し安全に所有できる措置を高めています。 もちろん、これはまた、100%の保護を提供していませんが、それは悪者がゲームをもう少し難しくすることをお勧めします。 対策の一部は、最小限のインストールとメンテナンスが必要になります。 その他キャッチするPHPの時間と多くの知識を必要としています。 あなたは、常にセキュリティ対策の選択の費用便益比に注意を払う必要があります。 それは連邦準備銀行のような小さな、プライベートサイトを保護するためにも意味がありません。 ただし、システムにいくつかの特定の変更は、すでに大きな意味より高いセキュリティを持っています。 そして、あなたは手遅れになる前であっても扱うことを....
すべてのヒントやCodesnipsは現在のDebianボックスを参照してください。
最初の ファイアウォール-一度すべてを禁止する
それらのデフォルトのインストールでほとんどのLinuxディストリビューションは絶対に必要ではありません外に任意のポートを開きます。 このような状況は、しかし、すぐに変更することができた場合でもサーバ
遊んで、物事をしよう。 突然、さらにメディアサーバーは、インターネットやデータベースをリスニングしている
インターネットからの接続を受け入れます。 したがって、自分自身を訓練し、基本的に外部からいったんすべての接続を禁止し、唯一の(自己)選択された化合物を可能にする非常に制限のあるファイアーウォールを置くために間違ったことはありません。 幸いなことに、これはiptablesで迅速に行われます。 このような方法では、もはやそこにはビジネスを持たない世界にアクセスできるようにするサービスを提供することはできません。 残念ながら、あなたは少し慰めを支払う - ファイアウォールは、新しいサービスを提供したいすべての時間を調整する必要があります。 それにもかかわらず、努力は小さく、メリットは大きい。
#/ bin / bashを #既存のテーブルを削除します。 iptablesの-F #すべての着信接続を禁止する iptablesの-PのINPUT DROP iptablesの-P FORWARD DROPを #すべての発信を許可する iptablesの-pの出力はACCEPT #SSHを許可する iptablesのINPUT-jのACCEPTは-p tcp - dportは22 #HTTPを許可する iptablesのINPUT-jのACCEPTは-p tcp - dportは80 たとえば、#さらにサービス(UDP)を許可し、ゲームサーバー iptablesのINPUT-jのACCEPTは-p tcp - dportは4534 #localhostからの接続をすべて許可します。 (サーバー自体に妨げられることなくアクセスできるようにするには、そのサービス、 #たとえば、ローカル·データベース上でのPHP iptablesのINPUT-S 127.0.0.1-jのはACCEPT #すでに確立された接続は、各ポートで受け入れられる #(いくつかのデーモンでは必須) iptablesのINPUT-mの状態 - 状態がESTABLISHED、RELATED-jのはACCEPT
この小さなバックボーンは、我々は、単に独自のサービスを展開し、追加し続けることができます。 ファイアウォール上で作業するときは、常に自分自身をロックアウトした場合の規定を確認する必要があります。 特に、物理的なアクセスを持っていないために、リモートサーバーに対して、それが失敗したファイアウォールの独自のアクセスを支配することによって失うことは非常に迷惑です。 邪魔にこの問題を回避するためには、リセットされ、ファイアウォール、数分ごと、またはサーバが再起動するだけでcronジョブを一時的にファイアウォールで開始するための作業を残すことができます。 ルールは、後でテストされ、愛されて、cronジョブが非アクティブになり、新しいルールは永久にアクティブのままになります。
サービスだけで周りに自分のサーバにリッスンしているかを調べるには、netstatコマンドを使用することができます。
#TCPソケットの場合: は、netstat-LPN | grepのtcpを #同様に、UDPのために: は、netstat-LPN | grepをUDP
ファイアウォールが実際に動作するかどうかをテストするには、別のコンピュータから、独自のサーバをポートをスキャンすることができます。 すべてが働いてそれが開いている唯一の偶数ポートになる必要があります。
#TCPの場合: nmapの-P1-65 535 meinserver.de #UDPの場合: nmapの-SU-P1-65 535 meinserver.de
2番目の SSHログインの禁止
独自のルートサーバー上では、完全なSSHアクセスを持っています。 これはちょうどそれを動作するように任意のSSHクライアントからサーバー倍にすることができますように、非常に便利です。 これの欠点は、コースは残念ながら何とか自分のパスワードを引き継いでいる人誰でもできることです。 それだけで有効なキーファイルを使用してSSHログインを許可する非常に安全です。 したがって、サーバーへのクライアントの公開鍵とコピーされたインタラクティブなログインはパスワードを入力して、無効になっています。
#クライアントでは、公開鍵を作成する パスワードを生成するときに指定した#場合は、1つのことを行う必要があり #キーとパスワードは、後でファイルをログに記録します。 そうでなければ #キーだけを必要としていました。 ssh-keygenに-tをRSA #サーバに生成されたキーをコピーします。 sshのコピー-ID-I〜/。sshを/ id_rsa.pub root@meinserver.de #今サーバー上のsshd_configを調整するの/ etc / ssh / 。 。 PasswordAuthenticationをしなく 。 。 #その後、再びRearBBposを開始 は/ etc / init.d / sshを再起動
でも、ここで1つは、何かが動作しない場合でも、シャットアウトしないように予防措置を取る必要があります。
悪者は、シェルを取得するためのあなたの頭の中で対応するパスワードを使用したUSBスティック上の公開鍵は、それが非常に困難になります。
3番目の SSHは、のdenyhostsを防ぐBruteforcing
アドバイスは、実用的な2ではありません、あなたがパスワードベースのログインが必要の利便性をあきらめていない場合は、少なくともサーバー上で攻撃者の自動化されたパスワード率を防ぐことができます。 インターネット上のボット、多くの終日は、SSHサーバへのより多くの何もしないで、あなたの様々なパスワードで試してみたい。 合理的にセキュアなパスワードを使用してそれが可能だしない場合であっても、大きな問題ではありませんが、より良い感じがあります。 サーバとユーザアカウントに存在する場合だけでなく、それはまた、そのユーザーを保護します。 ここでは、安全なパスワードを使用するユーザーに頼ることはできません。 のdenyhostsは常に見直され、ユーザのsshログインは間違って繰り返される彼らのパスワードを入力してしばらくの間、ロックされます。 IPのユーザーの一時的に彼らはもはやへのアクセスが可能ではありませんので、/ etc / hosts.denyファイルに入ります。 このSSHは非常に有望な非常に長いではなく、タスクにBruteforcing。
apt-getのインストールのdenyhosts #のdenyhostsは、インストール直後に動作します。 それはすることができます #ファイル/ etc / denyhosts.conf微調整で
第四 既知の問題IPを遮断するために使用されるブラックリスト
様々なインターネットのブラックリストにみじん切り/刑事/スパム/詐欺の多数のサーバーをリストする、維持されます。 これらのIPリストは、から、これは信頼されたコンピュータに自身のサーバにまったく接続できないないことが知られているように、ファイアウォールに直接入力することができます。 彼のロシアのプロキシが突然動作を停止しますので、そのようにあなたは、劇的に自分のサーバ上でスパムの量を減らすと、1つまたは他のスクリプトキディは、ロックアウトすることができます。 私が行ったことを行う方法別のブログ記事に Infiltrated.netのブラックリストの例を説明する。
第五 サーバ上で動作するFTPを使用しないでください。
FTPは、インターネットがまだ信頼された小さな村だった良い時代の遺物です。 ウェブサイトの管理者の多くは、まだサーバーにファイルを転送するFTPを使用したり、独自のウェブサイト上で動作する。 FTPはセキュリティ保護されていないすべてのデータを送信するので、残念ながら、これは、非常に不透明である。 パスワードとデータはサーバーとクライアント間の各ホップでも問題なく読み取ることができます。 SSHFSで行く方が、はるかに安全。 あなたがリモートサーバーのローカルファイルシステム上のssh経由でディレクトリをマウントすることができます。 彼はローカルコンピュータ上に存在していたかのように、サーバ上で動作することができます。 すべてのファイルは、サーバー上のファイルへのアクセスを完全に透過的であるので、直接サーバー上で画像を編集するには、ローカルグラフィックスプログラムで開き、保存することができます。 多くの努力をすることなく、より快適性と安全性。
#sshfsをインストールします。 apt-getでインストールsshfsの #ローカルファイルシステム上のマウントポイントを作成します。 します。mkdir /メディア/ myserverを ローカルファイルシステムのマウントに#サーバ SSHFS www-data@mein-server.de :/ var / wwwに/メディア/ myserverを #ここでディレクトリは/メディア/利用できるmyserverの下の私のローカルサーバー上の/ var / wwwです。
第六 アップデートをインストール
超安全なシステムは、システム自体が欠陥があると知られている脆弱性が悪用されることができれば助けにはなりません。 ほとんどのケースでは、これらの脆弱性はすぐに閉じたが、しばしばようにシステムの管理を定期的に更新を忘れてしまった。 あなたは、Linuxサーバー上で自動更新を有効にするか争点ではないかどうかを指定します。 それは自然に多くの不運旅は、システムが使用できなくなることがあるかもしれないのでいくつかは、決してしないだろう。 これはDebianシステム上での仕事の10年以上に私に起こったが、決して、私は、結果として得られるリスクよりもはるかに高く、タイムリーかつ定期的なアップデートの恩恵を感謝しています。
/ etc / crontabに位この行は、午前6時に毎日、システムクロックを更新 0 6 ***ルートapt-get updateを実行する&& apt-getの-yをアップグレード
これらの速くて汚い方法では、これまで常に良い私のために働いた。 私は最近、Debianのリポジトリとのパッケージで無人アップグレードは、おそらくもっとエレガントな問題を解決するその存在しますが、私がテストされていないことを読んでください。
さらにこれらのvollautomtischenシステムのアップデートでそれは完全にオフフックではありません。 カーネルのアップデートが配信されている場合は、手動で再びまだシステムをブートする必要があり、それ以外の変更は有効になりません。
我々はこのようなオープンソースCMSやフォーラムなど、サーバー上でサードパーティのPHPコードを使用している場合、それはもちろん、日付の新しいバージョンアップで絶対に必要な、このコードです。 Debianは、このマニュアル労働者をカバーするルールの中でそれらのアプリケーションにその変更を更新しませんので、必要とされています。 常に最新の状態であるために対応する製品を使用してメーリングリストを読むための最良の方法。
第七 open_basedirを持つPHPは投獄
Manyハックは、PHPコード内の脆弱性がサイトに属していないファイルシステムへのアクセスのファイルにアクセスするために使われているという事実に基づいていますが、あなたはそれが特に指定されたディレクトリでのみ読み取りれるように、PHPをロックして書き込むべき理由システム自体は、ことができました。 このために、php.iniのopen_basedirの設定オプション。 PHPがディレクトリにのみ許可されるアクセスを置くためのオプションがあります。 / etc / passwdなどのファイルは手の届かないところにある。 つのサーバ上で複数のWebサイトをホスティングすることは、それぞれの側に、各仮想ホストの設定でopen_basedirを設定する必要があります。
:VIA#グローバルphp.iniの #/ Etc/php5/apache2/php.ini open_basedirの=は/ var / www / :/ TMP / VirtualHostの設定で#パーサイト: 意味を有するopen_basedirの/ var / www /のサイト:/ / TMP /
それはすべてのサイトが通常アクセスする必要のあるスクリプトに追加されているかどうか検討することが重要です、それ以外の場合は、PHPアプリケーションの障害者や合法的な関数である可能性があります。
第八 MySQLユーザのためにあなた自身のウェブサイトを作成します。
あなた自身のPHP-MySQLアプリケーションを使用するには、絶対にApllikation独自のMySQLユーザのために作成し、いかなる状況下でMySQLのrootユーザの要求を使用する必要があります。 また、PHPスクリプトを必要とする、これまでのところ実際には操作は許可されているユーザーの権限を制限する必要があります。 CREATE TABLEとDROP TABLEはSQLインジェクションのように一般的であり、必要なことはありませんほとんどのPHPアプリケーションで使用されます。 これは、サーバー上で複数のデータベースで複数のWebサイトをホストし、すべてのユーザー用に独自のデータベースを作成する必要があります。 したがって、攻撃が成功した後、攻撃者はデータベースのいずれかへのアクセス権を持っていると直接ではなく、まったく。 あなたがMySQLユーザアカウントを管理するコマンドラインを試してみたくない場合は、ユーザー管理は、タブ "権利"の下にphpMyAdminのとは非常に簡単に機能します。
第九 PHPのエラーメッセージをオフ
PHPのエラーメッセージは、攻撃者が独自のサーバーについて多くを明らかにすることができます:ディレクトリ構造、データベース構造、構成エラー、等彼らはまた非常に専門外のユーザーを探します。 このような理由から、彼らはあなただけでログに表示され続けるつもりですので、常にオフにし、稼動中のWebサーバ上にある必要があります。
:VIA#グローバルphp.iniの #/ Etc/php5/apache2/php.ini =オフdisplay_errorsを VirtualHostの設定で#パーサイト: display_errorsをオフ要望に対して #エラーメッセージは、とにかくそれをお読みください。 猫/ var/log/apache2/error.log | grepはPHP
第十 ModSecurityは使用したSQLインジェクションの制限の対象
SQLインジェクションは、Webサーバに対する攻撃の最も頻繁に使用される方法です。 Webアプリケーションを介して直接アクセスし、それはそれらを実行するためにブラウザを満たしています。 ここで、そのデータベースのすべてでそれらを読んだり編集したり削除するデータベースユーザの権限に送信されるSQLクエリを構築されたユーザー変数によって送信されます。 SQLインジェクションに対する本当の本物の保護は、PHPのコードはこれらの攻撃に関連したサイトに書かれた場合にのみ存在します。 SQLクエリに得ることができ、ユーザの入力から、各変数は、それはテストしてエスケープする必要があります。 PHPは関数real_mysql_escape_string()を提供しています。
あなたはコードがクリーンであるかどうかわからない場合は、Apacheのmod_securityはとにかく、これらの攻撃を大量にかわすことができます。 mod_securityは定数見直し、Webサーバーへのすべての要求と、多くのSQLインジェクション攻撃をブロックすることができ、事前のパターンに対応しています。 残念ながら、唯一のmod_securityをマニュアル作業でうまく動作します。 多くの場合にも必要な新規インストールのmod_securityをブロックした後、PHPコードの(正規)関数なので、完全なアプリケーションを再度インストールをテストするとして1つは、他に選択肢がないこと。 唯一、1つは、mod_securityでも機能をブロックしたくない場合がありますかどうかを調べません。 もしそうであれば、調整するフィルタのリストは、偽陽性のように消えてしまいます。
mod_securityの設定は多少複雑ですが、この記事の範囲を超えていますが、インターネット上でmod_securityの優れたチュートリアルのトンがあります。
第11回 IDチェック- Apacheは、彼がだれであるかを知らない
これは、ハッキングに対して本当に効果的な方法ではありません、それはサーバのバージョンを探している自動化スクリプトを作成しますが、若干重い。 エラーメッセージ(例えば、404見つかりません)、そのサーバーのシグネチャを持つページへの通常のApacheを指しています。
www.daniel-ritter.deポート80でApache/2.2.16(Unix)サーバ
これは、任意の潜在的な侵略の前にeigesetzten Webサーバーとバージョンレベルについて少なくとも一度受信しますがなくなります。 署名サーバはすぐにオフにされています。
#/ Etc/apache2/conf.d/security オフServerSignatureは
第12回 Apacheモジュールを無効にする使用しないでください。
デフォルトでは、Apacheは必要ありませんほとんどないされているいくつかのモジュールをロードしています。 Debian上であなたは、読み込み済みのモジュールを見つけることができます
/でソフトリンクとしてetc/apache2/mods-enabled。
ほとんどの場合削除することができます。
mod_cgiへ
CGIスクリプトを実行するために使用されます。 このテクニックは、Webの黎明期にまで遡り、動的なWebサイトを可能にするために近代的なスクリプト言語の祖先だった。 mod_cgiには、PHPサイトの99%は不要であり、障害のあるApacheで設定潜在的なセキュリティホールです。
a2dismod CGI
mod_statusが
Apacheのステータス情報を読み取るためにブラウザを許可します。 それはほとんど "正常な"サイトに使用されることはありません、攻撃者が、Apacheのステータス情報を提供します。
a2dismod状況
mod_autoindexの
適切なディレクトリ内の有効なインデックスページがない場合で、mod_autoindexは、ディレクトリがWebサーバー上に表示されることを保証します。 この機能は必要でない場合は、Webサーバー上のディレクトリツリー全体が外部から見えることができるので、あなたはそれを無効にする必要があります。
a2dismodのautoindex
