Ubuntu12.04でfwknopを使用してシングルパケット認証を有効にする方法
ステータス:非推奨
この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。
理由: Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達し、セキュリティパッチまたはアップデートを受信しなくなりました。 このガイドはもう維持されていません。
代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。
序章
インターネットにサービスを公開することは常にリスクですが、多くの場合、そもそもサーバーを使用する理由のすべてです。 開いているポートや公開されているサービスは、悪意のあるユーザーや自動化されたスクリプトによる非常に多くの調査やアクセスの試みにさらされる可能性があります。
一部のサービスは(サイトをホストするWebサーバーのように)公に利用できるようにするためにアクセス可能なままにする必要がありますが、他のサービスは1人または数人の許可されたユーザーのみが使用することを目的としており、他のユーザーは使用できません(SSHなど)。 最良のシナリオでは、これらのサービスは十分に保護されていますが、実際に使用したい場合にのみアクセスできます。
シングルパケット認証は、特殊な暗号化されたパケットがリスニングサービスに送信されるまで、ファイアウォールがサービスへのアクセスをブロックできるようにする方法です。 サービスがこのパケットを検証すると、ファイアウォールルールを即座に変更して、必要なポートを公開します。
と呼ばれるツール fwknop
、Firewall Knock Operatorの略で、これらのパケットを解釈し、ファイアウォールルールを変更するために使用できます。 このガイドでは、Ubuntu12.04システムでfwknopサーバーとクライアントを構成します。 これにより、特に要求されるまでSSHサーバーをシールドできます。
1つのVPSにfwknopサーバーをインストールします
この構成では、Ubuntu12.04VPSインスタンスが2つあることを前提としています。 また、IPアドレスの利用も機能するはずですが、サーバーVPSを指すドメイン名があると想定します。 DigitalOcean のドメイン名の構成についてサポートが必要な場合は、ここをクリックしてください。
サーバーマシンで、apt-getを使用してfwknopサーバーコンポーネントをインストールします。
sudo apt-get update
sudo apt-get install fwknop-server
インストール中に、サービスと関連コンポーネントを構成するためのいくつかの質問が表示されます。
質問がある最初のコンポーネントはpostfixです。 「インターネットサイト」を選択し、次のセクションでドメイン名を入力します。
次に、安全性の低いキーシステムを使用して、デフォルトでfwknopがSSHポートを保護するかどうかを尋ねられます。 「はい」を選択して、サービスがいくつかのパラメーターを構成するようにします。 少し後で、より安全な設定に切り替えます。
保護するインターフェイスを選択します。 通常、これは「eth0」になります。 最後に、暗号に使用する暗号化キーを選択します。 これは後で変更するので、何を入れても構いません。 それが1語であることを確認してください。そうでない場合、構成はエラーになります。
fwknopクライアントを他のVPSにインストールします
クライアントとして使用するVPSに、クライアントコンポーネントをインストールする必要があります。 これは、他のマシンに送信する暗号化されたパケットを作成するシステムの一部です。
sudo apt-get update
sudo apt-get install fwknop-client
この時点では、クライアント部分は構成を必要としません。
GPGキーを構成する
パケット転送の認証を提供するためにGPGキーを使用します。 これは非対称暗号であるため、クライアントマシンとサーバーマシンの両方でこれらの手順を実行する必要があります。 GPGはデフォルトでインストールする必要があります。
各マシンで、次のように入力してキーを生成します。
gpg --gen-key
これはあなたにいくつかの情報を尋ねます。 ほとんどの質問では、デフォルトを受け入れても安全です。
パスフレーズを提供して確認します。 その後、キーを作成するのに十分なランダム情報を生成するのに少し時間がかかります。
次に、生成した各キーのパブリックIDを書き留めるか、コピーする必要があります。 次のように入力すると、これらを取得できます。
gpg --list-keys
/home/test/.gnupg/pubring.gpg
pub 2048R / 111111112014-01-09uidクライアント [email protected] サブ2048R/C1C26BA6 2014-01-09
上で強調表示されている部分は、各キーに必要な部分です。 それをどこかにコピーし、サーバーまたはクライアントコンポーネントとしてラベルを付けます。
SERVER: 11111111
CLIENT: 99999999
次に、クライアントマシンで、 client.asc
キーをファイルにエクスポートしてASCIIコピーします。 クライアント用にコピーしたキーIDを参照する必要があります。
gpg -a --export 99999999 > client.asc
サーバーマシンで、サーバーキーIDを参照して同様の手順を実行し、 server.asc
ファイル:
gpg -a --export 11111111 > server.asc
コンピュータ間でキーを転送する
次に、各マシンが両方のコピーを持つように、マシン間でキーを転送する必要があります。
これを使用してこれを行います scp
クライアントマシンからのツール。
クライアントマシンで、 client.asc
次のようなコマンドを使用して、サーバーにファイルします。
scp client.asc server_domain_or_ip : / path / to / user / home / directory
これにより、サーバーの通常のアカウントパスワードを使用して認証するように求められます。 通常のユーザーのホームフォルダを反映するようにパスを変更します。
次に、 server.asc
同様のコマンドを使用してファイル:
scp server_domain_or_ip : / path / to / user / home /directory/server.asc。
これで、各マシンに両方のファイルが作成されます。
キーのインポートと署名
各マシンの他のキーにアクセスできるようになったので、反対のキー(クライアントのサーバーキーとサーバーのクライアントキー)をローカルGPGデータベースにインポートできます。
サーバーマシンで、次のように入力します。
gpg --import client.asc
クライアントマシンで、次のように入力します。
gpg --import server.asc
各コンピューターのデータベースに反対のキーがあるので、各キーに署名してそれらを検証できます。
各マシンで、インポートしたばかりのキーのIDを参照して、このコマンドを入力します。 この例では、クライアントマシンで次のように入力します。
gpg --edit-key 11111111
サーバーマシンでは、次のように入力します。
gpg --edit-key 99999999
GPGプロンプトが表示されます。 キーに署名したいので、次のように入力します。
sign
確信があるかどうかを確認するメッセージが表示されます。
Y
その後、次のように入力して保存して終了できます。
save
この時点で、各コンピューターには、他のコンピューターのGPGキーのコピーがあります。 それらは、キーの信頼性を信頼していることを示すために署名されています。
fwknopサーバーでアクセスを構成する
サーバーマシンでは、GPGキーを使用するようにfwknopサービスを構成し、クライアントが接続して認証できるようにする必要があります。
サーバーで、root権限でアクセス構成を開きます。
sudo nano /etc/fwknop/access.conf
約4行のアクティブな行のみを含むファイルが表示されます。 次のようになります。
出典:任意; OPEN_PORTS:tcp / 22; ### for ssh(他のサービスへのアクセスのための変更)KEY:throw_away_password; FW_ACCESS_TIMEOUT:30;
これは、サービスのインストール時に選択したパスワードを使用して構成されます。 GPG認証に変更するため、これは必要ありません。 その行を今すぐコメントしてください:
出典:任意; OPEN_PORTS:tcp / 22; ### for ssh(他のサービスへのアクセスの変更)キー:throw_away_password;
FW_ACCESS_TIMEOUT:30;
次に、fwknopサービスにキーについて通知するいくつかの追加パラメーターを追加します。 さらに情報を追加する必要があります。
出典:任意; OPEN_PORTS:tcp / 22; ### for ssh(他のサービスへのアクセスの変更)キー:throw_away_password;
FW_ACCESS_TIMEOUT:30;
REQUIRE_SOURCE_ADDRESS:Y; DATA_COLLECT_MODE:PCAP; GPG_REMOTE_ID:99999999; ##クライアントキーはここにありますGPG_DECRYPT_ID:11111111; ##サーバーキーはここにありますGPG_DECRYPT_PW: your_GPG_passphrase_here ; ##ここにGPGパスフレーズを配置しますGPG_HOME_DIR:/ home / test /.gnupg; ##ユーザーのGPGディレクトリへのパス。 通常、##これはユーザーのホームディレクトリにあります。
クライアントのキーIDを反映するようにGPG_REMOTE_IDを変更し、サーバーIDを反映するようにGPG_DECRYPT_IDを変更してください。
さらに、GPGパスフレーズを入力し、ユーザーのパスを含める必要があります .gnupg
ディレクトリ。
ファイルを保存して閉じます。
IPTablesルールを構成する
fwknopサーバーの構成を変更したので、実際のiptablesルールを作成する必要があります。 サービスは必要に応じてこれらを変更しますが、最初にポートを閉じる必要があります。
まず、現在の接続を許可する必要があります。 このルールは、すでに確立されている接続と関連データを許可します。
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
次に、直後に、確立されていない接続の試行をすべてドロップすることにより、ポートへの他のすべてのアクセスを制限します。
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
そのポートへのアクセスを制限する基本的なファイアウォールができたので、構成を実装できます。 次のように入力して、fwknopサーバーを再起動します。
sudo service fwknop-server restart
これで、fwknopサービスは、構成したルールに一致するパケットについてサーバーの監視を開始します。
クライアントからサーバーに接続する
サーバーを構成して実行したので、テストを実行して、クライアントからSSHサーバーに接続できるかどうかを確認できます。 暗号化されたパケットをまだ送信していないため、これはタイムアウトになるはずです。
ssh root @ server_domain_or_ip
ssh:ホストserver_domain_or_ipポート22に接続:接続がタイムアウトしました
これがタイムアウトするのを待ちたくない場合は、「Ctrl-C」を押すことができます。
これで、サーバーで認証する暗号化されたパケットを送信できます。 これを行うには、fwknopclientコマンドにいくつかのパラメーターを渡します。
-
-A tcp / 22 :このオプションは、開くことを要求しているプロトコルとポートを指定します。
-
–gpg-recip :このオプションは、サーバーのGPGキーIDを指定します。
-
–gpg-sign :このオプションは、クライアントのGPGキーIDを指定します。
-
-a :このパラメーターは、アクセスを許可するIPアドレスをfwknopに指示します。 これはクライアントマシンである必要があります。
-
-D :これは、パケットの送信先をコマンドに通知します。 これは、サーバーのドメイン名またはIPアドレスです。
文字列に必要な情報がわかったので、パケットを作成して送信できます。
fwknop -A tcp / 22 --gpg-recip 11111111 --gpg-sign 99999999 -a client_ip_address -D server_domain_or_ip
キーを復号化するためのGPGパスフレーズの入力を求められます。 その後、パケットがサーバーに送信されます。
この時点で、パケットが受け入れられた場合、SSH経由での接続を試行するのに30秒かかります。
ssh root @ server_domain_or_ip
すべてがうまくいけば、正常にログインできるはずです。 開いているポートは30秒後に閉じますが、接続はアクティブなままです。
サーバーマシンでは、パケットを送信した後(30秒が経過する前)に、クライアントのIPアドレスを一時的に許可するために追加された新しいルールを確認できるはずです。
sudo iptables -S
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N FWKNOP_INPUT -A INPUT -j FWKNOP_INPUT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j DROP -A FWKNOP_INPUT -s client_ip_address / 32 -p tcp -m tcp --dport 22- j ACCEPT
ユーティリティはiptablesに別のチェーンを追加し、それを介してすべての入力をフィルタリングします。 次に、接続が暗号化されたパケットを生成するマシンと一致するかどうかを確認し、一致する場合はそれを受け入れます。 それ以外の場合は、通常どおりドロップします。
結論
単一のパケット認証メカニズムを設定することにより、サーバー間で接続するときにセキュリティの層を追加できます。 これにより、SSHサーバーがランダムな攻撃やブルートフォース攻撃から隠されるだけでなく、保護されたサービスでセキュリティエクスプロイトが見つかった場合にも役立ちます。 これにより、問題の修正に取り組んでいる間、安全を保つことができます。
単一パケット認証は一部のユーザーにとっては非常に厄介な場合がありますが、セキュリティにレイヤーを追加することをお勧めします。 通常のSSHセキュリティ対策と組み合わせると、これにより、隠されたサービスがかなり安全になります。