Это очередной туториал о том как использовать ключи доступа.
Допустим есть localhost и сервер на который можно зайти по логин/пассу. Сгенерим ключи ключи Здесь, что бы ходить Туда. Логично делать это именно на локалке, что бы по не защищенному протоколу передавать публичный ключ, за который можно не трястись.
Стоит отметить, что весьма удобно использовать человекочитаемые имена ключей, что бы понимать, куда ты с ним попадешь и под каким пользователем. Например [user_nane]@[server_name]
Однако придется повозиться, если придется ссашиться из под виндового git (он поставляется с MSYS) и без проблем он умеет работать только с тупенькими ключами без пасфразы. Так что стоит подумать при настройке рабочего окружения: что будет использоваться "тупенькая консоль" или какое-нибудь GUI- решение, где можно будет указать ключи, прописать к ним пассфразы и залочить GUI мастер паролем.
Для таких ситуаций на windows решил использовать условно бесплатный smartgit, на который довольно просто продлить триальную лицензию хаком для полноценной установки и переносной.
А если какой сервер используется в качестве jump node, то паттерн именования стоит использовать вида [user_nane]@[junmp_node]2[server_name] и выпускать ключи непосредственно на целевом сервере. Так проще будет их отзывать (на самом деле "забывать" из списка доверенных)
Обзываем ключ уникальным именем [user_nane]@[server_name] или 2[server_name].
Отлично, копируем ключи на удаленный [server_name].
Хочу отметить, что если вы вставляете публичный ключ, то это должна быть одна строка. Теперь просим локальную систему запомнить ключи
Если у вас достаточно много хостов, куда вы ходите, то стоит сделать конфиг для роутинга по адресу `vim ~/.ssh/config` по примеру:
и использовать можно уже так: `ssh srv1`
Поможем ему разродиться:
Заботливо скопировали на удаленку ключик к гитхабу, а теперь у вас не может личность добавиться? Поставьте ключу chmod 600. Вообще, если у вас такая беда на сервере каждый раз, то логично не ковыряться в носу, а сразу дополнить bashrc заготовкой
Как то раз я промахнулся так: я генерил в puttygen ключ с длинной 2048, а в sshd_config было значение ServerKeyBits равное 1024. Ну сами понимаете, сам себе злобный буратино)
Неплохо бы забекапить ключики. Шутки ради попробуем truecrypt. В каталоге со свеже скачанным бинарем открываем консоль :
Шикарно, создаем секурный том, который поместим в dropbox. Лучше следовать настройкам по умолчанию и проделать такой путь:
Create volume → Create an encrypted volume container → Standart... → path/to/dropbox/palevo.tc → ... → 5Mb → pass → Fat → Button "Format"
Тип файловой системы нужен такой что бы под виндой его (том) можно было открыть. Отлично, теперь когда ключи лежат там, зашифрованы.
Если паранойя очень давит на сознание, то можно сделать следующее.
Выпиливаем ключи из директории хомяка, и учим tc монтироваться по клику:
1)создаем скрипт на рабочем столе
2)делаем его исполняемым
Круто теперь после ввода двух паролей (sudo и от тома) у нас примонтируется том. И везде где это необходимо, будь то IDE терминал, можно указывать этот слот, как хранилище ключей. В панике можно все отмонтировать в форсированном режиме
Их достаточно много. Вот только большая часть подразумевает использование незапароленных ключей
два:
а еще можно Там исполнить скрипт лежащий здесь:
Теория
Допустим есть localhost и сервер на который можно зайти по логин/пассу. Сгенерим ключи ключи Здесь, что бы ходить Туда. Логично делать это именно на локалке, что бы по не защищенному протоколу передавать публичный ключ, за который можно не трястись.
Стоит отметить, что весьма удобно использовать человекочитаемые имена ключей, что бы понимать, куда ты с ним попадешь и под каким пользователем. Например [user_nane]@[server_name]
Однако придется повозиться, если придется ссашиться из под виндового git (он поставляется с MSYS) и без проблем он умеет работать только с тупенькими ключами без пасфразы. Так что стоит подумать при настройке рабочего окружения: что будет использоваться "тупенькая консоль" или какое-нибудь GUI- решение, где можно будет указать ключи, прописать к ним пассфразы и залочить GUI мастер паролем.
Для таких ситуаций на windows решил использовать условно бесплатный smartgit, на который довольно просто продлить триальную лицензию хаком для полноценной установки и переносной.
А если какой сервер используется в качестве jump node, то паттерн именования стоит использовать вида [user_nane]@[junmp_node]2[server_name] и выпускать ключи непосредственно на целевом сервере. Так проще будет их отзывать (на самом деле "забывать" из списка доверенных)
Практика
Давайте уже сделаем себе ключикssh-keygen -t dsa
Обзываем ключ уникальным именем [user_nane]@[server_name] или 2[server_name].
2[server_name] {enter} {enter}#пропускаем запароливание ключей {enter}
Отлично, копируем ключи на удаленный [server_name].
ssh-copy-id -i ~/.ssh/2[server_name] user@server_name
Хочу отметить, что если вы вставляете публичный ключ, то это должна быть одна строка. Теперь просим локальную систему запомнить ключи
ssh-add ~/.ssh/2[server_name]
Тюнинг
Если вы перемещате приватные ключи по незащищенному сегменту или храните на "не своих" машинах, то можно наделать пассфраз. Это просто сделать командойssh-keygen -p -f /path-to/key-file
Если у вас достаточно много хостов, куда вы ходите, то стоит сделать конфиг для роутинга по адресу `vim ~/.ssh/config` по примеру:
Host srv1 HostName 8.8.8.8 User root Port 225 IdentityFile ~/.ssh/server1/id_rsa
и использовать можно уже так: `ssh srv1`
Грабли
Ругается, что не может родить агент? Обычно этоCould not open a connection to your authentication agent
Поможем ему разродиться:
ssh-agent /bin/bash
Заботливо скопировали на удаленку ключик к гитхабу, а теперь у вас не может личность добавиться? Поставьте ключу chmod 600. Вообще, если у вас такая беда на сервере каждый раз, то логично не ковыряться в носу, а сразу дополнить bashrc заготовкой
SSH_ENV=$HOME/.ssh/environment # start the ssh-agent function start_agent { echo "Initializing new SSH agent..." # spawn ssh-agent /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 600 "${SSH_ENV}" . "${SSH_ENV}" > /dev/null /usr/bin/ssh-add } if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi
ключ отклоняется
хотя все настроено верно. Для того что бы отловить ошибку можно поставить в настройках /etc/ssh/sshd_config значение LogLevel DEBUG3, запуститьsudo tail -f /var/log/auth.logи гуглить все подозрительные строки.
Как то раз я промахнулся так: я генерил в puttygen ключ с длинной 2048, а в sshd_config было значение ServerKeyBits равное 1024. Ну сами понимаете, сам себе злобный буратино)
Немного для паранойи
Неплохо бы забекапить ключики. Шутки ради попробуем truecrypt. В каталоге со свеже скачанным бинарем открываем консоль :
sudo chmod +x truecrypt-6.3a-setup-x86 sudo ./truecrypt-6.3a-setup-x86
Шикарно, создаем секурный том, который поместим в dropbox. Лучше следовать настройкам по умолчанию и проделать такой путь:
Create volume → Create an encrypted volume container → Standart... → path/to/dropbox/palevo.tc → ... → 5Mb → pass → Fat → Button "Format"
Тип файловой системы нужен такой что бы под виндой его (том) можно было открыть. Отлично, теперь когда ключи лежат там, зашифрованы.
Если паранойя очень давит на сознание, то можно сделать следующее.
Выпиливаем ключи из директории хомяка, и учим tc монтироваться по клику:
1)создаем скрипт на рабочем столе
#!/bin/bash truecrypt --slot=5 --mount /path/to/Dropbox/palevo.tc
2)делаем его исполняемым
chmod +x palevo.tc
Круто теперь после ввода двух паролей (sudo и от тома) у нас примонтируется том. И везде где это необходимо, будь то IDE терминал, можно указывать этот слот, как хранилище ключей. В панике можно все отмонтировать в форсированном режиме
truecrypt -f -dтакой вот командой
Варианты использования
Их достаточно много. Вот только большая часть подразумевает использование незапароленных ключей
Бэкапы: сделать и сохранить
Ну например, по крону сливать бэкапы вот такой хитрой командой:mysqldump -u USER1 -pPASS1 DBASE1 | ssh remoteuser@remoteserver mysql -u USER2 -pPASS2 DBASE2
Исполнить что-нибудь на удаленном сервере
Или вот, исполнение команд на уделенном сервере раз:ssh [user]@[server] '[command 1] | [command 2] | [command 3]'
два:
ssh [user]@[server] << EOF command 1 command 2 command 3 EOF
а еще можно Там исполнить скрипт лежащий здесь:
ssh root@192.168.1.1 'bash -s' << local_script.shНа этом все