7サーバーを保護するセキュリティ対策

前書き

インフラストラクチャをセットアップするとき、多くの場合、アプリケーションをセットアップして実行することが主な関心事になります。 ただし、インフラストラクチャのセキュリティニーズに対応せずにアプリケーションを正しく機能させると、将来的に壊滅的な結果を招く可能性があります。

このガイドでは、アプリケーションの設定前または設定時に設定するのに最適な基本的なセキュリティ対策について説明します。

SSHキー

SSHキーは、パスワードベースのログインの代替としてSSHサーバーへの認証に使用できる暗号化キーのペアです。 認証の前に秘密鍵と公開鍵のペアが作成されます。 秘密鍵はユーザーによって秘密にされ、安全に保たれますが、公開鍵は誰とでも共有できます。

image:https://assets.digitalocean.com/articles/7_security_measures/1-ssh-key-auth.png [SSH Keys diagram]

SSHキー認証を設定するには、ユーザーの公開キーをサーバー上の特別なディレクトリに配置する必要があります。 ユーザーがサーバーに接続すると、サーバーはクライアントに秘密鍵が関連付けられていることの証明を要求します。 SSHクライアントは、秘密鍵を使用して、秘密鍵の所有権を証明する方法で応答します。 サーバーは、パスワードなしでクライアントに接続させます。 SSHキーの機能の詳細については、https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process [こちら]の記事をご覧ください。

セキュリティをどのように強化しますか?

SSHを使用すると、パスワード認証を含むあらゆる種類の認証が完全に暗号化されます。 ただし、パスワードベースのログインが許可されている場合、悪意のあるユーザーは繰り返しサーバーへのアクセスを試みることができます。 最新のコンピューティング能力を使用すると、これらの試行を自動化し、適切なパスワードが見つかるまで組み合わせて組み合わせを試みることにより、サーバーへのエントリを取得することが可能です。

SSHキー認証をセットアップすると、パスワードベースの認証を無効にできます。 通常、SSHキーにはパスワードよりも多くのデータが含まれているため、攻撃者が実行しなければならない可能性のある組み合わせが大幅​​に増えます。 多くのSSHキーアルゴリズムは、一致する可能性があるものを実行するのに時間がかかりすぎるという理由だけで、現代のコンピューティングハードウェアでは解読できないと考えられています。

これを実装するのはどのくらい難しいですか?

SSHキーは非常に簡単に設定でき、LinuxまたはUnixサーバー環境にリモートでログインするための推奨される方法です。 マシン上でSSHキーのペアを生成でき、数分以内に公開キーをサーバーに転送できます。

キーの設定方法については、https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys—​2 [このガイド]をご覧ください。 それでもパスワード認証が必要だと感じたら、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-fail2ban-on-ubuntu-14-04 [fail2ban ]サーバーでパスワードの推測を制限します。

ファイアウォール

ファイアウォールは、ネットワークに公開されるサービスを制御するソフトウェア(またはハードウェア)です。 これは、一般に利用できるポート以外のすべてのポートへのアクセスをブロックまたは制限することを意味します。

image:https://assets.digitalocean.com/articles/7_security_measures/2-firewall.png [ファイアウォール図]

通常のサーバーでは、デフォルトで多数のサービスが実行されている場合があります。 これらは、次のグループに分類できます。

  • インターネット上の誰でも、多くの場合匿名でアクセスできる公共サービス。 これの良い例は、サイトへのアクセスを許可するWebサーバーです。

  • 許可されたアカウントの特定のグループまたは特定の場所からのみアクセスする必要があるプライベートサービス。 この例としては、データベースコントロールパネルがあります。

  • サービスを外部に公開せずに、サーバー自体からのみアクセス可能な内部サービス。 たとえば、これはローカル接続のみを受け入れるデータベースである場合があります。

ファイアウォールを使用すると、上記のカテゴリに従ってソフトウェアへのアクセスが制限されます。 公共サービスは開いたままにしてすべての人が利用でき、プライベートサービスはさまざまな基準に基づいて制限できます。 内部サービスは、外部の世界から完全にアクセス不能にすることができます。 使用されていないポートについては、ほとんどの構成でアクセスが完全にブロックされます。

