OpenSSH: Использование аутентификации на базе публичного ключа


Мини-руководство "шаг за шагом"

Генерируем пару ключей (секретный и публичный):

% ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/andrushock/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/andrushock/.ssh/id_rsa.
Your public key has been saved in /home/andrushock/.ssh/id_rsa.pub.
The key fingerprint is:
25:95:5b:a6:d7:26:b6:f5:f9:a7:49:d4:a8:2a:0d:7d andrushock@midian

Проверяем корректность прав доступа к директории .ssh и RSA-ключам:

% ls -la .ssh | egrep -v 'total|\.\.'
drwx------   2 andrushock  wsrc   512 Oct 19 20:42 ./
-rw-------   1 andrushock  wsrc  1743 Jun 11 03:35 id_rsa
-rw-r--r--   1 andrushock  wsrc   413 Jun 11 03:35 id_rsa.pub

Добавляем публичный ключ в список авторизованных ключей на удаленной системе:

% ssh user@host "cat >> .ssh/authorized_keys" < .ssh/id_rsa.pub

В случае, если подкаталог .ssh и файл .ssh/authorized_keys на удаленной системе не существуют:

% ssh user@host "mkdir -m 700 .ssh; umask 077; cat > .ssh/authorized_keys" < .ssh/id_rsa.pub

Для сохранения парольных фраз к приватным ключам запускаем ssh-agent(1):

% eval `/usr/bin/ssh-agent`
Agent pid 3855

С помощью ssh-add(1) добавляем в память агента парольную фразу от нашего ключа:

% ssh-add
Enter passphrase for /home/andrushock/.ssh/id_rsa:
Identity added: /home/andrushock/.ssh/id_rsa (/home/andrushock/.ssh/id_rsa)

Для проверки просматриваем отпечаток секретного ключа:

% ssh-add -l
2048 25:95:5b:a6:d7:26:b6:f5:f9:a7:49:d4:a8:2a:0d:7d /home/andrushock/.ssh/id_rsa (RSA)

Выполняем вход на удаленный сервер без ввода пароля и парольной фразы:

% ssh user@host
OpenBSD 3.7-current (GENERIC) #1: Mon Aug  1 00:37:53 MSD 2005

Welcome to OpenBSD: The proactively secure Unix-like operating system.

$

Пример использования функций оболочки для упрощения беспарольной аутентификации:

% vi .profile
ssh_agent_start() {
	id1=$HOME/.ssh/identity
	id2=$HOME/.ssh/id_dsa
	id3=$HOME/.ssh/id_rsa
	if [ ! "$SSH_AGENT_PID" ] && [ -f $id1 -o -f $id2 -o -f $id3 ]; then
		eval `/usr/bin/ssh-agent -s`
		/usr/bin/ssh-add < /dev/null
		export SSH_AGENT_SHELL=$$
	fi
}

ssh_agent_stop() {
	if [ "$SSH_AGENT_PID" -a "$SSH_AGENT_SHELL"x = "$$"x ]; then
		/usr/bin/ssh-add -D < /dev/null
		eval `/usr/bin/ssh-agent -sk`
	fi
}

ssh_agent_start
trap ssh_agent_stop 0 1


OpenBSD.ru www@openbsd.ru
$RuOBSD: ssh-pubkey.html,v 1.26 2010/11/01 10:57:49 dinar Exp $