1PasswordによるSSHエージェントフォワーディング

1Passwordマニュアル|SSHエージェント転送を活用し、リモート環境で安全かつ効率的にSSHリクエストを行う方法を詳しく解説します。

1PasswordによるSSHエージェントフォワーディング

SSHエージェントフォワーディングを使うと、クラウド開発環境リモートワークステーションからGitコマンドを実行したりコミットに署名したりするなど、ローカルマシンであるかのようにリモート環境内でSSHリクエストを行うことができます。

リモートホストに秘密鍵をSaveする代わりに、SSHエージェントフォワーディングを使用してリクエストをローカルの1PasswordSSHエージェントに転送できます。次に、秘密鍵がローカルの1Passwordプロセスを離れることなく、生体認証でリクエストを承認できます。

必要条件

💡Windowsをお使いの場合

SSHエージェントフォワーディングはWindowsではサポートされていませんが、1Password WSL統合を設定して、WindowsホストからWSLインスタンスでSSHリクエストを認証できます。

SSHエージェントフォワーディング

リモートホストのエージェントフォワーディングを有効にすると、リモート環境内で行う全SSHリクエストが1PasswordSSHエージェントソケットを介してローカルの1Passwordプロセスに転送されます。

1Passwordで設定したオプション(フィンガープリントなど)を使ってSSHリクエストをローカルで承認できます。その後、リモートサーバーに秘密鍵を提供しなくても、承認がリモートホストに転送されます。

⚠️注意

SSHエージェントフォワーディングは信頼できるホストでのみ使うようにしてください。こちらでSSHエージェントフォワーディングをより安全に使う方法について学習してください。

SSHエージェントフォワーディングを準備する

OpenSSHでは、SSHエージェントフォワーディングはデフォルトでオフになっています。単一のセッションまたは特定のホストに対してオンにすることを選択できます。

シングルセッション用に準備する

シングルセッションのみエージェントフォワーディングをオンにするには、次のsshコマンドで-Aフラグを使用します。

ssh -A [email protected]

エージェントフォワーディングをオンにしてリモートホストに接続すると、リモートホストの環境変数SSH_AUTH_SOCKが自動的に設定されます。このソケット経由で送信されたデータは、ローカルの1Passwordソケットに転送されます。

[email protected]:~$ echo $SSH_AUTH_SOCK 結果の例: /tmp/ssh-XXXXNpdlnL/agent.151

エージェントフォワーディングが機能しているかどうかを確認するには、次のコマンドを実行して、1Passwordからリモートホストに転送されたSSH鍵のリストを表示させます。

[email protected]:~$ ssh-add -l 結果の例: 256 SHA256:2zmxMpLy5MeIx18pBUkumptKkKinlghygOvV6URe8QI SSH Key from 1Password (ED25519)

SSH鍵がリストに表示されたら、リモートサーバー内からSSHリクエストを実行してみてください。

[email protected]:~$ ssh -T [email protected]

ローカルマシン上の1Passwordアプリで、リクエストを承認するように求められます。

特定のホスト用に準備する

セッションごとに-Aフラグを使う必要がないように、特定のホストに対してSSHエージェントフォワーディングを常に設定したい場合は、そのホストを含​​めるように~/.ssh/configファイルを編集します。

例(Host example.com) ForwardAgent yes

SSHエージェントフォワーディングのセキュリティー

セキュリティーに関する考慮事項

エージェントフォワーディングセッションでローカルターミナルやIDEやその他のSSHクライアントにSSH鍵の使用を許可すると、同じキーを使用してリモート環境内で行われる全ての新しい接続も許可されます。他のユーザーが同じOSユーザーとしてリモート環境にアクセスした場合、セッション中はSSH鍵を使用してリモートホストからの接続を認証できます。

ただし、リモート環境で利用可能なその他のSSH鍵は、使う前にユーザーの承認が必要です。エージェント内の全ての鍵をリモート環境で追加の承認なしに使える標準のOpenSSHエージェントとは異なり、1PasswordSSHエージェントでは、各SSH鍵を使う前にユーザーの承認が必要です。リモート環境からこれらの鍵のいずれかを使おうとすると、認証が必要な1Password承認プロンプトが表示されるため、エージェントフォワーディングはOpenSSHエージェントよりも1Passwordの方が安全です。

エージェントフォワーディングをより安全に利用するには

