ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由: Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達し、セキュリティパッチまたはアップデートを受信しなくなりました。 このガイドはもう維持されていません。

代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

序章


サーバーは、定義上、サービスを提供し、ユーザーがアプリケーションとリソースにアクセスできるようにする手段として実装されます。 ただし、インターネットに接続されているコンピュータは、セキュリティの脆弱性を利用することを望んでいる悪意のあるユーザーやスクリプトの標的になることは避けられません。

ファイアウォールは存在し、サービスによって利用されていないポートへのアクセスをブロックするために使用する必要がありますが、アクセスしたいがすべての人に公開したくないサービスについてどうするかという問題があります。 必要なときにアクセスしたいが、それ以外の場合はブロックしたい。

ポートノッキングは、マシンで実行しているサービスを隠す1つの方法です。 これにより、特定の一連のネットワークトラフィックを介してポートを開くように要求するまで、ファイアウォールでサービスを保護できます。

このガイドでは、Ubuntu12.04VPSでSSHデーモンを隠す方法としてポートノッキングを実装する方法について説明します。 knockd パッケージ。

ノート: このチュートリアルでは、IPv4セキュリティについて説明します。 Linuxでは、IPv6のセキュリティはIPv4とは別に維持されます。 たとえば、「iptables」はIPv4アドレスのファイアウォールルールのみを維持しますが、「ip6tables」と呼ばれるIPv6の対応物があり、IPv6ネットワークアドレスのファイアウォールルールを維持するために使用できます。

VPSがIPv6用に構成されている場合は、IPv4とIPv6の両方のネットワークインターフェイスを適切なツールで保護することを忘れないでください。 IPv6ツールの詳細については、次のガイドを参照してください。LinuxVPSでIPv6を使用するようにツールを構成する方法

ポートノッキングはどのように機能しますか?


ポートノッキングは、ファイアウォールログまたはパケットキャプチャインターフェイスで接続の試行を監視するようにサービスを構成することで機能します。 事前定義された接続試行(または「ノック」)の特定のシーケンスが行われると、サービスはファイアウォールルールを変更して、特定のポートで接続を開きます。

これにより、実際に使用する予定があるまで、サービスを非表示にしておくことができます。 常に接続を利用できるようにする必要があるため、これはHTTPサーバーのようなものには実用的ではありません。 ただし、SSHなどの既知の正当なユーザーのみが使用することを目的としたサービスには役立ちます。

ノッキングシーケンスは任意に複雑になる可能性がありますが、それ自体では、通常、セキュリティ対策の唯一のセットではありません。 通常、サービス自体のセキュリティと認証の方法は、正しいシーケンスを発行するユーザーに公開されます。 このように、ポートノッキングは、ユーザーが通常の認証に到達するために通過しなければならない追加のレイヤーを追加します。

さらに役立つのは、ノッキングの試みについてフィードバックがないことです。 侵入者のスキャンでは、通常のすべてのポートが閉じていることがわかり、ノッキングシーケンスを試みた場合は、ポートが開いているかどうかを確認するために、各試行の間にチェックする必要があります。 多くの場合、これは攻撃者を思いとどまらせたり禁止したりするのに十分です。

この目的のために、Ubuntu 12.04に付属のiptablesファイアウォールを使用し、次のデーモンをインストールします。 knockd ポートノッキング機能を提供します。

ほとんどのトラフィックをブロックするようにIPTablesを構成する


実際のポートノッキングに到達する前に、基本的なファイアウォールを構成する必要があります。 ほとんどのものをロックダウンしたいと思います。

デフォルトでは、Ubuntuにはiptablesがインストールされています。 ただし、デフォルトのルールが設定されていないため、すべてのトラフィックが許可されます。 独自のルールセットを設計するには、ここでiptablesを使用してファイアウォールを設定する方法を学ぶことができます。

私たちの目的のために、そのガイドのほとんどのルールを使用します。

ローカルマシンでトラフィックを許可することから始めます。 これは、サーバーが生成してサーバーに送信するトラフィックを受け入れることを意味します。 これにより、サービスはブロックされることなく相互に通信できます。

sudo iptables -A INPUT -i lo -j ACCEPT

