序章

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

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

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

このセキュリティリスクに対する一般的な解決策は、2番目の要素を追加することです(つまり、 多要素認証、または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を使用しているマシンやサーバーに関係なく、既知のホストが常に携帯電話に存在します。

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

前提条件

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

  • Linuxディストリビューションを実行する1つのDigitalOceanドロップレット。
  • スマートフォン:iPhone(iOS 9.1以降)またはAndroid(6.0以降)。
  • macOS(10.10以降)、Ubuntu、Debian、RHEL、CentOS、Fedora、またはKaliLinuxを実行しているパーソナルコンピューター。

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

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

アプリがインストールされたら、アプリを開き、キーペアの生成をタップして、クリプトナイトSSHキーペアを作成します。 公開鍵を識別したい場合は、電子メールを入力してください(またはこの手順をスキップしてください)。

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

手順2—krをインストールする

次のステップは、ローカルコンピューターで続行されます。 krコマンドラインユーティリティをインストールする必要があります。これにより、SSHがクリプトナイトに保存されているキーで認証できるようになります。 krは、お好みのパッケージマネージャー(npm brewなど)でインストールするか、ここで行うようにcurlを使用することができます。

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

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

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

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

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

ステップ3—クリプトナイトとコンピューターのペアリング

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

  1. kr pair

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

クリプトナイトアプリで、画面下部のカメラアクセスを許可をタップします。 カメラが表示されたら、ターミナルでQRコードをスキャンします。 数秒後、Kryptoniteアプリはペアリングが成功したことを示し、端末はKryptoniteSSH公開鍵を出力します。

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

ステップ4—クリプトナイトを使用したSSHのテスト

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

  1. ssh me.krypt.co

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

  • Allow Once は、この1つのリクエストのみを承認してme.krypt.coにログインします。
  • 1時間許可は、この要求と、ペアリングされたコンピューターからの次の1時間の他のすべてのSSHログイン要求を承認します。 これらのログインが発生すると通知が届きますが、自動的に承認されます。
  • 拒否はこの要求を破棄し、SSHログインはコンピューターで失敗します(またはローカルキーにフォールバックします)。

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

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

ステップ5—クリプトナイトパブキーをDigitalOceanに追加する

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

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

  1. kr digitalocean

次のように、DigitalOceanに固有の命令を含む出力が表示されます。

Output
Public 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. SSHキーの追加をクリックします。
  3. クリプトナイト公開鍵を貼り付けます。
  4. 保存をクリックします。

SSHキーを追加するための詳細な手順は、DigitalOceanチュートリアルでのこのSSHのステップ3にあります。

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

ステップ6—既存の液滴にクリプトナイトパブキーを追加する

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

次のコマンドを実行して、クリプトナイト公開鍵をDropletの許可されたユーザーファイルに追加します。必ず、ユーザー名とDropletのIPアドレスを置き換えてください。

  1. kr add user@your_server_ip

これを行ったら、SSHで接続して動作することをテストします。

  1. ssh user@your_server_ip

お使いの携帯電話にクリプトナイトSSHログインリクエストが届きます。

結論

クリプトナイトを設定し、クリプトナイト公開鍵をDigitalOceanアカウントに正常に追加したので、ペアリングされたコンピューターから任意のドロップレットにSSHで接続できます。

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

クリプトナイトの動作の詳細については、クリプトナイトのシステムアーキテクチャブログ投稿およびクリプトナイトとkrのソースコードを参照してください。