以下のことをお勧めします。

  • エージェントフォワーディングは、必要な場合かつ安全であると信頼できる環境でのみ使用してください。

  • コマンドごとにエージェントフォワーディングを設定するか、特定のホストでのみエージェントフォワーディングを許可するように~/.ssh/configファイルを準備してください。デフォルトでは、全ホストに対してSSHエージェントフォワーディングをオンにしたりしないでください。

~/.ssh/config(悪い例 👎) Host * ForwardAgent yes

エージェントフォワーディングのために、常にForwardAgent yesディレクティブのスコープを特定のホストまたはドメインに絞ることをお勧めします。例えば、 Gitpodのエージェントフォワーディングをオンにするには、以下のようにしてください。

~/.ssh/config (良い例👍) Host *.gitpod.io ForwardAgent yes

ユースケース:クラウド開発環境

ローカルの統合開発環境(IDE)を使ってクラウド開発環境(CDE)に接続し、リモートGitコミットをプル、プッシュ、署名する場合は、ローカルの1PasswordSSHエージェントを介してこれらのコマンドを認証できます。

例えば、クラウドベースの開発環境への認証に使うIDEデスクトップアプリがローカルワークステーションにあるとします。リモートGitリポジトリーにアクセスするには、CDEワークスペースを使い、Gitリクエストを認証してコミットに署名する必要があります。SSHエージェントフォワーディングを使うと、ローカルワークステーションで実行されている1PasswordSSHエージェントを介して、IDEデスクトップアプリでCDEワークスペースからのSSHおよびGitコマンドを認証できます。

SSHエージェントフォワーディング

クラウド開発環境からのGitリクエストを承認できるようにSSHエージェントフォワーディングを設定するには、SSH設定ファイルを編集してCDEホストを追加します。IDEのリモート開発統合では、これを自動的に認識するはずです。

エージェントフォワーディングが正しく設定されているかどうかを確認するには、IDEでリモートシェルを開き、次のコマンドを実行します。

$ ssh-add -l

結果の例: 256 SHA256:2zmxMpLy5MeIx18pBUkumptKkKinlghygOvV6URe8QI SSH Key from 1Password (ED25519)

エージェントがSSHリクエストに使えるSSH鍵のリストが表示されます。

Git認証にSSHを使う

CDEがGitでの認証にHTTPSを使うように設定されていて、代わりにSSHを使う場合は、次のコマンドを実行してCDEのリモートGitの設定を変更します。

$ git config --global url."ssh://git@".insteadOf "https://"

あるいは、クラウド開発を初期化するスクリプト(cloud-init)またはドットファイルにコマンドを追加することもできます。

次回CDEからGitリクエストを行うと、1Passwordはリクエストを承認するように要求します。

例:

$ git fetch

今後SSH認証のみを使う場合は、リポジトリーへのHTTPS書き込みアクセスを取り消すことをお勧めします。

Gitコミット署名を準備する

ローカル.gitconfigファイルはクラウド開発環境に自動的に転送されないため、リモートGitコミット署名を設定するには、CDEのGit設定を変更する必要があります。

  • コミット署名にSSHを使うようにGitを設定します。

git config --global gpg.format ssh

  • コミットに常に署名するようにGitに指示します。

git config --global commit.gpgsign true

  • コミットに署名するために使うSSH鍵を設定します。

git config --global user.signingkey <your SSH public key>

認証モデル

クラウド開発環境で認証が必要なSSHまたはGitリクエストを実行すると、1PasswordはCDEに接続されているIDEのSSH鍵の使用を承認するように求めます。リクエストを承認すると、IDE全体がそのキーの使用を承認されます。同じOSユーザーでクラウド開発環境で実行されている全てのプロセスも承認されるため、セキュリティー上の考慮事項として留意する必要があります。

使用例:リモートワークステーション

SSH経由で接続するリモートワークステーションがあり、そのワークステーションからSSHおよびGitリクエストを実行する場合は、ローカルホストで実行される1Passwordエージェントを通じてそれらのリクエストを認証できます。

例えば、自宅に全てのGitリポジトリーを含むデスクトップワークステーションがあるとします。外出先でCreate業したい場合は、ラップトップを使用してSSH経由でリモートワークステーションに接続し、GitリポジトリーでCreate業します。SSHエージェントフォワーディングを使うと、ローカルラップトップで実行されている1PasswordSSHエージェントを介して、リモートワークステーションからのSSHおよびGitコマンドを認証できます。

SSHエージェントフォワーディング

