You can secure your SSH keys and configure an authentication agent so that you won’t have to reenter your passphrase every time you use your SSH keys.
With SSH keys, if someone gains access to your computer, they also gain access to every system that uses that key. To add an extra layer of security, you can add a passphrase to your SSH key. You can use ssh-agent to securely save your passphrase so you don’t have to reenter it.
Adding or changing a passphrase
You can change the passphrase for an existing private key without regenerating the keypair by typing the following command:
If your key already has a passphrase, you will be prompted to enter it before you can change to a new passphrase.
Auto-launching ssh-agent on Git for Windows
If you’re using Git Shell that’s installed with GitHub Desktop, you don’t need to follow these steps. GitHub Desktop automatically launches ssh-agent for you.
Otherwise, follow these steps to run ssh-agent automatically when you open bash or Git shell. Copy the following lines and paste them into your
/.bashrc file in Git shell:
If your private key is not stored in one of the default locations (like
/.ssh/id_rsa ), you’ll need to tell your SSH authentication agent where to find it. To add your key to ssh-agent, type ssh-add
Tip: If you want ssh-agent to forget your key after some time, you can configure it to do so by running ssh-add -t .
Now, when you first run Git Bash, you are prompted for your passphrase:
The ssh-agent process will continue to run until you log out, shut down your computer, or kill the process.
Saving your passphrase in the keychain
On OS X Leopard through OS X El Capitan, these default private key files are handled automatically:
The first time you use your key, you will be prompted to enter your passphrase. If you choose to save the passphrase with your keychain, you won’t have to enter it again.
Otherwise, you can store your passphrase in the keychain when you add your key to the ssh-agent. For more information, see «Adding your SSH key to the ssh-agent.»
SSH-ключ предоставляет возможность устанавливать соединение по протоколу SSH с удаленным хостом не вводя пароль. Зачем? По ходу работы, администрирования сайтов, необходимо часто соединяться с одними и теми же удалёнными хостами, набирая в консоли команду на соединение и пароля. Чтобы не набирать пароль многократно, но при этом устанавливать безопасное соединение нужно создать ssh-ключ.
- В консоли, на своём ПК пишем:
/.ssh/authorized_keys. Файл для хранения ключей назначается в файле конфигурации SSH сервера, директивой AuthorizedKeysFile
/.ssh/authorized_keys, если такой ключ найден, SSH сервер отправляет клиенту сообщение, зашифрованное найденным публичным ключом пользователя.
Весь процесс аутентификации можно посмотреть, с помощью опции -v ( verbose ), программы ssh, очень полезная штука, особенно на стадии настройки серверной и клиентской частей протокола SSH.
Генерация ключей с помощью программы ssh-keygen.
/.ssh/ >/root/.ssh/ >/root/.ssh/ >PermitRootLogin yes Данная директива нужна, если вы планируете работать под учетной записью root. PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys RhostsRSAAuthentication no HostbasedAuthentication no PermitEmptyPasswords no UseLogin no
/.ssh/authorized_keys, так как мы подключаемся пользователем root, то путь
/.ssh/authorized_keys указывает на директорию /root/.ssh/authorized_keys. Ключи сгенерированы и скопированы на SSH сервер, сервер соответствующим образом настроен, пробуем подключится: Если пароль на ключ введен верно, получаем доступ в удаленную систему.
Обратите внимание на следующий момент, с приведенным выше вариантом конфигурации SSH сервера, при неудачной аутентификации по ключам, например если неправильно ввести секретную фразу ключей, будет предложена аутентификация по паролю. Что-бы изменить это поведение и например вообще не пускать пользователя root иначе, как по ключам, можно изменить в конфигурационном файле сервера, значение директивы PermitRootLogin с yes на without-password.
Использование программы ssh-agent
/.ssh/ >/.ssh/ >ssh-agent и мы успешно подключаемся к удаленному SSH серверу. Посмотреть отпечатки загруженных в ssh-agent ключей, можно той-же командой ssh-add с опцией -l, или целиком ключи, опцией -L. Загружен один ключ, по которому мы подключались к удаленной машине. Кроме этого, при запуске ssh-add, можно указать путь до конкретного ключа, который необходимо загрузить, например: Удаляются ключи из ssh-agent, так-же просто как и добавляются, для этого используется опция -d, без параметров, для удаления стандартных ключей, опция -dфайл_ключа, если нужно удалить конкретный ключ, или опция -D, для удаления всех ключей, например: Приведу список самых используемых опций программы ssh-add: ssh-add Без опций, добавляются стандартные ключи ssh-add имя файла Добавляются конкретный ключ -l Показывает отпечатки всех загруженных в данный момент ключей -L Посмотреть список самих ключей -D Из ssh-agent, будут удалены все ключи -d имя файла Удаляет конкретный ключ -t Установить время жизни ключей, через данный промежуток времени ключи будут выгружены. -x Заблокировать ssh-agent паролем -X Разблокировать ssh-agent Что-бы закрыть ssh-agent, можно вызвать его c опцией -k, ну или на крайний случай прибить сигналом, например kill -QUIT P > ssh-agent и вы можете использовать загруженные в него ключи для последующих соединений. Для примера, с локального хоста, Local_host, подключаемся к удаленной машине Remote_host, по каким-то причинам, нам понадобилось что-то посмотреть на еще одном хосте, Next_remote_host, что происходит в таком случае:
- Клиент ssh c Local_host, подключается к SSH серверу, Remote_host, и запрашивает форвардинг для ssh-agent
- Сервер SSH, /usr/sbin/sshd, хоста Remote_host, создает сокет в /tmp/ssh-XXXXXXX/agent.##### и устанавливает переменную окружения SSH_AUTH_SOCK, присваивая ей путь к сокету.
- Когда нам понадобится подключиться к следующему серверу, ( мы сейчас на сервере Remote_host ), SSH клиент хоста Remote_host, обращается по пути, лежащему в переменной SSH_AUTH_SOCK, то есть к сокету.
- SSH сервер, находящийся на другом конце сокета /tmp/ssh-XXXXXXX/agent.#####, передает данные из ssh, сервера Remote_host, на ssh-agent, запущенный на хосте Local_host. Вся работа с ключами происходит на машине Local_host а не на машинах, на которых вы регистрируетесь в процессе работы.
- Теперь с хоста Remote_host, вы можете подключиться к хосту Next_remote_host, используя ключи, загруженные в ssh-agent, на хосте Local_host.
Это только на первый взгляд сложно выглядит, вся эта схема работает абсолютно прозрачно для пользователя, от него требуется только соответствующим образом настроить /etc/ssh/ssh_config а дплее все просто. Собственно тут даже показывать нечего в качестве примера.