Найти тему
🅱🅻🅰🅲🅺 🅳🅾🅾🆁

Как передать файлы по SSH?

Как использовать и максимально безопасно настроить 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
-2

Как видим, в терминал выведена справка, это означает, что набор программ установлен.

Если вы не обнаружили в своей системе такого вывода, то вам следует установить 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
-3

Теперь нам нужно подключится к нашему серверу. Для этого в Windows есть программа PuTTy, а в Linux можно использовать ту же утилиту "ssh" из набора программ OpenSSH.

Итак, давайте для начала попробуем подключиться через Linux, а для этого узнаем IP нашего сервера:

ifconfig
-4

И подключаемся:

ssh pi@192.168.0.15

pi - это имя пользователя;

192.168.o.15 - это IP сервера.

А вот как подключаться через PuTTy:

Открываем программу, вводим IP и порт (по умолчанию 22):

-5

И нажимаем "Open".

Далее вводим логин и пароль:

-6

После первого подключения к серверу - мы должны согласиться с предупреждением, которое означает, что после соединения будет сохранён специальный идентификатор этого соединения.

Внимание:

Если вы увидите это предупреждение при повторном подключении к серверу - возможно настройки соединения были изменены или вас атакует хакер!

Вот мы и подключились:

-7

Теперь мы можем свободно управлять сервером на расстоянии по 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 нам нужно ввести логин, верифицированный одноразовый код (который берётся из приложения) и пароль:

На этом всё! Спасибо за внимание и удачи в защите своего сервера!