- Вопрос или проблема
- Обновление
- Ответ или решение
- Авто-принятие отпечатка ключа RSA через командную строку
- 1. Использование параметра StrictHostKeyChecking
- Применение в конфигурационном файле SSH
- 2. Использование ssh-keyscan для проверки ключа
- 3. Использование временной базы для ключа
- 4. Альтернативные методы
- 5. Заключение
Вопрос или проблема
Я попробовал yes | ssh [email protected]
, чтобы попробовать принять отпечаток RSA-ключа, но все равно получаю запрос, уверен ли я, что хочу подключиться. Есть ли способ сделать это автоматически?
Добавьте это в ваш файл запуска bash или аналогичный:
#
# ssh + scp без сохранения или запроса ключей.
#
function sshtmp
{
ssh -o "ConnectTimeout 3" \
-o "StrictHostKeyChecking no" \
-o "UserKnownHostsFile /dev/null" \
"$@"
}
function scptmp
{
exec scp -o "ConnectTimeout 3" \
-o "StrictHostKeyChecking no" \
-o "UserKnownHostsFile /dev/null" \
"$@"
}
Затем используйте sshtmp
или scptmp
вместо ssh
и scp
.
ПРИМЕЧАНИЕ Если вы пойдете по этому пути, вы не будете уведомлены о том, что ключ хоста изменился, и потеряете безопасность.
OpenSSH 7.6 ввел новую настройку StrictHostKeyChecking=accept-new
именно для этой цели:
ssh(1): расширить опцию StrictHostKeyChecking двумя новыми
настройками. Первая "accept-new" будет автоматически принимать
ранее невидимые ключи, но будет отказывать в соединениях для
измененных или недействительных ключей хоста. Это более безопасный
поднабор текущего поведения StrictHostKeyChecking=no. Вторая настройка "n" является синонимом
текущего поведения StrictHostKeyChecking=no: принимаем новые
ключи хостов и продолжаем соединение для хостов с некорректными
ключами хостов. В будущих выпусках изменится значение
StrictHostKeyChecking=no на поведение "accept-new".
Использование SSH программно с известными ключами хоста
Если вы хотите использовать SSH программно И избежать атаки “Человек посередине”, то я предложу вам получить известный отпечаток с помощью команды ssh-keyscan
. Пример:
$ ssh-keyscan -t rsa,dsa github.com 2>/dev/null
github.com ssh-dss AAAAB3NzaC1kc3MAAACBANGFW2P9xlGU3zWrymJgI/lKo//ZW2WfVtmbsUZJ5uyKArtlQOT2+WRhcg4979aFxgKdcsqAYW3/LS1T2km3jYW/vr4Uzn+dXWODVk5VlUiZ1HFOHf6s6ITcZvjvdbp6ZbpM+DuJT7Bw+h5Fx8Qt8I16oCZYmAPJRtu46o9C2zk1AAAAFQC4gdFGcSbp5Gr0Wd5Ay/jtcldMewAAAIATTgn4sY4Nem/FQE+XJlyUQptPWMem5fwOcWtSXiTKaaN0lkk2p2snz+EJvAGXGq9dTSWHyLJSM2W6ZdQDqWJ1k+cL8CARAqL+UMwF84CR0m3hj+wtVGD/J4G5kW2DBAf4/bqzP4469lT+dF2FRQ2L9JKXrCWcnhMtJUvua8dvnwAAAIB6C4nQfAA7x8oLta6tT+oCk2WQcydNsyugE8vLrHlogoWEicla6cWPk7oXSspbzUcfkjN3Qa6e74PhRkc7JdSdAlFzU3m7LMkXo1MHgkqNX8glxWNVqBSc0YRdbFdTkL0C6gtpklilhvuHQCdbgB3LBAikcRkDp+FCVkUgPC/7Rw==
github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
Затем вы можете создать скрипт, чтобы сохранить это во временный файл и использовать опцию UserKnownHostsFile
.
Пример ниже – это скрипт, который можно назвать ssh_github
:
#!/bin/bash
HOSTKEY='github.com ssh-dss AAAAB3NzaC1kc3MAAACBANGFW2P9xlGU3zWrymJgI/lKo//ZW2WfVtmbsUZJ5uyKArtlQOT2+WRhcg4979aFxgKdcsqAYW3/LS1T2km3jYW/vr4Uzn+dXWODVk5VlUiZ1HFOHf6s6ITcZvjvdbp6ZbpM+DuJT7Bw+ h5Fx8Qt8I16oCZYmAPJRtu46o9C2zk1AAAAFQC4gdFGcSbp5Gr0Wd5Ay/jtcldMewAAAIATTgn4sY4Nem/FQE+XJlyUQptPWMem5fwOcWtSXiTKaaN0lkk2p2snz+EJvAGXGq9dTSWHyLJSM2W6ZdQDqWJ1k+cL8CARAqL+UMwF84CR0m3hj+wtVGD/J4G5kW2DBAf4/bqzP4469lT+dF2FRQ2L9JKXrCWcnhMtJUvua8dvnwAAAIB6C4nQfAA7x8oLta6tT+oCk2WQcydNsyugE8vLrHlogoWEicla6cWPk7oXSspbzUcfkjN3Qa6e74PhRkc7JdSdAlFzU3m7LMkXo1MHgkqNX8glxWNVqBSc0YRdbFdTkL0C6gtpklilhvuHQCdbgB3LBAikcRkDp+FCVkUgPC/7Rw==
github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+ PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+ 2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=='
TEMPFILE=$(mktemp)
echo "$HOSTKEY" > $TEMPFILE
ssh -o "UserKnownHostsFile $TEMPFILE" $@
rm $TEMPFILE
С этим вы можете просто запустить ssh_github
вместо ssh
, и он подключится, даже если нет файла known_hosts
, где вы положили скрипт.
Я просто использую:
ssh -o StrictHostKeyChecking=no user@host
Это также можно использовать с pssh:
pssh -O StrictHostKeyChecking=no -h list.text -l user -A -i "cmd"
Используйте опцию StrictHostKeyChecking, например:
ssh -oStrictHostKeyChecking=accept-new $host
Эту опцию также можно добавить в ~/.ssh/config:
Host *
StrictHostKeyChecking accept-new
Преимущество опции accept-new
заключается в том, что она запомнит хост в первый раз, когда вы подключаетесь к нему – и если он когда-либо изменится, вы будете предупреждены.
Это не является универсальным исключением. Если ключи хоста изменятся, вы все равно получите предупреждение. Если вам совершенно не важно, получить MITM, вы можете использовать это вместо:
ssh -oUserKnownHostsFile=/dev/null $h
Это ужасная идея по очевидным причинам – любой может создать сценарий, который просто соберет ваш пароль и использует его, чтобы захватить настоящий хост.
Мои 5 копеек, потому что никто этого не упомянул:
Сначала мой случай использования – несколько серверов загружают на единый сервер “upload”, заданный как хостнейм “upload.domain.com”. Загрузка осуществляется с помощью rsync+ssh. Я хотел иметь возможность изменить “upload.domain.com” и чтобы все продолжало работать.
Я сделал конфигурационный файл в директории .ssh:
cat > .ssh/config <<[end]
StrictHostKeyChecking no
[end]
или
echo "StrictHostKeyChecking no" >> ~/.ssh/config
Вам не нужно удалять файл .ssh/known_hosts
, он печатает сообщение, но все равно работает.
Обновление
Я не имею в виду, что это будет crontab или что-то автоматическое.
Я имею в виду, что вы должны создать файл .ssh/config
и вставить в него эту строку. Самый простой способ – это команда, которую я показываю. Вы можете использовать любой другой метод, который вам удобен, например текстовые редакторы – vi
, pico
и т.д.
Используйте эту команду, чтобы добавить хост в ~/.ssh/known-hosts (и не добавлять дублирующиеся) как указано здесь
например, добавляя gitlab.com
ssh-keygen -F gitlab.com || ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
вы должны добавить доверенный хост в файл: ~/.ssh/config
вы можете легко добиться этого, изменив значение TRUSTED_HOST для вашего имени хоста
export TRUSTED_HOST="github.com" && {cat | >> ~/.ssh/config } <<EOF
Host $TRUSTED_HOST
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
LogLevel ERROR
EOF
Вы можете использовать эту команду, но учитывайте проблему безопасности, связанную с автоматическим принятием ключей SSH:
timeout 1s ssh -o StrictHostKeyChecking=accept-new $host :
В dropbear ssh вы можете использовать опцию -y
: т.е. попробуйте
ssh -y [email protected]
-y
Всегда принимайте ключ удаленного хоста, если он неизвестен
Ответ или решение
Авто-принятие отпечатка ключа RSA через командную строку
Использование SSH для подключения к удаленным серверам вызывает необходимость подтвердить отпечаток ключа RSA. При первом подключении вы можете столкнуться с ожиданием подтверждения, что может быть неудобно в автоматизированных сценариях. В данном ответе мы разберем несколько методов автоматического принятия отпечатков ключей RSA через командную строку, а также учтем аспекты безопасности.
1. Использование параметра StrictHostKeyChecking
Одним из наиболее простых способов автоматического принятия ключей является использование параметра StrictHostKeyChecking
. Этот параметр имеет несколько настроек:
- no: Не проверять ключи заранее. Это означает, что вы никогда не получите уведомление о новых или измененных ключах и сможете подключиться без подтверждения.
- accept-new: Принять новые ключи при первом подключении, но с предупреждением, если ключи изменились. Это более безопасный подход, так как вы будете уведомлены о изменении ключа.
Чтобы использовать эти настройки, выполните команду:
ssh -o "StrictHostKeyChecking=accept-new" user@host
Или, чтобы использовать StrictHostKeyChecking=no
:
ssh -o "StrictHostKeyChecking=no" user@host
Применение в конфигурационном файле SSH
Также можно настроить эти опции по умолчанию для всех подключений, добавив их в файл ~/.ssh/config
:
Host *
StrictHostKeyChecking accept-new
2. Использование ssh-keyscan
для проверки ключа
Если вы хотите принимать только известные ключи и избегать атаки "Человек посередине" (MITM), вы можете использовать команду ssh-keyscan
для получения отпечатка ключа до подключения:
ssh-keyscan -t rsa,dsa target_host >> ~/.ssh/known_hosts
Это позволяет вам явно устанавливать доверенные ключи, которые вы можете использовать в дальнейшем.
3. Использование временной базы для ключа
Если вы хотите использовать ключи временно, вы можете создать скрипт, который будет принимать ключи и удалить временный файл:
#!/bin/bash
HOSTKEY='Ваш_ключ_хоста'
TEMPFILE=$(mktemp)
echo "$HOSTKEY" > $TEMPFILE
ssh -o "UserKnownHostsFile=$TEMPFILE" user@host
rm $TEMPFILE
Этот подход позволяет временно хранить ключи для одного подключения.
4. Альтернативные методы
Для удобства вы можете использовать команды, которые автоматически применяют параметр автоматического принятия ключей:
echo "StrictHostKeyChecking no" >> ~/.ssh/config
Это обеспечит автоматическое принятие всех ключей, но имейте в виду, что это создает угрозу безопасности, если хост изменится.
5. Заключение
Автоматическое принятие отпечатков ключей RSA при помощи SSH может существенно упростить автоматизацию и интеграцию, однако всегда следует проявлять осторожность. Настройки такие как StrictHostKeyChecking=no
могут значительно увеличить риски безопасности. Важно осознавать последствия и стремиться к наиболее безопасным методам работы с удаленными системами.
Мы рекомендуем использовать комбинацию StrictHostKeyChecking=accept-new
и предварительную проверку ключей через ssh-keyscan
, чтобы сохранить безопасность без ущерба для удобства работы.