wiki-js/sysadmin/ssh/ssh-auth.md

154 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Авторизация по ключу rsa по ssh
description:
published: true
date: 2023-11-07T10:28:37.028Z
tags: ssh, rsa
editor: markdown
dateCreated: 2023-11-03T12:36:39.209Z
---
## SSH авторизация по ключам
В интернете можно найти множество иснтрукций о том как настроить *ssh авторизацию по ключам* для использования с репозиториями, удаленным администрированием, различными программами контроля версий и т.д.
Встречаются даже такие извращения как использование Putty агента в связке с Tortoise Git на основе Putty сессий. Варианты с генерацией ключа с помощью Putty, конвертирование из одного формата в другой и подсовывание в Tortoise Git я, изрядно измучившись, тоже выкинул. Даже на самом GitHub лежит мануал с использованием агента ключей.
Перелопатив кучу мануалов я решил что мне нужен универсальный способ. И похоже мне удалось такой найти.
Итак, мне нужно чтобы работало:
* из любых терминалов (cmd, PowerShell, Git-bash, Git-cmd)
* с любыми shell (cmd, sh, bash, zsh т.д.)
* c любыми встроенными в терминалы или shell утилитами (ssh, scp, sftp и т.д.)
* со всеми репозиториями (GitHub, GitLab, Gitea)
* с различными GUI (TortoiseGit, VSCode, Altium Designer и пр.)
* без использования агентов ключей (ssh-agent или Putty)
* одинаково настраивалось как в Windows, так и в Linux.
* на одну машину должен приходиться один ключ, чтобы не настраивать отдельно для каждой утилиты/приложения/IDE
* один ключ для работы с репозиториями и доступом к удаленным серверам
Как оказалось чтобы все это реализовать нужно было не гуглить мануалы, а читать **man ssh**.
---
Для работы с SSH в windows будем использовать OpenSSH. Ставить отдельно его не надо т.к. OpenSSH идет в комплекте с Git. Ставим его в первую очередь.
Если же Git уже установлен, то идем дальше...
---
### 1. Открываем терминал и создаем ключ нашей локальной системы.
```
$ ssh-keygen -t rsa
```
На все вопросы нажимаем "Enter", отказываясь от ключевой фразы.
Как результат в домашней папке пользователя будет создана ключевая пара:
- .ssh/id_rsa (закрытый ключ)
- .ssh/id_rsa.pub (открытый ключ)
Закрытый ключ мы не трогаем. Он секретный и остается только на этой машние.
Открытый ключ мы используем для помещения в репозитории и удаленные сервера.
---
### 2. Добавляем ключ в ~/.ssh/config
Поскольку мы не будем пользоваться никакими агентами ключей, то для пользования репозиториями, нужно прописать данный ключ в ~/.ssh/config в качестве ипользуемого по умолчанию глобально.
Если этого файла нет, то создаем его и добавляем в него строчку:
```
IdentityFile ~/.ssh/id_rsa
```
~/.ssh/config вообще очень полезный файл. Рекомендую почитать что он еще умеет. Например туда можно прописать хосты типа:
```
Host site
HostName www.my-site.dyndns.org
Port 2222
User user
```
Тогда вместо такого:
```
$ ssh user@www.my-site.dyndns.org -p 2222
```
Можно писать так:
```
$ ssh site
```
---
### 3. Добавляем ключ на удаленные сервера Linux
Если ключ нужен только для работы с репозиториями, то переходим к следующему пункту.
Если есть программа ssh-copy-id (в Linux и Git-bash она есть), прописываем публичный ключ на удаленный сервер.
```
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip
```
Eсли ssh-copy-id нет, то можно сделать это вручную.
Вот последовательность действий:
- логинимся на удаленной машине
- добавляем свой ключ в файл authorized_keys
```
remote$ echo "содержимое файла открытого ключа" >> ~/.ssh/authorized_keys
```
- делаем правильные права (если файл только что был создан)
```
remote$ chmod 600 ~/.ssh/authorized_keys
```
- проверяем, что все работает, запускаем на локальном компьютере.
```
$ ssh user@server_ip
```
---
### 4. Добавляем ключ в репозитории
Для работы с репозиториями необходимо прописать туда публичный ключ.
Для этого копируем содержимое файла ~/.ssh/id_rsa.pub во все необходимые репозитории.
- GitHub: Settings -> SSH and GPG keys -> Nes SSH key
- GitLab: Preferences -> SSH Keys -> Add key
- Gitea: Settings -> SSH / GPG keys -> Add Key
В качестве имени ключа удобно указывать пользователя и имя машины.
**user@host**
Для тестирования авторизации можно запустить:
```
$ ssh -T git@github.com
```
Аналогично и для других репозиториев:
```
$ ssh -T git@repo_url
```
Что проверяю я:
```
$ ssh -T git@github.com
$ ssh -T git@git.fwdrd.ru
$ ssh -T git@gitlab.srv.mf-t.ru -p 2222
```
---
### 4. Настройка TortoiseGit
Чтобы TortiseGit переключился на использование OpenSSH надо в настройках
```
Settings -> Network -> SSH client
```
поменять клиент на
```
C:\Program Files\Git\usr\bin\ssh.exe
```
---
### PS (Linux)
Если все настроено но все равно спрашивает пароль, то надо проверить права:
```
~ 755
~/.ssh 700
~/.ssh/* 600
```
Удачной работы!