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