会社の本番環境をセットアップする必要がありますが、新しいアーキテクチャのコンポーネントに問題があります。
クイックドローを作成して、今日どのように行われ、明日行われるべきかをどのように理解しているかを示しました。
すべてがDebianを使用しています。
編集:すべてがクラウドに保存され、実際には小さなホスティング業者に保存されますが、DOに移行する予定です。
サーバーはインターネットにアクセスでき、NATの背後にあります。
サーバーには、その投稿の最後に記載されているようにセキュリティスタックがインストールされています。
サーバーのソフトウェアはVMに直接インストールされています。
ここのimgurのスキーマ
サーバーはプライベートネットワーク内にあります。
ApacheとMySQLはDockerコンテナ内で実行されます。
サーバーはロードバランサー/プロキシ/ファイアウォールの背後にあります。
必要に応じて、PHPコンテナーのクラスターを実行できます。
編集 imgurの新しいスキーマ 回答によると
古い質問
エントリポイントは私の問題です。プロキシ/負荷分散に使用するソフトウェアがわかりません。
2つの異なるコンテナーがあるため、Dockerをスウォームモードで使用する必要があるかどうかはよくわかりません。
すでにApacheがHTTPリクエストを処理しているため、nginxを使用する必要があるかどうかわかりません。
コンテナがインターネットにアクセスして、たとえば構成ファイル(外部のgitリポジトリに保存されているpuppetファイル)をダウンロードする方法がわかりません。
私は実際にこれについてたくさん読んでいて、(コンテナの外にデータを保存するなどの)グッドプラクティスを学ぼうとしていますが、それでも少し不明確です。
ノードで実行されている別のアプリがあり、同じスキーマを適用したいのですが、Apache/PHPコンテナーをPM2/Nodeコンテナーに置き換えるだけです。これが、負荷分散について質問している理由です。 PHPアプリの負荷分散も必要になる可能性があります。
多分私はそのアーキテクチャの更新に完全に間違っているので、今日は何が機能しているのかを維持する必要がありますか?しかし、攻撃対象領域が大きいため、2台のサーバーのセキュリティを管理する方が危険だと感じています。
CSFがデフォルトでDockerをブロックすることも聞いたので、追加のルールを作成する必要があります。回避したいのですが、スウォームモードのDockerでそのまま動作しますか?
編集:答えは私がこの点に到達するのを助けました、私が間違っているなら私を訂正してください
あなたのメッセージを理解できたら、2のスキーマに従って設定する必要があります。
最初に、ファイアウォールで着信するすべてのTCP/UDP接続をフィルタリングし、ポートをスキャンしようとするIPをブロックします。
次に、アクセスしたポートに応じてSSH/HTTP/SFTPを適切なコンテナにルーティングするプロキシを取得しました。
traefikは群れを監視できるので、何が起こっているのかを監視するのに十分だと思います。
DBへのSSHアクセスを希望しますVMプロキシからDBVMへのルートを公開しないようにSSHトンネル経由でのみ。(その方法を知っています)
Traefikを使用することで、オーケストレーターサーバーを追加し、スケールアップする必要がある数のApache + PHPコンテナーを追加できるようになりました。
Traefikは、管理下にあるサービスを監視するための優れた方法を提供します。
ログは視覚化のためにELKスタックに送信されます。 ELKスタックにセキュリティログを送信することも考えています。
いいですね ?
セキュリティに関する知識が乏しいことを許して、最善を尽くしました。
-CSF + LFD
-無人-アップグレード
-clamav
-rkhunter
-ログウォッチ
-fail2ban
-psad
-sshrootログインなし+ポートノッキング
あなたの主な目標は何ですか?
パフォーマンス
目標がパフォーマンスであり、オフライン時間をいくらか節約できる場合は、現在の設定で問題ありません。QuintilianoがDBをコンテナーで使用することについてコメントしたことは有効です。 Apacheをリバースプロキシとして使用することは管理が簡単ですが、パフォーマンスを向上させるためにHAProxyを確認できます(難しくはありませんが、慣れるまでに時間がかかります)。パフォーマンスを向上させるには、2つ以上のサーバーとロードバランサーが必要になる場合があります(ロードバランサーは単一のサーバーでは意味がありません)。接続が良好な場合は、ネットワークインターフェイスバインディングを使用して接続速度を2倍にすることができます。
セキュリティ
プロキシの前にルーターを追加することでセキュリティを向上させることができます(プロフェッショナル-高価-または経済的ですが、ユビキタス、mikrotikなどのフル機能)。あなたはそれを設定し、あなたのプライベートネットワークを保護する方法を知る必要があります。セキュリティの観点から、データベースをコンテナで実行し、パフォーマンスをいくらか失う方がよいでしょう。プロキシをコンテナに設定することもできます。使いやすいプロキシ/ロードバランサーである traefik を確認することをお勧めします。そうです、1台のサーバーは2台のサーバーよりも保守が簡単です。
冗長性(フェイルセーフ)
ダウンタイムがないことを望む場合は、設計を変更する必要があります。少なくとも2台のルーターが必要で、VRRPをセットアップします。ネットワークインターフェイスバインディングを設定し、少なくとも2台のサーバーを用意する必要があります(より多くのサーバーが最適です)。サーバーの1つに奇数のIPを送信し、他のサーバーに偶数のIPを送信するようにルーターを設定し(セッションを同期する必要がないようにします)、接続の負荷を分散します。あるサーバーから別のサーバーにファイルを同期する方法が必要になります(ファイルのアップロードなどの場合)。 nison を使用することをお勧めしますが、dockerの代わりにLXDを使用しているため、それがあなたのケースで機能するかどうかはわかりません。データベースの場合は、クラスター内に配置することをお勧めします。 Galera と maxscale を確認してください。通常、そのためには少なくとも3台のサーバーが必要ですが、 Galera Arbitrator を使用すると、2台のサーバーで実行できます。
それは唯一の道であり、多くの道があり、これが私の個人的な解決策です。
UPDATE(セキュリティについて)
真剣に、そのビジネスデータが漏洩した場合、それはどれほど悪いことでしょうか? 「致命的」とおっしゃいましたが、そうですか?私があなたにこれを尋ねる理由は、それが重要であるならば、あなたはあなた自身でこれをするべきではなく、専門のチームかセキュリティコンサルタントのどちらかでこれをするべきだからです。どれだけ本にこだわっても、十分な経験がなければ間違いの余地が常にあります(そして、このサイトで質問しているのは、それがないからですよね?)。誤解しないでください。そのデータが漏洩した場合、誰がその責任を問われるのでしょうか。私の個人的なケースでは、トップシークレットを管理していません。標準を超えるセキュリティ対策を実行して適用しようとする限り、それで十分だと思います。私があなたのセキュリティリストに見るものから、あなたは私が通常していることのほとんどをカバーしています、そして今のところ私はこれまでセキュリティ違反を持っていません(私が知っている:P)。
セットアップを改善できる提案が他にもいくつかあります。
1)データ保護:MariaDBを使用した保存データの暗号化 を確認してください。これは、データを暗号化するための非常に簡単な方法です。その主な利点は、データベースファイルが危険にさらされた場合、キーがないと役に立たないことです。キーをメモリに保存する方が、スナップショットやバックアップに保存されないため、優れています。欠点は、データベースを起動するたびにそのキーを入力する必要があることです。この暗号化方法は、誰かが実行中のインスタンスにアクセスできる場合には役に立ちません(これはデータベースにハッキングする最も一般的な方法です)。
2)アプリケーション:私の推測では、最も弱いリンクはアプリケーション層にあります。コードが適切に保護されており、XSSやSQLインジェクションなどに対して脆弱でないことを確認する必要があります。 100%になることができない場合は、非常に重要なデータをアプリケーションからできるだけ遠ざけることをお勧めします。必ず保護レイヤーを追加してください(追加の認証、データベース内の値の暗号化など)。
3)暗号化されたディレクトリ:ディレクトリの暗号化は通常、サーバーが盗まれたり、誰かがroot以外のユーザーにアクセスしたりする場合に役立ちます。
4)バックアップ:バックアップとスナップショットを保存する場所を確認してください。それらはデータベースと同じくらい重要です。サーバーがランサムウェアに感染している場合(はい Linuxでも発生する可能性があります )、バックアップは1日を節約するのに役立ちます。それらを安全な場所(制限され、暗号化され、可能であれば不変)に保管することをお勧めします。
5)ローカルネットワーク:サーバーがローカルネットワークから分離されていることを確認してください。ローカルネットワークが安全であると思い込まないでください。そのため、ローカルクライアントに特別なアクセス許可を付与しないでください。サーバーを離れた場所に隔離され、インターネット経由でのみアクセスできるかのように扱います。そうすれば、単一のエントリポイントのみを保護できます。
6)SSH:まだsshにポート22を使用している場合は、それを変更します。 sshのパスワードに加えて(そしてノックポートに加えて)クライアントキーを使用することをお勧めします。
7)パスワード:十分にテストされたパスワードマネージャーアプリケーションを使用して、すべてのサーバーパスワードを安全に保管してください。パーソナルコンピュータがハッキングされ、それらのパスワードが危険にさらされている場合は、このセキュリティ式にいくら追加してもかまいません。したがって、サーバーだけでなくパーソナルコンピュータも保護してください。 (強力なパスワードを使用していますよね?)
8)バックドア:私がロックアウトされていることが何度かありました!ですから、それはあなたにも起こり得ることを覚えておいてください。サーバーにアクセスするための追加の方法を開く場合は、それらがメインの方法と同じくらい強力であることを確認してください。サーバーに物理的にアクセスできる場合は、それほど心配する必要はありません。
9)アンチウイルス:clamAV
をあまり信用しないでください。これは悪いソフトウェアではありませんが、商用ソリューションと同じ保護はありません。メールサーバーや一部のファイルサーバー(Samba)で、よく知られているWindowsウイルスをブロックするために使用していますが、新しい脅威に関しては信頼していません。それがあなたを保護すると思い込まない方が良いです。ご存知のように、非常に小さい 既知のLinuxマルウェアのリスト です。したがって、clamAVが原因でパフォーマンスの問題が発生している場合、それがなくてもセキュリティはあまり変更されません(すでに保護している場合)他の多くの方法でサーバー)。商用ソリューションが必要な場合は、SophosとESETが適しています。サーバーに対するすべての脅威を本当に把握したい場合は、AlienVaultを試すことができます(ただし、そのためだけに追加のサーバーが必要になります)。
重要な質問:(誰かが...)
* gains access to the DB through my applications?
* gains access the containers?
* gains access to the servers as user?
* gains access to the servers as root? <-- usually this is gameover
* stole the server?
* has access to the local network?
* gains access to my 'development' computer?
ここで取り上げたポイントの多くはすでに行っていることは承知していますが、私は何も想定したくありませんでした。私の洞察がお役に立てば幸いです。ここで取り上げなかった他の推奨事項があれば、ぜひお聞かせください。
あなたのために私の2セント。
まず第一に、2番目のアプローチは良いものだと思います。公開されているサーバーは1つだけであり、セキュリティの観点から環境を維持するのは簡単です。さらに、2番目のアプローチでは、スケールアウトも簡単です。
私がやらないこと
コンテナでのMySQLの使用。 dockerはデプロイに最適なソリューションであり、非常に高速に処理できることを知っていますが、Docker + Databaseでの私の経験は良くありませんでした。 Dockerを使用してMySQLノードをデプロイするときは、MySQL DBファイルの外部永続ストレージを確保する必要があります。これは、アプリケーションに高負荷がかかっているときに、間違ったディスクとネットワークハードウェアで簡単に問題になる可能性があります。私は、DB専用の優れたVM(または必要に応じてそれ以上)を用意し、dockerを使用してこのDBに接続されているアプリケーションサーバーから大量のアプリケーションを生成することを好みます。また、DockerSwarmの2つのVMタイプの問題も解決します。さらに、puppetを使用しているため、dockerとほぼ同じくらい簡単に新しいDBノードを提供できます。
私がすること
それは、新しいことを学ぶためのツールと時間についてのあなたの知識にのみ依存します。サイトのトラフィックが1万リクエスト/秒未満の場合、箱から出してすぐに、Apacheはその仕事に適したツールです。構成と保守が簡単で、ほとんどすべての人がそれを処理する方法を知っています。負荷が増加するにつれて、より堅牢なソリューションを探す必要があります。私はHAproxyの大ファンです。ほぼ6ヶ月間使用していて、大好きです。 L7(HTTPプロキシとして)とL4(TCPプロキシとして、例:MySQLロードバランサー)プロキシ/バランサーの両方としてサーバーを提供し、多くのオプションがあり、Apacheよりもはるかに軽量です。アイデアが浮かんだらすぐに難しくはなく、簡単にスケールアウトして大量の接続を処理できます。
ApacheとHAproxyの両方で、PHPノード間で負荷を共有するロードバランサーアルゴリズムを使用できます。セッション/キャッシュ配布にはおそらくMemcache/Redisが必要であり、実装はまったく難しくありません。プロキシをチョークポイントとして使用すると、プロキシをTLSオフロードとして使用して、PHPノードの使用量を減らすこともできます。
PHPノードと同様に、ApacheとNgnixの使用はあなた次第です。繰り返しになりますが、知識と経験のあるツールを使用してください。どちらもPHPに最適なサーバーです。
ノードが構成を取得する問題に関しては、プロキシは内部ネットワークからのゲートウェイとしても機能します。負荷の増加は最小限に抑えられます(通常、本番時間後にサイトに変更を加えます)。大量のファイル/構成を転送する必要がある場合は、サイト内で使用するGIT/SVNまたはその他のリポジトリをインストールすることをお勧めします。このアプローチでは、DEV-> PRODUCTIONからファイルを1回だけ転送し、パペットまたはその他のツールでLAN内のサーバーにファイルを提供する必要があります。環境の規模にもよりますが、それは大きな勝利です。
そして最後に、セキュリティの面で。プロキシと内部サーバーに加えていくつかのWAF(Webアプリケーションファイアウォール)で回線を保持するために、古き良きIptablesをいつでも使用できます。 iptablesはWebポートでの接続のみを許可するため(VPN内の特定のオリジン/トンネルのセットに対してsshをフィルタリングします)、攻撃対象領域がアプリケーションになります。 WAFは実装が非常に面倒な場合がありますが、その方法はあります。また、このアプライアンスのアプライアンスと独自のソリューションを探すこともできます。アプリケーションログをELKやGrayLogなどに一元化し、何よりも、ディスク、メモリ、ディスクの使用量など、パフォーマンスと問題をすべて監視して、各プロキシとサーバーのリンクと接続を確認します。このようにして、クライアントが苦情を申し立て始める前に、サイトのパフォーマンスを評価し、必要なアップグレードを予測できます(常に最大の負荷に備える)。この役割にはZabixxが好きです。
お役に立てば幸いです。
[]の
与えられた答えは両方とも素晴らしいです。
ここでセキュリティの側面にポイントを追加したいと思います。
主な問題は[〜#〜] docker [〜#〜]です。
Dockerのセキュリティに対する責任は、あなたから開発チームに移ります。これはDevOpsと呼ばれます。
問題は、開発チームがパッチ、現在のJavaバージョン、およびand(管理者が気にするすべてのものですが誰も気付かない)に関してセキュリティを認識していないことかもしれません。
解決策は、開発者に新しい役割をトレーニングすることです。
これはエラーが発生しやすく、時間のかかるプロセスであるため、適切な手法でこれをサポートすることをお勧めします。これは(Dockerコンテキストでは)DevSecOpsと呼ばれます。
Dockerと統合し、ガイドラインで設定されたセキュリティを提供していないDockerコンテナを破棄するまで、完全に自動化されたセキュリティを探す製品が市場に出回っています。
それは移行プロセスに役立つかもしれません。