リモートワークステーションからのSSHおよびGitリクエストを承認できるようにSSHエージェントフォワーディングを設定するには、ローカルホスト上のSSH設定ファイルを編集して、リモートワークステーションでのエージェントフォワーディングを許可します。

エージェントフォワーディングが正しく設定されているかどうかを確認するには、リモートワークステーションに接続し、次のコマンドを実行します。

$ ssh-add -l

結果の例:

256 SHA256:2zmxMpLy5MeIx18pBUkumptKkKinlghygOvV6URe8QI SSH Key from 1Password (ED25519)

エージェントがSSHリクエストに使えるSSH鍵のリストが表示されます。

リモートワークステーション上でIdentityAgentの設定を変更する

リモートワークステーションにも1PasswordSSHエージェントがインストールされている場合は、GitとSSHが、リモートワークステーションにインストールされている1Passwordアプリのエージェントソケットではなく、ローカルホストから転送されたソケットを使うようにしてください。

IdentityAgentは環境変数SSH_AUTH_SOCKよりも優先されるため、SSHシェルを使用していない場合にのみ設定が適用されるように、リモートワークステーションの~/.ssh/configIdentityAgentファイルを例えば次のように変更することをお勧めします。

Match host * exec "test -z $SSH_TTY"

IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"

その後、リモートワークステーションのSSHシェルから実行される全てのGitまたはSSHコマンドは、SSH_AUTH_SOCK認証に転送されたものを使用し、1PasswordはローカルホストからのSSHリクエストを承認するように要求します。

この変更は、ワークステーションにリモートでアクセスするのではなく、ローカルで使う場合の1PasswordSSHエージェントの実行方法には影響しません。IdentityAgentワークステーションで実行されているSSHエージェントを使うために、設定は通常通り適用されます。

Gitコミット署名を準備する

ローカル.gitconfigファイルはリモートワークステーションに自動的に転送されないため、デフォルトではリモートGit設定が使われます。

ローカルホストで使用しているのと同じSSH鍵を使って、リモートワークステーションで1PasswordによるGitコミット署名を設定している場合は、設定を変更する必要はありません。

op-ssh-sign署名プログラムは、SSH_AUTH_SOCKとSSH_TTYの両方の環境変数が設定されていることを検出すると、リモートワークステーションの1Passwordソケットではなく、ローカルホストから転送されたソケットを使うように自動的に適応します。

認証モデル

リモートシェルまたはリモートで接続されたIDEから認証が必要なSSHまたはGitリクエストを実行すると、1Passwordは、リモートワークステーションへの接続に使うターミナルまたはIDEのSSH鍵の使用を承認するように求めます。

リクエストを承認すると、アプリ全体がこのキーの使用を許可されます。同じOSユーザーの下でリモートワークステーション上で実行されている全てのプロセスも許可されるため、セキュリティー上の考慮事項として留意する必要があります。

トラブルシューティング

1Password SSH Agentでエージェントフォワーディングを使う際に問題が発生する場合は、確認すべき点がいくつかあります。

SSH_AUTH_SOCK環境変数が設定されているかどうかを確認する

「echo $SSH_AUTH_SOCK」をターミナルで実行して、サーバー上でこの環境変数が設定されていることを確認します。

[email protected]:~$ echo $SSH_AUTH_SOCK

結果の例:

/tmp/ssh-XXXXNpdlnL/agent.151

変数が設定されていない場合、SSHエージェントフォワーディングは機能しません。1Password SSHエージェントがオンになっていること、および認証にエージェントを使うようにSSHクライアントが設定されていることを確認してください。

SSHエージェントが正しいSSHキーにアクセスできるかを確認する

ターミナルで「ssh-add -l」を実行すると、1Passwordからリモートホストに転送されたSSH鍵のリストが表示されます。

[email protected]:~$ ssh-add -l

結果の例:

256 SHA256:2zmxMpLy5MeIx18pBUkumptKkKinlghygOvV6URe8QI SSH Key from 1Password (ED25519)

SSH鍵がリストに表示されない場合は、そのキーが1PasswordSSHエージェントで使えるかどうか、またSSHエージェントが使うように設定されている保管庫にSaveされているかどうかを確認してください。

サーバー上でエージェントフォワーディングが許可されているかどうかを確認する

リモートサーバーでエージェントフォワーディングを使うには、サーバーのsshd_config

ファイルでAllowAgentForwardingオプションをYesに設定する必要があります。