これにより、「INPUT」チェーンにルールが追加されます。 このチェーンは、サーバーに着信するすべての接続を処理します。 このルールは、内部通信に使用されるローカルループバックインターフェイスである「lo」ネットワークインターフェイス上のすべてのトラフィックを受け入れるようにiptablesに指示します。

次に、次のように入力して、確立されたすべての接続と確立された接続に関連するトラフィックを許可するようにします。

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

このルールは、すでに確立された接続に関連付けられているトラフィックを受け入れるようにiptablesに指示します。 これは重要なことです。接続のブロックを開始すると、現在のSSHセッションが切断されたくないからです。

次に、永続的で世界的に消費可能なサービスを許可する必要があります。 これが意味するのは、常に実行されて表示される必要があるサービスのルールを追加することです。 たとえば、標準のポート80でWebサイトが提供されている場合、そのトラフィックを常に許可する必要があります。

ポートノッカーを使用して開くサービスのルールをiptablesに追加しないでください。 代わりに、ノッキングデーモンを使用してルールセットを動的に変更します。 このチュートリアルでは、SSHサーバーを初期のiptables構成に追加しません。

この構文を使用して、独自のルールを確立します。

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

この時点では、接続を受け入れるためのルールのみを追加し、接続を削除していません。 私たちはまだすべてを受け入れています、私たちは特定の種類のトラフィックについて明示しているだけです。

ここで、特に許可されていないものをすべて削除します。 このルールを追加します。

sudo iptables -A INPUT -j DROP

上記のルールで処理されていないトラフィックはすべてドロップされます。 次のように入力すると、ルールを表示できます。

sudo iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP

ご覧のとおり、新しいSSH接続を受け入れるためのルールはまだありません。

この時点で接続が切断された場合は、右上隅にある[コンソールアクセス]ボタンをクリックして、コントロールパネルからサーバーにアクセスする必要があります。

これは直接ログインとして機能し、SSHを使用しないため、ルールの影響を受けません。

iptablesルールを確立したら、それらを永続化する iptables-persistent. 次のように入力してインストールします。

sudo apt-get install iptables-persistent

その後、次のように入力してサービスを開始します。

sudo service iptables-persistent start

Knockdサービスをインストールします


使用するポートノッキング対応サービスを knockd. 次のように入力するだけでインストールできます。

sudo apt-get install knockd

これによりユーティリティがインストールされますが、デフォルトではサービスは開始されません。

これは、デーモンが重要なトラフィックをすぐにブロックしないようにするための安全上の予防措置です。 このサービスを構成して明示的に有効にする必要があります。

ポートノッキングを使用するようにKnockdを構成する


サービスを構成するには、構成ファイルを編集する必要があります。 ルート権限でこのファイルを開きます。

sudo nano /etc/knockd.conf

次のようなファイルが表示されます。

[options]
        UseSyslog

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

すぐに、ノックがどのように機能するかについてのいくつかの重要な情報を見ることができるはずです。 また、構成がそれほど複雑ではないことを理解し始める必要があります。

「オプション」セクションには、 UseSyslog. これは、通常のsyslogメソッドを使用して情報をログに記録する必要があることをknockに通知します。 これにより、ログがに挿入されます /var/log/messages.

別のログファイルを指定する場合は、代わりに次のオプションを使用して指定できます。

LogFile = / path / to / log / file

その下には、2つのセクションがあります。 これらのセクションの名前は何でもかまいません。 これらは、それぞれ1つのイベントに一致する一連のルールをグループ化するために使用されます。

たとえば、ファイルには、SSHポートを開くセクションと、SSHポートを再び閉じるセクションがあります。

ノッキングパターンを設定するパラメータは次のとおりです。

シーケンス=7000,8000,9000

これは、同じIPがポート7000で接続を要求し、次にポート8000が直接続き、最後にポート9000が続く場合、この一連のルールが一致することを意味します。

このセットの他の2つのパラメーターも、アクティビティが一致するかどうかを制御します。

seq_timeout = 5
tcpflags = syn

最初のオプションは、シーケンスを完了する必要がある時間を指定します。

2つ目は、tcpパケットが有効であると見なされるために、tcpパケットに存在する必要があるフラグを指定します。 の値 syn ここに表示されているのは、SSHなどのプログラムによってバックグラウンドで作成されたパケットと必要なパケットを区別するためによく使用されます。

