После завершения этого раздела учащиеся смогут настроить учетную запись пользователя для использования аутентификации на основе ключей, позволяющей безопасно входить в удаленные системы без пароля.
Вы можете настроить SSH-сервер на прохождение аутентификации без пароля с помощью ключей. Такая аутентификация основана на схеме «закрытый-открытый ключ».
Необходимо создать пару связанных файлов криптографических ключей. Один из них — это закрытый ключ, другой — открытый ключ. Файл закрытого ключа используется в качестве учетных данных аутентификации и, как пароль, должен храниться в секрете и быть защищен. Открытый ключ копируется в системы, к которым хочет подключиться пользователь, и используется для проверки закрытого ключа. Открытый ключ не обязательно держать в секрете.
Вы помещаете копию открытого ключа в свою учетную запись на сервере. Когда вы пытаетесь войти в систему, SSH-сервер может использовать открытый ключ, чтобы отправить запрос, на который можно правильно ответить закрытым ключом. В результате ваш клиент ssh может автоматически проходить аутентификацию на сервере с помощью уникальной копии закрытого ключа. Это позволяет вам безопасно входить в системы без интерактивного ввода пароля.
Создание ключей SSH
Чтобы создать закрытый ключ и соответствующий открытый ключ для аутентификации, используйте команду ssh-keygen. По умолчанию закрытые и открытые ключи хранятся в файлах ~/.ssh/id_rsa и ~/.ssh/id_rsa.pub соответственно.
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
[user@host ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Enter Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter Enter same passphrase again: Enter Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:vxutUNPio3QDCyvkYm1oIx35hmMrHpPKWFdIYu3HV+w user@host.lab.example.com The key's randomart image is: +---[RSA 2048]----+ | | | . . | | o o o | | . = o o . | | o + = S E . | | ..O o + * + | |.+% O . + B . | |=*oO . . + * | |++. . +. | +----[SHA256]-----+
[user@host ~]$
ssh-keygen
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Если вы не укажете парольную фразу, когда команда ssh-keygen предложит сделать это, сформированный закрытый ключ не будет защищен. В этом случае любой пользователь с вашим файлом закрытого ключа сможет использовать его для аутентификации. Если вы установите парольную фразу, вам потребуется вводить ее при прохождении аутентификации с помощью закрытого ключа. (Поэтому вы будете использовать на удаленном хосте парольную фразу закрытого ключа, а не пароль для прохождения аутентификации.)
Вы можете использовать вспомогательную программу ssh-agent, чтобы временно кэшировать парольную фразу закрытого ключа в памяти в начале сеанса и проходить аутентификацию совсем без пароля. Этот вопрос рассматриваются позже в данном разделе.
В следующем примере команды ssh-keygen показано создание закрытого ключа, защищенного парольной фразой, вместе с открытым ключом.
[user@host ~]$ ssh-keygen -f .ssh/key-with-pass Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in .ssh/key-with-pass. Your public key has been saved in .ssh/key-with-pass.pub. The key fingerprint is: SHA256:w3GGB7EyHUry4aOcNPKmhNKS7dl1YsMVLvFZJ77VxAo user@host.lab.example.com The key's randomart image is: +---[RSA 2048]----+ | . + =.o ... | | = B XEo o. | | . o O X =.... | | = = = B = o. | |= + * * S . | |.+ = o + . | | + . | | | | | +----[SHA256]-----+
ssh-keygen -f .ssh/key-with-pass
Опция -f с командой ssh-keygen определяет файлы, в которых сохранены ключи. В предыдущем примере закрытый и открытый ключи сохраняются в файлах /home/user/.ssh/key-with-pass /home/user/.ssh/key-with-pass.pub соответственно.
-f
/home/user/.ssh/key-with-pass
/home/user/.ssh/key-with-pass.pub
Во время дальнейшего формирования пары ключей SSH, если вы не укажете уникальное имя файла, вам будет предложено перезаписать существующие файлы id_rsa и id_rsa.pub. В случае перезаписи существующих файлов id_rsa и id_rsa.pub потребуется заменить старый открытый ключ новым на всех SSH-серверах, где используется старый открытый ключ.
id_rsa
id_rsa.pub
Создаваемые ключи SSH по умолчанию сохраняются в каталоге .ssh/ домашнего каталога пользователя. Режим разрешений для закрытого ключа ― 600, а для открытого — 644.
.ssh/
Передача открытого ключа
Для использования аутентификации на основе ключей необходимо скопировать открытый ключ в целевую систему. Команда ssh-copy-id копирует открытый ключ из пары ключей SSH в целевую систему. Если вы не укажете путь к файлу открытого ключа при выполнении команды ssh-copy-id, будет использоваться файл /home/user/.ssh/id_rsa.pub по умолчанию.
/home/user/.ssh/id_rsa.pub
[user@host ~]$ ssh-copy-id -i .ssh/key-with-pass.pub user@remotehost /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys user@remotehost's password: redhat Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@remotehost'" and check to make sure that only the key(s) you wanted were added.
ssh-copy-id -i .ssh/key-with-pass.pub user@remotehost
user@remotehost's password:
redhat
После успешной передачи открытого ключа в удаленную систему можно будет входить в эту систему через SSH, проходя аутентификацию по соответствующему закрытому ключу. Если вы не укажете путь к файлу закрытого ключа при выполнении команды ssh, будет использоваться файл /home/user/.ssh/id_rsa по умолчанию.
/home/user/.ssh/id_rsa
user
[user@host ~]$ ssh -i .ssh/key-with-pass user@remotehost Enter passphrase for key '.ssh/key-with-pass': redhatpass ...output omitted... [user@remotehost ~]$ exit logout Connection to remotehost closed. [user@host ~]$
ssh -i .ssh/key-with-pass user@remotehost
Enter passphrase for key '.ssh/key-with-pass':
redhatpass
[user@remotehost ~]$
exit
Использование ssh-agent для неинтерактивной аутентификации
Если закрытый ключ SSH защищен парольной фразой, как правило, необходимо указывать эту фразу при использовании закрытого ключа для аутентификации. Однако вы можете использовать программу ssh-agent, чтобы временно кэшировать парольную фразу в памяти. Когда вы будете использовать SSH для входа в другую систему с помощью закрытого ключа, программа ssh-agent будет автоматически предоставлять парольную фразу. Это удобно и более безопасно, поскольку злоумышленник не сможет подсмотреть вводимую парольную фразу.
В зависимости от конфигурации локальной системы, когда вы впервые входите в среду графического рабочего стола GNOME, программа ssh-agent может запускаться и настраиваться автоматически.
Если вы входите на текстовую консоль, входите с помощью ssh либо используете sudo или su, вам, скорее всего, потребуется вручную запустить программу ssh-agent для этого сеанса. Сделать это можно с помощью следующей команды:
[user@host ~]$ eval $(ssh-agent) Agent pid 10155 [user@host ~]$
eval $(ssh-agent)
При выполнении программа ssh-agent отображает некоторые команды оболочки. Необходимо выполнить эти команды, чтобы задать переменные среды, используемые такими программами, как ssh-add, для взаимодействия с ними. Команда eval $(ssh-agent) запускает программу ssh-agent и выполняет эти команды, чтобы автоматически задать переменные среды для сеанса командной оболочки. Она также отображает PID процесса ssh-agent.
После запуска программы ssh-agent необходимо задать в ней парольную фразу для закрытого ключа. Сделать это можно с помощью команды ssh-add.
Следующие команды ssh-add добавляют закрытые ключи из файлов /home/user/.ssh/id_rsa (по умолчанию) и /home/user/.ssh/key-with-pass соответственно.
[user@host ~]$ ssh-add Identity added: /home/user/.ssh/id_rsa (user@host.lab.example.com) [user@host ~]$ ssh-add .ssh/key-with-pass Enter passphrase for .ssh/key-with-pass: redhatpass Identity added: .ssh/key-with-pass (user@host.lab.example.com)
ssh-add
ssh-add .ssh/key-with-pass
Enter passphrase for .ssh/key-with-pass:
После успешного добавления закрытых ключей в процесс ssh-agent вы можете установить SSH-подключение, используя команду ssh. Если вы используете какой-либо файл закрытого ключа, отличный от стандартного файла /home/user/.ssh/id_rsa, необходимо использовать опцию -i с командой ssh, чтобы указать путь к файлу закрытого ключа.
ssh-agent
-i
В следующем примере команды ssh используется стандартный файл закрытого ключа для аутентификации на SSH-сервере.
[user@host ~]$ ssh user@remotehost Last login: Fri Apr 5 10:53:50 2019 from host.example.com [user@remotehost ~]$
ssh user@remotehost
В следующем примере команды ssh используется нестандартный файл закрытого ключа /home/user/.ssh/key-with-pass для аутентификации на SSH-сервере. Закрытый ключ в следующем примере уже был расшифрован и добавлен к родительскому процессу ssh-agent, поэтому команда ssh не предлагает вам расшифровать закрытый ключ путем ввода парольной фразы в интерактивном режиме.
[user@host ~]$ ssh -i .ssh/key-with-pass user@remotehost Last login: Mon Apr 8 09:44:20 2019 from host.example.com [user@remotehost ~]$
Когда вы выйдете из сеанса, в котором была запущена программа ssh-agent, процесс завершится и парольные фразы для закрытых ключей будут удалены из памяти.
Man-страницы ssh-keygen(1), ssh-copy-id(1), ssh-agent(1) и ssh-add(1)
ssh-copy-id