セキュリティをどのように強化しますか?

ファイアウォールは、サーバー構成の重要な部分です。 サービス自体がセキュリティ機能を実装していたり​​、実行したいインターフェースに制限されている場合でも、ファイアウォールは追加の保護層として機能します。

適切に設定されたファイアウォールは、開いたままにする必要がある特定のサービスを除くすべてへのアクセスを制限します。 ほんの数個のソフトウェアを公開するだけで、サーバーの攻撃対象領域が減少し、悪用に対して脆弱なコンポーネントが制限されます。

これを実装するのはどのくらい難しいですか?

Linuxシステムには多くのファイアウォールがあり、その中には他のものよりも学習曲線が急勾配のものがあります。 ただし、一般的には、ファイアウォールの設定は数分で完了し、サーバーの初期設定時またはコンピューターで提供されるサービスを変更するときにのみ必要になります。

簡単な選択はhttps://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server[UFW firewall]です。 その他のオプションは、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04 [iptables]またはhttps:/を使用することです。 /www.digitalocean.com/community/tutorials/how-to-install-and-configure-config-server-firewall-csf-on-ubuntu[CSF firewall]。

VPNとプライベートネットワーク

プライベートネットワークは、特定のサーバーまたはユーザーのみが利用できるネットワークです。 たとえば、DigitalOceanプライベートネットワークは、https://www.digitalocean.com/community/tutorials/digitalocean-private-networking-faq [同じ地域内の同じアカウントまたはチーム内のサーバー間の分離通信]を有効にします。 + VPN、または仮想プライベートネットワークは、リモートコンピューター間に安全な接続を作成し、ローカルプライベートネットワークであるかのように接続を提示する方法です。 これにより、プライベートネットワーク上にあるかのようにサービスを構成し、安全な接続を介してリモートサーバーに接続することができます。

image:https://assets.digitalocean.com/articles/7_security_measures/3-vpn.png [VPN図]

セキュリティをどのように強化しますか?

内部通信にパブリックネットワークの代わりにプライベートネットワークを使用することは、2つの選択肢があることを考えると、ほとんど常に望ましいことです。 ただし、データセンター内の他のユーザーは同じネットワークにアクセスできるため、サーバー間の通信を保護するための追加の対策を実施する必要があります。

VPNの使用は、事実上、サーバーのみが見ることができるプライベートネットワークをマップする方法です。 通信は完全にプライベートで安全です。 VPNソフトウェアが公開する仮想インターフェイスを介してトラフィックを渡すように、他のアプリケーションを構成できます。 このように、パブリックインターネット上のクライアントが消費できるサービスのみをパブリックネットワークに公開する必要があります。

これを実装するのはどのくらい難しいですか?

この機能を備えたデータセンターでプライベートネットワークを利用することは、サーバーの作成中にインターフェイスを有効にし、プライベートネットワークを使用するようにアプリケーションとファイアウォールを構成するのと同じくらい簡単です。 データセンター全体のプライベートネットワークは、同じネットワークを使用する他のサーバーとスペースを共有することに注意してください。

VPNに関しては、初期セットアップはもう少し複雑ですが、ほとんどのユースケースではセキュリティの向上は価値があります。 VPN上の各サーバーには、セキュリティで保護された接続の確立と構成に必要な共有セキュリティと構成データが必要です。 VPNが起動して実行された後、VPNトンネルを使用するようにアプリケーションを構成する必要があります。 インフラストラクチャを安全に接続するためのVPNの設定については、https://www.digitalocean.com/community/tutorials/how-to-secure-traffic-between-vps-using-openvpn [OpenVPNチュートリアル]をご覧ください。

公開鍵インフラストラクチャとSSL / TLS暗号化

公開鍵インフラストラクチャ(PKI)は、個人を識別し通信を暗号化するための証明書を作成、管理、検証するように設計されたシステムを指します。 SSLまたはTLS証明書を使用して、異なるエンティティを相互に認証できます。 認証後、暗号化された通信を確立するためにも使用できます。

image:https://assets.digitalocean.com/articles/7_security_measures/4-ssl-tls.png [SSLダイアグラム]

セキュリティをどのように強化しますか?