最後に、コマンドが表示されます。

command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

これをiptablesルールとして認識する必要があります。 セクションラベル「openSSH」が示すように、このセクションは、正しいシーケンスがヒットしたときにSSH接続用のポートを開きます。

ただし、iptablesの構成中に注意を払っていた場合は、この新しいルールが -A このルールをINPUTチェーンの最後に追加するオプション。 これにより、このルールがルールの後に配置され、残りのすべての接続が削除されます。

この状況を修正するには、このコマンドを変更する必要があります。 コマンドをルールに置き換えて、リストの一番上に新しいルールを挿入します。 これを行うには、 -I オプションとルール1としての場所の参照:

command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT

この変更により、ノックしたユーザーからのSSH接続を受け入れるための新しいルールがINPUTチェーンの最上位に追加されます。 The %IP% ルールの一部は、許容可能なノックを行ったIPアドレスに置き換えられます。

2番目のSSHセクションはほとんど同じことを行いますが、異なるシーケンスを使用し、SSHへの接続を開いたiptablesからルールを削除します。 このシーケンスをヒットして、開いたギャップを埋めることができます。

実際には、これら2つのセクションのシーケンスは、基本的にランダムなものに常に変更する必要があります。 デフォルトのシーケンスを維持すると、ポートノッキングによって確立されるセキュリティが効果的に削除されます。

さらに設定する前に、現在の設定をテストしてみましょう。 ファイルを保存して閉じます。

Knockdサービスを実装する


有効なルールセットを持つようにknockdを構成したので、デーモンを実装してテストできます。 構成は有効ですが、この時点では、各ノッキングセクションのポートシーケンスを変更しない限り、安全ではないことに注意してください。

別のファイルを編集してサービスを有効にする必要があります。 ルート権限でこのファイルを開きます。

sudo nano /etc/default/knockd

変更する必要があります START_KNOCKD サービスを開始するために「1」になるオプション:

START_KNOCKD = 1

ファイルを保存して閉じます。

これで、次のように入力してサービスを開始できます。

sudo service knockd start

これによりデーモンが起動し、ポートのシーケンスをノックしてiptablesルールセットを変更できるようになります。

ポートノッキングテスト


次に、構成したポートノッキングシーケンスを使用して、iptablesルールを変更する機能をテストする必要があります。

new ターミナルウィンドウで、ツールを使用してこれらのポートを要求できます。 問題が発生した場合に備えて、他のセッションを開いたままにしておくことをお勧めします。 繰り返しになりますが、誤ってロックアウトした場合は、コントロールパネルのドロップレットのページの右上隅にある[コンソールアクセス]ボタンを使用してください。

さまざまなツールを使用してノックできます。 いくつかの人気のある選択肢は netcat, nmap、および特別に設計されたクライアントは、適切に、 knock.

我々は使用するだろう nmap この例では、ほとんどのLinuxディストリビューションとOSXにデフォルトでインストールされているためです。

ノックする前に、SSHポートが実際に現在閉じられていることを確認しましょう。 サーバーへの接続に通常使用するコマンドを入力します。

 ssh root @ server_ip_address
  sh:ホストserver_ip_addressポートに接続します22:操作がタイムアウトしました

サーバーからの応答はなく、SSHクライアントはタイムアウトするはずです。 これは、SSHデーモンが現在iptablesによってブロックされているためです。 自動的にタイムアウトしない場合は、ctrl-Cと入力してSSHの試行を終了します

シーケンスタイムアウトパラメータが設定されているため、実際には、正しいシーケンスに到達するまでの時間は非常に限られています。 小さなインラインbashスクリプトを使用して、これらのポートをすばやくノックします。

ローカルマシンから、次のようなコマンドを入力します。

 700080009000のxの場合;  do nmap -Pn --host_timeout 201 --max-retries 0 -p $ x server_ip_address ; 終わり

コマンドで、3つの番号をシーケンス用に選択した番号に調整して、SSHポートを開きます。 サーバーのアドレスを反映するようにserver_ip_addressを変更します。

これにより、リストしたすべてのポートでnmapが順番に呼び出されます。

それが完了すると、SSHに定期的にログインできるようになります。

ssh root @ server_ip_address

