重要なポイント
- ポート ノッキングは、ファイアウォール ポートを閉じ、特定の順序で接続が試行された場合にのみアクセスを許可することでサーバーを保護する方法です。
- ポートノッキングは、秘密のノックが明らかになると簡単に突破される可能性があるため、セキュリティの唯一の形式として依存すべきではありません。
ポート ノッキングは、ファイアウォール ポート (使用されることがわかっているポートであっても) を閉じることでサーバーを保護する方法です。これらのポートは、接続リクエストが秘密のノックを提供する場合にのみ、オンデマンドで開かれます。
ポートノッキングは「秘密のノック」です
禁酒法が 本格化していた 1920 年代、 密酒場に入りたければ、 秘密のノックを知り、正しくタップして中に入る必要がありました。
ポートノッキングは現代版に相当します。他のユーザーがコンピュータ上のサービスにアクセスできるようにしたいが、ファイアウォールをインターネットに開放したくない場合は、ポート ノッキングを使用できます。これにより、受信接続を許可するファイアウォール上のポートを閉じ、事前に設定されたパターンの接続試行が行われたときにポートを自動的に開くことができます。接続試行のシーケンスは秘密のノックとして機能します。もう一度秘密のノックをするとポートが閉じます。
ポートノッキングは目新しいものですが、これは 隠蔽によるセキュリティの一例であり、 その概念には根本的に欠陥があることを知っておくことが重要です。システムへのアクセス方法の秘密は、特定のグループに属する人だけが知っているため安全です。しかし、その秘密が明らかになったり、観察されたり、推測されたり、解明されたりしたために、ひとたび暴露されると、あなたの安全は無効になります。 SSH サーバーにキーベースのログイン を要求するなど、他の強力な方法でサーバーを保護することをお勧めします。
サイバーセキュリティへの最も堅牢なアプローチは多層化されているため、おそらくポートノッキングはそれらの層の 1 つである必要があります。レイヤーが多ければ多いほど良いですよね?ただし、ポート ノッキングは、適切に強化された安全なシステムに (たとえあったとしても) あまり役に立たないと主張することもできます。
サイバーセキュリティは広大で複雑なテーマですが、ポートノッキングを唯一の防御手段として使用すべきではありません。
ノックされたものを取り付ける
ポート ノッキングをデモンストレーションするために、これを使用してポート 22 (SSH ポート) を制御します。 ノックド というツール を使用します。 Ubuntu または別の Debian ベースのディストリビューションを使用している場合は、apt-get を使用してこのパッケージをシステムにインストールします。他の Linux ディストリビューションでは、代わりに Linux ディストリビューションのパッケージ管理ツールを使用してください。
次のように入力します。
sudo apt-get install ノックされました
おそらく、すでに
iptables ファイアウォールが
システムにインストールされていますが、
iptables-persistent
パッケージのインストールが必要になる場合があります。保存された
iptable
ルールの自動ロードを処理します。
次のように入力してインストールします。
sudo apt-get install iptables-persistent
IPV4 設定画面が表示されたら、スペースバーを押して「はい」オプションを受け入れます。
IPv6 設定画面でスペースバーをもう一度押して、「はい」オプションを受け入れ、次に進みます。
次のコマンドは、確立された接続と進行中の接続の継続を許可するように
iptables
に指示します。次に、別のコマンドを発行して SSH ポートを閉じます。
このコマンドを発行するときに誰かが SSH で接続している場合、その接続が切断されることは望ましくありません。
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
このコマンドは、次のようなルールをファイアウォールに追加します。
- -A : ルールをファイアウォール ルール テーブルに追加します。つまり、一番下に追加します。
- INPUT : これは受信接続に関するルールです。
-
-m conntrack
: ファイアウォール ルールは、ルールの条件に一致するネットワーク トラフィック (パケット) に作用します。
-mパラメータにより、iptables追加のパケット マッチング モジュールを使用します。この場合、conntrackと呼ばれるモジュールは、カーネルのネットワーク接続追跡機能と連動します。 - –cstate ESTABLISHED,RELATED : ルールが適用される接続のタイプ、つまり ESTABLISHED 接続と RELATED 接続を指定します。確立された接続とは、すでに進行中の接続です。関連接続は、確立された接続からのアクションによって確立される接続です。おそらく、接続されている誰かがファイルをダウンロードしたいと考えているでしょう。これは、ホストによって開始された新しい接続上で発生する可能性があります。
- -j ACCEPT : トラフィックがルールに一致する場合、ファイアウォールの ACCEPT ターゲットにジャンプします。つまり、トラフィックは受け入れられ、ファイアウォールを通過することが許可されます。
これで、コマンドを発行してポートを閉じることができます。
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
このコマンドは、次のようなルールをファイアウォールに追加します。
- -A : ルールをファイアウォール ルール テーブルに追加します。つまり、最後に追加します。
- INPUT : このルールは受信接続に関するものです。
- -p tcp : このルールは、伝送制御プロトコルを使用するトラフィックに適用されます。
- –dport 22 : このルールは、ポート 22 (SSH ポート) をターゲットとする TCP トラフィックに特に適用されます。
- -j REJECT : トラフィックがルールに一致する場合、ファイアウォールの REJECT ターゲットにジャンプします。したがって、トラフィックが拒否された場合、ファイアウォールの通過は許可されません。
netfilter-persistent
デーモンを起動する必要があります。次のコマンドを使用してこれを行うことができます。
sudo systemctl start netfilter-persistent
netfilter-persistent
保存と再ロードのサイクルを実行させ、
iptable
ルールをロードして制御するようにします。
次のコマンドを入力します。
sudo netfilter-永続保存
sudo netfilter-persistent reload
これでユーティリティがインストールされ、SSH ポートが閉じられました (できれば、誰も接続を切断せずに済みます)。次に、秘密のノックを構成します。
ノックの構成
knockd
を設定するには 2 つのファイルを編集します。 1 つ目は、次の
knockd
構成ファイルです。
sudo gedit /etc/knockd.conf
gedit
エディターが開き、
knockd
構成ファイルがロードされます。
ニーズに合わせてこのファイルを編集します。私たちが注目するセクションは、「openSSH」と「closeSSH」です。次の 4 つのエントリが各セクションにあります。
- sequence : ポート 22 を開閉するためにアクセスする必要があるポートの順序。デフォルトのポートは、ポート 22 を開く場合は 7000、8000、および 9000、閉じる場合は 9000、8000、および 7000 です。これらを変更したり、リストにポートを追加したりできます。私たちの目的のために、デフォルトのままにしておきます。
- seq_timeout : 誰かがポートの開閉をトリガーするためにポートにアクセスしなければならない時間。
-
command
: オープンまたはクローズアクションがトリガーされたときに
iptablesファイアウォールに送信されるコマンド。これらのコマンドは、ファイアウォールにルールを追加する (ポートを開くため) か、ルールを削除する (ポートを閉じるため) かのいずれかです。 - tcpflags : 各ポートがシークレット シーケンスで受信する必要があるパケットのタイプ。 SYN (同期) パケットは、 TCP 接続要求の最初のものであり、 3 ウェイ ハンドシェイク と呼ばれます。
「openSSH」セクションは、「ポート 22 を開いてコマンドをファイアウォールに送信するには、TCP 接続要求をポート 7000、8000、9000 に対してこの順序で 5 秒以内に行う必要があります。」と解釈できます。
「closeSSH」セクションは、「ポート 22 を閉じるコマンドがファイアウォールに送信されるようにするには、TCP 接続要求をポート 9000、8000、7000 に対してこの順序で 5 秒以内に行う必要があります。」と解釈できます。
ファイアウォールのルール
openSSH セクションと closeSSH セクションの「command」エントリは、1 つのパラメーターを除いて同じままです。構成は次のとおりです。
- -A : ファイアウォール ルール リストの最後にルールを追加します (openSSH コマンドの場合)。
- -D : ファイアウォール ルール リストからコマンドを削除します (closeSSH コマンドの場合)。
- INPUT : このルールは、受信ネットワーク トラフィックに関係します。
- -s %IP% : 接続を要求しているデバイスの IP アドレス。
- -p : ネットワークプロトコル。この場合は TCP です。
- –dport : 宛先ポート。この例では、ポート 22 です。
- -j ACCEPT : ファイアウォール内の受け入れターゲットにジャンプします。言い換えれば、パケットは、それに作用せずに残りのルールを通過してドロップされます。
ノックされた設定ファイルの編集
ファイルに対して行う編集は、以下の赤で強調表示されています。
「seq_timeout」を 15 秒に延長します。これは十分な時間ですが、接続リクエストを手動で実行している場合は、これくらいの時間が必要になる可能性があります。
「openSSH」セクションでは、コマンドの
-A
(追加) オプションを
-I
(挿入) に変更します。このコマンドは、ファイアウォール ルール リストの先頭に新しいファイアウォール ルールを挿入します。
-A
オプションを残した場合、ファイアウォール ルール リストが追加され、最後に配置されます。
受信トラフィックは、リスト内の各ファイアウォール ルールに対して上から順にテストされます。ポート 22 を閉じるルールがすでにあります。そのため、トラフィックを許可するルールが検出される前に、受信トラフィックがそのルールに対してテストされると、接続は拒否されます。この新しいルールが最初に見つかった場合、接続は許可されます。
close コマンドは、openSSH によって追加されたルールをファイアウォール ルールから削除します。 SSH トラフィックは、既存の「ポート 22 は閉じられている」ルールによって再び処理されます。
これらの編集を行った後、構成ファイルを保存します。
ノックされた制御ファイルの編集
knockd
制御ファイルは非常に単純です。ただし、実際に作業して編集する前に、ネットワーク接続の内部名を知っておく必要があります。それを見つけるには、次のコマンドを入力します。
IPアドレス
このマシンがこの記事を調査するために使用する接続は
enp0s3
と呼ばれます。接続の名前をメモしておきます。
次のコマンドは、
knockd
制御ファイルを編集します。
sudo gedit /etc/default/knockd
gedit
の
knockd
ファイルは次のとおりです。
必要な編集がいくつか赤で強調表示されています。
「START_KNOCKD=」エントリを 0 から 1 に変更しました。
また、「KNOCKD_OPTS=」エントリの先頭からハッシュ
#
を削除し、「eth1」をネットワーク接続の名前
enp0s3
に置き換えました。もちろん、ネットワーク接続が
eth1
の場合は変更しません。
証拠はプリンの中にある
これが機能するかどうかを確認するときが来ました。次のコマンドを使用して、
knockd
デーモンを起動します。
sudo systemctrl start ノックされました
次に、別のマシンにジャンプして接続を試みます。そのコンピューターにも
knockd
ツールをインストールしました。これは、ポート ノッキングを設定するためではなく、
knockd
パッケージが
knock
という別のツールを提供するためです。私たちはこのマシンを使って秘密のシーケンスで発砲し、ノックを行います。
次のコマンドを使用して、IP アドレス 192.168.4.24 を持つポート ノッキング ホスト コンピューターのポートに接続要求のシークレット シーケンスを送信します。
ノック 192.168.4.24 7000 8000 9000 -d 500
これは、IP アドレス 192.168.4.24 のコンピュータをターゲットにし、ポート 7000、8000、および 9000 に対して、500 ミリ秒の
-d
(遅延) を挟んで順番に接続要求を発行するように
knock
に指示します。
次に、「dave」というユーザーが 192.168.4.24 に SSH リクエストを送信します。
ssh デイブ@192.168.4.24
接続が受け入れられ、パスワードを入力すると、リモート セッションが開始されます。コマンド プロンプトが
dave@nostromo
から
dave@
に変わります。リモート コンピュータからログアウトするには、次のように入力します。
出口
コマンド プロンプトがローカル コンピュータに戻ります。彼はもう一度
knock
を使用し、今度は逆の順序でポートをターゲットにして、リモート コンピュータの SSH ポートを閉じます。
ノック 192.168.4.24 9000 8000 7000 -d 500
確かに、これは特に有益なリモート セッションではありませんでしたが、ポート ノッキングによるポートの開閉を示しており、1 枚のスクリーンショットに収まっています。
さて、これを反対側から見るとどうなったでしょうか?ポート ノッキング ホストのシステム管理者は、次のコマンドを使用して、システム ログに到着する新しいエントリを表示します。
tail -f /var/log/syslog
- 3 つの openSSH エントリが表示されます。これらは、各ポートがリモート ノック ユーティリティのターゲットになると発生します。
- トリガー シーケンスの 3 つの段階がすべて満たされると、「 OPEN SESAME 」というエントリがログに記録されます。
-
ルールを
iptablesルール リストに挿入するコマンドが送信されます。これにより、正しいシークレット ノック (192.168.4.23) を与えた PC の特定の IP アドレスから、ポート 22 での SSH 経由のアクセスが許可されます。 - ユーザー「dave」は数秒間だけ接続し、その後切断します。
- 3 つの closeSSH エントリが表示されます。これらは、各ポートがリモート ノック ユーティリティのターゲットになると発生します。リモート ノック ユーティリティは、ポート ノッキング ホストにポート 22 を閉じるように指示します。
- 3 つのステージがすべてトリガーされると、再び「OPEN SESAME」メッセージが表示されます。コマンドはファイアウォールに送信され、ルールが削除されます。 (ポートを閉じるときに「CLOSE SESAME」を使用しないのはなぜでしょうか?誰にも分かりません。)
これで、ポート 22 に関する
iptables
ルール リスト内の唯一のルールは、そのポートを閉じるために最初に入力したルールになります。したがって、ポート 22 は再び閉じられます。
頭をたたく
それはポートノッキングのパーラートリックです。気晴らしとして扱い、現実世界では行わないでください。または、必要に応じて、これを唯一のセキュリティ形式として依存しないでください。





