DigitalOceanでKryptoniteを使用してSSHで安全に接続する方法

前書き

SSHは、リモートLinuxサーバーに接続するための主要な方法です。 このチャネルを保護することは、安全なインフラストラクチャを維持するために不可欠です。 SSHを介してリモートサーバーに対して認証を行う最も一般的な方法は、公開キーと秘密キーのペアを使用することです。 リモートサーバーの認証キーリストに公開キーを追加すると、準備が整います。

より難しい質問は、秘密鍵を安全に保管する方法です。

通常、開発者は秘密鍵を~/.sshディレクトリに保存します。 ただし、単純なcat ~/.ssh/id_rsaコマンドで秘密鍵を読み取ることができます。 マシン上のアプリケーションは、パスフレーズで暗号化されている場合でも、SSH秘密キーを読み取る可能性があります。

このセキュリティリスクの一般的な解決策は、2番目の要素を追加することです(つまり、 multi-factor authentication, or MFAを有効にします)。 これの欠点は、セットアップコストと使いやすさの2つです。 作成するサーバーごとに、OATH-TOTP PAMモジュールを使用して共有シークレットをロードするようにOpenSSHサーバーを構成する必要があります。 これは時間のかかるプロセスであり、間違いを犯す場所がたくさんあります。 さらに、サーバーにSSH接続するたびに、電話でアプリを開き、6桁のコードを読み取って、端末に入力する必要があります。 これにより、ワークフローが大幅に遅くなる可能性があります。

MFAの構成の欠点を回避するために、開発者はNitroKeyやYubiKeyなどのUSBハードウェアセキュリティモジュール(HSM)を使用して、SSHパブリックキーとプライベートキーのペアを生成および保存します。 これらは、SSHキーペアを保持する小さなUSBデバイスです。 サーバーにSSH接続するたびに、USBデバイスをコンピューターに接続し、デバイスのボタンを押します。

ただし、HSMは高価です。 SSH互換デバイスの価格は最大50ドルです。 持ち運びできるもう1つのデバイスであり、サーバーにSSHで接続するたびに、USBデバイスをコンピューターに接続し、物理ボタンを押す必要があります。 通常、USB HSMにはディスプレイ画面がないため、実際にどのログインを承認しているかがわからず、認証されたものの監査ログを表示する方法もありません。

Kryptoniteは、SSH秘密鍵を保護するための新しいソリューションです。 無料で、セットアップが簡単で、ユーザーフレンドリーで、追加のセキュリティ保護が組み込まれています。 サーバー側での変更は必要なく、スマートフォンへのプッシュ通知を介して(アプリを開かずに)ログイン要求を承認できます。 既知のホストは、どのマシンまたはサーバーにSSHで接続しているかに関係なく、常に携帯電話であなたと一緒にいます。

このガイドでは、電話機でKryptoniteを使用してSSHキーペアを生成し、電話機をローカルコンピュータとペアリングし、Kryptoniteを使用してDigitalOcean DropletにSSHで接続します。

前提条件

このガイドに従うには、次のものが必要です。

  • Linuxディストリビューションを実行している1つのDigitalOcean Droplet。

  • スマートフォン:iPhone(iOS 9.1以降)またはAndroid(6.0以降)。

  • macOS(10.10以降)、Ubuntu、Debian、RHEL、CentOS、Fedora、またはKali Linuxを実行しているパーソナルコンピューター。

[[ステップ-1 -—-クリプトナイトキーペアの生成]] ==ステップ1—クリプトナイトキーペアの生成

最初のステップは、iOSまたはAndroidフォンでget.krypt.coに移動して、クリプトナイトアプリをダウンロードすることです。

アプリがインストールされたら、アプリを開き、Generate Key Pairをタップして、クリプトナイトSSHキーペアを作成します。 公開鍵を識別するためにメールを入力します(またはこの手順をスキップします)。

次に、Kryptoniteのコマンドラインユーティリティをインストールする必要があります。

[[step-2 -—- installing-kr]] ==ステップ2 —krのインストール

次の手順は、ローカルコンピューターで続行されます。 kr command line utilityをインストールする必要があります。これにより、SSHはクリプトナイトに保存されているキーで認証できます。 ここで行うように、お好みのパッケージマネージャー(npmや `brew) or simply use `curlなど)を使用してkrをインストールできます。

セキュリティ上の理由から、インストールする前にインストールスクリプトを調べたい場合は、curl https://krypt.co/kr > install_krを実行して確認できます。 それがどのように機能するか、そしてthe kr documentationにインストールする別の方法についてもっと読むことができます。

準備ができたら、krをインストールします。

curl https://krypt.co/kr | sh

