Czy mogę dowiedzieć się, którego klucza SSH użyto do uzyskania dostępu do konta?


56

Czy można dowiedzieć się, którego klucza SSH użyto do uzyskania dostępu do konta? Mam konto na serwerze, do którego pozwalam kilku (zaufanym!) Osobom dostęp za pośrednictwem ssh. Przydałoby się wiedzieć, kto i kiedy się zalogował. Mam dostęp do konta root, więc mogę przeglądać dzienniki, ale wydaje się, że nic tam nie ma. Czy jest jakiś przełącznik konfiguracji, który pozwoli w jakiś sposób zidentyfikować klucz w logach?


Czy próbowałeś grać z LogLevel w sshd_config?
EightBitTony

Byłoby niezwykle przydatne, aby dowiedzieć się, który klucz został użyty do autoryzacji bieżącej sesji - w moim przypadku do kontroli dostępu do repozytorium Mercurial dostępnego poprzez wspólne logowanie. Wszystkie istniejące techniki wymagają wątkowania tożsamości za pomocą opcji polecenia, która jest nieco niezgrabna.
Tom Anderson


Mechanizm Centos
jhfrontz

Odpowiedzi:


38

Jeśli przejdziesz do pliku konfiguracyjnego sshd (zwykle /etc/ssh/sshd_config) i zmienisz dyrektywę LogLevel na VERBOSE:

LogLevel VERBOSE

... możesz zobaczyć coś takiego w dziennikach:

24 czerwca 22:43:42 localhost sshd [29779]: Znaleziono pasujący klucz RSA: d8: d5: f3: 5a: 7e: 27: 42: 91: e6: a5: e6: 9e: f9: fd: d3: ce
Jun 24 22:43:42 localhost sshd [29779]: Zaakceptowano klucz publiczny dla caleb z portu 127.0.0.1 59630 ssh2

Od man sshd_config:

   LogLevel
          Gives  the  verbosity  level that is used when logging messages from
          sshd(8).  The possible values are: QUIET, FATAL, ERROR,  INFO,  VER-
          BOSE,  DEBUG,  DEBUG1,  DEBUG2,  and  DEBUG3.   The default is INFO.
          DEBUG and DEBUG1 are equivalent.  DEBUG2  and  DEBUG3  each  specify
          higher  levels of debugging output.  Logging with a DEBUG level vio-
          lates the privacy of users and is not recommended.

To wygląda obiecująco. Odcisk palca mówi mi, który klucz jest używany. Wielkie dzięki.
Loop Space

W celu wydrukowania odcisku palca bieżącej sesji:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
F. Hauri

Lubię GNU sed !
F. Hauri

3
@ F.Hauri, chyba że coś mi umknie, czy to nie zwróci złej rzeczy, jeśli PID zostanie ponownie użyty do drugiej sesji SSH? Wygląda na to, że zawsze zwróci najwcześniejszy odcisk palca dla danego PID w pliku auth.log, a nie najnowszy.
godlygeek

@godlygeek O tak! Muszę lepiej whipe qdyrektywę, sklep linię do końca pliku ... sed linia stać: sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log. Zdecydowanie: I Love sed!
F. Hauri

15

Nieco podobne do odpowiedzi @ user37161 . Jeśli na współużytkowanym koncie działa niestandardowa powłoka, a powłoka musi wiedzieć, który użytkownik tam jest, wówczas uruchomienie skryptu „otoki” może być niewystarczające, ponieważ informacje nie są przekazywane do niestandardowej powłoki poza metodami, które mogą powodować wyścig warunki.

Zamiast tego możesz użyć environment=opcji w pliku uprawnione klucze, aby ustawić zmienną środowiskową, którą niestandardowa powłoka może następnie odczytać.

Wewnątrz .ssh/authorized_keyspliku wstaw każdą linię za pomocą zestawu zmiennych środowiskowych, takich jak:

environment="REMOTEUSER=jrhacker" ssh-rsa ....
environment="REMOTEUSER=jbloggs" ssh-rsa ....

Następnie niestandardowa powłoka lub dowolny z różnych skryptów rc może odczytać $REMOTEUSERzmienną i podjąć odpowiednią akcję.

Pamiętaj jednak, że jeśli używasz standardowej powłoki, zalogowany użytkownik może modyfikować plik, aby udaremnić różne rzeczy. Ponadto istnieje pewne ryzyko, że użytkownicy mogą ustawiać zmienne środowiskowe, takie jak LDPRELOAD. Zobacz sshd_configdokumentację na temat PermitUserEnvironment.


13

Zaktualizuj 31.10.2016 o formacie dziennika

Niektóre skrypty do prawidłowej instalacji

Istnieje pełna użyteczna metoda śledzenia / rejestrowania połączeń ssh według klucza z zastrzeżeniem nazwy użytkownika.

Wprowadzenie

Oprócz odpowiedzi @Caleb chciałbym podzielić się kilkoma sztuczkami:

Nota: Pracuję nad Debianem 6.0 .

Instalacja serwera

Poziom dziennika SSHD

Najpierw upewnij się, że konfiguracja serwera ma wystarczający poziom rejestrowania:

jako root, ustawi i aktywuje pełne logowanie:

sed '/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{s/^/# /;h;s/$/\nLogLevel VERBOSE/};${p;g;/./!{iLogLevel VERBOSE'$'\n;};D}'  -i /etc/ssh/sshd_config

Można napisać:

sed '
     /^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
        s/^/# /;
        h;
        s/$/\nLogLevel VERBOSE/
    };
    ${
        p;
        g;
        /./!{
            iLogLevel VERBOSE
        };
        D
    }'  -i /etc/ssh/sshd_config

lub w skrypcie sed :

#!/bin/sed -f
/^[^#]*LogLevel.*\(QUIET\|FATAL\|ERROR\|INFO\)/{
    s/^/# /;
    h;
    s/$/\nLogLevel VERBOSE/
};
${
    p;
    g;
    /./!{
        iLogLevel VERBOSE
    };
    D
}

Który można uruchomić jako:

patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config

Niż za aktywację tego:

service ssh restart

Syslog: czynienie odcisków palców czytelnymi dla użytkownika

Teraz weź odciski palców w pliku czytelnym dla użytkownika:

echo ':msg, regex, "Found matching .* key:" -/var/log/sshdusers.log' \
    > /etc/rsyslog.d/ssh_key_user.conf 
echo ':msg, regex, "Accepted publickey for" -/var/log/sshdusers.log' \
    >> /etc/rsyslog.d/ssh_key_user.conf 

service rsyslog restart

Spróbuj (ponownie) zalogować się z ssh, aby upewnić się, że nowy plik sshdusers.logzostał utworzony (i zawiera coś)

chmod 644 /var/log/sshdusers.log

Stosowanie

Spowoduje to wydrukowanie odcisku palca bieżących sesji:

sed -ne "/sshd.$PPID.:.*matching .SA key/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log

sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log

Wtyczka dla .bashrc

I na koniec jest mały dodatek do umieszczenia na końcu twojego /etc/bash.bashrclub użytkownika .bashrc:

ssh_oPwd=$OLDPWD
ssh_oUmask=$(umask)
umask 077
ssh_tempdir=$(mktemp -d /tmp/ssh-id-XXXXXXX)
cd $ssh_tempdir || exit 1

