1. 序章

サーバーの管理サービスを保護するための戦略は数多くあります。 いくつか例を挙げると、管理目的、管理VPN、ロギングゲートウェイ、およびソースIPフィルタリングに固有のサブネットをセグメント化します。

このチュートリアルでは、これらの戦略のいくつかについて説明します。 具体的には、特定のクライアントへのSSHアクセスをIPアドレスで制限する方法。 ここで説明するテクニックのいくつかは、他のサービスにも役立ちます。

2. 管理サービス注意

セキュリティの観点から、最初のガイドラインの1つは、不要なサービスを無効にするです(この非常に興味深い NISTガイドを確認してください)。 つまり、不要で必須ではないオペレーティングシステムサービスを無効にする必要があります。

ただし、システムの運用・保守自体には一部のサービスが必要です。 この場合、可能な限り狭い特権のセットを評価する必要があります。 そうすれば、攻撃対象領域を最小限に抑えるように努めます。

管理サービスは、その重要性から、私たちのビジネスに深刻な損害を与える可能性があるため、細心の注意を払って対処する必要があります

3. TCPラッパー

サービスアクセスをブロックまたは有効化するために登場した最初のソリューションの1つは、TCPラッパーでした。 これは90年代初頭から存在しており、最初のホストベースのACL(アクセス制御リスト)の1つです。

2つの主要な統合モードがあります。 アプリケーションは、ライブラリ libwrap0 (主要なLinuxディストリビューションにデフォルトでインストールされます)にリンクするか、プロキシユーティリティtcpdを直接またはネットワークスーパーサーバーデーモンを介して使用できます。 (xinetdまたはinetdなど)。

OpenSSHサーバーはバージョン6.7でネイティブTCPWrappersのサポートを失いましたが、それでも多くのレガシーUnixボックスで使用できます。 新しいOpenSSHバージョンでは、xinetdスーパーサーバーデーモンで引き続き使用できます。

TCP Wrappersの主な利点は、構成が簡単なことです。 私たちのバージョンがそれをサポートしている場合、2つのファイルを微調整することでその動作を制御できます。 すべてのホストを拒否するには、/etc/hosts.denyファイルにワイルドカードを追加します。

/etc/hosts.deny
sshd : ALL

これで、/etc/hosts.allowファイルを微調整することで特定のホストへのアクセスを有効にできます。

/etc/hosts.allow
sshd : 192.168.0.0/24
sshd : 127.0.0.1
sshd : [::1]
sshd : myhost.local.com

もちろん、TCP WrappersをサポートしていないバージョンのOpenSSHを使用している場合(2014年以降にインストールまたは更新されたシステムの場合は非常に適切です)、これは機能しません。

4. ファイアウォール、IPフィルター、およびIPテーブル

IPアドレスからのSSHアクセスをブロックするより一般的な方法は、IPフィルタリングを使用することです。 繰り返しますが、2つのアプローチがあります。 1つは、ネットワークファイアウォールを使用して、サーバーへの管理レベルのアクセスを保護することです。 次の図は、それがどのように機能するかを示しています。

ご覧のとおり、ファイアウォールはACLルールを監視し、ファイアウォールに向かって流れるすべてのネットワークトラフィックに適用できます。 ただし、これが主な制限事項です。攻撃者がファイアウォールの制御下にない代替パスを見つけた場合、攻撃はを通過する可能性があります。 この図では、クライアントB en Cはファイアウォールによってアクセスがモデレートされていますが、クライアントAはそうではなく、サーバーのネットワークに存在しています。

そのため、保護は階層化されたものとして設計する必要があります。 各保護レイヤーは、侵害された場合、問題を迅速に通知できます。 そうすることで、気配りの行き届いた管理者は、脅威が実際に被害をもたらす前に、脅威への対策を講じることができます。

ネットワークファイアウォールは、私たちの保護対策の重要な部分であり、必須です。 ただし、ホストでより重要なルールを適用するのが一般的です。 そのために、オペレーティングシステムのIPフィルタリングを使用できます。 たとえば、LinuxはIPテーブルを使用できます。

iptables -A INPUT -p tcp --dport 22 --source 172.10.1.10 -j ACCEPT     # Add SSH access to a single host
iptables -A INPUT -p tcp --dport 22 --source 192.168.1.0/24 -j ACCEPT  # Add SSH access to a subnetwork
iptables -A INPUT -p tcp --dport 22 -j DROP                            # Drop all other sources

IPTablesは非常に強力です。 マシンが2つ以上のネットワークに直接接続している場合は、完全なネットワークファイアウォールとして機能できます。 ただし、トラフィックの負荷分散、宛先アドレスとポートのリダイレクトと再マップ、ネットワークの問題のシミュレートなども可能です。

5. SSH構成

上記のオプションに加えて、 / etc /sshd_configファイルにいくつかのセキュリティ対策を適用したい場合があります。

さまざまな使用シナリオで適切なセキュリティを設定するのに役立つ構成がたくさんあります。 sshサーバーをインターネットに公開する必要がある場合は、公開鍵と秘密鍵のペアなど、より強力な認証方法を使用するのが最適です。