プッシュ通知を有効にするように求められます。 これは、Kryptoniteがプッシュ通知を介してログイン承認要求を送信するために必要です。

アプリケーション、キーペア、およびkrが用意できたので、次のステップは、コンピューターをクリプトナイトとペアリングすることです。

[[step-3 -—- pairing-kryptonite-with-your-computer]] ==ステップ3—クリプトナイトとコンピューターのペアリング

krが正常にインストールされたら、次を実行します。

kr pair

端末にQRコードが表示されます。 端末ウィンドウが小さい場合は、QRコード全体が見えるように大きくするか、フォントサイズを小さくする必要があります。

クリプトナイトアプリで、画面下部のAllow Camera Accessをタップします。 カメラが表示されたら、ターミナルでQRコードをスキャンします。 数秒後、Kryptoniteアプリは正常なペアリングを表示し、ターミナルはKryptonite SSH公開キーを印刷します。

このキーペアが機能することをテストしてみましょう。

[[step-4 -—- testing-ssh-with-kryptonite]] ==ステップ4—クリプトナイトを使用したSSHのテスト

すべてが機能することを確認するには、パブリックme.krypt.coサーバーにSSHで接続してみてください。

ssh me.krypt.co

Kryptoniteアプリに、次の3つのオプションでSSH認証を承認するように要求するリクエストが表示されます。

  • Allow Onceは、me.krypt.coにログインするためのこの1つの要求のみを承認します。

  • Allow for 1 hourは、この要求と、ペアリングされたコンピューターからの他のすべてのSSHログイン要求を次の1時間承認します。 これらのログインが発生しても通知されますが、自動的に承認されます。

  • Rejectはこの要求を破棄し、SSHログインはコンピューターで失敗します(またはローカルキーにフォールバックします)。

Allow Onceをタップします。 me.krypt.coへのSSHログインが成功すると、疑似シェルがすぐに終了し、シールドのロゴが表示されます。

デバイスをロックしてme.krypt.coにSSHで接続しようとすると、目的のコマンドを使用してデバイスにプッシュ通知が送信され、ロック画面からの承認を求められます。

[[step-5 --- adding-your-kryptonite-pubkey-to-digitalocean]] ==ステップ5—クリプトナイトPubkeyをDigitalOceanに追加する

Kryptoniteがコンピューターとペアリングされたので、SSH経由で使用するすべてのサーバーとツールに公開キーをすばやく追加できます。

DigitalOceanに公開キーを追加するには、次のコマンドを実行します。

kr digitalocean

次のようなDigitalOceanに固有の手順を含む出力が表示されます。

OutputPublic key copied to clipboard.
Press ENTER to open your web browser to DigitalOcean.
Then click “Add SSH Key” and paste your public key.

次はこれを行う必要があります。

  1. ターミナルからENTERを押すと、DigitalOcean設定ページに自動的に移動し、必要に応じてログインします。

  2. Add SSH Keyをクリックします。

  3. Kryptonite公開キーを貼り付けます。

  4. Saveをクリックします。

SSHキーを追加するための詳細な手順は、Step 3 of this SSH on DigitalOcean tutorialにあります。

キーをDigitalOceanにアップロードすると、新しいドロップレットに簡単に追加できます。 サーバーを作成するときに、Kryptoniteキーのボックスを選択するだけです。 次に、このキーを既存のドロップレットに追加しましょう。

[[step-6 --- adding-your-kryptonite-pubkey-to-an-existing-droplet]] ==ステップ6—既存のドロップレットにクリプトナイトパブキーを追加する

krコマンドラインツールを使用して、ローカルSSHキーまたはパスワードでアクセスできるすでに実行中のドロップレットにクリプトナイト公開キーを追加できます。

次のコマンドを実行して、Kryptonite公開キーをDropletの承認済みユーザーファイルに追加し、ユーザー名とDropletのIPアドレスを必ず置き換えます。

kr add user@your_server_ip

これが完了したら、SSHを試行して動作することをテストします。

ssh user@your_server_ip

スマートフォンでKryptonite SSHログインリクエストを受け取ります。

結論

Kryptoniteをセットアップし、Kryptonite公開キーをDigitalOceanアカウントに正常に追加したので、ペアリングしたコンピューターからDropletにSSHで接続できるようになりました。

秘密鍵は携帯電話に安全に保存され、デバイスから離れることはありません。 要求を許可すると、秘密鍵を使用して、デバイス上でローカルにSSHログインナンスに暗号的に署名します。 次に、この署名がコンピューターに返送され、SSH認証が完了します。

クリプトナイトのしくみの詳細については、Kryptonite’s system architecture blog postKryptonite and kr source codeをご覧ください。