SSH
SSH (Secure SHell) is the ubiquitous tool for logging into and working on remote machines securely. All sensitive information is strongly encrypted, and in addition to the remote shell, SSH supports file transfer, and port forwarding for arbitrary protocols, allowing secure access to remote services. It replaces the classic telnet, rlogin, and similar non-secure tools - but SSH is not just a remote shell, it is a complete environment for working with remote systems.
В дополнение к основной команде ssh, набор программ SSH также включает такие утилиты, как scp (Secure Copy Program, программа безопасного копирования) и sftp (Secure File Transfer Protocol, безопасный протокол передачи файлов) и ssh-agent для управления ключами. Стандартным портом для взаимодействия SSH является порт 22.
Изначально SSH была не свободной программой. Однако сегодня самой популярной и де-факто стандартной версией SSH является реализация OpenSSH из операционной системы OpenBSD. Именно данная версия предустановлена на Gentoo.
SSH is multi-platform, and is very widely used: OpenSSH is installed by default on most Unix-like OSs, on Windows10, on MacOS, and can be installed on Android or "jailbroken" iOS (SSH clients are available). This makes SSH a great tool for working with heterogeneous systems.
Установка
Проверка установки
В большинстве развертываний Gentoo Linux пакет OpenSSH уже установлен в системе. Это можно проверить с помощью запуска команды ssh. Если пакет установлен, то будет отображена справка по использованию:
user $
ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command]
Если справка не будет отображена, то ssh либо испорчен, либо не установлен. Также возможно, что пользователь просто захочет пересобрать OpenSSH с новым набором USE-флагов. В любом случае, продолжим с обзора доступных USE.
If this does not try to install OpenSSH, the package may have been masked, or even listed in package.provided, though this would be unusual.
USE-флаги
USE flags for net-misc/openssh Port of OpenBSD's free SSH release
+pie
|
Build programs as Position Independent Executables (a security hardening technique) |
+ssl
|
Enable additional crypto algorithms via OpenSSL |
audit
|
Enable support for Linux audit subsystem using sys-process/audit |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
kerberos
|
Add kerberos support |
ldns
|
Use LDNS for DNSSEC/SSHFP validation. |
legacy-ciphers
|
Enable support for deprecated, soon-to-be-dropped DSA keys. See https://marc.info/?l=openssh-unix-dev>m=170494903207436>w=2. |
libedit
|
Use the libedit library (replacement for readline) |
livecd
|
Enable root password logins for live-cd environment. |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
security-key
|
Include builtin U2F/FIDO support |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
static
|
!!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically |
test
|
Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently) |
verify-sig
|
Verify upstream signatures on distfiles |
xmss
|
Enable XMSS post-quantum authentication algorithm |
Emerge
После включения нужных USE-флагов не забудьте установить (или пересобрать) OpenSSH:
root #
emerge --ask --changed-use --oneshot net-misc/openssh
After changing any global USE flags in make.conf that affect the OpenSSH package, emerge world to update to the new USE flags:
root #
emerge --ask --verbose --update --deep --newuse @world
Конфигурация
Создание ключей
Работа безопасной оболочки в SSH основана на использовании криптографических ключей, применяемых для шифрования, дешифрования и хэширования.
Системные ключи генерируются при первом запуске службы SSH. Ключи можно сгенерировать заново с помощью команды ssh-keygen.
root #
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
root #
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
root #
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
Настройка сервера
Настройки сервера SSH обычно хранятся в файле /etc/ssh/sshd_config, хотя возможно провести дополнительную настройку в файле OpenRC /etc/conf.d/sshd, включая изменение местоположения конфигурационного файла. Для более детальной информации о том, как настроить сервер, посмотрите man-страницу sshd_config(5).
The server provides means to validate its configuration using test mode:
root #
/usr/sbin/sshd -t
Always validate the configuration changes prior restarting the service in order to keep the remote login available.
Настройка клиента
Клиент ssh и относящиеся к нему программы (scp, sftp и другие) настраиваются в следующих файлах:
- ~/.ssh/config
- /etc/ssh/ssh_config
Для более детальной информации прочтите man-страницу ssh_config(5).
Предотвращение вторжений
SSH — это служба, которая часто подвергается атаке. Некоторые инструменты (например, sshguard и fail2ban) отслеживают логи и заносят в чёрный список удаленных пользователей после нескольких неудачных попыток войти в систему. Использование подобных программ необходимо для укрепления защиты систем, подвергающихся частым атакам.
Сервис
Commands to run the SSH server will depend on active init system.
OpenRC
Добавьте OpenSSH демон в уровень запуска default:
root #
rc-update add sshd default
Запустим службу sshd с помощью команды:
root #
rc-service sshd start
Сервером OpenSSH можно управлять, как и любой другой OpenRC-управляемой службой:
root #
rc-service sshd start
root #
rc-service sshd stop
root #
rc-service sshd restart
Активные SSH подключения к серверу не обрываются при вводе команды rc-service sshd restart.
systemd
Для того чтобы демон OpenSSH загружался при запуске системы:
root #
systemctl enable sshd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib64/systemd/system/sshd.service.
Для запуска OpenSSH демона:
root #
systemctl start sshd.service
Для проверки работает ли сервис:
root #
systemctl status sshd.service
Использование
Команды
OpenSSH provides several commands, see each command's man page for usage information:
- scp(1) — безопасная передача файлов
- sftp(1) — безопасный протокол передачи файлов
- ssh-add(1) — добавление идентификатора закрытого ключа в агент аутентификации
- ssh-agent(1) — агент аутентификации
- ssh-copy-id(1) — использование локальных ключей для авторизации входов на удаленный компьютер
- ssh-keygen(1) — утилита ключей аутентификации
- ssh-keyscan(1) — получение открытых ключей SSH от удаленных серверов
- sshd(8) — сервис OpenSSH
Управляющие последовательности
В процессе сессии SSH, нажатие кнопки "тильда" (~) начинает управляющую последовательность. Введите следующее для списка опций:
ssh>
~?
Note that escapes are only recognized immediately after a newline. They may not always work with some shells, such as fish.
Беспарольная аутентификация на удалённом сервере SSH
Полезна для работы с git-сервером.
For more details see the Security Handbook.
Leaving the passphrase empty implies the private key file will not be encrypted. An attacker having access to the local filesystem will be able to read the private key.
Клиент
На стороне клиента, если это ещё не сделано, создайте пару ключей. Создайте пару ключей, запустив следующую команду (конечно, не вводя парольной фразы):
user $
ssh-keygen -t ed25519
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/larry/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/larry/.ssh/id_ed25519 Your public key has been saved in /home/larry/.ssh/id_ed25519.pub The key fingerprint is: SHA256:riDdFuPhN7alEsAvm717gM1IZBP3DYXGo5apQG7OUM1 larry@client The key's randomart image is: +--[ED25519 256]--+ | .+ ..+o. | | o + Ao+.o | |. o A Oo . . | | = + .o + | | o . S= + . | | . *. B + . | | o.= * o | | ...+ = . | | .. .+= | +----[SHA256]-----+
The default file names of the keys must not be changed, or the server may persist in asking for a password even after running ssh-copy-id
as explained below. The file name will be one of:
- id_rsa
- id_ecdsa
- id_ed25519
depending on the key algorithm used.
Сервер
Проверьте, что аккаунт пользователя существует на сервере, затем поместите содержимое клиентского файла id_ed25519.pub в файл ~/.ssh/authorized_keys, расположенный в домашнем каталоге пользователя. Это можно сделать, запустив следующую команду на компьютере-клиенте (тут необходимо ввести пароль пользователя):
user $
ssh-copy-id <server>
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/larry/.ssh/id_ed25519.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys larry@<server>'s password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '<server>'" and check to make sure that only the key(s) you wanted were added.
После этого должен быть возможен вход без пароля:
user $
ssh <server>
larry@<server>
После этого на сервере в файле /etc/ssh/sshd_config должно быть PasswordAuthentication no
.
Проверка на одной машине
Вышеописанную процедуру можно протестировать локально:
user $
ssh-keygen -t ed25519
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/larry/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again: ...
user $
mv ~/.ssh/id_ed25519.pub ~/.ssh/authorized_keys
user $
ssh localhost
Сервисы, работающие поверх ssh
SSH may be used to access remote services, such as HTTP, HTTPS, fileshares, etc., through an encrypted "tunnel". Remote service access is detailed in the SSH tunneling and SSH jump host articles.
Копирование файлов на удаленный хост
Команда SFTP, являющаяся частью SSH, использует протокол SSH File Transfer Protocol для копирования файлов на удаленный хост. rsync также может использоваться в качестве альтернативы для данной задачи.
Согласно примечаниям к релизу OpenSSH 8.0 от 2019 года, «Протокол scp устарел, плохо управляем и не исправляется своевременно. Вместо него для передачи файлов мы рекомендуем использовать более современные протоколы — sftp и rsync». Примечания к релизу OpenSSH 8.8 от 2021 года отмечают: «Ближайшие релизы OpenSSH изменят scp(1) от использования устаревшего протокола scp/rcp на использование SFTP по умолчанию».
ssh-agent
OpenSSH comes with ssh-agent, a daemon to cache and prevent from frequent ssh password entries. When run, the environment variable SSH_AUTH_SOCK is used to point to ssh-agent's communication socket. The normal way to setup ssh-agent is to run it as the top most process of the user's session. Otherwise the environment variables will not be visible inside the session.
Depending on the way the graphical user session is configured to launch, it can be tricky to find a suitable way to launch ssh-agent. As an example for the lightdm display manager, edit and change /etc/lightdm/Xsession from:
user $
exec $command
into:
user $
exec ssh-agent $command
To tell ssh-agent the password once per session, either run ssh-add
manually or make use of the AddKeysToAgent
option.
Recent Xfce will start ssh-agent (and gpg-agent) automatically. If both are installed both will be started which makes identity management especially with SmartCards more complicated. Either stop XFCE from autostarting at least SSH's agent or disable both and use the shell, X-session or similar.
user $
xfconf-query -c xfce4-session -p /startup/ssh-agent/enabled -n -t bool -s false
user $
xfconf-query -c xfce4-session -p /startup/gpg-agent/enabled -n -t bool -s false
Советы
Terminal multiplexers to preserve sessions
It is possible to use a terminal multiplexer to resume a session after a dropped connection. Tmux and Screen are two popular multiplexers that can be used to be able to reconnect to a session, even if a command was running when the connection dropped out.
SSH over intermittent connections
When on unstable Internet connections, or when roaming between networks (such as when moving wifi networks), mosh can help avoid dropping SSH sessions.
Open new tabs for session with Kitty terminal
By using the SSH kitten for the Kitty terminal emulator, it is possible to open new "tabs", or windows, on the current SSH session without having log in again.
Kitty also provides other practical SSH functionality.
Benchmark the optimal rounds for an ed25519 key
It is highly advisable to conduct benchmarking for the ed25519 key generation process, particularly considering the default value of 16 rounds and the potential performance improvements achievable with higher round values.
#!/bin/sh
rounds="16 32 64 100 150"
num_runs=20
for r in $rounds; do
printf "Benchmarking 'ssh-keygen -t ed25519 -a %s' on average:\n" "$r"
total_time=0
i=1
while [ $i -le $num_runs ]; do
start_time=$(date +%s.%N)
ssh-keygen -t ed25519 -a "$r" -f test -N test >/dev/null 2>&1
end_time=$(date +%s.%N)
runtime=$(echo "$end_time - $start_time" | bc)
total_time=$(echo "$total_time + $runtime" | bc)
rm test{,.pub} >/dev/null 2>&1
printf "Run %s: %s seconds\n" "$i" "$runtime"
i=$((i + 1))
done
average_time=$(echo "scale=3; $total_time / $num_runs"| bc)
printf "Average execution time: %s seconds\n\n" "$average_time"
done
It is highly recommended to perform benchmarking for ed25519 key generation, considering both security and performance aspects. While the highest recommended round may offer superior security, it's essential to find the optimal balance based on individual requirements and time constraints. By conducting benchmark tests, one can evaluate the trade-off between security and performance, ensuring the selection of an appropriate round value for ed25519 keys.
Benchmarking is a crucial process to measure the performance and efficiency of a system or a specific component, such as cryptographic algorithms. In the context of SSH (Secure Shell) ciphers, it is important to determine the optimal number of rounds for generating ed25519 keys.
The provided script, ssh-benchmark.sh, conducts benchmarking on the ssh-keygen command with different round values for ed25519 keys. The script executes the ssh-keygen command multiple times with varying round values and measures the execution time for each run. It then calculates the average execution time for each round value.
By benchmarking different round values, system administrators and security professionals can identify the optimal round value that strikes a balance between security and performance. Higher round values generally provide stronger security but can result in increased computational overhead. Finding the right balance ensures that ed25519 keys are generated efficiently without compromising security.
Benchmarking helps identify potential bottlenecks, vulnerabilities, or areas that require improvement in security systems. It assists in selecting the most suitable algorithms and configurations for a particular use case, ensuring that security measures are robust and effective.
Устранение проблем
Существует 3 различных уровня отладки. Параметр -v
заставляет ssh выводить отладочные сообщения о своей работе. Это полезно при отладке соединения, проблемах аутентификации и настройки. Несколько параметров -v
увеличивают подробность сообщений. Максимальный уровень подробности равен трём.
user $
ssh example.org -v
user $
ssh example.org -vv
user $
ssh example.org -vvv
Permissions are too open
An ssh connection will only work if the file permissions of the ~/.ssh directory and contents are correct.
- The ~/.ssh directory permissions should be 700 (drwx------), i.e. the owner has full access and no one else has any access.
- Under ~/.ssh:
- public key files' permissions should be 644 (-rw-r--r--), i.e. anyone may read the file, only the owner can write.
- all other files' permissions should be 600 (-rw-------), i.e. only the owner may read or write the file.
These permissions need to be correct on the client and server.
Обрыв долгоживущих соединений
Многие устройства доступа к Интернету выполняют преобразование сетевых адресов (NAT). Это процесс, который позволяет устройствам из частной сети, которая обычно находится дома или на работе, получить доступ к другим сетям (например, к Интернету) не смотря на то, что для этой сети выделен только один IP-адрес. К сожалению, не все NAT-устройства одинаково устроены, и некоторые из них могут обрывать долгоживущие TCP-соединения, в том числе, используемые в SSH. Обычно это обнаруживается при внезапной потере возможности взаимодействия с удаленным сервером, хотя сама программа ssh свою работу не прекращала.
Чтобы решить данную проблему, можно настроить клиенты и сервера OpenSSH таким образом, чтобы они посылали незаметные сообщения «keep alive», нацеленные на поддержку и подтверждение использования соединения:
- Чтобы включить поддержку keep alive для всех клиентов подключающихся к локальному серверу установите в файле /etc/ssh/sshd_config параметр
ClientAliveInterval 30
(или другое значение в секундах). - Чтобы включить поддержку keep alive для всех серверов подключенных к локальному клиенту, установите в файле /etc/ssh/ssh_config или ~/.ssh/config параметр
ServerAliveInterval 30
(или другое значение в секундах). - Установите
TCPKeepAlive no
, чтобы устранить отключения.
For example, to modify the server's configuration, add following file:
# The following ClientAlive values will keep an inactive session open for 30 minutes
ClientAliveCountMax 60
ClientAliveInterval 30
#
# Deactivate TCPKeepAlive
TCPKeepAlive no
To modify the client's configuration, add following file:
# The following ServerAlive values will keep an inactive session open for 2 hours
ServerAliveInterval 60
ServerAliveCountMax 120
New key does not get used
This scenario covers the case when a key to access a remote system has been created, the public key installed on the remote system, but the remote system is (for some reason) not accessible via ssh. This can happen if the name of the keyfile is not known to ssh.
Confirm which key files ssh is trying by running it with one of the verbose options, as described at the start of the Troubleshooting section. The verbose output will include the names of the keyfiles it is trying, and the one (if any) that actually gets used.
The default key files for the system are listed in the /etc/ssh/ssh_config, see the commented-out lines containing IdentityFile
directives.
There are several ways to use a key with a non-default name.
The key name can be specified on the command line every time:
user $
ssh -i ~/.ssh/my_keyfile user@remotesys
Alternatively, add following ssh configuration file to add a special case for ssh to the remote system:
Host remotesys
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/my_keyfile
If any are specified, it appears to be necessary to specify all the desired keys on a remote host. Read up on the ssh IdentityFile.
Проброс X11, но нет никакого проброса или туннелирования
Проблема: После того, как вы сделали необходимые изменения в файлах конфигурации, чтобы разрешить проброс X11, вы обнаруживаете, что приложения X запускаются на сервере, а не передаются клиенту.
Решение: Что скорее всего, в процессе входа через SSH на удаленный сервер или узел переменная DISPLAY либо сбрасывается, либо устанавливается после того, как её установит сеанс SSH.
Чтобы проверить этот вариант, послу удаленного входа выполните следующее:
user $
echo $DISPLAY
localhost:10.0
Должно вывестись что-то похожее на localhost:10.0
или localhost2.local:10.0
(если на стороне сервера включён параметр X11UseLocalhost no
). Если обычное «:0.0» не выводится, проверьте, что переменная DISPLAY не сбрасывается или не переинициализируется в файле $HOME/.bash_profile. Если это так, то удалите или закомментируйте инициализацию переменной DISPLAY, чтобы не дать командам в ~/.bash_profile выполниться в процессе входа SSH:
user $
ssh -t larry@localhost2 bash --noprofile
Не забудьте заменить larry
в команде на подходящее имя пользователя.
Ещё одно решение — создать алиас в файле ~/.bashrc.
Смотрите также
- Autossh — a command that detects when SSH connections drop and automatically reconnects them.
- dropbear — a lightweight SSH server. It runs on a variety of POSIX-based platforms.
- Keychain — В этом документе описано как использовать общие ключи SSH вместе с программой keychain
- Mosh — a SSH client server that is aware of connectivity problems of the original SSH implementation.
- SCP — an interactive file transfer program, similar to the copy command, that copies files over an encrypted SSH transport.
- SFTP — an interactive file transfer program, similar to FTP, which performs all operations over an encrypted SSH transport.
- SSHFS — a secure shell client used to mount remote filesystems to local machines.
- SSH tunneling — a method of connecting to machines on the other side of a gateway machine.
- SSH jump host — employed as an alternative to SSH tunneling to access internal machines through a gateway.
- rsync — a powerful file sync program capable of efficient file transfers and directory synchronization.
- Укрепление безопасности SSH-сервера (Руководство по безопасности)
- Запуск сервиса SSH — Руководство пользователя Gentoo — Установка
Внешние ресурсы
- net-misc/connect — SSH Proxy Command -- connect.c
- https://lonesysadmin.net/2011/11/08/ssh-escape-sequences-aka-kill-dead-ssh-sessions/amp/ - A blog entry on escape sequences.
- https://hackaday.com/2017/10/18/practical-public-key-cryptography/ - Practical public key cryptography (Hackaday).
- https://www.akadia.com/services/ssh_putty.html - Port forwarding explained.