Вопрос или проблема
Как и где я могу проверить, какие ключи были добавлены с помощью ssh-add
в мой ssh-agent
?
Используйте ssh-add -l
, чтобы вывести их список по отпечаткам.
$ ssh-add -l
2048 72:...:eb /home/gert/.ssh/mykey (RSA)
Или ssh-add -L
, чтобы получить полный ключ в формате OpenSSH.
$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc[...]B63SQ== /home/gert/.ssh/id_rsa
Последний формат такой же, как если бы вы добавляли их в файл ~/.ssh/authorized_keys
.
Удивительно, но в версии ssh-add
для MacOS в какой-то момент перестали отображаться имена файлов, как это было в Linux. Я написал скрипт, который делает то же самое для отпечатков, имеющих соответствующий файл в ~/.ssh/
.
Я назвал функцию ssh-add_wf
, wf = с файлом. Подробности функции ниже:
$ type ssh-add_wf
ssh-add_wf is a function
ssh-add_wf ()
{
while read -r line; do
for file in ~/.ssh/*.pub;
do
printf "%s %s\n" "$(ssh-keygen -lf "$file" | awk '{$1=""}1')" "$file";
done | column -t | grep --color=auto "$line" || echo "$line";
done < <(ssh-add -l | awk '{print $2}')
}
Пример
$ ssh-add_wf
SHA256:mwvSCr2CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected] (RSA) /Users/myuser/.ssh/[email protected]_id_rsa.pub
SHA256:qInIrnKcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected] (RSA) /Users/myuser/.ssh/[email protected]_id_rsa.pub
SHA256:tX+AAJA0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SHA256:EyNkhTLQXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected] (RSA) /Users/myuser/.ssh/[email protected]_id_rsa.pub
SHA256:KKKVwtvFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SHA256:tr0hZP52XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
В приведенном выше примере любые ключи в выводе ssh-add
, которые соответствуют файлу в каталоге ~/.ssh/
, будут включать имя файла в выводе в четвертой колонке. Любые ключи, которые не имеют соответствующих файлов, будут иметь эту колонку пустой. В этом выводе у нас есть 3 ключа, которые имеют соответствующие файлы.
Механика функции
Скрипт использует 2 цикла. Внешний цикл — это while
, который берет вывод ssh-add
. Этот вывод содержит все отпечатки ключей SSH, загруженных в ssh-agent
.
Внутренний цикл — это for
, который проходит по содержимому всех файлов, соответствующих шаблону ~/.ssh/*.pub
. Для каждого файла мы получаем информацию с помощью ssh-keygen -lf <file>
, а затем удаляем первый столбец этого вывода:
…до…
4096 SHA256:mwvSCr2CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected]
…после…
SHA256:mwvSCr2CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected]
Эта строка затем выводится вместе с именем файла:
printf “%s %s\n” “$(ssh-keygen -lf “$file” | awk ‘{$1=””}1’)” “$file”
В конце выполнения этого цикла используется следующее:
| column -t | grep “$line” || echo “$line”
Это форматирует вывод так, чтобы он был столбчатым (column -t
).
На этом этапе мы проверяем этот вывод на наличие отпечатка из ssh-add
с помощью grep "$line"
. Если совпадение найдено, мы выводим наш printf
; в противном случае возвращаемся к просто выводу оригинального отпечатка из ssh-add
, $line
.
Ссылки
Ответ или решение
Для того чтобы выяснить, какие ключи были добавлены в ssh-agent
с помощью команды ssh-add
, имеется несколько способов и подходов. Понимание этих методов важно для управления безопасностью и удобством использования SSH-ключей, особенно в условиях, когда общее количество ключей велико и необходимо поддерживать их актуальность.
Теория
ssh-agent
— это фоновый процесс, который хранит приватные ключи, используемые для SSH-аутентификации. Он избавляет пользователей от необходимости повторно вводить парольную фразу каждый раз, когда им требуется использовать SSH-ключ.
Команда ssh-add
используется для добавления ключей в ssh-agent
. Она также позволяет проверять, какие ключи в данный момент загружены в агент. Эти возможности управления крайне полезны для администраторов и пользователей, взаимодействующих с множеством удаленных систем.
Примеры
-
Получение списка ключей по отпечаткам:
Выполнение команды
ssh-add -l
выводит список ключей, добавленных вssh-agent
, преобразованный в отображение отпечатков.$ ssh-add -l 2048 72:...:eb /home/gert/.ssh/mykey (RSA)
В данном случае вы видите отпечаток ключа и путь к его файлу.
-
Получение полных публичных ключей:
Для получения полного представления о ключах в OpenSSH-формате используется команда
ssh-add -L
.$ ssh-add -L ssh-rsa AAAAB3...B63SQ== /home/gert/.ssh/id_rsa
Этот формат представления ключей идентичен тому, который используется в файле
~/.ssh/authorized_keys
.
Применение
Эти команды особенно полезны для администратора системы, чтобы удостовериться в актуальности и правильности загруженных ключей. Однако на определенных ОС, таких как MacOS, в какой-то момент функции команды ssh-add
могли измениться, и информация о файле расположения ключа может не отображаться.
В таких случаях можно применить пользовательские скрипты для обеспечения нужной функциональности. Примером может служить функция ssh-add_wf
, которая была разработана именно для того, чтобы на MacOS поддерживать сопоставление отпечатков с файлами ключей.
Реализация функции ssh-add_wf
Данный скрипт обеспечивает отображение путей к файлам, сопоставленным с отпечатками ключей:
ssh-add_wf ()
{
while read -r line; do
for file in ~/.ssh/*.pub;
do
printf "%s %s\n" "$(ssh-keygen -lf "$file" | awk '{$1=""}1')" "$file";
done | column -t | grep --color=auto "$line" || echo "$line";
done < <(ssh-add -l | awk '{print $2}')
}
Механика работы:
-
Внешний цикл
while
читает отпечатки из результата командыssh-add -l
. -
Внутренний цикл
for
просматривает все.pub
файлы в директории~/.ssh/
, извлекая их отпечатки с помощьюssh-keygen -lf <file>
и далее удаляет ненужный первый столбец. -
Функция
printf
в сочетании сgrep
проверяет, есть ли совпадение в отпечатках ключей; если да, выводит путь к файлу, иначе просто возвращает исходный отпечаток.
Эта функция полезнa, если необходимо идентифицировать конкретные SSH-ключи, используемые в ssh-agent
, и сопоставить их с файлами на диске. Такое сопоставление может существенно упростить управление ключами, например, при их ротации или удалении.
Заключение
Понимание работы ssh-agent
и способов управления ключами с помощью ssh-add
является важной частью обеспечения безопасности и управления доступами в системах на основе SSH. Эти инструменты помогают инженерам и администраторам контролировать ключи, предотвращая избыточные аутентификации при поддержании высокой степени безопасности. При изменениях в поведении утилит, таких как ssh-add
на разнородных платформах, дополнительная кастомизация, как показано в примере функции ssh-add_wf
, может стать необходимостью для обеспечения функциональности и удобства работы.