Почти везде и всегда пользуюсь, но почему то даже заметки не написал на эту тему в блоге. Хотя функциональность очень полезная и главное удобная!
Короткое how-to, для тех кому лень читать портянку(предполагается что на целевой машине стоит sudo и пользователь user добавлен в его группу):
1 2 3 |
ssh-keygen -t rsa -f ~/my-key && chmod 600 ~/my-key && ssh-copy-id -i ~/my-key.pub user@target-server ssh user@target-server "echo user_password | sudo -S sed -i -E 's/#\s*PasswordAuthentication yes/\nPasswordAuthentication no/' /etc/ssh/sshd_config && echo user_password | sudo -S service sshd restart" ssh -i ~/my-key.pub user@target-server |
- target-server — сервер к которому мы планируем подключаться по ключу
- user_password — пароль пользователя user на удаленном сервере
Это вариант для быстрой реализации доступа по ключам и отключения доступа по поролю. Хотелось бы сразу сказать про опцию -S в sudo, так как для выполнения sudo нужен пароль, то при помощи этой опции мы его передаем через stdin. Этого можно избежать если подключиться к серверу по ssh и выполнить эти команды в ручном режиме. Данный метод плох тем, что вы светите свой пароль, если выбран данный метод, то желательно после подключения к серверу сменить пароль пользователя.
Генерируем ключ
Первое что нам необходимо сделать, это сгенирировать пару ключей закрытый и открытый ключ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): /home/user/my-key Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/my-key Your public key has been saved in /home/user/my-key.pub The key fingerprint is: SHA256:A3Evdf63ClK4kbFBO1VuihLWNwerwQAERMYyEmaquzv+CtEs user@target-server The key's randomart image is: +---[RSA 3072]----+ |&&O*+.o o . | |=o** o + o | |oo+* = | |o.+ooo . | |o ... S | |.o . | |oEo | |o+ . | |++o.o. | +----[SHA256]-----+ |
Во время генерации отвечая на вопросы можно задать место хранения открытого и закрытого ключа, а так же указать пароль к ключу, тогда при авторизации по ключу будет запрошен пароль ключа. Вариант генерации с указанием расположения ключа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
ssh-keygen -t rsa -f ~/my-key Generating public/private rsa key pair. /home/user/.ssh/my-key already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/my-key Your public key has been saved in /home/user/my-key.pub The key fingerprint is: SHA256:A3rSDGsgbdf1BxiHk++d1tOCbup7ZQHoSyRgIWsaSM user@target-server The key's randomart image is: +---[RSA 3072]----+ | . +=oo. | | +o.+.. | | o oo + . | | E = o o+ o ... .| | o + = S+ +.o...| | = o .o ..*..| | + B+o | | . + +++ | | o ..+. | +----[SHA256]-----+ |
В большинстве случаев я использую пароли на ключах, кроме тех случаев, когда ключи предназначены для работы сервисов, например для работы Ansible.
После генерации ключа настоятельно рекомендую изменить права на каталог и закрытый ключ, чтоб его не мог читать никто кроме нашего пользователя
1 |
chmod 600 ~/my-key |
Теперь когда у нас есть пара приватного и открытого ключа, мы можем продолжить. Нам необходимо скопировать наш публичный ключ на целевой сервер, к которому мы будем подключаться по ключу.
Копирование через SSH-COPY-ID
Самый простой способ это использовать ssh-copy-id:
1 2 3 4 5 6 7 8 9 10 |
ssh-copy-id -i ~/my-key.pub user@target-server /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/my-key.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@target-server's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@target-server'" and check to make sure that only the key(s) you wanted were added. |
Копирование через SSH перенаправлением
Если покаким то причинам способ выше не подходит, то можно сделать следующим образом:
1 |
ssh user@target_server "cat >> ~/.ssh/authorized_keys" < ~/my-key.pub |
Данная команда добавит наш ключ в конец authorized_keys, если файла authorized_keys не будет, то он создастся.
Копирование при помощи copy/paste
В крайнем случае можно просто посмотреть содержимое нашего my-key.pub и скопировать его содержимое в каталог ~/.ssh/authorized_keys нужного пользователя на целевой машине.
1 2 |
cat ~/my-key.pub ssh-rsa AAAAB3NzaC1yc2ES.......HS4iPmNP7QLIKU= user@target-server |
Копирование при помощи SSH/SCP
1 |
ssh user@target_server 'mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys' |
После этих действий мы можем скопировать наш публичный ключ в authorized_keys. Стоит так же отметить, что в authorized_keys может содержаться множество ключей, поэтому при добавлении ключей стоит быть внимательным, чтоб не испортить ключи от других узлов или вовсе не заетреть по неосторожности.
Если на целевой машине не используются другие ключи то просто копируем наш публичный ключ в authorized_keys:
1 |
scp ~/my-key.pub user@target_server:~/.ssh/authorized_key |
Дополнительные параметры scp
Можно использовать дополнительные параметры для модификации поведения команды scp
. Например:
-r
— копировать папки и файлы рекурсивно.-p
— сохранять метаданные (дата создания, владелец, правами доступа) файлов.
Авторизация по ключу
На этих этапах вы все еще использовали авторизацию по поролю. Но с этого момента вы можете попробовать авторизоваться уже по ключу:
1 |
ssh -i ~/my-key user@target_server |
Ключ -i указывает что нужно использовать указанный закрытый ключ для авторизации, если его не указать то будет применяться авторизация по поролю если целевая машину его поддерживает или авторизация по дефолтному ключу пользователя ~/.ssh/id_rsa
Кстати если в процессе генерации ключа не задать путь для ключа то по умолчанию пересоздастся именно id_rsa и рядом будеи id_rsa.pub, тогда можно не указывать ключ -i для подключения.
Дополнительные настройки сервера SSH
Основная задача выполнена, теперь по хорошему необходимо произвести дополнительные манипуляции, такие как: отключить авторизации по поролю, сменить порт, запретить вход под root`ом и т.п. настройки.
Для реализации этих задач будем использовать конфигурацию самого сервера sshd через /etc/ssh/sshd_config
Открываем sshd_config и вносим правки в следующие параметры, если каких то параметров нет, нужно их добавить:
Port -меняем с 22 на что то из диапозона от 1024-49151(пользовательский диапозон портов, все что меньше системные от 0-1023, все что выше динамические от 49152-65535)
PermitRootLogin — разрешить подключаться под root. В разных ОС этот парметр может быть по умолчанию разный, в Ubuntu он равен no, в Debian же он равен yes. Yes — разрешить, No — запретить.
PasswordAuthentication — разрешить авторизацию по паролю, Yes — разрешить, No — запретить.
PermitEmptyPasswords — разрешить авторизацию с пустым паролем, по дефолту обычно — No(запрещено), но стоит всегда проверять.
PubkeyAuthentication — возможность авторизации по ключам, по умолчанию включено — значение Yes, если нужно отключить — значение No.
LoginGraceTime — время на ввод пароля, по умолчанию 2 минуты, обычно ставлю 30 секунд, этого более чем достаточно для входа.
AllowUsers — мы можем задать конкретных пользователей которым можно подключаться по ssh. Пример: AllowUsers user1 user2 user3 admin
X11Forwarding — по умолчанию Yes, если вам не требуется никаких перенаправлений к графическим программам, то лучше отключить изменив значение в No.
AllowTcpForwarding — по умолчанию Yes, если не планируете использовать проброс tcp через ssh, то лучше отключить изменив на No.
После того как внесем все изменения, перезапускаем службу sshd:
1 |
service sshd restart |
Для редактирования и перезапуска службы sshd необходимы права root.
Добавить комментарий