Як керувати декількома ключами SSH

Можна з упевненістю сказати, що більшість розробників веб-сфери в певний момент стикалися з SSH. SSH - один із найбільш часто використовуваних протоколів для безпечного обміну даними. Ви використовуєте SSH для підключення до віддалених серверів, що також включає управління кодом за допомогою Git та синхронізацію з віддаленими сховищами.

Незважаючи на те, що вважається гарною практикою мати одну пару приватно-відкритих ключів на пристрій, іноді вам потрібно використовувати кілька ключів та / або у вас є незвичні імена ключів.

Можливо, ви використовуєте одну пару ключів SSH для роботи над внутрішніми проектами вашої компанії, але ви можете використовувати інший ключ для доступу до серверів деяких корпоративних клієнтів. Можливо, ви навіть використовуєте інший ключ для доступу до власного приватного сервера.

Керування ключами SSH може стати громіздким, як тільки потрібно буде використовувати другий ключ. Сподіваюсь, ця стаття допоможе тим, хто має проблеми з управлінням ключами SSH.

Я припускаю, що читач має базові знання про Git та SSH. Більшість прикладів у статті будуть використовувати Git. Звичайно, все це стосуватиметься будь-якого іншого зв'язку SSH. З огляду на це, є деякі трюки, специфічні для Git.

Ремінь, ось і ми!

Робота з одним ключем SSH

По-перше, давайте подивимось, як може виглядати ваш робочий процес, перш ніж мати кілька клавіш, про які слід турбуватися.

У вас є один закритий ключ, що зберігається ~/.ssh/id_rsaразом із відповідним відкритим ключем ~/.ssh/id_rsa.pub.

Давайте уявимо, що ви хочете проштовхувати / тягнути зміни коду на / з віддаленого сервера Git - скажімо GitHub, чому б і ні. Для цього спочатку потрібно додати свій відкритий ключ до GitHub.

Я не буду йти над цим кроком, це повинно бути досить легко, щоб дізнатися, як це зробити. Я також припустив, що вас звуть Стів, і ви працюєте над надсекретним проектом, який використовує Raspberry Pies для нюху мережевого трафіку.

Щоб розпочати свою роботу, вам слід клонувати сховище git за допомогою SSH:

git clone [email protected]:steve/raspberry-spy.git

На цей момент GitHub буде таким: "Йо, це приватне сховище! Нам потрібно зашифрувати трафік за допомогою цього відкритого ключа, який я тут маю, та вашого приватного ключа ".

Ви додали відкритий ключ до свого профілю на GitHub, але SSH повинен якось з’ясувати, де знаходиться ваш відповідний приватний ключ.

Оскільки ми не знаємо, який приватний ключ слід використовувати при вході [email protected]SSH, клієнт SSH намагається знайти ключ у розташуванні за замовчуванням, що є ~/.ssh/id_rsa- це його найкраща здогадка. Якщо в цьому місці немає файлу, ви отримаєте повідомлення про помилку:

Cloning into 'raspberry-spy'... Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

Якщо у вас є якийсь закритий ключ, що зберігається у файлі ~/.ssh/id_rsa, SSH-клієнт використовуватиме його для шифрування зв'язку. Якщо цей ключ захищений паролем (як і має бути), вам буде запропоновано ввести пароль приблизно так:

Enter passphrase for key '/Users/steve/.ssh/id_rsa':

Якщо ви введете правильну парольну фразу, і якщо цей приватний ключ справді відповідає відкритому ключу, який ви прикріпили до свого профілю, все буде добре, і сховище буде успішно клоновано.

Але що, якби ви назвали свій ключ інакше (напр. ~/.ssh/_id_rsa)? Клієнт SSH не зможе визначити, де зберігається закритий ключ. Ви отримаєте таку ж Permission denied ...помилку, як і раніше.

Якщо ви хочете використовувати приватний ключ, який ви назвали інакше, вам доведеться додати його вручну:

ssh-add ~/.ssh/_id_rsa

Після введення парольної фрази ви можете перевірити, чи був ключ доданий до ssh-agent(клієнт SSH), виконавши ssh-add -l. Ця команда перелічить усі ключі, які в даний час доступні для клієнта SSH.

Якщо спробувати клонувати сховище зараз, це буде успішно.

Все йде нормально?

Якщо у вас пильні очі, ви можете почати помічати деякі потенційні проблеми.

По-перше, якщо ви перезапустите свій комп'ютер, ssh-agentвін перезапуститься, і вам доведеться додавати свої неіменовані за замовчуванням ключі, використовуючи ssh-addзнову і знову, вводячи паролі та всі ці нудні речі.