SSHデーモン自体は、Plugable Authentication Modules(PAM)システムで許可されている代替手段(Kerberos SSO、ワンタイムパスワードを含む複数の認証要素、名前はいくつかありません)とともに、公開/秘密鍵を使用できます。

最適なソリューションは、特定のアプリケーションシナリオによって異なります。 認証に加えて、SSHサーバーの他のセキュリティ構成を確認すると便利です。 例えば:

  • ルートアクセスを無効にする: PermitRootLogin yes / no
  • トンネルと転送を無効にします。 <em>PermitTunnel yes/no; AllowTcpForwarding yes/no; DisableForwarding; yes/no</em>
  • PAMを使用する: <em>UsePAM yes/no</em>
  • パスワード認証を無効にする: PasswordAuthentication no
  • キーベースの認証を有効にする: AuthenticationMethods publickey
  • ユーザーとグループを許可する: AllowUsers / AllowGroups
  • ユーザーとグループを拒否する: DenyUsers / DenyGroups
  • Chrootユーザーセッション: ChrootDirectory chroot_path

PAM認証(すべての主要なディストリビューションのデフォルト)を使用して、特定のIPおよびユーザーへのアクセスを制限するためのさまざまなオプションを作成できます。 /etc/security/access.confファイルは、次のように、ユーザー/アドレスのペアに基づいてアクセスを作成し、ルールを拒否できます。

# Allows user foo and members for admins group from the console and the specified IPv6 address and IPv4 subnet
+ : @admins foo : LOCAL 2001:db8:0:101::/64 10.1.1.0/24

# Disallow console logins to all but the shutdown, sync and all other accounts, which are a member of the wheel group.
- : ALL EXCEPT (wheel) shutdown sync : LOCAL

# Block all other users from all other sources
- : ALL : ALL

6. 動的ブロッキング

ファイアウォールがIPからの永続的な試行のブロックをサポートしている場合は、それを有効にする必要があります。そうすると、同じIPからの永続的な試行がブラックリストに登録されて隔離されます。 同じ結果を得るためにIPテーブルまたはいくつかの追加ソフトウェアを使用することもできます

まず、一貫性のあるSSHの試行を抑制するために、次のIPテーブルルールを使用できます。

# Enable recent rules for incoming SSH
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource -j ACCEPT
# Rate limit SSH connections 5 (--hitcound) attempts for each 60s (--seconds)
iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH --rsource -j LOG --log-prefix "SSH_BAN"
# Log the blocked attempts (optional)
iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH --rsource -j DROP

残念ながら、このアプローチでは、失敗したかどうかだけは考慮されていません。 関係なく、接続の試行をブロックします。 失敗した試行のみを検討する場合は、より複雑なソリューションを使用する必要があります。

1つの方法は、SSHデーモンログファイルを継続的に監視するスクリプトを作成し、その場でIPテーブルルールを作成して、隔離期間後にそれらを削除することです。 このアプローチは、 denyhosts fail2ban sshguardなどの多くのオープンソースソリューションにすでに便利に組み込まれています。

もう1つのアプローチは、PAM自動ブラックリストモジュールpam_ablです。 このモジュールは、失敗した認証の試行に基づいて、ユーザーとIPを自動的にブラックリストに登録できます。 1つのハイライトは、PAMモジュールであるため、それを使用するすべてのサービスで使用できることです。 Ubuntuでは、次のコマンドでインストールするだけです。

# First install pam_abl
sudo apt-get install -y libpam-abl

インストールの最後に、インストーラーによって/etc/pam.d/common_authPAMスタック構成に追加する必要があります。

# here are the per-package modules (the "Primary" block)
auth    required                        pam_abl.so config=/etc/security/pam_abl.conf

構成ファイル/etc/security/pam_abl.confには、それぞれのデフォルトのホワイトリスト(ブラックリストに登録されないユーザーまたはホスト)として、ユーザー(user_rule)とホスト(host_rule)の検疫時間が含まれます。 。 コマンドラインユーティリティpam_ablは、ブロックリストの現在の内容を表示します。 また、ホストとユーザーを追加または削除することもできます。

# pam_abl
Failed users:
	foo (15)
		Blocked based on rule [*/sshd]
Failed hosts:
	10.1.1.150 (15)
		Not blocking

7. 結論

このチュートリアルでは、サーバーのSSHサービスへの不正アクセスのリスクを制限するための対策について説明しました。 これまでに示したように、ベストプラクティスは、単一の保護手段だけに依存しないことです。

可能な限り、保護を積み重ねて、外部の攻撃者が損害を与える前に時間と労力を費やして侵害する必要があるようにする必要があります。 したがって、これらの手法のいくつかを組み合わせることは、良い出発点です。 露出とリスクレベルに応じて、通常の境界ネットワークファイアウォールに加えて、より強力な認証の使用、サーバーにアクセスできるIPアドレスの制限、ブルートフォースの試行を遅らせるための接続の制限、問題のあるホストの隔離を検討する必要があります。