Настройка и обеспечение безопасности SSH
Для подключения к одноплатному компьютеру по ssh необходимо ввести команду ssh имя_пользователя@ip_адрес устройства. После введения данной команды система попросит ввести пароль пользователя; при введении правильного пароля, откроется консоль устройства, аналогичная консоли ubuntu. В данном разделе описаны продвинутые функции OpenSSH, которые позволяют сильно упростить жизнь системным администраторам и программистам.
Управление ключами
Удаленно подключиться к устройству по ssh можно не по паролю, а по заранее сгенерированному ключу. Ключ состоит из открытой и закрытой части. Открытая кладется в домашний каталог пользователя, закрытая — на сервер. Главной особенностью ключа по сравнению с паролем является то, что его нельзя «украсть», взломав сервер: ключ не передается с клиента на сервер, а во время авторизации клиент доказывает серверу, что владеет ключом.
Генерация ключа
Свой ключ можно сгенерировать с помощью команды ssh-keygen. Если не задать параметры, то он сохранит все так, как надо.
Ключ можно закрыть паролем. Этот пароль (в обычных графических интерфейсах) спрашивается один раз и сохраняется некоторое время. Если пароль указать пустым, он спрашиваться при использовании не будет.
Осторожно: Восстановить забытый пароль невозможно.
Сменить пароль на ключ можно с помощью команды
ssh-keygen -p.Структура ключа
(если на вопрос про расположение ответили по умолчанию):
- ~/.ssh/id_rsa.pub — открытый ключ. Его копируют на сервера, куда нужно получить доступ.
- ~/.ssh/id_rsa — закрытый ключ. Его нельзя никому показывать. В целях безопасности, если этот ключ попал в руки кому-то еще, нужно перегенерировать ключи.
Копирование ключа на сервер
В каталоге пользователя, под которым вы хотите зайти, если создать файл ~/.ssh/authorized_keys и положить туда открытый ключ, можно будет заходить без пароля. Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям, иначе ssh его не примет. В ключе последнее поле — user@machine. Оно не имеет никакого отношения к авторизации и служит только для удобства определения где чей ключ. Заметим, это поле может быть изменено (или даже удалено) без нарушения структуры ключа.
Если вы знаете пароль пользователя, то процесс можно упростить. Команда ssh-copy-id user@server позволяет скопировать ключ не редактируя файлы вручную.
Если у вас ssh на нестандартном порту, то ssh-copy-id будет требовать:
ssh-copy-id '-p 443 user@server'Ключ сервера
Первый раз, когда вы заходите на сервер, ssh вас спрашивает, доверяете ли вы ключу. Если отвечаете нет, соединение закрывается. Если да — ключ сохраняется в файл ~/.ssh/known_hosts. Узнать, где какой ключ нельзя, иначе потерялся бы смысл безопасности ключей.
Если ключ сервера поменялся (например, сервер переустановили), ssh выдаст уведомление о подделке ключа.
Обратите внимание, если сервер не трогали, а ssh выдает уведомления, значит вы не на тот сервер пытаетесь осуществить подключение. Например, в сети появился еще один компьютер с тем же IP, зачастую такая проблема встречается в локальных сетях с 192.168.1.1, которых в мире несколько миллионов. Сценарий взлома всей системы маловероятен, чаще это просто ошибка с IP, хотя если все хорошо, а ключ поменялся — это повод начать переживать за безопасность (а если у вас авторизация по ключу, и сервер вдруг запросил пароль — то уже нужно беспокоится за безопасность и не вводить пароль).
Удалить известный ключ сервера можно командой ssh-keygen -R server. При этом нужно удалить еще и ключ IP (они хранятся раздельно): ssh-keygen -R 127.0.0.1.
Ключ сервера хранится в /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_rsa_key.pub. Их можно:
- скопировать со старого сервера на новый;
- сгенерировать с помощью ssh-keygen. Пароль при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет.
Заметим, если вы сервера клонируете, например в виртуальных системах, то ssh-ключи сервера нужно обязательно перегенерировать.
Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key.
Копирование файлов
Передача файлов на сервер иногда может утомлять. Помимо возни с sftp и прочими странными вещами, ssh предоставляет нам команду scp, которая осуществляет копирование файла через ssh-сессию:
scp path/myfile user@8.8.8.8:/full/path/to/new/location/Обратно тоже можно:
scp user@8.8.8.8:/full/path/to/file /path/to/put/heresshfs
Модуль fuse позволяет «экспортировать» запросы к файловой системе из ядра обратно в userspace к соответствующей программе. Это позволяет легко реализовывать «псевдофайловые системы». Например, мы можем предоставить доступ к удаленной файловой системе через ssh так, что все локальные приложения (за малым исключением) не будут ничего подозревать.
Для использование необходимо установить пакет sshfs он сам доустановит пакет fuse:
sudo apt install sshfsПример использования, который монтирует файловую систему NanoPi на наш персональный компьютер:
sudo sshfs -o allow_other,default_permissions pi@192.168.1.27:/ /mntДля того чтобы посмотреть файловую систему на персональном компьютере необходимо ввести в терминал:
ls /mnt
Для того чтобы отключить файловую систему NanoPi, необходимо ввести:
sudo umount /mntЕсли вы много работаете с данными от рута, то можно (нужно) сделать idmap:
-o idmap=userРаботает она следующим образом: если мы коннектимся как пользователь test@server, а локально работаем как пользователь person, то мы говорим «считать, что файлы test — это файлы person». Ну, или «root», если мы коннектимся как root.
В случае, если имена пользователей локальное и удаленное, совпадают, idmap не нужен.
Заметим, комфортно работать получается только если у нас есть ssh-ключ, если нет — авторизация по паролю.
Отключить обратно можно командой fusermount -u /path, однако, если соединение залипло (например, нет сети), то можно/нужно делать это из-под рута: sudo umount -f /path.
Удаленное исполнение кода
ssh может выполнить команду на удаленном сервере и тут же закрыть соединение. Простейший пример:
ssh user@server -t ls /etc/Выведет нам содержимое /etc/ на server, при этом у нас будет локальная командная строка.
