Linux: ssh (конфигурация, 2FA, примеры подключения, автологин, удаление сессий, radius, скрипты)

SSH (Secure Shell) – позволяет подключится к удаленной железке по ssh, передавать данные поверх поднятого SSH (SCP/WINSCP или даже SSH-TUNNEL, SSH-PROXY). SSH-клиент и сервер OpenSSH в Linux дистрибутивах типа RHEL7 предустановлены в систему.

Основные опции.

-l Specifies the user to log in as on the remote machine
-p Port to connect to on the remote host
-i key (PEM format)
Установка

Клиент идет обычно во всех дистрибутивах.

Сервер выбирается опционально (OpenSSH Server) при установке.

Можно установить вручную (ubuntu/debian):

sudo apt-get update
sudo apt-get install openssh-server

Если выдает ошибку ниже, то нужно разобраться с репозиториями – привести к тому, как должно быть, например для debian.

openssh-server : Depends: libwrap0(>= 7.6-4~) but it is not installable
Recommends: ssh-import-id but it is not installable
КОнфигурация

Изменяем порт с “по умолчанию” для уменьшения нагрузки от школо-брутфорсеров.

Port 66661

Отключаем доступ рута

PermitRootLogin no

Делаем доступ только ля определенных учетных записей с определенных хостов или сетей.

AllowUsers admin@1.1.1.* admin@1.2.2.2 user@3.3.3.3

Отключаем ssh-туннели. Хотя и пользователи могут их сами включить.

$ sudo grep -i forw /etc/ssh/sshd_config
#AllowTcpForwarding yes
Примеры подключения

по логину/паролю

ssh 10.130.37.17 – подключаемся к хосту 10.130.37.17 по SSH порту по умолчанию (порт 22) с логином  по умолчанию (из под которого мы находимся в системе).

ssh -p 19999 -l username test.net или ssh –p 19999 username@test.net – подключаемся на порт 19999 test.net с логином username.

При первом подключении с клиента к неизвестному ранее хосту-серверу будет вопрос о том, что аутентификация сервера не может быть проверена в связи с отсутствием записи о хосте. После первого подключения в файле .ssh/known_hosts появится ECDSA/RSA2 key fingerprint хоста, к которому происходило подключение и в следующий раз вопроса о ключе не последует.

~$ ssh -l user1 192.168.1.17
The authenticity of host '192.168.1.17 (192.168.1.17)' can't be established.
ECDSA key fingerprint is 83:d6:36:5c:f6:6c:59:d0:f4:43:f6:13:fb:f0:26:5f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.17' (ECDSA) to the list of known hosts.
~$ cd .ssh
~/.ssh$ more known_hosts
|1|vrUcv9MuzkA0y6h8MbKp3wwSm/w=|/wyoBsJJxIw4+i78ru52bFwOuz8= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMf/qhQ+TZgxST09f0jYxuMla6QDCK0QAqAC3UVODyhD
uGuMaSYVln+Ypaf8cWmBUY1ECB+y/kLyyF8ZbL8JGfk=

по приватному ключу

сhmod 400 ubuntu16_bot.pem
ssh -i ubuntu16_bot.pem ubuntu@52.37.203.47

ssh -i alicloud.pem ubuntu@47.254.169.62
Если не сделать chmod будет ошибка (ключ открыт не только для тебя – лошара):
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Permissions 0644 for 'alicloud.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "alicloud.pem": bad permissions

plink

полноценный пакет putty включает утилиту plink, которая имеет встроенный протокол telnet/ssh. Она ставится как в Linux, так и в Windows! В результате можно не ставить отдельные OpenSSH, telnet клиенты, а просто поставить plink.

plink -telnet 10.3.3.3
plink -ssh weril.me
plink -ssh -i key.ppk ubuntu@52.37.203.47

А чтобы не путаться добавить alias в .profile/.bash_rc.

$ cat /etc/bash/bashrc

# ALIAS
alias telnet='plink -telnet'
alias t='plink -telnet'
Автологин

Автологин по SSH возможен разными способами:

  • без костылей с помощью ключей, но аутентификацию только по ключу могут отключить на сервере, к примеру, во избежание backdoor.
  • если нужно исполнить одну команду (или скрипт), то можно сделать вызов shell сразу после аутентификации в одной строке
ssh user@172.1.1.226 'grep some_str /var/log/sys.log'
  • sshpass
  • expect – классический способ, когда другие не работают 🙂 Причем самопильный expect не работает – ssh палит что пароль перенаправляется через echo.
~$ (sleep 1; echo 123) | ssh -p 1999 username@1.1.1.1
Pseudo-terminal will not be allocated because stdin is not a terminal.
Удаление сессий

Удалить сессию ssh можно через Kill процесса

ps -aux | grep pts
sudo kill -9 10142

Нужно дропать активные ssh коннекты и удалять/перемещать .ssh папку пользователя, во избежания ssh-backdoor. Целиком взято отсюда

