Введение
Пару слов о чем тут пойдет речь. Для подключения по ssh можно использовать связку логин-пароль, а можно логин-сертификат. В интернете всюду рассказывают о том, что сертификат это безопасно и надо обязательно использовать его для авторизации на сервере. Все, что не по сертификату — дурной тон и дилетантство. Я совершенно не разделяю это мнение и сам всегда использую связку логин-пароль, более того, я чаще всего захожу сразу под root. Я искренне не понимаю, зачем заходить под обычным пользователем и каждый раз вводить sudo и пароль. Я захожу на сервер для совершения административных действий и мне всегда нужны полные права. Что мне там делать под обычным пользователем ума не приложу.
За все время моей работы с серверами у меня никогда не было проблем, связанных с авторизацией по паролю, поэтому я считаю пустой тратой времени какие-то дополнительные действия в этом плане, если нет особой необходимости. Доводы о том, что пароль могут сбрутить выглядят несостоятельными. Пароль должен быть сложным, и брутить его никто не будет. Даже если будут, то есть fail2ban, который быстро отключит желающих побаловаться. Хотя я сомневаюсь, что сейчас кто-то занимается брутом ssh.
Уточню важный момент — все сказанное выше относится к ситуациям, когда я единственный администратор сервера и кроме меня на него больше никто не заходит. Если это не так, то тут уже возникают нюансы, в зависимости от ситуации, где нужно использовать сертификаты, разные учетные записи пользователей и sudo, к примеру, для логирования действий различных пользователей.
Об одном таком нюансе я и расскажу. Мне понадобилось настроить авторизацию ssh по сертификату. Причем авторизовываться будет сразу пользователь root. Заходить будут как по паролю, так и по сертификату. Мне необходимо вести учет того, кто по какому сертификату подключился по ssh к серверу.
Использование открытого/закрытого SSH ключа в Unix/Linux
Чтобы посмотреть содержание ключа, используйте:
$ cat ~/.ssh/l1_key.pub
И получите что-то типа:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC9raaaCmx9CvnAr8ffiODwocbkmmgvIG64AAwGkCDE0iaz0Xl3BJg98+WM8W0IAbNXMPdxjsRbhpUBWb966vsZ0u/ZYdreUOyOgFKLb5nnGh7qC1Sbv8Yp0MvC1M7g/BQimnG1UHv5C0iZDdxlP7Sj9H5Mwf1rpfQCd95j9nWcpJBgrZxvaRhNS+EA5nrg0BtebkznHdWe4f84sUzAWsZZNcd//V5aIF5f5pSHyzCrcMXPppLWOoUJ+xlAj9AUJ74AxGVmlh4au2LHDCpYKAnXpzV5+hy9E8yMGl44Sa3fDHwWX5p3a9r8LdKlYIYVAo3HQsS2Fqw7/m3qmo2+hDvurJWWJUCeQQFL/5MuIN4QS/xUdXutegQImT5ikrEIakSS8NIzaj6ZjpHR+fbl/WdO7/UhoIJYPHjQ7fSVOuMaz5+ZjRZK7QFdG2QXubUUkh1NdI+31T2vZlvAhyMtxMSzj5m014gvPPwPRNiBqwSvHKEe2trA8/bIVgme34YkLhUA58Pqzgc7GHRzwty11ejywZdxonwivX3UCAPcD/95xuIeHcF5OO8y4bWABHvTvdkmB/3RV5S5vkxATqdqqM5+QrUyEzePERgZzKcj+gRqDIozMrVh1jSiX2lwtutJ1iU0YrRhVVph9BJLmcewqb+yDv5eJT+luNNvQy6AvXzuiw== shared_L1_team_acc
На mac OS X имеется функция которая позволяет копировать в буфер, например:
$ cat ~/.ssh/l1_key.pub| pbcopy
Данный ключ стоит скопировать на удаленный сервер следующим образом:
$ ssh-copy-id -i ~/.ssh/YOUR_KEY YOUR_USER@YOUR_HOST
Где:
- YOUR_KEY — Ваш сгенерированный ключ.
- YOUR_USER — Ваш пользователь на удаленной машине.
- YOUR_HOST — Ваш хост на удаленной машине.
Должен появиться файл:
$ ls -alh ~/.ssh/l1_key.pub
И, добавим содержание ключа в:
$ cat ~/.ssh/l1_key.pub >> ~/.ssh/authorized_keys
Или если используется ~/.ssh/authorized_keys2, то применяем аналогичные действия:
$ cat ~/.ssh/l1_key.pub >> ~/.ssh/authorized_keys2
PS: Можно еще одной командой выполнить ряд аналогичных действий:
# cat ~/.ssh/YOUR_KEY.pub | ssh YOUR_USER@YOUR_HOST "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Осталось уже долго, идем дальше….
Изменение ssh_config
В зависимости от Unix/Linux ОС, ssh_config может лежать в разным местах.
Пример файла в Debian/Ubuntu:
# vim /etc/ssh/ssh_config
Пример файла в Redhat/Fedora/Centos:
# vim /etc/ssh/sshd_config
Примерный вывод:
Port 22 Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key SyslogFacility AUTHPRIV PermitRootLogin yes RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys RhostsRSAAuthentication no HostbasedAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no GSSAPICleanupCredentials yes X11Forwarding yes UseLogin no AllowUsers captain root AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server
В данном конфиге (я имею ввиду по этой теме), нас интересует следующие строки:
RSAAuthentication yes PubkeyAuthentication yes PasswordAuthentication no
После того как привели к такому виду, перезапускаем ssh:
# service sshd restart
Подключаемся к удаленному серверу:
$ ssh -i l1_key your_username@your_host_ip
Вот еще полезное чтиво:
Другие темы можно найти на сайте
Тема «Сгенерировать открытый/закрытый SSH ключ в Unix/Linux» завершена.
Использование ключей
P.S. Здесь я рассматриваю случай подключения из Windows к Linux серверу.
Для интереса посмотрим содержимое файлов ключей созданных в PuTTY. Публичный ключ:
---- BEGIN SSH2 PUBLIC KEY ---- Comment: "rsa-key-20170813" AAAAB3NzaC1yc2EAAAABJQAAAQEAidv/Xk0Sj+eHBg91AAX+ISn/RWEoZwFONsKI rgMwqkZmrqDEFCjbn0aUYSuZjKAOH/uMQHm3KQmtVG62xHePevg4/ZG4bEGeM6le UZLkCqdhhwat/JTEu9chQZktWF/Ok3IRHOPlZ8Se6Qg3lEBuijSk6VHSSBJeNY+6 tWAtB9h1vrh5PMJce2IEkXJtcFgXVUSvtxOtHpOUwdgNg5U69knrozJXTS6W7Dtb NFZlf8BYHNy6f/06/dks2r3QFC/f+a7yrj7AMs0HDm/8ZYOBwWS3tuLqyPC2Wx6f omx2yhIuXr1G+86N9+29Q+lMnAkbMSvCKDwH/9YJxlNKbGAZxw== ---- END SSH2 PUBLIC KEY ----
Этот ключ нам нужно поместить на сервер. Но в данном виде он для этого не годится. Есть два варианта: либо привести ключ к виду:
либо открыть приватный ключ в Puttygen и скопировать Public key оттуда. В том и другом случае ключ будет выглядеть как-то так:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAidv/Xk0Sj+eHBg91AAX+ISn/RWEoZwFONsKIrgMwqkZmrqDEFCjbn0aUYSuZjKAOH/uMQHm3KQmtVG62xHePevg4/ZG4bEGeM6leUZLkCqdhhwat/JTEu9chQZktWF/Ok3IRHOPlZ8Se6Qg3lEBuijSk6VHSSBJeNY+6tWAtB9h1vrh5PMJce2IEkXJtcFgXVUSvtxOtHpOUwdgNg5U69knrozJXTS6W7DtbNFZlf8BYHNy6f/06/dks2r3QFC/f+a7yrj7AMs0HDm/8ZYOBwWS3tuLqyPC2Wx6fomx2yhIuXr1G+86N9+29Q+lMnAkbMSvCKDwH/9YJxlNKbGAZxw== rsa-key-20170813
То есть из ключа удалены переносы строк, перед ним вставлена фраза «ssh-rsa», а после ключа — комментарий. Кстати, в Linux ключ сохраняется сразу в таком виде.
Если вы устанавливаете ключ на сервер вручную, то его необходимо поместить в файл /home/username/.ssh/authorized_keys . На самом сервере это можно сделать к примеру так:
Если вы создаёте VDS-сервер, то обычно хостер предоставляет возможность сразу указать ключи. Рассмотрю DigitalOcean и Scaleway.
В панели DigitalOcean необходимо перейти в Settings (настройки), затем выбрать Security (безопасность) и нажать кнопку Add SSH key.
В поля вставляем наш публичный ключ и комментарий.
Готово. Теперь мы видим отпечаток ключа.
У Scaleway делается аналогично. Переходим в Credentials (полномочия?).
Вставляем ключ и нажимаем кнопку Use this SSH key.
Видим ключ:
Который после обновления страницы превращается в отпечаток:
После этого можно создавать VDS-сервер.
Теперь смотрим приватный ключ (часть файла):
PuTTY-User-Key-File-2: ssh-rsa Encryption: aes256-cbc Comment: rsa-key-20170813 Public-Lines: 6 AAAAB3NzaC1yc2EAAAABJQAAAQEAidv/Xk0Sj+eHBg91AAX+ISn/RWEoZwFONsKI rgMwqkZmrqDEFCjbn0aUYSuZjKAOH/uMQHm3KQmtVG62xHePevg4/ZG4bEGeM6le UZLkCqdhhwat/JTEu9chQZktWF/Ok3IRHOPlZ8Se6Qg3lEBuijSk6VHSSBJeNY+6 tWAtB9h1vrh5PMJce2IEkXJtcFgXVUSvtxOtHpOUwdgNg5U69knrozJXTS6W7Dtb NFZlf8BYHNy6f/06/dks2r3QFC/f+a7yrj7AMs0HDm/8ZYOBwWS3tuLqyPC2Wx6f omx2yhIuXr1G+86N9+29Q+lMnAkbMSvCKDwH/9YJxlNKbGAZxw== Private-Lines: 14 F8Q44u5El96ttrGZkwBB36NhgBohmQI+/8TkBaTCqqLjPGKTl21cSQkp4epdgRn8 9MGsrgktyKC2KqE8N+SWSBIpli7cPqTMlOSowT5gj6RSZs3kpZlgUan5cZG0DN3R ... gG7WibKiyC3gVraFn4XiyqurZ4uPGZ313flq7dPqE6cYwAqm3JiQXcq5SsklnN+F Private-MAC: 8d8b1d632d0923614c72d2220902e787d151c145
Абсолютно ничего интересного. К счастью, ничего нам с ним делать не нужно, нам нужен просто этот файл целиком. Открываем программу PuTTY authentication agent (Pageant), которая сразу же прячется в системный трей. Вытаскиваем её оттуда щелчком по значку. Видим такое пустое окно:
Жмём кнопку Add key, выбираем приватный ключ, вводим пароль от него. Всё, ключ загружен. Программу можно закрыть (она будет свёрнута в трей).
Пока Pageant висит в трее с загруженными ключами, у вас есть беспарольный доступ к серверу. Теперь просто как обычно подключаемся к серверу по SSH, используя PuTTY. Вводим логин… и всё) Пароль от нас уже не потребуют.
В следующей статье расскажу об одном из способов хранения SSH ключей.
Установка пакетов SSH
Как уже говорилось система ssh в Linux-системах распространяется в виде составного метапакета, поэтому для установки всех требуемых утилит ssh нужно выполнить всего одну команду:
В Ubuntu
$ sudo apt-get install ssh
В CentOS
$ yum -y install openssh-server openssh-clients
После чего начнется процесс установки
Как видно, менеджер пакетов сам распознает все зависимые и связанные пакеты и установит их. Также, по завершению установки, автоматически будет запущен SSH-сервер в режиме демона. Это можно проверить командой:
$ systemctl status sshd
или:
$ service sshd status даст тот же вывод. Теперь сервер работает с базовыми настройками по-умолчанию.
Генерация ключей в Windows
Для генерации ключей в Windows можно использовать утилиту PuTTY Key Generator (Puttygen) из PuTTY. Работать в ней очень просто. Единственное, что в ней нужно сделать — выбрать тип ключа (RSA) и его длину. И нажать кнопку «Generate».
Во время процесса генерации нам рекомендуют двигать мышью внутри окна, чтобы увеличить энтропию. По окончанию процесса увидим такое окно:
В самом верхнем поле мы видим наш публичный ключ. Его можем публиковать хоть на своей странице в соц.сетях. Это не опасно. Отсюда же его и удобно копировать для вставки на сервер. Но об этом позже.
Key fingerprint — отпечаток ключа. Короткая последовательность байт, которая идентифицирует наш публичный ключ.
Key comment — просто комментарий к ключу. Никак не используется и служит только для нашего удобства. Если ключей у вас много от разных серверов, то лучше их подписать.
Key passphrase — а вот сюда необходимо ввести пароль (и ниже повторить), которым мы защитим наш ключ в случае кражи.
После этого жмём кнопки «Save public key» и «Save private key». Впрочем, сохранять публичный ключ не имеет смысла, так как он продублирован в файле приватного ключа.
Примечание
Если необходимо сменить пароль, то нужно просто открыть приватный ключ в Puttygen, ввести в поля новый пароль и пересохранить приватный ключ. Публичный при этом не изменится.
Копирование открытого ключа на сервер
Добавить открытый ключ на сервер можно несколькими способами.
Примечание: На каждый сервер можно добавить неограниченное количество SSH-ключей.
Добавить открытый ключ на сервер можно несколькими способами. Рассмотрим несколько из них, начиная с простейшего. Выберите самый удобный для вас метод и используйте его, чтобы добавить открытый ключ на сервер.
Копирование ключа с помощью ssh-copy-id
Если на локальном компьютере установлена утилита ssh-copy-id, с её помощью вы можете быстро добавить открытый ключ на удалённый сервер. Обычно (но не всегда) утилита ssh-copy-id включена в пакет OpenSSH.
Чтобы узнать, есть ли эта утилита на локальном компьютере, просто попробуйте запустить её. Если она не установлена, на экране появится ошибка:
Вы можете установить её или воспользоваться другим методом копирования ключа.
В команде ssh-copy-id нужно указать IP-адрес или доменное имя, а также имя пользователя, для которого нужно добавить эти SSH-ключи.
Команда может вернуть:
Это значит, что локальный компьютер не узнаёт удалённый сервер, потому что ранее SSH-ключи никогда не использовались при аутентификации. Чтобы продолжить, введите yes и нажмите RETURN.
Утилита сканирует локальную учетную запись пользователя в поисках открытого ключа, id_rsa.pub. Когда она найдёт нужный файл, она запросит пользователя удалённого сервера.
Введите пароль и нажмите RETURN. Утилита подключится к аккаунту пользователя на удалённом хосте и установит открытый ключ; это происходит путём копирования содержимого файла id_rsa.pub в файл .ssh/authorized_keys в домашнем каталоге удалённого пользователя.
Если копирование прошло успешно, на экране появится:
Теперь открытый ключ добавлен в файл authorized_keys удалённого пользователя, и сервер сможет принять закрытый ключ для аутентификации.
Примечание: Скопировав ключ на удалённый сервер, можете переходить к разделу «Аутентификация с помощью SSH-ключей».
Копирование ключа через SSH
Если на вашем сервере нет утилиты ssh-copy-id, но есть парольный SSH-доступ к серверу, вы можете установить открытый ключ с помощью SSH-клиента.
Для этого нужно вывести открытый ключ на локальном компьютере и передать его по SSH на удалённый сервер. На удалённом сервере нужно создать каталог ~/.ssh (если такого каталога нет), а затем добавить открытый ключ в файл authorized_keys в этом каталоге. Используйте перенаправление потока >>, чтобы вставить ключ в файл authorized_keys (если ранее вы добавляли SSH-ключи на удалённый сервер, такой файл уже существует; при этом ключи не будут переписаны новыми ключами).
Если вы не изменили название файла открытого ключа по умолчанию (id_rsa.pub), используйте эту команду:
Команда может вернуть такое сообщение:
Это значит, что локальный компьютер не узнаёт удалённый сервер, потому что ранее SSH-ключи никогда не использовались при аутентификации. Чтобы продолжить, введите yes и нажмите RETURN.
Команда запросит пароль удалённого пользователя:
Введите пароль и нажмите RETURN. Если команда выполнена успешно, она не вернёт никакого вывода. Ключ id_rsa.pub будет добавлен в файл authorized_keys.
Примечание: Скопировав ключ на удалённый сервер, можете переходить к разделу «Аутентификация с помощью SSH-ключей».
Копирование ключа вручную
Также вы можете добавить открытый ключ на удалённый сервер вручную. Для этого нужно авторизоваться на удалённом сервере как пользователь, для которого предназначен этот ключ.
Процесс не меняется: вам нужно взять открытый ключ на локальной машине и добавить его в .ssh/authorized_keys в домашнем каталоге удалённого пользователя.
Войдите на удалённый сервер:
При этом может появиться сообщение:
Это значит, что локальный компьютер не узнаёт удалённый сервер, потому что ранее SSH-ключи никогда не использовались при аутентификации. Чтобы продолжить, введите yes и нажмите RETURN.
После этого будет запрошен пароль удалённого пользователя:
Создайте каталог .ssh в домашнем каталоге удалённого пользователя, если такого каталога пока что нет:
Вернитесь на локальную машину и запросите открытый SSH-ключ:
Скопируйте вывод в буфер, затем откройте файл authorized_keys в текстовом редакторе:
Вставьте в него открытый ключ, а затем сохраните и закройте файл (Esc, a, a).
Открытый ключ SSH теперь добавлен на удалённый сервер.
Настройка и подключения PuTTY
Теперь все что нам осталась это создать новый сеанс и настроить его подключения к SSH серверу по ключу.
Создаем новый сеанс пиши на IP Адрес к серверу.
Далее, мы выбираем меню категорию SSH и там выберем под категорию Auth
В поле Private key file for authentication загружаем наш приватный ключ.
Далее переходим обратно в раздел Session и сохраняем нашу сессию для того чтобы следующий раз не заполнять все эти поля.
Остаётся только проверить правильность аутентификации к SSH серверу по ключу. Запустите PuTTY и подключитесь к своему серверу. Если вы при создании, ключа заполнили поле Key Passphrase и Confirm Passphrase то вас запросит вести этот пароль. Если же всё настроено неправильно, то будет выдано сообщение об ошибке и предложено ввести пароль.
Использование пароля
Начнем с инструкции о том, как подключиться к удаленному серверу через SSH по логину и паролю. Это самый простой способ. Хостер предоставляет вам IP-адрес, логин и пароль. Этого достаточно для того, чтобы установить соединение с удаленным сервером.
Подключение на Windows
Моя основная система — Windows. Раньше для подключения к серверу через SSH я пользовался сторонней утилитой PuTTY, потому что в операционной системе не было встроенного компонента. В «десятке» он появился, так что теперь можно подключаться к SSH через командную строку (cmd).
Чтобы включить встроенный в систему OpenSSH:
- Откройте «Параметры» (Win + I) и перейдите в раздел «Приложения».
- Выберите опцию «Управление дополнительными компонентами».
- Нажмите «Добавить компонент».
- Выберите в списке OpenSSH Client и нажмите «Установить».
- После завершения установки перезагрузите систему.
Теперь разберемся, как подключиться к SSH через cmd. Запустите командную строку и выполните запрос вида ssh [email protected].
Значение root — логин для подключения, вы получили его в письме при создании сервера. 185.104.114.90 — IP-адрес сервера. Его можно посмотреть в панели управления сервером или в том же письме, которое прислал хостер. У команды может быть также дополнительный параметр -p, после которого прописывается номер порта. По умолчанию используется порт 22. Если у вас настроен другой порт, нужно явно его указать, — например, полный адрес может выглядеть так: ssh [email protected] -p 150.
После выполнения команды клиент SSH предложит добавить устройство в список известных. Введите в командной строке yes и нажмите на Enter. Затем укажите пароль для доступа к серверу. На этом подключение к серверу через SSH завершено — теперь все команды будут выполняться на удаленной машине, к которой вы подключились.
На версиях младше Windows 10 1809 нет встроенной поддержки протокола OpenSSH. В таком случае понадобится сторонняя утилита. Смотрим, как через PuTTY подключиться по SSH:
- Запустите PuTTY.
- На вкладке Session укажите Host Name (IP-адрес сервера), Port (по умолчанию 22, но если вы в конфигурации сервера указали другой порт, нужно задать его номер).
- Убедитесь, что тип соединения установлен SSH.
- Нажмите на кнопку Open, чтобы подключиться.
Если вы ввели правильные данные, появится окно консоли, в котором нужно указать логин и пароль для подключения к серверу. При первом запуске также отобразится запрос на добавление устройства в список известных.
Подключение на Linux и macOS
Теперь посмотрим, как подключиться по SSH через терминал на Linux. Для этого не требуется установка дополнительных компонентов, все работает «из коробки».
- Запустите терминал. Обычно для этого используется сочетание клавиш Ctrl+Alt+T. Найти терминал также можно по пути «Главное меню» — «Приложения» — «Система».
- Выполните команду для подключения. Синтаксис такой же, как на Windows, — ssh [email protected]. Если порт не стандартный, то нужно явно его указать: например, ssh [email protected] -p 150. Вместо root вы указываете свое имя пользователя, а вместо 185.104.114.90 — IP-адрес своего сервера.
- Если хост и порт указаны верно, на следующем шаге появится запрос на ввод пароля. При первом подключении также будет предложение добавить новое устройство в список известных. Для этого введите yes и нажмите на клавишу Enter.
На этом подключение завершено. Теперь все команды, которые вы вводите в терминале, будут выполняться на удаленной машине.
Если IP-адрес или порт указаны неверно, то на экране появится сообщение об ошибке — Connection Refused. Это может также говорить о том, что доступ запрещен брандмауэром на удаленном сервере (если вы его не отключили). Чтобы разрешить подключение через SSH:
- на сервере с Ubuntu/Debian выполните команду $ sudo ufw allow 22/tcp;
- на сервере CentOS/Fedora выполните команду $ firewall-cmd —permanent —zone=public —add-port=22/tcp.
Цифра 22 в синтаксисе — номер порта. Если вы используете другой порт, то укажите его явно.
Если вы знаете как подключиться через SSH на Linux, то справитесь с этой задачей и на macOS. В операционной системе Apple тоже есть встроенный терминал. Синтаксис команды для подключения не меняется: ssh [email protected], где root — ваш логин, а 185.104.114.90 — IP-адрес сервера, с которым вы устанавливаете соединение.