web-dev-qa-db-ja.com

ssh-agentを使用する

私は自分のデスクトップをオフィスに持っています。 Xが開始すると、ssh-agentが自動的に開始します。最初にSSH keyを一度追加する必要があります。そうすれば、毎回パスワードを入力しなくてもsshを使用できます。

ただし、SSHを介して(つまり、自宅から)デスクトップに接続すると、ssh-agentにアクセスできず、毎回キーを入力する必要があります。また、ssh-agentの新しいインスタンスを開始しても、接続できません。

リモートシステム(ssh経由で接続している)でssh-agentを使用する方法はありますか?

2
user1968963

エージェント転送を使用できます。クライアント側の構成(ForwardAgent yes)に必ず~/.ssh/configを含めるか、-Aコマンドラインオプションを使用してください。 (この機能はサーバー側で無効にできます(sshd_configAllowAgentForwarding)が、これは任意のシェルコマンドを実行できない制限付きアカウントにのみ役立ちます。)このようにして、ローカルのすべてのキーマシンはリモートセッションで使用できます。クライアント側でエージェント転送を有効にすると、セキュリティに影響することに注意してください。リモートマシンの管理者がキーにアクセスできるようになります(たとえば、Aにいて、BのキーとCのキーがあり、エージェントの転送を有効にする場合)。 Bへの接続で、これによりBがキーにアクセスできるようになり、Cにログインできるようになります。

オフィスマシンのXセッションのエージェントを自宅のSSHセッションで使用できるようにする場合は、Xセッションと同じファイルを指すようにSSH_AUTH_SOCK環境変数を設定する必要があります。手動で行うのは簡単です。

export SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXXXXX/agent.12345

ここで、XXXXXXXXXXXXはランダムな文字列で、12345はエージェントプロセスのPIDです。実行中のエージェントが1つ(find /tmp -maxdepth 1 -user $USER -name 'ssh-*')ある場合はこれを簡単に自動化できますが、複数ある場合に必要なエージェントを検出するのはより複雑です。

実行中のプロセスからSSH_AUTH_SOCKの値を抽出できます。たとえば、Linuxでは、ウィンドウマネージャーがMetacity(デフォルトのGnomeウィンドウマネージャー)の場合、次のようになります。

env=$(grep -z '^SSH_AUTH_SOCK=' /proc/$(pidof -s metacity)/environ')
if [ -n "$env" ]; then export "$env"; fi

または、単一のSSHエージェントを使用するようにオフィスマシンを構成することもできます。ログイン時にエージェントが自動的に開始される場合、ほとんどのディストリビューションでは、環境にSSH_AUTH_SOCKという変数が既に存在する場合はエージェントは開始されません。したがって、SSH_AUTH_SOCKの定義を~/.profileまたは~/.pam_environmentに追加し、ssh-agentでまだ開始されていない場合は手動で.profileを開始します。

export SSH_AUTH_SOCK=~/.ssh/$HOSTNAME.agent
if [ -z "$(pgrep -U "$USER" ssh-agent)" ]; then
  ssh-agent >/dev/null
fi

リモートシェルで、次のコマンドを実行できます。

ssh-agent bash

このようにして、必要な環境変数が設定された新しいSSHエージェントインスタンスと新しいbashシェルを取得します。 exitまたはlogoutを指定してシェルを終了すると、SSHエージェントも終了します。

直接使用しているデバイスで同じキーを使用できる場合は、ssh -Aを使用して、新しく起動したローカルエージェントにアクセスできるようにすることもできますリモートシェル =。これにはセキュリティ上の影響がいくつかありますが、いずれにせよ両方のデバイスでキーを使用できる場合は、違いはありません。

既存のエージェントに接続する場合は、グラフィカルシェルで設定されているのと同じように、関連する環境変数を設定する必要があります。 GUIセッションの自動開始機能を使用して、変数をどこかに格納すると便利な場合があります。 envを使用して環境変数を取得できます。

env | grep SSH

エージェントにアクセスするには、基本的にSSH_AUTH_SOCKが必要です。 SSH_AGENT_PIDはエージェントに信号を送信するために使用され、他のSSH変数は補助ツールに使用されます。

/proc/*/environを介して他のプロセスの環境にアクセスすることもできます。ただし、アイテムはLFで終了するのではなく、NULで終了します。この場合、ファイル方式が望ましいと思います。

3
Pavel Šimerda