пятница, 11 октября 2013 г.

Учимся ходить. По ssh

Это очередной туториал о том как использовать ключи доступа.

Теория


Допустим есть 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
На этом все