it-swarm-ru.tech

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

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

62
Andrew Stacey

Если вы заходите в конфигурационный файл 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
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.
39
Caleb

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

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

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

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

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

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

18
Chris Cogdon

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

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

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

Введение

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

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

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

Уровень 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'
[email protected]
SSH_TTY=/dev/pts/2

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

15
F. Hauri

Предположим, что пользователи "joe" и "deb" имеют доступ к учетной записи "x". Тогда в аккаунте x's .ssh_authorized_keys вы добавляете строки:

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

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

10
user37161

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

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

Это будет:

  • ssh-add -L: Список открытых ключей
  • awk '{ print $2 }': Получить только отпечаток пальца
  • xargs -i grep '{}' ~/.ssh/authorized_keys: С каждым ключом проверьте, какой из них находится на authorized_keys
  • head -n 1: Получить только первый
3
pci

В 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 знак равно

3
vpathak

В дополнение к @F. Хаури ответь, я готовлю полезную "LoggedIn Prompt".

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

[email protected] kszumny
[email protected] kszumny
[email protected] tom
[email protected]
[email protected] chris
[email protected] 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)\[email protected]\h:\w\$ '

Result

enter image description here

0
noisy