Есть такая фишка в ssh - авторизация пользователя не по паролю, а по ключу. Это удобно если... да просто удобно) если у вас куча серверов или несколько людей могут их админить. В общем, постановка задачи есть - выполняем.
1. Создание rsa-ключа.
Вначале на той машине, с которой хотите ходить везде (т. е. например, ваша рабочая) создаем пару ключей:
ssh-keygen -t dsa
Отвечаем на вопросики, даем или не даем (не рекомендуется, иначе зачем мы вс это делаем?) пароль на ключик.
Получаем пару файлов - публичный и приватный ключ. Публичный ключ, который мы будем копировать на сервера, на которые хотим заходить по ключу называется:
id_dsa.pub
2. User management
Далее опциональные шаги. Заходим на целевой сервер и:
1. Создаем юзера командой useradd name_of_user
2. Создаем пароль нашему юзеру командой passwd name_of_user
3. Добавляем пользователя в файл /etc/sudoers (если sudo не установлен и файлика нет - устанавливаем apt-get install sudo или типа того) после похожей записи рута и изменяем или комментируем строчку требования пароля:
Defaults !requiretty
Затем после строчки %sudo ALL=(ALL) ALL пишем:
name_of_user ALL=(ALL) NOPASSWD:ALL
Теперь команда sudo su - не будет запрашивать пароль.
3. Копирование ключа на удалённый сервер
Есть два пути:
а) копируем ключ автоматически. Для этого на сервере, где есть публичный ключ, выполняем:
ssh-copy-id -i ~/.ssh/id_dsa.pub user@remote-host
где параметром -i передается путь в публичному ключу и кладется в папку .ssh указанного пользователя со всеми правами автоматически.
б) копируем вручную. Для этого заходим в хомяк пользователя на удаленном сервере, создаем там папку .ssh, а в ней файл authorized_keys, в который копируем наши публичные ключи - смотрите, чтобы каждый ключик был в одну строчку!
Изменяем владельца наших файлов/директорий - ссх очень чувствителен к этому.
chown -R name_of_user:name_of_user .ssh
chmod 700 .ssh
chmod 400 .ssh/authorized_keys
Всё, теперь мы можем зайти удаленно на наш сервер по ssh не указывая пароль нашего пользователя и командой sudo su - сразу превратиться в рута без вопросов :)
4. Способы авторизации на удалённом сервере по ключу
Один из способов был указан ранее.
Далее просто командой c указанием пути к ключу:
ssh -i /path/to/key/key.pem user@server
И ещё один вариант - добавить конфиг файл. Осбенно хорошо когда серверов несколько.
Добавляем в папку вашего пользователя на клиенте:
nano /home/your_user/.ssh/config
следующее:
Host server1 server1.company.com
Hostname 192.168.1.2
User username
IdentityFile /path/to/key/key1.pem
Host server2 server2.company.com
Hostname server2.com
User username
IdentityFile /path/to/key/key2.pem
И потом можно сразу заходить командами вида:
ssh server1
ssh server2
Update 1.
Столкнулся с ситуацией, когда всё проделанное выше не работало для удаленного сервера Oracle Linux 6.8 (аналог RHEL/CentOS 6.8) пока я не выполнил команды:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
restorecon -R -v /root/.ssh
Несмотря на то, что Selinux был выключен.
Update 2.
Описанные в начале команды для новых систем Debian/Ubuntu не сработали. Потому создаём ключи другого формата:
Создаём ключи на сервере1:
ssh-keygen -t rsa -b 4096 -C "domain.com"
Копируем ключи на сервер2:
ssh-copy-id user@server2
Дролжны получить такой результат:
"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.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@server2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user@server2.
"
Проверяем:
ssh user@server2