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


56

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


Вы пытались играть с LogLevel в sshd_config?
EightBitTony

Было бы поразительно полезно иметь возможность выяснить, какой ключ использовался для авторизации текущего сеанса - в моем случае, для контроля доступа к хранилищу Mercurial, доступ к которому осуществляется через общий логин. Все существующие методы включают в себя передачу идентификатора через опцию команды, которая немного неуклюжа.
Том Андерсон,


Ответы:


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.


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


2

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

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

Возможно, более точный и менее интенсивный процессор: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\$ '

Результат

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.