Как использовать и максимально безопасно настроить SSH
Всех приветствую! 👋
Вы попали на очень подробный гайд по использованию и настройке SSH.
Давайте начнём с того, что это вообще такое и как работает:
❓ > SSH (Secure Shell) - сетевой протокол, позволяющий удалённо управлять операционной системой. Благодаря шифрованию всего трафика - использование данного протокола является довольно безопасным решением.
ДИСКЛЕЙМЕР:
Автор статьи никого не призывает к правонарушениям и отказывается нести ответственность за ваши действия. Вся информация предоставлена исключительно в ознакомительных целях. Спасибо!
Краткая история:
Появление первой версии SSH состоялось в 1995 году и называлась она "SSH-1".
В 1999 году разработчики операционной системы "OpenBSD" принялись разрабатывать свой набор программ для использования SSH под названием "OpenSSH".
С версии OpenBSD 2.6 разработчики приняли решение переносить свою разработку и на другие операционные системы.
в 2006 году версию "SSH-2" признали стандартом и теперь используется везде по умолчанию.
Установка OpenSSH:
Часто гайды по SSH являются очень скучными и непонятными, потому что хоть и есть практика, но нет цели.
Так вот сегодня нашей целью будет выступать эффективная настройка SSH-соединения на Raspberry Pi и к концу этой статьи мы добьёмся желаемого.
Исходя из истории становится понятно - OpenSSH - это набор программ для использования протокола "SSH".
Чаще всего этот набор программ предустановлен в операционные системы на базе ядра Linux.
Итак, у нас есть малина с ОС Raspbian и давайте проверим, установлен ли OpenSSH в нашу систему:
ssh
Как видим, в терминал выведена справка, это означает, что набор программ установлен.
Если вы не обнаружили в своей системе такого вывода, то вам следует установить OpenSSH следующей командой:
apt install openssh-server
Запуск SSH-сервера и подключение:
Запуск производится двумя способами:
1. Обращаясь к файлу:
Запуск:
sudo /etc/init.d/ssh start
Остановка:
sudo /etc/init.d/ssh stop
Перезапуск:
sudo /etc/init.d/ssh restart
2. Через Systemctl:
Запуск:
sudo systemctl start ssh
Остановка:
sudo systemctl stop ssh
Перезапуск:
sudo systemctl restart ssh
Я использую первый вариант, он мне привычнее.
Итак, давайте запустим SSH-сервер:
/etc/init.d/ssh start
Теперь нам нужно подключится к нашему серверу. Для этого в Windows есть программа PuTTy, а в Linux можно использовать ту же утилиту "ssh" из набора программ OpenSSH.
Итак, давайте для начала попробуем подключиться через Linux, а для этого узнаем IP нашего сервера:
ifconfig
И подключаемся:
ssh pi@192.168.0.15
pi - это имя пользователя;
192.168.o.15 - это IP сервера.
А вот как подключаться через PuTTy:
Открываем программу, вводим IP и порт (по умолчанию 22):
И нажимаем "Open".
Далее вводим логин и пароль:
После первого подключения к серверу - мы должны согласиться с предупреждением, которое означает, что после соединения будет сохранён специальный идентификатор этого соединения.
Внимание:
Если вы увидите это предупреждение при повторном подключении к серверу - возможно настройки соединения были изменены или вас атакует хакер!
Вот мы и подключились:
Теперь мы можем свободно управлять сервером на расстоянии по SSH.
Настраиваем SSH:
Чтобы защитить наш сервер - нужно правильно настроить SSH-соединение.
Для этого мы должны обратить внимание на файл /etc/ssh/sshd_config - который является конфигурационным файлом.
Мы можем в него вносить изменения, для этого откроем файл в редакторе:
sudo nano /etc/ssh/sshd_config
В нём настройки работают по такому принципу:
ключевое слово аргумент
Например, давайте изменим порт.
Это нужно для того, чтобы предотвратить хакерские атаки на дефолтный порт.
Раскомментируем строку (уберём ## ) и изменим номер порта
Далее пройдёмся по другим настройкам:
ListenAddress: hostname/hostname:port
Это нужно для указания прослушиваемого IP-адреса, если на сервере их несколько.
PermitRootLogin no/yes/prohibit-root/forced-command-only
Это отвечает за вход на сервер от рута. Конечно, это небезопасно, поэтому выставляем значение "no", что означает запрет на вход под рутом.
PasswordAuthentication no/yes
Это отвечает за вход по паролю на сервер (пока что не обращаем внимание)
PermitEmptyPasswords no/yes
Если здесь выставлено значение "yes", то будет возможность войти на сервер с пустой строкой пароля.
PubkeyAuthentication no/yes
Это вход по SSH-ключу (позже разберём что это).
MaxAuthTries
Это максимальное кол-во попыток входа.
MaxStartups
Это максимальное кол-во одновременных подключений с одного IP.
LoginGraceTime
Это время за которое должен залогиниться пользователь. Будьте аккуратны, если поставить слишком маленькое значение - юзер может просто не успеть войти на сервер.
Также есть переменные, которых нет в конфигурационном файле, но их можно добавить:
AllowUsers или AllowGroups - пользователи или группы, которым можно войти на сервер
DenyUsers или DenyGroups - пользователи или группы, которым нельзя заходить на сервер (типа чёрного списка)
Эти переменные принимают так называемые "шаблоны":
Символ "*" - означает любое значение, например:
AllowUsers *@192.168.0.11 - вход под любым пользователем разрешён только для IP 192.168.0.11
или:
AllowUsers user1@192.168.0.* - вход под юзером "user1" разрешён любому IP-адресу, который начинается на "192.168.0."
Вот пример безопасной настройки SSH:
Port 2448
PermitRootLogin no
LoginGraceTime 20
MaxAuthTries 1
MaxStartups 2
AllowUsers *@192.168.0.*
После настройки файла - сохраняем изменения и перезапускаем службу:
sudo /etc/init.d/ssh restart
ну или:
sudo systemctl restart ssh
Если вы изменили порт SSH, то для подключения через Linux нужно его указать параметром -p:
ssh pi@192.168.0.15 -p 2448
Где 2448 - порт.
Вход по SSH-ключу:
Есть 2 вида ключа, приватный и публичный.
Публичный ключ не является секретным, он должен храниться на сервере.
Приватный ключ - это такой файл, который нельзя никому передавать.
Если проще:
Публичный ключ - это замок, а приватный - это ключ от замка.
Для генерации пары ключей вместе с PuTTy устанавливается программа PuTTygen:
Есть несколько типов ключа, RSA, DSA ECDSA и EdDSA.
Выбираем тип ключа (лучше RSA или DSA) и нажимаем Generate:
Хаотично двигаем мышкой для генерации и дожидаемся результата:
Итак, нам представлены публичный и приватный ключи.
Мы даже можем добавить к публичному ключу комментарий.
Также мы можем добавить пароль к ключу (рекомендуемая дополнительная мера безопасности).
Нажимаем Save private key и выбираем место, куда хотим сохранить ключ.
Далее копируем значение публичного ключа:
И его нужно вставить в файл /home/user/.ssh/authorized_keys
Если на сервере в домашнем каталоге нет папки .ssh, то создаём её:
mkdir .ssh
Переходим в папку и создаём файл:
cd .ssh
nano authorized_keys
И вставляем ранее скопированное значение публичного ключа в файл.
Сохраняем и проверяем содержимое файла:
cat authorized_keys
Далее в конфигурационном файле запрещаем входить по паролю:
PasswordAuthentication no
И проверяем, чтобы была возможность авторизации по ключу:
PubkeyAuthentiocation yes
Перезапускать службу после таких действий не нужно, ключ автоматически должен запрашиваться при входе.
Для входа по ключу запускаем PuTTy и указываем в SSH -> Auth путь к ключу.
Если мы устанавливали пароль на ключ, то он должен запрашиваться при подключении:
Чтобы сгенерировать ключ на линуксе - используем ssh-keygen:
ssh-keygen -t dsa
Параметром -t мы указываем тип шифрования. Его можно не указывать, тогда по дефолту будет RSA.
Далее указываем название файла и путь к нему (или нажимаем Enter и будет выбран дефолт).
Вводим пароль
В итоге у нас сохраняются в директории .ssh публичный и приватный ключи.
Мы можем вручную передать публичный ключ на сервер или использовать утилиту ssh-copy-id:
ssh-copy-id pi@192.168.0.15 -p 2448
RSA или DSA - не имеет значения, оба шифрования вполне безопасны. Но для SSH скорее всего эффективнее будет DSA.
Подключение по одноразовому паролю (Google Auth).
Этот способ заменяет подключение по ключам и не менее безопасный.
С помощью приложения Google Auth вы будете получать одноразовые коды, которые нужно будет вводить при подключении.
После использования кода - он становится неактивен и требуется новый.
Итак, первым делом обновляем пакеты.
sudo apt update
Далее устанавливаем Google-authentication:
sudo apt install libpam-google-authenticator
И запускаем для настройки:
google-authenticator
У нас отображается уникальный ключ и QR-код (QR-код у меня отобразился криво из за мелкого окна):
Этот код мы должны ввести в приложение (его можно скачать из Google Play)
Скипаем ввод кода в терминале:
-1
и на экране выводятся коды для восстановления, которые нужно сохранить в надёжное место:
На вопрос Do you want to update your "путь" file? нажимаем Y.
Далее тоже Y.
Потом N.
И снова Y.
Теперь редактируем файл:
sudo nano /etc/pam.d/sshd
И добавляем в начало файла эту строчку:
auth required pam_google_authenticator.so
Сохраняем файл.
Теперь в файле конфигурации меняем ChallengeResponseAuthentication no
на ChallengeResponseAuthentication yes.
Сохраняем файл и перезапускаем службу.
Теперь для подключения по SSH нам нужно ввести логин, верифицированный одноразовый код (который берётся из приложения) и пароль:
На этом всё! Спасибо за внимание и удачи в защите своего сервера!