6

Редактировать: Что мне действительно нужно знать, КАКОЙ ключ ssh от авторизованного ключа используется для идентификации в настоящее время вошедшего в систему пользователя.

По словам "man sshd":

Protocol 2 public key consist of options, keytype, base64-encoded key, comment.

Я вижу, что когда я использую ssh-keygen, комментарием обычно является локальная идентификация пользователя. Есть ли способ получить доступ к этому значению, когда я на удаленном компьютере? (Вроде как переменная оболочки SSH_CLIENT)

(Предполагая, что комментарий должен быть каким-то удаленным идентификатором, я хотел бы записать это из сценария оболочки! Это на убунту)

5 ответов5

3

Я лично не рекомендовал бы это решение, но выкладываю это для обсуждения.

Если вы готовы:

  1. Изменить уровень ведения журнала SSHd
  2. Предоставьте вашему сценарию доступ к /var/log/secure (или эквивалентному файлу журнала)

Вы можете установить "LogLevel DEBUG" в sshd_config, чтобы получать следующие записи каждый раз, когда ключ ssh успешно используется для аутентификации:

Aug 13 11:51:13 myhost sshd[20195]: debug1: matching key found: file /home/myuser/.ssh/authorized_keys, line 3
Aug 13 11:51:13 myhost sshd[20195]: Found matching DSA key: 00:aa:bb:cc:dd:ee:00:c0:0b:fa:ce:00:00:ab:cd:ef

Написание сценария для анализа журналов и получения соответствующей информации будет тривиальным. Вы, вероятно, могли бы использовать grep для «sshd [$ PPID]», чтобы уменьшить количество строк, которые должен выполнить скрипт.

Обратите внимание, что изменение уровня журнала на DEBUG значительно увеличит размер ваших журналов и может нарушить конфиденциальность пользователей. Из "man sshd_config":

Вход с уровнем DEBUG нарушает конфиденциальность пользователей и не рекомендуется.

Я уверен, что есть несколько шагов, которые можно предпринять, чтобы сделать это решение немного менее страшным (например, запись информации отладки sshd в другой файл и контроль доступа к этому файлу и сценарию), но в конце концов, если день все еще будет делать ты съеживаешься

1

Это для удобства, со страницы руководства ssh-keygen в Debian:

Для ключей RSA1 также имеется поле комментария в файле ключей, которое только для удобства пользователя помогает идентифицировать ключ. Комментарий может сказать, для чего нужен ключ, или что-то полезное. При инициализации ключа комментарий инициализируется как «user @ host», но его можно изменить с помощью параметра -c.

Я думаю, что самое близкое, что вы получите для определения того, какой ключ использовался для входа, это ssh-add , с -L, со страницы руководства:

-L Перечисляет параметры открытого ключа всех идентификаторов, представленных в настоящее время агентом.

Вы можете увеличить уровень регистрации демона ssh до DEBUG1:

LogLevel DEBUG1

И журнал покажет отпечаток RSA ключа SSH, используемого для входа в систему:

Aug 13 08:52:56 ubuntu_test sshd[17115]: debug1: matching key found: file /home/username/.ssh/authorized_keys, line 1
Aug 13 08:52:56 ubuntu_test sshd[17115]: Found matching RSA key: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Вы можете получить отпечаток ключа с помощью ssh-keygen:

-l Показать отпечаток указанного файла открытого ключа. Частные ключи RSA1 также поддерживаются. Для ключей RSA и DSA ssh-keygen пытается найти соответствующий файл открытого ключа и печатает свой отпечаток пальца. В сочетании с -v, ASCII-изображение ключа предоставляется вместе с отпечатком пальца.

Из файла авторизованных ключей вам придется разделить каждую строку на новый файл для чтения с помощью ssh-keygen -l . Вот пример сценария Ruby, который сделает это:

#!/usr/bin/env ruby
File.open("/home/username/.ssh/authorized_keys").each do |l|
  file_name = l.split(" ")[2]
  key_file = File.new("#{file_name}.pub_key", "w")
  key_file.puts l
  key_file.close
  puts %x{ssh-keygen -l -f #{file_name}.pub_key}
end
1

Это поможет, если вы хотите отслеживать вход из скрипта на компьютере SSHd .

Шаг 1: переменная оболочки ' SSH_CLIENT ' дает вам две части информации

  • Удаленный IP-адрес (192.168.1.2 в строке ниже)
  • Удаленный порт TCP, через который подключен клиент (56120 ниже)
    SSH_CLIENT='192.168.1.2 56120 22'  
                ----------- -----  
                 Source IP   Port

Шаг 2: Теперь вы можете выполнить вход (в обратном направлении) к исходному IP (192.168.1.2) и проверить UserID.

SSHd-Server$ ssh you@192.168.1.2 exec "netstat -et  | grep 56120"  
 tcp  0  0 hostname:56120 localhost:ssh ESTABLISHED user1  9937126
                    -----                           ----- 

Вы определили user1@192.168.1.2.

1

Если у вас есть открытый ключ (подозреваемого пользователя), вы можете найти подпись в auth.log . Сопоставьте это с выводом из (обратите внимание, что -l здесь маленький -L):

ssh-keygen -l <enter>

Эта команда запросит путь к открытому ключу и выведет подпись для этого ключа.

0

Так как я не мог найти полный ответ в сети для этого, я написал свой собственный сценарий bash:

#!/bin/bash

cat /root/.ssh/authorized_keys | while read KEY; do
        echo "";
        name=$(echo "$KEY" | cut -d ' ' -f3-);
        file_name=$(echo "$name" | tr ' ' '_');
        echo $KEY > $file_name;
        fingerprint=$(ssh-keygen -l -f $file_name);
        rm -f $file_name;
        echo "$name login's";
        logins=$(grep `echo "$fingerprint" | awk '{print $2}'` /var/log/secure*);
        logins_count=$(echo "$logins" | wc -l);
        echo "Total Login's: $logins_count";
        if [ -n "$logins" ]; then
                login_pids=$(echo "$logins" | perl -p -e 's/.*\[(.*)\].*/$1/g');
                for f in `ps -e | grep 'sshd' | awk '{print $1}' | grep "$login_pids"`; do
                        [ -n "$f" ] && echo "Current sessions pid: $f";
                done;
        fi;
done;

#

Редактировать: я написал это много лет спустя, надеюсь, что это может пригодиться кому-то https://github.com/sayajin101/SSH-Key-Login-Extended

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .