⌨ Labor omnia vincit ☮

OpenSSH: using keys for access

Posted in GNU/Linux, OpenSSH by anaumov on 04.08.2010

Понадобилось настроить вход через OpenSSH на удаленную машину, без постоянного ввода пароля. Погуглил, и нашел немало мануалов (в основном в блогах), о том как это можно сделать. К сожаленью, почти все они оказались как две капли воды похожи, а последовательность преведенных там команд предоставляла достаточно скудные возможности или вообще нерабочие соединение. К тому же мне понадобилось создавать запросы через web-интерфейс, а не через консоль, т.е. мне не просто надо было логиниться без пароля, но и при помощи одного запроса получать вывод той или иной команды с удаленной машины.

Прежде всего надо создать пару ключей, использование которых избавит нас от ввода пароля:

> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/alex/.ssh/id_rsa):
Created directory '/home/alex/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alex/.ssh/id_rsa.
Your public key has been saved in /home/alex/.ssh/id_rsa.pub.
The key fingerprint is:
08:a9:56:2b:fc:f5:39:22:a7:a8:78:18:6f:0a:6c:39 alex@pizza
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|     .           |
|    +            |
| . o o .         |
|  = . o S        |
|o..o . . .       |
|.E  o o +        |
|= =. + . .       |
|+=. .            |
+-----------------+

В результате у нас есть два ключа – публичный, которым мы делимся с теми, с кем хотим настроить соединение, и секретный, который не должны никому показывать и который служит для нашей идентификации. Используя пару этих ключей нам не придется каждый раз вводить пароль. Естественно на удаленной машине должен быть наш публичный ключ. Храниться он должен в файле ~/.ssh/authorized_keys. Что бы скопировать его туда, некоторые советуют использовать команду scp, которая предназначенна для копирования файлов целиком, т.е. что-то типа этого:

> scp /home/alex/.ssh/id_rsa.pub alex@server:/home/alex/.ssh/authorized_keys

Проблема в том, что если я захочу этой же командой добавить еще одну запись, то я перезапишу уже существующий файл. Для домашнего использования это не так критично, но если вы настраиваете это пускай даже в небольшой фирме, то сразуже почувствуете, что это неудобно. К примеру, если я хочу открыть root-досуп на сервере для нескольких коллег, то в файле /root/.ssh/authorized_keys надо будет добавить несколько записей (для каждой “клиентской” машины).
В этом случае ИМХО лучше сделать что-то типа:

> cat ~/.ssh/id_rsa.pub | ssh root@server 'cat  >> .ssh/authorized_keys'

В конец файла будет добавлена запись вашего ключа. То, что там уже было, останется нетронутым.

Теперь я могу логиниться на удаленном сервере без пароля:

> ssh root@server
Last login: Thu Aug  4 12:44:52 2010 from pizza
Have a lot of fun...
server:~ #

Чтобы получить вывод какой-то команды, мне необязательно теперь логиниться на удаленной машине. Вывод я могу получить и вот так:

> whoami
alex

> ssh -i ~/.ssh/id_rsa root@server whoami
root

> cat /etc/SuSE-release
openSUSE 11.1 (i586)
VERSION = 11.1

> ssh -i ~/.ssh/id_rsa root@server 'cat /etc/SuSE-release'
SUSE Linux Enterprise Server 11 (i586)
VERSION = 11
PATCHLEVEL = 0

Это очень удобно, так как теперь я могу получать любую информацию об удаленной машине через web. Все что для этого надо это создать пару ключей для пользователя wwwrun, скопировать публичный ключ на удаленную машину и создать запрос через web. Для тестирования вам возможно понадобиться консоль с правами wwwrun, для этого сделайте vipw, и в конец строки (для пользователя wwwrun) добавте /bin/bash. Не забывайте так же, что после создания ключей, они будут не в /home/wwwrun/.ssh/id_rsa.pub, а в /var/lib/wwwrun/.ssh/id_rsa.pub.

Теперь этот код на PHP:

$ssh = 'ssh -i /var/lib/wwwrun/.ssh/id_rsa root@server whoami';
$answer = shell_exec($ssh);
echo "$answer";

должен вернуть в окне браузера “root”.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: