序章

ほとんどの場合、主な焦点はクラウドアプリケーションを稼働させることにあります。 セットアップと展開のプロセスの一環として、システムとアプリケーションが一般に公開される前に、堅牢で徹底的なセキュリティ対策を組み込むことが重要です。 アプリケーションを展開する前にこのチュートリアルでセキュリティ対策を実装すると、展開後に実装される可能性のあるアドホック対策とは対照的に、インフラストラクチャで実行するすべてのソフトウェアが安全な基本構成を持つことが保証されます。

このガイドでは、サーバーインフラストラクチャの構成とセットアップ中に実行できるいくつかの実用的なセキュリティ対策について説明します。 このリストは、サーバーを保護するために実行できるすべてのリストではありませんが、これに基づいて構築できる開始点を提供します。 時間の経過とともに、環境やアプリケーションの特定のニーズに合わせて、より調整されたセキュリティアプローチを開発できます。

SSHキー

SSH(セキュアシェル)は、サーバーの管理と通信に使用される暗号化されたプロトコルです。 サーバーを操作するときは、SSHを介してサーバーに接続されているターミナルセッションでほとんどの時間を費やす可能性があります。 パスワードベースのログインの代わりに、SSHキーは暗号化を使用してサーバーに安全にログインする方法を提供し、すべてのユーザーに推奨されます。

SSHキーを使用すると、認証の目的で秘密キーと公開キーのペアが作成されます。 秘密鍵はユーザーによって秘密にされ、安全に保たれますが、公開鍵は共有できます。 これは一般に非対称暗号化と呼ばれ、他の場所で見られるパターンです。

SSHキー認証を構成するには、サーバーの予想される場所(通常は)に公開SSHキーを配置する必要があります ~/.ssh/authorized_keys). SSHキーベースの認証がどのように機能するかについて詳しくは、SSH暗号化と接続プロセスについてをお読みください。

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

SSHを使用すると、パスワード認証を含むあらゆる種類の認証が完全に暗号化されます。 ただし、パスワードベースのログインが許可されている場合、悪意のあるユーザーは、特にサーバーが公開IPアドレスを持っている場合、サーバーへのアクセスを繰り返し自動的に試みる可能性があります。 同じIPからの複数回の試行が失敗した後にアクセスをロックアウトする方法はありますが、悪意のあるユーザーは、サーバーへのログインを試行できる速度によって実際には制限されますが、ユーザーがアクセスを試みる可能性のある状況ではブルートフォース攻撃を繰り返すことでスタックに攻撃を加えると、セキュリティ上のリスクが発生します。

SSHキー認証を設定すると、パスワードベースの認証を無効にできます。 SSHキーには通常、パスワードよりもはるかに多くのデータが含まれています(12文字のパスワードから128文字のSSHキーハッシュを作成できます)。これにより、ブルートフォース攻撃がはるかに困難になります。 それにもかかわらず、一部の暗号化アルゴリズムは、十分に強力なコンピューターでパスワードハッシュを十分な回数リバースエンジニアリングしようとすることにより、クラック可能と見なされます。 最新のSSHクライアントによって生成されたデフォルトのRSAキーを含むその他のものは、まだ解読される可能性がありません。

SSHキーを実装する方法

SSHキーは、Linuxサーバー環境にリモートでログインするための推奨される方法です。 SSHキーのペアは、ローカルマシンで ssh コマンドを実行すると、公開鍵をリモートサーバーに転送できます。

サーバーにSSHキーを設定するには、Ubuntu、Debian、またはCentOSのSSHキーの設定方法に従ってください。

パスワードアクセスを必要とする、またはブルートフォース攻撃を受けやすいスタックの部分については、サーバーに fail2ban のようなソリューションを実装して、パスワードの推測を制限できます。

許可しないことをお勧めします root SSH経由で直接ログインするユーザー。 代わりに、非特権ユーザーとしてログインし、sudoなどのツールを使用して必要に応じて特権を昇格させます。 権限を制限するこのアプローチは、最小特権の原則として知られています。 サーバーに接続し、SSHで動作することを確認した非特権アカウントを作成したら、無効にすることができます root を設定してログインします PermitRootLogin no のディレクティブ /etc/ssh/sshd_config サーバー上で、次のようなコマンドを使用してサーバーのSSHプロセスを再起動します。 sudo systemctl restart sshd.

ファイアウォール

ファイアウォールは、サービスがネットワークに公開される方法、および特定のサーバーに出入りできるトラフィックの種類を制御するソフトウェアまたはハードウェアデバイスです。 適切に構成されたファイアウォールにより、サーバーまたはネットワークの外部から、公開されているはずのサービスにのみアクセスできるようになります。

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

  • インターネット上の誰でも、多くの場合匿名でアクセスできる公共サービス。 この例は、実際のWebサイトをサーバーするWebサーバーです。
  • 許可されたアカウントの選択されたグループまたは特定の場所からのみアクセスする必要があるプライベートサービス。 たとえば、phpMyAdminのようなデータベースコントロールパネル
  • パブリックインターネットにサービスを公開せずに、サーバー自体の内部からのみアクセスできる内部サービス。 たとえば、ローカル接続のみを受け入れる必要があるデータベース。

ファイアウォールは、さまざまな粒度で上記のカテゴリに従ってソフトウェアへのアクセスを制限することを保証できます。 公共サービスは開いたままにしてインターネットで利用でき、プライベートサービスは接続タイプなどのさまざまな基準に基づいて制限できます。 内部サービスをインターネットに完全にアクセスできないようにすることができます。 使用されていないポートの場合、ほとんどの構成でアクセスが完全にブロックされます。

ファイアウォールはどのようにセキュリティを強化しますか?

サービスがセキュリティ機能を実装している場合や、サービスを実行するインターフェイスに制限されている場合でも、ファイアウォールは、トラフィックがアプリケーションによって処理される前にサービスとの接続を制限することにより、保護の基本レイヤーとして機能します。

適切に構成されたファイアウォールは、通常、それらのサービスに関連付けられたポートのみを開くことによって、開いたままにする必要がある特定のサービスを除くすべてへのアクセスを制限します。 たとえば、SSHは通常ポート22で実行され、Webブラウザを介したHTTP / HTTPSアクセスは通常、それぞれポート80と443で実行されます。 ほんの数個のソフトウェアを公開することで、サーバーの攻撃対象領域が減少し、悪用に対して脆弱なコンポーネントが制限されます。

ファイアウォールを実装する方法

Linuxシステムで使用できるファイアウォールは多数あり、一部は他のファイアウォールよりも複雑です。 一般に、サーバーで実行されているサービスに変更を加える場合にのみ、ファイアウォール構成を変更する必要があります。 起動して実行するためのいくつかのオプションは次のとおりです。

  • UFW(Uncomplicated Firewall)は、Ubuntuなどの一部のLinuxディストリビューションにデフォルトでインストールされます。 詳細については、Ubuntu20.04でUFWを使用してファイアウォールを設定する方法をご覧ください。

  • Red Hat、Rocky、またはFedora Linuxを使用している場合は、 Firewalldを使用してファイアウォールを設定する方法を読んで、デフォルトのツールを使用できます。

  • UFWやfirewalldなどの多くのソフトウェアファイアウォールは、設定されたルールを次のファイルに直接書き込みます。 iptables. での作業方法を学ぶには iptables 構成を直接行うと、 Iptables Essentials:Common Firewall Rules andCommandsを確認できます。 Dockerなど、独自にポートルールを実装する他のソフトウェアも、直接書き込みを行うことに注意してください。 iptables、UFWで作成したルールと競合する可能性があるため、 iptables このような場合の構成。

注: DigitalOceanを含む多くのホスティングプロバイダーでは、ファイアウォールを直接実装する必要はなく、クラウドサーバー上で外部レイヤーとして実行されるサービスとしてファイアウォールを構成できます。 管理されたツールを使用してネットワークエッジで実装されるこれらの構成は、実際にはそれほど複雑ではありませんが、スクリプト化と複製がより困難になる可能性があります。 DigitalOceanのクラウドファイアウォールのドキュメントを参照できます。

ファイアウォール構成がデフォルトで不明なトラフィックをブロックしていることを確認してください。 そうすれば、展開する新しいサービスが誤ってインターネットに公開されることはありません。 代わりに、アクセスを明示的に許可する必要があります。これにより、サービスの実行方法、アクセス方法、およびサービスを使用できるユーザーを評価する必要があります。

VPCネットワーク

仮想プライベートクラウド(VPC)ネットワークは、インフラストラクチャのリソース用のプライベートネットワークです。 ネットワークのインターフェイスにはパブリックインターネットからアクセスできないため、VPCネットワークはリソース間のより安全な接続を提供します。

VPCネットワークはどのようにセキュリティを強化しますか?

一部のホスティングプロバイダーは、デフォルトで、クラウドサーバーに1つのパブリックネットワークインターフェイスと1つのプライベートネットワークインターフェイスを割り当てます。 インフラストラクチャの一部でパブリックネットワークインターフェイスを無効にすると、これらのインスタンスは、内部ネットワークを介してプライベートネットワークインターフェイスを使用して相互に接続できるようになります。つまり、システム間のトラフィックは、パブリックインターネットを介してルーティングされません。露出または傍受。

ingress ゲートウェイとも呼ばれる少数の専用インターネットゲートウェイのみを条件付きで公開することにより、VPCネットワークのリソースとパブリックインターネット間の唯一のアクセスポイントとして、接続するパブリックトラフィックをより詳細に制御および可視化できます。あなたのリソースに。 Kubernetesのような最新のコンテナオーケストレーションシステムは、デフォルトで多くのプライベートネットワークインターフェイスを作成し、選択的に公開する必要があるため、非常に明確に定義された入力ゲートウェイの概念を持っています。

VPCネットワークを実装する方法

多くのクラウドインフラストラクチャプロバイダーでは、データセンター内のVPCネットワークにリソースを作成して追加できます。

注: DigitalOceanを使用していて、独自のVPCゲートウェイをセットアップしたい場合は、ドロップレットをVPCゲートウェイとして構成する方法ガイドに従って、Debian、Ubuntuでの方法を学ぶことができます。 、およびCentOSベースのサーバー。

独自のプライベートネットワークを手動で構成するには、高度なサーバー構成とネットワークの知識が必要になる場合があります。 VPCネットワークを設定する代わりに、サーバー間でVPN接続を使用することもできます。

VPNとプライベートネットワーキング

VPN、または仮想プライベートネットワークは、リモートコンピューター間に安全な接続を作成し、ローカルプライベートネットワークであるかのように接続を提示する方法です。 これにより、サービスをプライベートネットワーク上にあるかのように構成し、安全な接続を介してリモートサーバーに接続する方法が提供されます。

たとえば、DigitalOceanプライベートネットワークは、同じアカウント内のサーバーまたは同じリージョン内のチーム間の分離された通信を可能にします。

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

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

VPNを実装する方法

プライベートネットワークを使用するには、通常、サーバーを最初に展開するときにネットワークインターフェイスについて決定し、これらのインターフェイスを優先するようにアプリケーションとファイアウォールを構成する必要があります。 比較すると、VPNを展開するには、追加のツールをインストールして追加のネットワークルートを作成する必要がありますが、通常は既存のアーキテクチャの上に展開できます。 VPN上の各サーバーには、VPN接続を確立するために必要な共有セキュリティおよび構成データが必要です。 VPNが稼働した後、VPNトンネルを使用するようにアプリケーションを構成する必要があります。

UbuntuまたはCentOSを使用している場合は、 Ubuntu20.04でOpenVPNサーバーをセットアップおよび構成する方法チュートリアルに従うことができます。

Wireguard は、もう1つの一般的なVPN展開です。 一般に、VPNは、いくつかのエントリポイントの背後に一連のプライベートネットワークインターフェイスを実装することで、クラウドサーバーへの侵入を制限するという同じ原則に従いますが、VPC構成が通常コアインフラストラクチャの考慮事項である場合、VPNはよりアドホックベースで展開できます。 。

サービス監査

優れたセキュリティには、システムの分析、利用可能な攻撃対象領域の理解、およびコンポーネントの可能な限りのロックダウンが含まれます。

サービス監査は、特定のシステムで実行されているサービス、通信に使用されているポート、およびそれらのサービスが話しているプロトコルを知る方法です。 この情報は、パブリックアクセス可能にするサービス、ファイアウォール設定、監視、およびアラートを構成するのに役立ちます。

サービス監査はどのようにセキュリティを強化しますか?

実行中の各サービスは、それが内部または公開を目的としているかどうかにかかわらず、悪意のあるユーザーに対する拡張された攻撃対象領域を表します。 実行しているサービスが多いほど、ソフトウェアに影響を与える脆弱性の可能性が高くなります。

マシンで実行されているネットワークサービスがわかったら、これらのサービスの分析を開始できます。 サービス監査を実行するときは、実行中の各サービスについて次の質問を自問してください。

  • このサービスを実行する必要がありますか?
  • サービスは、実行すべきではないネットワークインターフェイスで実行されていますか?
  • サービスをパブリックまたはプライベートネットワークインターフェイスにバインドする必要がありますか?
  • ファイアウォールルールは、正当なトラフィックをこのサービスに渡すように構成されていますか?
  • ファイアウォールルールが正当でないトラフィックをブロックしていますか?
  • これらの各サービスの脆弱性に関するセキュリティアラートを受信する方法はありますか?