Обычное отключение/блокирование не исключает удаленного подключения пользователя к серверу, если ему предварительно была установлена аутентификация по открытому ключу RSA. Такие пользователи будут получать доступ к консольной оболочке (shell) на сервере без необходимости ввода какого-либо пароля. Не забывайте проверять пользовательские домашние каталоги на файлы, которые позволяют подобный тип авторизации по SSH, например, /home/username/.ssh/authorized_keys.

Удаление или переименование каталога .ssh/ в домашнем каталоге пользователя предотвратит дальнейшую способность аутентификации по SSH.

Убедитесь что проверили любые установленные SSH соединения заблокированных пользователей, поскольку могут остаться входящие или исходящие соединения. Убейте все, которые найдете.
Radius

Для аутентификации на Linux-сервере (например, RHEL) по SSH через удаленный RADIUS на сервер для взаимодействия с RADIUS обычно ставят модуль PAM-D (pam: gdm-password).

 

Генерация ключа

Может понадобиться например для github – генерируем public ключ, импортируем его на сайт github, взаимодействуем (аутентифицируемся в github) с помощью ssh через CLI. Подробно описано тут.

Создать ключ можно с паролем (безопаснее) или без (удобнее).

$ ssh-keygen -t rsa -b 4096 -C "weril@me.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/redkin_p/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/redkin_p/.ssh/id_rsa.
Your public key has been saved in /Users/redkin_p/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Zjhr1DFAbbonau8iUh8Ty+PZpRMNUfFK3ILi5T2+4r4 weril@me.com
The key's randomart image is:
+---[RSA 4096]----+
| .ooo. |
| .+oo |
| . o+* o |
| ..+o= = |
| ..o=+S |
| . *.+*+. |
| . o Bo*. |
|. . B.= . |
| . o *E+. |
+----[SHA256]-----+

После этого нужно запустить ssh agent и добавить ключи.

$ eval "$(ssh-agent -s)"
Agent pid 25236

$ ssh-add .ssh/id_rsa
Enter passphrase for .ssh/id_rsa:
Identity added: .ssh/id_rsa (weril@me.com)

Далее загружаем ключи на git и пытаемся подключиться на git@github.com. Если все ок – будет написано, что подключение (аутентификация) успешно, но git не предоставляет shell access.

ssh -T git@github.com

Зато, теперь мы можем клонировать приватный репозиторий.

git clone ssh://git@github.com/...repo.git

 

ПУБЛИЧНЫЙ КЛЮЧ (public key)

Публичный ключ хоста используется даже при использовании схемы аутентификации без ключей для верификации того, что хост, к которому мы подключаемся, не поменялся (spoof ip/dns/etc).

C:\Users\redkin.petr>ssh root@172.1.1.111
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:y1yfOPQSFkcvh5tpc7XxndYb6iM1ImYiOgHkocjVvYc.

Please contact your system administrator.
Add correct host key in C:\\Users\\user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\user/.ssh/known_hosts:1
ECDSA host key for 172.1.1.111 has changed and you have requested strict checking.
Host key verification failed.

На Windows в known_hosts

172.1.1.111 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKZrX/vZfbDjzZ1AzBosWnvX5J7h/0VAq6qbyQG1HjRc4jWtqyaT20b4IS2X8rASRk0bdaNXI9k2XPQUuTvJo0w=

На самом сервере

# cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKZrX/vZfbDjzZ1AzBosWnvX5J7h/0VAq6qbyQG1HjRc4jWtqyaT20b4IS2X8rASRk0bdaNXI9k2XPQUuTvJo0w= root@DMG
Скрипт на событие логина по SSH

см. в отдельной статье

 

2FA google-authenticator

  • Формально ключ + пароль это уже 2FA, но безопасней токен на отдельном устройстве (не на том, с которого происходит подключение)
  • Что круто, verification code появится в любом случае – правильный вы ввели пароль или нет. Это позволяет хакеру не думать, что он обошел какой-то эшелон защиты (кхм кхм авторизация WordPress).
  • Не работает со старыми версиями SecureCRT, но мне подходит mRemoteNG/SuperPutty (если только не нажимать кнопку close others).

centos, ubuntu

Устанавливаем epel репозиторий.

sudo yum install epel-release

Устанавливаем authenticator.

sudo yum install google-authenticator 
sudo apt-get install libpam-google-authenticator

Помимо самого токена делаются две доп. защиты: rate limiting, запрет использования одного токена несколько раз. Запускаем из под учетной записи, для которой включается fa, без sudo (иначе FA включается для root).

google-authenticator
Do you want authentication tokens to be time-based (y/n) y

Do you want me to update your "/home/admin/.google_authenticator" file? (y/n) y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server. Do you want to do so? (y/n) n

If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n) y

Редактируем файлы и перезагружаем сервис sshd

sudo vi /etc/pam.d/sshd
auth required pam_google_authenticator.so

sudo vi /etc/ssh/sshd_config
ChallengeResponseAuthentication yes

sudo service sshd restart

Enjoy!

Leave a Reply