構成した他のシーケンスをノックすることで、ポートを再度閉じることができます。

 900080007000のxの場合;  do nmap -Pn --host_timeout 201 --max-retries 0 -p $ x server_ip_address ; 終わり

Knockユーティリティを使用したポートノッキング


ノックする簡単な方法は、 knock のメーカーによって提供されるユーティリティ knockd. これはノックされたパッケージに含まれているため、サーバーで行ったのと同じようにクライアントマシンにインストールできます。

sudo apt-get install knockd

プロジェクトのWebサイトの[ダウンロード]セクションからノッククライアントを入手することもできます。 利用可能なネイティブOSXおよびWindowsクライアント(さらにはiOSおよびAndroidクライアント)があります。

ノッククライアントをインストールすると、次の構文を使用するだけでシーケンスを簡単に実行できます。

server_ip_addressシーケンスをノックします

したがって、この例では、次のように入力してSSHポートを開くことができます。

server_ip_address 700080009000をノックします

これは、前述の他の方法よりもはるかに高速です。

次のように入力して、ポートを閉じることができます。

server_ip_address 900080007000をノックします

接続を自動的に閉じるようにKnockdを構成する


ポートノッキングデーモンが正しく機能していることを確認したので、構成の詳細をいくつか変更して、より堅牢にしましょう。

構成ファイルを再度開きます。

sudo nano /etc/knockd.conf

SSHの一致を1つのルールに凝縮するために、コマンドタイムアウトを確立するknockdの機能を利用します。 これは、終了後にSSHポートを閉じるためにノックすることを覚えておく必要がないことを意味します。

「openSSH」セクションと「closeSSH」セクションをコメントアウトまたは削除できます。 それらを、単に「SSH」と呼ぶ単一のセクションに置き換えます。

[options]
    UseSyslog

[SSH]

この新しいセクションでは、他のセクションと同じように、シーケンス、tcpflags、およびシーケンスタイムアウトを確立します。 SSHポートを開くために使用したコマンドも含まれます。

[オプション]UseSyslog

[SSH]シーケンス= 5438,3428,3280,4479tcpflags = syn seq_timeout = 15 start_command = / sbin / iptables -I INPUT 1 -s%IP%-p tcp --dport 22 -j ACCEPT

ポートの一意のシーケンスを選択します。 ご覧のとおり、この例では4つのポートを使用しています。 で指定された時間枠内にすべてのポートをノックオンできる限り、ポートの数を増やすことができます。 seq_timeout パラメータ。

The start_command パラメータはと同じです command 他の例で使用されているパラメータ。 このバリアントを使用することを選択したのは、私たちが行っていることについてより詳細にするためです。

この後、ポートを閉じるのに役立ついくつかの新しいパラメータを追加します。

[オプション]UseSyslog

[SSH]シーケンス=5438,3428,3280,4479tcpflags = syn seq_timeout = 15 start_command = / sbin / iptables -I INPUT 1 -s%IP%-p tcp --dport 22 -j ACCEPT cmd_timeout = 10 stop_command = / sbin / iptables -D INPUT -s%IP%-p tcp --dport 22 -j ACCEPT

The cmd_timeout に含まれるコマンドを実行する前にノックが待機する秒数です stop_command 変数。

その結果、正しいシーケンスが使用されると、デーモンはSSHポートを開きます。 その後、10秒間待機してから、ポートを再度閉じます。

ファイルを保存して閉じます。

デーモンを再起動して、新しいルールを実装します。

sudo service knockd restart

このポートノッキングルールを使用して、指定した時間内に簡単に接続できます。 たとえば、次のコマンドを使用して、サーバーに簡単に接続できます。

ノックserver_ip_address54383428 3280 4479 && ssh root @ server_ip_address

ファイアウォールに作成した穴は、10秒後に閉じます。

結論


ポートノッキングは、隠すことによるセキュリティ(実際にサービスを保護するのではなく非表示にする)として軽蔑的な口調で語られることがありますが、ランダムな攻撃に対する保護の層を追加するための優れた方法です。

最良の結果を得るには、利用可能なネイティブツールを使用してサービスを常に保護する必要があります。 ただし、これらの方法の前にポートノッキングスキームのようなものを追加すると、サービスで発生するブルートフォース攻撃や侵入の試みの数を大幅に減らすことができます。

ジャスティン・エリングウッド