Чи можу я дізнатися, який ключ ssh використовувався для доступу до облікового запису?


56

Чи можна дізнатися, який ключ ssh використовувався для доступу до облікового запису? У мене є обліковий запис на сервері, до якого я дозволяв декільком (довіреним!) Людям доступ до ssh. Мені буде корисно мати можливість знати, хто входив і коли. У мене є кореневий доступ, щоб я міг переглядати журнали, але там, здається, нічого немає. Чи є якийсь перемикач конфігурації, який покладе якийсь спосіб ідентифікації ключа в журналах?


Ви спробували грати з 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]: Прийнято publickey для календаря з порту 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.

Це виглядає перспективно. Потім відбиток пальця повідомляє мені, який ключ використовується. Щиро дякую.
Петля пробілу

Для друку відбитків пальців поточного сеансу: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. Остаточно: я люблю sed!
Ф. Хаурі

15

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

Натомість ви можете скористатися environment=параметром у файлі санкціонованих_кейсів для встановлення змінної середовища, яку потім може прочитати користувацька оболонка.

Всередині вашого .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

Спочатку переконайтеся, що конфігурація сервера має достатній рівень реєстрації:

як 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

Syslog: робить відбитки пальців користувача читабельними

Тепер візьміть відбитки пальців у файлі, прочитаному користувачем:

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

Nota При певній установці файл авторизованого ключа може бути інакше названий, як $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". Потім у рахунок 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
Отей

0

Крім @F. Відповідаю Хаурі, я готую корисний «Підвісок LoggedIn».

Ще один додатковий файл ($ HOME / .ssh / користувачів):

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.