サーバーの認証局を確立して証明書を管理すると、インフラストラクチャ内の各エンティティが他のメンバーのIDを検証し、トラフィックを暗号化できます。 これにより、攻撃者がインフラストラクチャ内のサーバーを模倣してトラフィックを傍受する中間者攻撃を防ぐことができます。

各サーバーは、中央の認証局を信頼するように構成できます。 その後、認証局が署名する証明書は暗黙的に信頼されます。 通信に使用しているアプリケーションとプロトコルがTLS / SSL暗号化をサポートしている場合、これはVPNトンネルのオーバーヘッドなしでシステムを暗号化する方法です(VPNは内部でSSLを使用することもよくあります)。

これを実装するのはどのくらい難しいですか?

認証局の設定と公開鍵インフラストラクチャの残りの設定には、かなりの初期努力が必要です。 さらに、証明書を管理すると、新しい証明書を作成、署名、または失効する必要がある場合に、追加の管理負担が発生する可能性があります。

多くのユーザーにとって、本格的な公開鍵インフラストラクチャを実装することは、インフラストラクチャのニーズが拡大するにつれて、より意味があります。 VPNを使用してコンポーネント間の通信を保護することは、追加の管理コストに見合うPKIのポイントに到達するまで、適切なストップギャップの手段になる場合があります。

サービス監査

これまで、セキュリティを改善するために実装できる技術について説明してきました。 ただし、セキュリティの大部分は、システムを分析し、利用可能な攻撃対象領域を理解し、できる限りコンポーネントをロックダウンすることです。

サービス監査は、インフラストラクチャ内のサーバーで実行されているサービスを発見するプロセスです。 多くの場合、デフォルトのオペレーティングシステムは、起動時に特定のサービスを実行するように構成されています。 追加のソフトウェアをインストールすると、依存関係が自動的に開始される場合があります。

image:https://assets.digitalocean.com/articles/7_security_measures/5-service-audit.png [サービス監査図]

サービス監査は、システムで実行されているサービス、通信に使用されているポート、受け入れられているプロトコルを知る方法です。 この情報は、ファイアウォール設定の構成に役立ちます。

セキュリティはどのように強化されますか?

サーバーは、内部目的および外部クライアントを処理するために多くのプロセスを開始します。 これらはそれぞれ、悪意のあるユーザーに対する攻撃対象領域の拡大を表しています。 実行しているサービスが多いほど、アクセス可能なソフトウェアに脆弱性が存在する可能性が高くなります。

マシン上でどのネットワークサービスが実行されているかを把握したら、これらのサービスの分析を開始できます。 それぞれの質問に答えたい質問は次のとおりです。

  • このサービスを実行する必要がありますか?

  • サービスは必要のないインターフェースで実行されていますか? 単一のIPにバインドする必要がありますか?

  • 正当なトラフィックがこのサービスに渡されることを許可するようにファイアウォールルールが構成されていますか?

  • ファイアウォールルールが正当でないトラフィックをブロックしていますか?

  • これらの各サービスの脆弱性に関するセキュリティ警告を受信する方法はありますか?

このタイプのサービス監査は、インフラストラクチャ内の新しいサーバーを構成する際の標準的なプラクティスです。

これを実装するのはどのくらい難しいですか?

基本的なサービス監査は非常に簡単です。 `+ netstat +`コマンドを使用すると、各インターフェイスのポートをリッスンしているサービスを確認できます。 TCPおよびUDPトラフィックのリッスンに使用されているプログラム名、PID、およびアドレスを示す簡単な例は次のとおりです。

sudo netstat -plunt

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

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      887/sshd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      919/nginx
tcp6       0      0 :::22                   :::*                    LISTEN      887/sshd
tcp6       0      0 :::80                   :::*                    LISTEN      919/nginx

注意が必要な主な列は、「+ Proto」、「+ Local Address」、および「+ PID /プログラム名」です。 アドレスが「0.0.0.0」の場合、サービスはすべてのインターフェイスで接続を受け入れています。

ファイル監査および侵入検知システム

ファイル監査とは、システムが既知の良好な状態である場合、現在のシステムをファイルの記録およびシステムのファイル特性と比較するプロセスです。 これは、許可されている可能性のあるシステムへの変更を検出するために使用されます。

