LinuxでSSHサービスを保護するためにポートノッキングを使用する方法


ポートノッキングは、正当なユーザーにサーバー上で実行されているサービスへのアクセスのみを許可することにより、ポートへのアクセスを制御する優れた手法です。これは、正しい接続試行のシーケンスが行われると、ファイアウォールが閉じられたポートを喜んで開くように機能します。

ポートノッキングの背後にあるロジックは、SSHサービスを保護することです。デモンストレーションの目的で、Ubuntu18.04を使用します。

ステップ1:knockdをインストールして構成する

開始するには、Linuxシステムにログインし、図のようにknockdデーモンをインストールします。

$ sudo apt install knockd

インストールしたら、vimコマンドラインテキストエディターでknockd.conf構成を開きます。

$ sudo vim /etc/knockd.conf

デフォルトの設定ファイルは次のように表示されます。

[openSSH] セクションで、デフォルトのノッキングシーケンス(7000,8000,9000)を別のシーケンスに変更する必要があります。これは、これらの値がすでにわかっており、システムのセキュリティを危険にさらす可能性があるためです。

テストの目的で、値を10005、10006、10007に設定しました。これは、クライアントシステムからSSHポートを開くために使用されるシーケンスです。

3行目–コマンドで始まり、/sbin/iptablesコマンドの直後でINPUTの前に-A-Iに変更します。

最後に、 [closeSSH] セクションで、デフォルトのシーケンスを好みの順序に変更します。これは、ユーザーが完了してサーバーからログアウトしたときにSSH接続を閉じるために使用されるシーケンスです。

これが完全な構成です。

完了したら、変更を保存して終了します。

変更する必要があるもう1つの構成は、/ etc/default/knockdです。もう一度、テキストエディタを使用して開きます。

$ sudo vim /etc/default/knockd

START_KNOCKD u003d 0という行を見つけます。コメントを外し、値を 1に設定します。

次に、 KNOCKD_OPTS u003d”-i eth1” の行に移動します。コメントを外し、デフォルトの eth1値をシステムのアクティブなネットワークインターフェイスに置き換えます。ネットワークインターフェイスを確認するには、ifconfigコマンドを実行するだけです。

私たちのシステムでは、enp0s3がアクティブなネットワークカードです。

完全な構成は次のとおりです。

変更を保存して終了します。

次に、図のようにknockdデーモンを起動して有効にします。

$ sudo systemctl start knockd
$ sudo systemctl enable knockd

knockdデーモンのステータスを確認するには、次のコマンドを実行します。

$ sudo systemctl status knockd

手順2:ファイアウォールのSSHポート22を閉じる

ノックされたサービスの目的はsshサービスへのアクセスを許可または拒否することであるため、ファイアウォールのsshポートを閉じます。ただし、最初に、UFWファイアウォールのステータスを確認しましょう。

$ sudo ufw status numbered

出力から、SSHポート22がそれぞれ5番と9番のIPv4プロトコルとIPv6プロトコルの両方で開いていることがはっきりとわかります。

示されているように、これら2つのルールを、最大値である9から削除する必要があります。

$ sudo ufw delete 9
$ sudo ufw delete 5

これで、サーバーにリモートでログインしようとすると、次のような接続タイムアウトエラーが発生します。

ステップ3:SSHサーバーに接続するようにノッククライアントを構成する

最後のステップでは、クライアントを構成し、最初にサーバーで構成したノックシーケンスを送信してログインを試みます。

ただし、最初に、サーバーで行ったのと同じように、knockdデーモンをインストールします。

$ sudo apt install knockd

インストールが完了したら、示されている構文を使用してノックシーケンスを送信します

$ knock -v server_ip knock_sequence

私たちの場合、これは次のように解釈されます。

$ knock -v 192.168.2.105 10005 10006 10007

シーケンスに応じて、私たちが持っているものと同様の出力が得られるはずです。これは、ノックの試みが成功したことを示しています。

この時点で、SSHを使用してサーバーに正常にログインできる状態になっているはずです。

リモートサーバーでの作業が完了したら、終了ノックシーケンスを送信してSSHポートを閉じます。

$ knock -v 192.168.2.105 10007 10006 10005

図のように、サーバーにログインしようとすると失敗します。

これで、ポートノッキングを活用してサーバー上のSSHサービスを保護する方法についてこのガイドを締めくくります。より適切で簡単なアプローチは、SSHキーペアを使用してパスワードSSH認証を構成することです。これにより、秘密鍵を持つユーザーのみが、公開鍵が保存されているサーバーで認証できるようになります。