ssh_crtFp=$(
    sed -ne "/sshd.\($(($(ps ho ppid $PPID)))\|$PPID\).:.*\(Accepted publickey\|matching .SA key\)/{s/^.* //g;h};\${x;p}" /var/log/sshdusers.log
)
for ((ssh_i=1;ssh_i<=$(wc -l <$HOME/.ssh/authorized_keys);ssh_i++));do
    export ssh_line="$(sed -ne ${ssh_i}p <$HOME/.ssh/authorized_keys)"
    echo "$ssh_line" >tempKey
    export ssh_lFp=($(ssh-keygen -l -f tempKey))
    if [ "${ssh_lFp[1]}" == "$ssh_crtFp" ] ;then
        export SSH_KEY_USER=${ssh_line##* }
        break
      fi
  done

cd $OLDPWD
OLDPWD=$ssh_oPwd
rm -fR $ssh_tempdir
umask $ssh_oUmask
unset ssh_lFp ssh_line ssh_i ssh_crtFp ssh_tempdir ssh_oUmask ssh_oPwd

więc po ponownym zalogowaniu z SSH zobaczysz:

set | grep ^SSH
SSH_CLIENT='192.168.1.31 43734 22'
SSH_CONNECTION='192.168.1.31 43734 192.168.1.2 22'
SSH_KEY_USER=user@mydesk
SSH_TTY=/dev/pts/2

Uwaga W przypadku niektórych instalacji plik autoryzowanego klucza może mieć inną nazwę, na przykład $HOME/.ssh/authorized_keys2...


Kiedy to zostało opublikowane, byłem pod GNU / Linux Debian 6 , ale to działa tak samo pod Debianem 7 ...
F. Hauri


Ulepszony z powodu zmiany formatu dziennika
F. Hauri 31.10.16

Miły. Twój patchSshdConfigLogLevel.sed nie powinien mieć na końcu „.sed”, ponieważ niepotrzebnie ujawniałby szczegóły implementacji. #! linia jest całkowicie wystarczająca.
Alex North-Keys,

@ AlexNorth Klucze rozszerzenia pod UN * X są generaly strony technicznej unseless, jak wolimy użytkowania mim i filedla poznania typów plików. Ale jak dla ludzi, którzy przeglądania systemu plików, posiadające rozszerzenia takie jak .pl, .py, .sh, .awk, .sed, .tar.gz, lub nawet .png.b64.gzjest przydatna!
F. Hauri

8

Załóżmy, że użytkownicy „Joe” i „Deb” mają dostęp do konta „x”. Następnie na koncie x .ssh_authorized_keysdodajesz linie:

command='wrapper joe' joe public key
command='wrapper deb' deb public key

Również w skrypcie opakowania możesz zrobić wszystko, co chcesz, rejestrując klucz prywatny tego Joe za pomocą polecenia sshw określonym dniu i czasie $ORIGINAL_COMMAND.


3

W Fedorze 20+ próby logowania i sukcesy są zapisywane w /var/log/audit/audit.log. Ten dziennik zapisuje próby logowania (niepowodzenia i sukcesy), a klucz linii papilarnych użyty do próby logowania jest zapisywany w polu o nazwie fp.

Możesz porównać zalogowany odcisk palca z odciskami palców w uprawnionych kluczach, uruchamiając go wiersz po wierszu przez ssh-keygen -l

Szczegółowe wyjaśnienie dotyczące logowania ssh oraz ich bezpieczeństwa i wykrywania włamań znajduje się tutaj: http://vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia


2

Możesz spróbować:

ssh-add -L | awk '{ print $2 }' | xargs -i grep '{}' ~/.ssh/authorized_keys  | head -1

Prawdopodobnie bardziej precyzyjny i mniej intensywny procesor:ssh-add -L | awk 'NR==FNR { k=$2;next } /^#/{next} $2==k { print $3;exit} $3==k {print $4;exit} ' - ~/.ssh/authorized_keys
Otheus

0

Oprócz @F. Odpowiedź Hauri, przygotowuję przydatny „monit LoggedIn”.

Jeden dodatkowy plik jest opcjonalny ($ HOME / .ssh / users):

kszumny@laptop kszumny
kszumny@comp2 kszumny
tom@laptop tom
pati@home
chris@workstation1 chris
chris@workstation2 chris

Tę część należy wkleić do /etc/profile(dla wszystkich użytkowników) lub do~/.bashrc

other_users_prompt()
{
    pids=`ps fx | grep "sshd:\s" | awk '{print $1}'`
    users=""
    for uid in $pids
    do
        ssh_crtFp=`sed -ne "/sshd.$uid.:.*matching .SA key/{s/^.* //g;p;q}" /var/log/sshdusers.log`
        for ((ssh_i=1;ssh_i<=$(wc -l <$HOME/.ssh/authorized_keys);ssh_i++));do
            export ssh_line="$(sed -ne ${ssh_i}p <$HOME/.ssh/authorized_keys)"
            echo "$ssh_line" >tempKey
            export ssh_lFp=($(ssh-keygen -l -f tempKey))
            if [ "${ssh_lFp[1]}" == "$ssh_crtFp" ] ;then
                export SSH_KEY_USER=${ssh_line##* }
                ST_USER=`cat $HOME/.ssh/users | grep "${SSH_KEY_USER}" | awk '{print $2}'`
                if [ -z "$ST_USER" ]; then
                    ST_USER=$SSH_KEY_USER
                fi
                if [ -z "$users" ]; then
                    users="$ST_USER"
                else
                    users="$users\n$ST_USER"
                fi
                break
            fi
        done
    done

    if [ `echo -e "$users" | sort | uniq -c | wc -l` == 1  ]; then
       exit
    fi

    users=`echo -e "$users" | sort | uniq -c | awk '{print $2"("$1")"}' | xargs echo -e`
    echo -e "[LoggedIn:$users] "

}

PS1='$(other_users_prompt)\u@\h:\w\$ '

Wynik

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.