image:https://assets.digitalocean.com/articles/7_security_measures/6-file-audit.png [ファイル監査図]

侵入検知システム(IDS)は、不正なアクティビティがないかシステムまたはネットワークを監視するソフトウェアです。 多くのホストベースのIDS実装は、システムが変更されたかどうかを確認する方法としてファイル監査を使用します。

セキュリティをどのように強化しますか?

上記のサービスレベル監査と同様に、安全なシステムの確保に真剣に取り組んでいる場合、システムのファイルレベル監査を実行できると非常に便利です。 これは、管理者が定期的に実行することも、IDSの自動化プロセスの一部として実行することもできます。

これらの戦略は、ユーザーまたはプロセスによってファイルシステムが変更されていないことを確実に確認する唯一の方法です。 多くの理由で、侵入者は多くの場合、長期間サーバーを悪用し続けることができるように隠されたままにしたいと望んでいます。 バイナリを侵害されたバージョンに置き換える可能性があります。 ファイルシステムの監査を行うと、ファイルのいずれかが変更されているかどうかがわかり、サーバー環境の整合性に自信を持つことができます。

これを実装するのはどのくらい難しいですか?

IDSの実装またはファイル監査の実施は、非常に集中的なプロセスになる場合があります。 初期構成では、サーバーに行った非標準的な変更について監査システムに通知し、ベースライン読み取り値を作成するために除外する必要があるパスを定義します。

また、日々の運用がより複雑になります。 アップデートを実行する前にシステムを再確認し、アップデートの実行後にベースラインを再作成してソフトウェアバージョンの変更をキャッチする必要があるため、アップデート手順が複雑になります。 また、侵入者が監査を変更して追跡できないように、レポートを別の場所にオフロードする必要があります。

これにより管理の負荷が増大する可能性がありますが、既知の良好なコピーに対してシステムをチェックできることは、知らないうちにファイルが変更されていないことを確認する唯一の方法の1つです。 一般的なファイル監査/侵入検知システムには、https://www.digitalocean.com/community/tutorials/how-to-use-tripwire-to-detect-server-intrusions-on-an-ubuntu-vps [Tripwire]およびhttps://www.digitalocean.com/community/tutorials/how-to-install-aide-on-a-digitalocean-vps[Aide]。

隔離された実行環境

実行環境の分離とは、個々のコンポーネントが専用のスペース内で実行される方法を指します。

image:https://assets.digitalocean.com/articles/7_security_measures/7-isolation.png [分離環境図]

これは、個別のアプリケーションコンポーネントを独自のサーバーに分離することを意味する場合があります。または、「+ chroot +」環境またはコンテナーで動作するようにサービスを構成することを意味する場合があります。 分離のレベルは、アプリケーションの要件とインフラストラクチャの現実に大きく依存します。

セキュリティをどのように強化しますか?

プロセスを個々の実行環境に分離すると、発生する可能性のあるセキュリティ上の問題を分離する能力が向上します。 bulkheadsとコンパートメントが船の船体違反を封じ込めるのと同様に、個々のコンポーネントを分離することで、侵入者がインフラストラクチャの他の部分へのアクセスを制限できる。

これを実装するのはどのくらい難しいですか?

選択した封じ込めの種類によっては、アプリケーションの分離は比較的簡単です。 個々のコンポーネントをコンテナにパッケージ化することで、ある程度の分離を迅速に達成できますが、Dockerはコンテナ化をセキュリティ機能と見なさないことに注意してください。

各ピースに「+ chroot 」環境を設定すると、ある程度の分離も提供できますが、これは「 chroot +」環境から抜け出す方法がしばしばあるため、絶対確実な分離方法でもありません。 専用マシンへのコンポーネントの移動は、最高レベルの分離であり、多くの場合、最も簡単な場合がありますが、追加のマシンのコストが高くなる場合があります。

結論

上記の戦略は、システムのセキュリティを改善するために行うことができる機能強化の一部にすぎません。 セキュリティ対策は、実装するのを長く待つほど有効性が低下することを認識しておくことが重要です。 セキュリティは後から考えることはできず、提供するサービスやアプリケーションとともに最初から実装する必要があります。

Related