このタイプのサービス監査は、インフラストラクチャに新しいサーバーを構成する際の標準的な方法です。 数か月ごとにサービス監査を実行すると、意図せずに変更された可能性のある構成を持つサービスを検出するのにも役立ちます。

サービス監査を実装する方法

システムで実行されているネットワークサービスを監査するには、 ss サーバーで使用されているすべてのTCPおよびUDPポートを一覧表示するコマンド。 TCPおよびUDPトラフィックのリッスンに使用されているプログラム名、PID、およびアドレスを示すコマンドの例は次のとおりです。

  1. sudo ss -plunt

The p, l, u, n、 と t オプションは次のように機能します。

  • p は、特定のソケットを使用する特定のプロセスを示しています。
  • l は、接続をアクティブにリッスンしているソケットのみを示しています。
  • u (TCPソケットに加えて)UDPソケットが含まれます。
  • n トラフィックの数値を示します。
  • t TCPソケット(UDPソケットに加えて)が含まれます。

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

Output
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3)) tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=69226,fd=6),("nginx",pid=69225,fd=6)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=812,fd=4)) tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=69226,fd=7),("nginx",pid=69225,fd=7))

注意が必要な主な列は、Netid、Local Address:Port、およびProcessnameの列です。 ローカルアドレス:ポートが 0.0.0.0の場合、サービスはすべてのIPv4ネットワークインターフェイスで接続を受け入れています。 住所が [::] その後、サービスはすべてのIPv6インターフェイスで接続を受け入れます。 上記の出力例では、SSHとNginxは両方とも、IPv4とIPv6の両方のネットワークスタック上のすべてのパブリックインターフェイスでリッスンしています。

SSHとNginxが両方のインターフェースでリッスンすることを許可するか、どちらか一方のみでリッスンすることを許可するかを決定できます。 通常、未使用のインターフェイスで実行されているサービスを無効にする必要があります。

無人更新

優れた基本レベルのセキュリティを確保するには、サーバーをパッチで最新の状態に保つ必要があります。 古くて安全でないバージョンのソフトウェアを実行しているサーバーは、セキュリティインシデントの大部分の原因ですが、定期的な更新により、脆弱性を軽減し、攻撃者がサーバーに足を踏み入れるのを防ぐことができます。 無人更新により、システムはパッケージの大部分を自動的に更新できます。

無人更新はどのようにセキュリティを強化しますか?

無人の実装、すなわち 自動更新により、サーバーを安全に保つために必要な作業レベルが下がり、サーバーが既知のバグに対して脆弱になる可能性がある時間が短縮されます。 サーバー上のソフトウェアに影響を与える脆弱性が発生した場合、更新の実行にかかる時間にかかわらず、サーバーは脆弱になります。 毎日の無人アップグレードにより、パッケージを見逃すことはなく、修正が利用可能になるとすぐに脆弱なソフトウェアにパッチが適用されます。

無人更新を実装する方法

Ubuntuでの無人更新の実装の概要については、Ubuntuサーバーを更新しておく方法を参照してください。

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

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

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

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

各サーバーは、一元化された認証局を信頼するように構成できます。 その後、この機関によって署名された証明書はすべて暗黙的に信頼できます。

PKIを実装する方法

認証局の構成と他の公開鍵インフラストラクチャのセットアップには、かなりの初期作業が必要になる場合があります。 さらに、証明書を管理すると、新しい証明書を作成、署名、または取り消す必要がある場合に、追加の管理負担が発生する可能性があります。

多くのユーザーにとって、本格的な公開鍵インフラストラクチャを実装することは、インフラストラクチャのニーズが増大するときにのみ意味があります。 VPNを使用してコンポーネント間の通信を保護することは、PKIが追加の管理コストの価値があるポイントに到達するまでのより良い中間手段である可能性があります。

独自の認証局を作成する場合は、使用しているLinuxディストリビューションに応じて、認証局(CA)の設定と構成の方法ガイドを参照してください。

結論

このチュートリアルで概説されている戦略は、システムのセキュリティを向上させるために実行できるいくつかの手順の概要です。 セキュリティ対策は、実装を待つ時間が長くなるほど効果が低下することを認識することが重要です。 セキュリティは後から考えるべきではなく、インフラストラクチャを最初にプロビジョニングするときに実装する必要があります。 構築するための安全な基盤ができたら、デフォルトで安全な環境で実行されていることを保証して、サービスとアプリケーションの展開を開始できます。

安全な開始環境であっても、セキュリティは継続的で反復的なプロセスであることに注意してください。 変更によるセキュリティへの影響と、ソフトウェアの安全なデフォルト構成と環境を常に作成するために実行できる手順を常に自問してください。