SSH nie zezwala na użycie klucza z uprawnieniami do odczytu grupowego

9

Mam programistyczny serwer git, który wdraża się na serwerze działającym, gdy livegałąź jest przekazywana. Każdy użytkownik ma swój login i dlatego post-receivehak, który wykonuje wdrożenie na żywo, jest uruchamiany pod własnym użytkownikiem.

Ponieważ nie chcę utrzymywać kluczy publicznych użytkowników jako kluczy autoryzowanych na zdalnym serwerze na żywo, stworzyłem zestaw kluczy, które „należą do systemu git w celu dodania do zdalnych serwerów na żywo (w post-receivehaku używam $GIT_SSHaby ustawić klucz prywatny z -iopcją).


Mój problem polega na tym, że ze względu na to, że wszyscy użytkownicy mogą chcieć wdrożyć na żywo, klucz prywatny systemu git musi być co najmniej czytelny dla grupy, a SSH naprawdę tego nie lubi.

Oto próbka błędu:

XXXX@XXXX /srv/git/identity % ssh -i id_rsa XXXXX@XXXXX
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: id_rsa

Rozejrzałem się dookoła, oczekując, że znajdę coś, co zmusiłoby ssh do przejścia przez połączenie, ale nie znalazłem nic prócz ludzi ślepo mówiących, że po prostu nie powinieneś pozwalać na dostęp do niczego oprócz jednego użytkownika.

Jessie Ross
źródło

Odpowiedzi:

5

Oto ładny prosty i bezpieczny sposób.

Utwórz nowego użytkownika do transferu ssh, nazywam go git-sync. Utwórz podobnego użytkownika na serwerze z członkostwem w grupie dla repozytorium git. Dodaj klucz publiczny dla użytkownika synchronizacji do tego pliku uprawnionego_klucza2 użytkowników. Zakładam, że użytkownicy git są członkami gitgroup. Upewnij się, że użytkownik git-sync jest również członkiem tej grupy.

Teraz edytuj plik / etc / sudoers, aby zawierał wiersz taki jak:

%gitgroup ALL=(git-sync) NOPASSWD: /usr/bin/git

Umożliwi to dowolnemu członkowi grupy gitgroup uruchomienie komendy / usr / bin / bit jako git-sync bez hasła.

Teraz umieść coś takiego w haczyku po otrzymaniu:

sudo -u git-sync /usr/bin/git push origin
Kent Hulick
źródło
To lepsze niż to, czego szukałem, dzięki!
Jessie Ross,
11

Ci MOŻE używać do odczytu dla grupy plików tożsamości, chyba że jesteś właścicielem klucza. Więc po prostu ustaw plik tożsamości, który ma być własnością, na przykład użytkownik root, a następnie wszyscy użytkownicy repozytorium git są gotowi do pracy.

Zaletą tego jest to, że nie potrzebujesz sudo - rozwiązanie będzie prostsze.

Zauważ, że to ponownie napotka oryginalny problem, jeśli używasz roota do wypychania repozytorium git.

Linus Swälas
źródło
2
To jest niesamowite i znacznie lepsze niż odpowiedzi „nie rób tego”. Dzięki!
Ian McGowan,
2
Permissions 0640 for 'id_rsa' are too open.

Klucz prywatny musi pozostać prywatny. Nie powinieneś pozwalać nikomu go czytać.

Ponieważ nie chcę utrzymywać kluczy publicznych użytkowników jako kluczy autoryzowanych na zdalnym serwerze na żywo, stworzyłem zestaw kluczy, które „należą do systemu git w celu dodania do zdalnych serwerów na żywo (w post-receivehaku używam $GIT_SSHaby ustawić klucz prywatny z -iopcją).

  1. skonfiguruj parę kluczy do ssh z dev na serwer produkcyjny
  2. w post-receiveskrypcie przechwytującym spróbuj czegoś takiego:

    if [ "live" == "$branch" ]; then
        ssh -t user@prod "git --work-tree=... --git-dir=... checkout -f"
    fi
    
kwanty
źródło
Jak mogę „skonfigurować parę kluczy do ssh z dewelopera na serwer produkcyjny”, z tym mam problem. Mam już 2 na swoim miejscu.
Jessie Ross,
1
On dev: ssh-keygen, ssh-copy-id user@prod. Na prod: chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys.
kwanty
1
Problem polega na tym, że jest wielu użytkowników, dlatego muszę to powtórzyć dla każdego użytkownika, który chce edytować czasy dla każdego projektu istniejącego na serwerze.
Jessie Ross,
Nie. Musisz skonfigurować tylko dwóch kolejnych użytkowników: jednego do ssh z dewelopera do prod, a drugiego do uruchomienia git checkout...(w prod).
kwanty
post-receiveHak (maszyna dev) prowadzony jest przez użytkownika, który naciska na zmianę (a więc za zgodą użytkowników), więc będą one mieć różne klucze, nie mogę pomóc, które użytkownik będzie. W post-receiveakcji działają dwa zaczepy na dwóch różnych serwerach.
Jessie Ross,