OpenSSH z kluczami publicznymi z bazy danych

14

Czy możliwe jest pobranie kluczy publicznych z bazy danych zamiast pliku autoryzowanych_kluczy?

Chciałbym użyć takiej konfiguracji do zarządzania dostępem ssh do rzeczy takich jak repozytoria git dla wielu użytkowników bez potrzeby ponownego tworzenia pliku autoryzowanych_kluczy przy każdej zmianie lub dodaniu klucza publicznego.

Fionn
źródło
1
Używam do tego marionetki
Matt Simmons,
Userify może zarządzać tymi kontami za pomocą scentralizowanej administracji, ale lokalnego uwierzytelniania. W ten sposób, jeśli twoja scentralizowana baza danych ulegnie awarii, nadal będziesz mógł się zalogować, ale uzyskasz wszystkie zalety scentralizowanego zarządzania.
Jamieson Becker,

Odpowiedzi:

16

Znalazłem to pytanie, próbując sam na nie odpowiedzieć. Po kilku poszukiwaniach i eksperymentach znalazłem kilka innych opcji. Pominąłem część dotyczącą dystrybucji kluczy jako alternatywy, ponieważ Matt Simmons to opisał. Wiem też, że zdarza się, że to nie wystarczy. Na przykład, jeśli jesteś GitHub i musisz przechowywać miliony kluczy publicznych dla jednego użytkownika, ciągłe aktualizowanie plików SSH uprawnione_klucze i utrzymywanie ich synchronizacji między potencjalnie dziesiątkami a setkami skrzynek brzegowych nie jest wykonalne ani pożądane.

Więc,

  1. Przede wszystkim RedHat (i warianty) mają obsługiwaną łatę dla OpenSSH, która dodaje opcje AuthorizedKeysCommandi AuthorizedKeysCommandRunAs. Łatka została scalona w górę w openssh 6.2. Aby zacytować ze strony man :

    AuthorizedKeysCommand

    Określa program do wyszukiwania kluczy publicznych użytkownika. Program zostanie wywołany za pomocą pierwszego argumentu nazwy autoryzowanego użytkownika i powinien wygenerować na standardowych wyjściach wiersze klucza autoryzowanego (patrz AUTORYZOWANE przyciski w sshd (8)). Domyślnie (lub po ustawieniu pustego ciągu) nie jest uruchamiane narzędzie AuthorizedKeysCommand. Jeśli AuthorisedKeysCommand nie autoryzuje użytkownika pomyślnie, autoryzacja przechodzi do pliku AuthorizedKeysFile. Pamiętaj, że ta opcja działa tylko przy włączonym uwierzytelnieniu Pubkey.

    AuthorizedKeysCommandRunAs

    Określa użytkownika, na którego koncie jest uruchamiane narzędzie AuthorizedKeysCommand. Pusty ciąg (wartość domyślna) oznacza, że ​​użytkownik jest autoryzowany.

    W dzisiejszych eksperymentach stwierdziłem, że od razu nie działa to z powodu domyślnych zasad SELinux. Możesz obejść ten problem, wyłączając wymuszanie SELinux za pomocą setenforce 0. Ponieważ włączenie SELinux jest prawdopodobnie złym pomysłem, zamiast tego możesz wygenerować poprawną politykę. W moim przypadku było to tak proste, jak próba zalogowania się z AuthorizedKeysCommandopcją skonfigurowaną w, /etc/ssh/sshd_configa następnie za pomocą audit2allow -a -M local && semodule -i local.pp. To w zasadzie przegląda dzienniki kontroli i znajduje rzeczy, którym zapobiegano, i generuje dla nich wyjątki. Jeśli prawdopodobnie znajdują się tam inne elementy, które mogą znaleźć się na białej liście, prawdopodobnie powinieneś dowiedzieć się więcej o audit2allowtym, aby upewnić się, że nowe zasady są odpowiednie.

  2. Istnieją inne (prawdopodobnie mniej przetestowane i zaufane) łatki, aby dodać podobną funkcjonalność. Na przykład istnieje openssh-script-auth . Możesz także znaleźć łatkę używaną przez RedHat i zastosować ją bezpośrednio. Szybki przegląd Googling odkrywa https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patch i https://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch, które są na podstawie wersji RH, ale zaktualizowanych do nowszych wersji OpenSSH.

  3. Łata OpenSSH, aby wykonywać wyszukiwania kluczy bezpośrednio z niektórych sklepów (np. GitHub i CodeBaseHQ i inne zrobiły). Zgodnie z moją najlepszą wiedzą GitHub nie otworzył tej łatki, ale wiem, że w przeszłości spotkałem się z wersjami wyszukiwania kluczy MySQL i PostgreSQL. Próbowałem je teraz znaleźć ponownie, ale nie miałem szczęścia.

  4. Istnieje również kilka opcji opartych na BEZPIECZNIKACH. Na przykład istnieje LPKFuse, który pozwala obsługiwać klucze publiczne z LDAP, zmieniając AuthorizedKeysFilelokalizację na jedną w systemie plików LPKFuse. LPKFuse FS tworzy pliki wirtualne, których zawartość jest wspierana przez pola z serwera katalogów.


Podsumowując, myślę, że opcja nr 1 jest zdecydowanie najlepsza, ponieważ jest oficjalnie obsługiwana przez RedHat. Ponadto pozwala umieścić dowolną logikę w tym skrypcie (w tym rozmowę z bazą danych) w dowolnym języku.

Bo Jeanes
źródło
Odp: # 1 fajne znalezisko !! Mam nadzieję, że pójdzie w górę, będzie przydatny w ESXi.
Jason Tan
@JasonTan: AuthorizedKeysCommand poszedł w górę w openssh 6.2. Zaktualizowałem również odpowiedź, aby to odzwierciedlić.
Bluewind
Świetna odpowiedź, opcja 1 była dokładnie tym, czego szukałem.
Shane Kilkelly,
3

O ile mi wiadomo, OpenSSH nie ma takiej możliwości. Najlepszym rozwiązaniem może być automatyczne generowanie skryptu co noc przez skrypt (lub tak często, jak to konieczne).

Możesz także zobaczyć to pytanie: System do dystrybucji kluczy publicznych SSH

Matt Simmons
źródło
1

Wierzę, że w nowszych wersjach openssh możesz przechowywać klucze we wpisie LDAP użytkownika. Jeśli używasz już LDAP lub AD do zarządzania kontem, powinieneś być w stanie wykorzystać go również do zarządzania kluczami.

Mtinberg
źródło