Могу ли я узнать, какой ключ ssh был использован для доступа к учетной записи?

56

Можно ли узнать, какой ключ ssh был использован для доступа к учетной записи? У меня есть учетная запись на сервере, к которой у нескольких (доверенных!) Людей есть доступ через ssh. Я бы счел полезным узнать, кто вошел в систему и когда. У меня есть root-доступ, поэтому я могу просматривать журналы, но там, похоже, ничего нет. Есть ли какой-нибудь переключатель конфигурации, который позволит идентифицировать ключ в журналах?

Loop Space
источник
Вы пытались играть с LogLevel в sshd_config?
EightBitTony
Было бы поразительно полезно иметь возможность выяснить, какой ключ использовался для авторизации текущего сеанса - в моем случае, для контроля доступа к хранилищу Mercurial, доступ к которому осуществляется через общий логин. Все существующие методы включают в себя передачу идентификатора через опцию команды, которая немного неуклюжа.
Том Андерсон,
5
Об этом есть запрос функции OpenSSH: добавьте отпечаток pubkey в сообщение журнала аутентификации
Steffen
Механизм Centos: unix.stackexchange.com/questions/147295/…
jhfrontz

Ответы:

38

Если вы зайдете в конфигурационный файл sshd (обычно /etc/ssh/sshd_config) и измените директиву LogLevel на VERBOSE:

LogLevel VERBOSE

... вы можете увидеть что-то подобное в журналах:

Июн 24 22:43:42 localhost sshd [29779]: Найден соответствующий ключ 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]: принят открытый ключ для caleb с порта 127.0.0.1 59630 ssh2

От 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.
Калеб
источник
Это выглядит многообещающе. Затем отпечаток пальца говорит мне, какой ключ используется. Большое спасибо.
Loop Space
Для печати отпечатка пальца текущего сеанса:sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;p;q}" /var/log/auth.log
Ф. Хаури
Мне нравится GNU sed !
Ф. Хаури
3
@ F.Hauri, Если я что-то упустил, разве это не вернуло бы неправильную вещь, если PID повторно используется для второго сеанса SSH? Похоже, что он всегда будет возвращать самый старый отпечаток для данного PID в auth.log, а не самый последний.
Godlygeek
@godlygeek Ах, да! У меня лучше whipe qдирективы, хранить строки до конца файла ... нове линии становятся: sed -ne "/sshd.$PPID.:.*matching DSA key/{s/^.* //g;h};\${x;p}" /var/log/auth.log. Определенно: я люблю сед!
Ф. Хаури
15

Несколько похоже на ответ @ user37161 . Если в общей учетной записи запущена настраиваемая оболочка, и оболочке необходимо знать, кто там находится, запуск сценария «оболочки» может оказаться недостаточным, поскольку информация в ней не передается в настраиваемую оболочку, кроме как через методы, которые могут привести к гонке. условия.

Вместо этого вы можете использовать environment=опцию в файле author_keys, чтобы установить переменную окружения, которую пользовательская оболочка сможет затем прочитать.

Внутри вашего .ssh/authorized_keysфайла добавьте каждую строку с набором переменных среды, как показано ниже:

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

Затем пользовательская оболочка или любой из различных сценариев rc могут прочитать $REMOTEUSERпеременную и предпринять соответствующие действия.

Однако обратите внимание, что если вы используете стандартную оболочку, то вошедший в систему пользователь может изменить файл, чтобы помешать различным действиям. Кроме того, есть некоторые риски, позволяющие пользователям устанавливать такие переменные среды, как LDPRELOAD. Смотрите sshd_configдокументацию о PermitUserEnvironment.

Крис Когдон
источник
13

Обновление 2016-10-31 о формате журнала

Несколько скриптов для правильной установки

Существует полнофункциональный метод для отслеживания / регистрации ssh-соединений по ключу с затратами на имя пользователя.

Введение

В дополнение к ответу @Caleb, я хотел бы поделиться некоторыми маленькими хитростями:

Примечание: я работаю над Debian 6.0 .

Установка сервера

Уровень SSHD Log

Сначала убедитесь, что конфигурация сервера имеет достаточный уровень ведения журнала:

В качестве пользователя root будет установлен активный подробный вход в систему:

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

Может быть написано:

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

или в сценарии sed :

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

Который может быть запущен как:

patchSshdConfigLogLevel.sed -i /etc/ssh/sshd_config

Чем активировать это:

service ssh restart

Системный журнал: создание отпечатков пальцев для чтения пользователем

Теперь возьмите отпечатки пальцев в читаемом пользователем файле:

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

Попробуйте (повторно) войти в систему из ssh, чтобы убедиться, что новый файл sshdusers.logсоздан (и содержит что-то), затем

chmod 644 /var/log/sshdusers.log

использование

Это напечатает отпечаток текущего сеанса:

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

Плагин для .bashrc

И, наконец, есть небольшая надстройка, которую нужно добавить в конец вашей /etc/bash.bashrcили пользователя .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

поэтому после повторного входа из SSH вы увидите:

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

Примечание. В некоторых случаях файл авторизованного ключа может иметь другое имя, например $HOME/.ssh/authorized_keys2...

Ф. Хаури
источник
Когда это было опубликовано, я был под GNU / Linux Debian 6 , но эта работа была почти такой же под Debian 7 ...
Ф. Хаури
Модернизировано из-за изменения формата журнала
Ф. Хаури
Приятно. Ваш patchSshdConfigLogLevel.sed не должен иметь ".sed" в конце, так как он излишне предоставит детали реализации. # линия вполне достаточна.
Алекс Норт-Кис
@ AlexNorth-Кис расширение под UN * X является Generaly technicaly unseless, как мы предпочитаем использовать мимику и fileдля познания типов файлов. Но для человека , который просматривать файловые системы, имеющие расширения , например .pl, .py, .sh, .awk, .sed, .tar.gz, или даже .png.b64.gzэто полезно!
Ф. Хаури
8

Предположим, что пользователи "joe" и "deb" имеют доступ к учетной записи "x". Затем в аккаунте х .ssh_authorized_keysдобавьте строки:

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

Также в скрипте-обертке вы можете делать все, что захотите, регистрируя, какой закрытый ключ Джо использовал sshв определенную дату и время с помощью команды $ORIGINAL_COMMAND.

user37161
источник
3

В fedora 20+ попытки входа и успехи сохраняются в /var/log/audit/audit.log. В этом журнале сохраняются попытки входа в систему (сбои и успехи), а отпечаток ключа, используемый для попытки входа в систему, сохраняется в поле с именем fp.

Вы можете сравнить отпечаток ключа вошедшего в систему с отпечатками в авторизованном ключе, выполнив его построчно через ssh-keygen -l

Подробное объяснение в отношении ssh-логинов и их безопасности и обнаружения вторжений находится здесь: http://vpathak.tumblr.com/post/121343814158/fedora-audit-log-with-love-from-russia

vpathak
источник
2

Вы можете попробовать это:

ssh-add -L | awk '{ print $2 }' | xargs -i grep '{}' ~/.ssh/authorized_keys  | head -1
PCI
источник
Возможно, более точный и менее интенсивный процессор: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

В дополнение к @F. Хаури ответь, я готовлю полезную «подсказку для входа в систему».

Один дополнительный файл является необязательным ($ HOME / .ssh / users):

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

Эта часть должна быть вставлена ​​в /etc/profile(для всех пользователей) или в~/.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\$ '

Результат

введите описание изображения здесь

шумный
источник