OS X MavericksでSSH KeychainIntegrationを無効にするにはどうすればよいですか?


18

OS X MavericksのSSH KeychainIntegrationに問題があります。Appleのサポートサイトを調べてみましたが、私の問題を抱えている人は誰もいません。私が見てきた私は別のコミュニティを試してみることにしたので、一見、それだけでなくSSHを使用する方法がわからない人がたくさん。

まず、私の構成が機能しています。資格情報がエージェントにキャッシュされた状態で、必要に応じてホストにキーペアとsshを使用できます。予想どおり、「ssh-add -l」でキャッシュされた資格情報を確認できます。OS Xスタイルのダイアログで「キーチェーンのパスワードを記憶する」というチェックボックスを使用して、パスワードを入力するように求められます。通常、このチェックボックスは無視しますが、チェックすると、キーチェーンにキーが保存されていることがわかります。ただし、キーチェーンに保存されているこのキーは、パスワードを持っているため、使用されていないようです。少なくともそれは、私が読んださまざまなものから収集したものです。パスワードをダイアログに入力し、キーがエージェントにキャッシュされると、接続に成功しますが、「キーチェーンへのパスワードの保存に失敗しました」と言われる前に接続できません。このエラーメッセージを見ると、さらに調査することになりました。接続するたびにエラーが発生するのは好きではありません。

SSH_CONFIG(5)のマンページを見ると面白くなってきます。キーチェーンを処理するための2つのオプションがあります。これはAppleに固有のAskPassGUIとKeychainIntegrationです。〜/ .ssh / configでこれらを切り替えることができ、そうするといくつかの興味深い結果が得られます。

AskPassGUIをnoに設定すると、ターミナルの入力テキスト行ではなく、OS Xスタイルのダイアログが表示されなくなります。大したことない。ただし、これを行うと、ssh-agentは資格情報をキャッシュしません。これは明らかに壊れており、資格情報がキャッシュされていればテキストプロンプトを簡単に表示できるのでイライラします。

KeychainIntegrationをnoに設定すると、sshは次のようにハードエラーをスローします。

~/.ssh/config: line 11: Bad configuration option: KeychainIntegration
~/.ssh/config: terminating, 1 bad configuration options

私の質問は、単純に、これです:OS X Keychain Integration for SSHを実際に無効にする方法はありますか?


いい質問です。すぐに答えはありませんが、それが得た票で、誰かのレーダーに現れますように。OS Xのビルドのバグは、1行の設定ファイルで確認できます-値をyesまたはnoに設定すると、説明どおりに失敗します。
bmike

明確化のポイント:ssh-addが資格情報を正常にキャッシュした場合にのみ、「キーチェーンへのパスワードの保存に失敗しました」というメッセージが表示されます。私はしていない、私はそれを再読み込みするとき、それは読み込み方法ですすべての接続の試み、上のそれを参照してください。キャッシュされた資格情報を使用すると、期待どおりに静かに接続します。
ジム14

回答:


7

Mavericksに同梱されている現在のバージョンのSSH(ここにあります)のソースコードに基づくと、configオプションの機能はKeychainIntegrationまだ実装されていないようです。私は、オプションを参照しないopenssh / readconf.hの内容に基づいてこの仮定をしていKeychainIntegrationます。ただし、askpassguiオプションを参照します。そのファイルの「キーワード」構造体をチェックすると、実際にはkeychainintegrationオプションが存在しないことが示されます(これはoBadOption(NULL)オペレーションコードが返されることを意味します)。

希望する機能がmanページで指定されている方法で実装されていないことを示す別の手がかりは、ファイルopenssh / keychain.cです。ソースコードは、defaultsシステム(つまり、プロパティリストファイル)がに関連する設定を保存するために使用されていることを実際に示していますKeychainIntegration。具体的には、store_in_keychain関数からの行はKeychainIntegrationを参照します。

/* Bail out if KeychainIntegration preference is -bool NO */
if (get_boolean_preference("KeychainIntegration", 1, 1) == 0) {
    fprintf(stderr, "Keychain integration is disabled.\n");
    goto err;
}

対応するget_boolean_preference関数は次のとおりです。CFPreferencesCopyAppValue「org.openbsd.openssh」アプリケーション識別子からブール値を取得するために使用していることに注意してください。

#if defined(__APPLE_KEYCHAIN__)

static int get_boolean_preference(const char *key, int default_value,
int foreground)
{
int value = default_value;
CFStringRef keyRef = NULL;
CFPropertyListRef valueRef = NULL;

keyRef = CFStringCreateWithCString(NULL, key, kCFStringEncodingUTF8);
if (keyRef != NULL)
    valueRef = CFPreferencesCopyAppValue(keyRef,
        CFSTR("org.openbsd.openssh"));
if (valueRef != NULL)
    if (CFGetTypeID(valueRef) == CFBooleanGetTypeID())
        value = CFBooleanGetValue(valueRef);
    else if (foreground)
        fprintf(stderr, "Ignoring nonboolean %s preference.\n", key);

if (keyRef)
    CFRelease(keyRef);
if (valueRef)
    CFRelease(valueRef);

return value;
}

#endif

これは、次のKeychainIntegrationdefaultsコマンドを実行して、自分で機能を無効にできることを意味する場合があります。

defaults write org.openbsd.openssh KeychainIntegration -bool NO

または、すべてのユーザーに設定するには:

sudo defaults write /Library/Preferences/org.openbsd.openssh KeychainIntegration -bool NO


2
深く掘り下げて、感謝しています。あなたが提案したように私は経由に設定KeychainIntegrationNOてみましたdefaultssshその後、私が設定AskPassGUIしたかのように動作し~/.ssh/configます-資格情報はキャッシュされず、パスフレーズを常に求められます。役に立たない。それでも、あなたは質問に答えたと思います。答えは、単に「無効にすることはできますが、完全には実装されておらず、おそらく結果が気に入らないでしょう」ということです。
ジム14年

私はこれに対する答えを見つけるためにいろいろ探していました。MacとLinuxの間で移植するカスタム.zshrcファイルがあるので、キーチェーンがssh-agentと追加されたキーの管理を制御していることに気がつきました。
LF4 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.