Jak mogę wyłączyć SSH KeychainIntegration w OS X Mavericks?

18

Mam pewne problemy z SSH KeychainIntegration w OS X Mavericks. Próbowałem przeszukiwać witrynę pomocy technicznej Apple, ale nie widziałem, żeby ktoś miał mój problem. I widziałem wielu ludzi, którzy pozornie nie wiedzą, jak korzystać z SSH, że dobrze, więc postanowiłem spróbować innej społeczności.

Po pierwsze, moja konfiguracja działa. Jestem w stanie używać mojej pary kluczy i ssh do hostów w razie potrzeby, a moje poświadczenia są buforowane w agencie. Jestem w stanie zobaczyć moje poświadczenia zapisane w pamięci podręcznej za pomocą „ssh-add -l”, zgodnie z oczekiwaniami. Zostaję poproszony o podanie hasła za pomocą okna dialogowego w stylu OS X, z polem wyboru z napisem „Zapamiętaj hasło w moim pęku kluczy”. Zazwyczaj ignoruję to pole wyboru, ale kiedy je zaznaczam, widzę, że mój klucz jest przechowywany w pęku kluczy. Jednak klucz przechowywany w pęku kluczy najwyraźniej nigdy nie jest używany, ponieważ mam na nim hasło. Przynajmniej tyle zebrałem z różnych rzeczy, które przeczytałem. Kiedy wprowadzam hasło do okna dialogowego, a klucz jest buforowany w agencie, nawiązuję połączenie, ale nie zanim usłyszę komunikat „Zapisywanie hasła do pęku kluczy nie powiodło się”. Widzenie tego komunikatu o błędzie skłoniło mnie do dalszego zbadania; Nie lubię pojawiać się błędu przy każdym połączeniu.

Ciekawie robi się patrząc na stronę SSH_CONFIG (5) . Istnieją dwie opcje postępowania z pękiem kluczy, specyficzne dla Apple: AskPassGUI i KeychainIntegration. Możesz przełączać je w ~ / .ssh / config, a to daje interesujące wyniki.

Ustawienie AskPassGUI na no spowoduje, że nie będzie już wyświetlane okno dialogowe w stylu OS X, a zamiast tego linia tekstu w terminalu. Nic takiego. Ale jeśli to zrobisz, ssh-agent nie buforuje twoich danych uwierzytelniających. Jest to po prostu zepsute i frustrujące, ponieważ mógłbym łatwo żyć z monitem tekstowym, gdyby dane uwierzytelniające były buforowane.

Ustawienie KeychainIntegration na no, ssh generuje twardy błąd, jak następuje:

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

Moje pytanie po prostu brzmi: czy istnieje sposób, aby faktycznie wyłączyć integrację pęku kluczy OS X dla SSH?

Jim
źródło
Ładne pytanie, nie mam natychmiastowej odpowiedzi, ale mam nadzieję, że dzięki głosom pojawi się na czyimś radarze. Mogę potwierdzić błąd w mojej kompilacji systemu OS X za pomocą tylko jednego pliku konfiguracyjnego - ustawienie wartości na tak lub nie kończy się niepowodzeniem zgodnie z opisem.
bmike
Wyjaśnienie: Otrzymuję komunikat „Zapisywanie hasła do pęku kluczy nie powiodło się” tylko wtedy, gdy ssh-add pomyślnie buforuje poświadczenia. I nie widzę w każdej próbie połączenia, która jest, jak to brzmi, kiedy ją ponownie przeczytać. Dzięki buforowanym poświadczeniom po prostu łączy się cicho, jak można się spodziewać.
Jim

Odpowiedzi:

7

Na podstawie kodu źródłowego bieżącej wersji SSH, która jest dostarczana z Mavericks (znajduje się tutaj ), wydaje się, że funkcjonalność opcji konfiguracji KeychainIntegrationnie została jeszcze zaimplementowana. Przyjmuję to założenie na podstawie zawartości openssh / readconf.h , która nie odwołuje się do KeychainIntegrationopcji. Odnosi się jednak do askpassguiopcji. Sprawdzanie struktury „słów kluczowych” w tym pliku rzeczywiście pokazuje, że keychainintegrationopcja nie jest obecna (co z kolei oznacza, że oBadOptionzostanie zwrócony kod operacji (NULL)).

Kolejną wskazówką sugerującą, że pożądana funkcjonalność nie jest zaimplementowana w sposób określony przez stronę podręcznika, jest plik: openssh / keychain.c . Kod źródłowy faktycznie pokazuje, że defaultssystem (tj. Pliki listy właściwości) jest używany do przechowywania ustawień związanych z KeychainIntegration. W szczególności wiersze z store_in_keychainodwołania do funkcji 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;
}

Oto odpowiednia get_boolean_preferencefunkcja. Pamiętaj, że używa go CFPreferencesCopyAppValuedo uzyskania wartości logicznej z identyfikatora aplikacji „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

Może to oznaczać, że możesz sam wyłączyć tę KeychainIntegrationfunkcję, wykonując następujące polecenie domyślne:

defaults write org.openbsd.openssh KeychainIntegration -bool NO

lub ustawić dla wszystkich użytkowników:

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

Eddie Kelley
źródło
2
Kopałeś głęboko i doceniam to. Próbowałem ustawienie KeychainIntegration, aby NOpoprzez defaultsjak sugeruje. sshnastępnie zachowuje się tak, jakby ustawić AskPassGUIw ~/.ssh/config- brak poświadczenia są buforowane, a ja zapytany o hasłem przez cały czas. Mniej niż przydatne. Myślę jednak, że odpowiedziałeś na pytanie, a odpowiedź brzmi: „Można to wyłączyć, ale nie jest w pełni zaimplementowane i prawdopodobnie nie polubisz wyników”.
Jim
Dziękuję bardzo, szukałem wszędzie, aby znaleźć odpowiedź na to pytanie. Ponieważ mam niestandardowy plik .zshrc, który przesyłam między Mac i Linuksem, doprowadziło mnie to do szału, że brelok przejmuje kontrolę nad zarządzaniem ssh-agent i dodanymi kluczami.
LF4