Чи можемо ми автоматизувати додавання ключів або якось вказати, який ключ використовувати під час доступу до певних серверів?

Чи можемо ми якось зберегти паролі, щоб нам не потрібно було їх кожного разу вводити? Якби там було щось на зразок брелока для збереження захищених паролем ключів SSH?.

Будьте впевнені, на всі ці питання є відповіді.

Введи, SSH config

Як виявляється, конфігураційний файл SSH - це щось, що може нам допомогти. Це файл конфігурації для кожного користувача для зв’язку SSH. Створіть новий файл: ~/.ssh/configі відкрийте його для редагування.

Керування спеціальними SSH ключами

Перше, що ми вирішимо за допомогою цього configфайлу, це уникнення необхідності додавати спеціально названі ключі SSH за допомогою ssh-add. Припускаючи, що ваш ключ SSH названий ~/.ssh/_id_rsa, додайте до configфайлу наступне :

Host github.com HostName github.com User git IdentityFile ~/.ssh/_id_rsa IdentitiesOnly yes

Тепер переконайтеся, що ~/.ssh/_id_rsaйого немає ssh-agent, виконавши ssh-add -D. Ця команда видалить усі ключі з поточно активного ssh-agentсеансу. Сеанс скидається кожного разу, коли ви виходите з системи або перезавантажуєтесь (або якщо ви вбиваєте ssh-agentпроцес вручну). Ми можемо “імітувати” перезавантаження, виконавши згадану команду.

Якщо ви спробуєте клонувати своє сховище GitHub зараз, це буде те саме, що якби ми додали ключ вручну (як це було раніше). Вас запитають пароль:

git clone [email protected]:steve/raspberry-spy.git Cloning into 'raspberry-spy'... Enter passphrase for key '/Users/steve/.ssh/_id_rsa':

Ви помітили, що ключем, до пароля якого нам пропонують, є той самий ключ, який ми вказали у нашому configфайлі. Після введення правильного пароля ключа SSH сховище буде успішно клоновано.

Примітка: якщо після успішного клонування ви спробуєте git pull, вам знову буде запропоновано ввести пароль. Це ми вирішимо пізніше.

Важливо, щоб Host github.comз configі github.comз URI [email protected]:steve/raspberry-spy.gitзбігалися. Ви також можете змінити configбути Host mygithubі клон з допомогою URI [email protected]:steve/raspberry-spy.git.

This opens the floodgates. As you are reding this, your mind is racing and thinking about how all your troubles with SSH keys are over. Here are some useful configuration examples:

Host bitbucket-corporate HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_corp IdentitiesOnly yes

Now you can use git clone [email protected]:company/project.git

Host bitbucket-personal HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes

Now you can use git clone [email protected]:steve/other-pi-project.git

Host myserver HostName ssh.steve.com Port 1111 IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes User steve IdentitiesOnly yes

Now you can SSH into your server using ssh myserver. How cool is that? You do not need to enter port and username manually every time you execute ssh command.

Bonus: Per-repository settings

You can also define which specific key should be used for certain repository, overriding anything in SSH config. Specific SSH command can be defined by setting sshCommand under core in /.git/config. Example:

[core] sshCommand = ssh -i ~/.ssh/id_rsa_corp

This is possible with git 2.10 or later. You can also use this command to avoid editing the file manually:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_corp'

Password managemet

Last piece of the puzzle is managing passwords. We want to avoid having to enter password every time when SSH connection is initiating. To do so, we can utilize keychain management software that comes with MacOS and various Linux distributions.

Start by adding your key to the keychain by passing -K option to the ssh-add command:

ssh-add -K ~/.ssh/id_rsa_whatever

Now you can see your SSH key in the keychain. On MacOS it looks something like this:

Keychain Access

If you remove the keys from ssh-agent via ssh-add -D (this will happen when you restart your computer, as mentioned before) and try SSH-ing, you will be prompted for password again. Why? We just added the the key to the keychain. If you check Keychain Access again, you will notice that the key you added using ssh-add -K is still in the keychain. Weird, huh?

It turns out there is one more hoop to jump through. Open your SSH config file and add the following:

Host * AddKeysToAgent yes UseKeychain yes

Now, SSH will look for key in keychain and if it finds it you will not be prompted for password. Key will also be added to ssh-agent. On MacOS this will work on MacOS Sierra 10.12.2 or later. On Linux you can use something like gnome-keyring and it might work even without this last modification to SSH config. As for Windows - who knows, right?

I hope someone found this useful. Now go and configure your SSH config file!

Learn more about SSH:

  • The ultimate guide to SSH keys
  • A top-down introduction to SSH