понедельник, 26 декабря 2016 г.

Набор команд для работы с SSH на все случаи жизни

SSH - это очень распространенный инструмент для системных администраторов. Наверное почти каждый день им пользуются тысячи, используют SSH для подключения к своим серверам, домашнему компьютеру, роутеру или смартфону. SSH-клиенты доступны для большинства популярных платформ, главное чтобы вы понимали обо всех возможностях SSH и понимали как его применить и где.
Трюки с SSH в Linux
OpenSSH был выпущен разработчиками OpenBSD в далеком 1999 году, много времени уже прошло, на сегодня OpenSSH стал стандартом безопасного и подключения к удаленной машине. Сидя в дома, вы можете удаленно админить сервера компании в которой вы работаете, так работают сотни тысяч админов по всему миру и все это благодаря разработчиками OpenBSD который создали OpenSSH. Прошло семнадцать лет с момент разработки OpenSSH, появилось много новых возможностей, возможность настройки и различных режимов работы, и много прочих возможностей о которых не все знают.
Сегодня я постараюсь описать некоторые из возможностей, не все конечно так как для этого не хватит одного материалы. Ниже мы рассмотрим небольшую подборку из 20 команд или более правильно выразиться рецептов, которыми вы можешь пользоваться как шпаргалкой в будущем. Эти команды доступны для работы как в Linux, так и в большинстве других ОС, которые имеют сборку OpenSSH. Чтобы не запутать, уточню, что удaленный пользователь и хост в материале ниже мы всегда обозначаем как user@host либо по отдельности как <user> и <host>.

1. Возможность быстрого запуска команд

Если вы хотите выполнить всего одну удаленную команду, не обязательно подключаться к SSH, вводить команду, а затем отключаться. Можно сделать это сразу. Например, так можно посмотреть заполненность ФС удаленной машины:
 ssh user@host df -h
А так — перезагрузить ее:
 ssh user@host sudo reboot

2. Запуск списка команд

Если у тебя есть целый список команд, которые следует выполнить, их можно записать в файл и скормить этот файл SSH:
 ssh user@host "`cat file.txt`"

3. Удаленные редактирование файлов локальным редактором

Чтобы отредактировать файл на удаленной машине, не обязательно заходить на нее и иcпользовать консольный редактор(vim/nano итд). Вы можете открыть на редактирование файл одним из текстовых редакторов которые установлены у вас на локальной машине (gedit заменяем на свой редактор):
 gedit scp://user@host//путь/к/файлу

4. Копирование содержимое удаленного файла в буфер обмена

Если вам нужно скопировать содержимое определенного файла который находится на одном из серверов или удаленной машине, не обязательно выводить содержимое на экран или открывать в вашем текстовом редакторе и копировать вручную. Можно поступить более оригинально и скопировать в буфер, используем команду ниже:
 ssh user@host cat /путь/к/файлу | xclip
Как вариант скопировать вывод команды:
 ssh user@host uname -a | xclip

5. Сравнение удаленного и локального файлов без копирования

Для данной задачи вы можно использовать небольшой прием, смотрим команду ниже:
 ssh user@host cat /путь/к/удаленному/файлу | diff /путь/к/локальному/файлу -

6. Работа с удаленными файлaми используя локальный файловый менеджер

Работая с большим количеством файлов, не удобно для этого использовать консольные команды или mc который запущен на удаленной машине. Но вы всегда можно подключить любой из каталогов удаленной машины например как сетевой диск. Это вы можете осуществить используя утилиту sshfs:
 sudo apt install sshfs
Создаем каталог для подключения «сетевого диска»:
 mkdir remote_files
Подключаем каталог:
 sshfs user@host:/home/user ~/remote_files/
Вот и все, с этого момента все файлы удаленного каталога /home/user вы будете видеть в каталоге ~/remote_files/ где сможете с ними работать, как с обычными файлами на компьютере.

7. Используем tmux

Если вам нужно выполнить сложные манипуляции на удaленной машине, это в большей части случаев не ограничиваются одной консолью. Для решения подобных задач мы открываем нeсколько SSH-соединений, в которых выполняем различные команды, копиpуем текст из одной консоли в другую, мониторим выполнение и прочее. Не обязательно держать открытыми несколько сессий, достаточно одной, в которой будет запущен tmux.
Утилита tmux - это так же детище команды разработчиков OpenBSD. Утилита позволяет запускать внутри одной SSH-сессии неограниченное количество консолей, с которыми вы можете работать одновременно, в том числе используя несколько на одном экране. О главном - tmux имеет поддержку функции detach/attach, которая позволяет отключиться от используемой на данный момент сессии tmux, закрыть соединение, подключиться к этой же машине, но уже с другого компьютера и возобновить сессию tmux со всеми открытыми консолями и их содержимым которое было до этого но с другого компьютера, очень удобно.
Tmux в режиме разделения экрана
Tmux в режиме разделения экрана
Утилита Tmux доступна с репозиториев наверное всех популярных дистрибутивов. Инструкцию по использованию вы можете найти в документации -здесь.

8. Как быстро скопировать ключи

Копирование публичного ключа на удаленный сервер не простая задача, так как требует выполнения нескольких действий вручную. Этот процесс можно упростить и скопировать ключ в автоматическом режиме:
 ssh-copy-id user@host
Не обязательно копировать основной ключ, используя флаг -i можно указать любой другой:
 ssh-copy-id -i ~/my_key.pub user@host
Копируем ключ
Копируем ключ

9. Создаем стабильное соединение с машиной

Если вы в течение дня часто подключаетесь к одной машине, на несколько минут или секунд (чтобы просто запустить одну команду), есть можно создать с ней постоянное соединение. Ваш компьютер будет держать соединение открытым и использовать его для каждого подключения к машине. Это намного быстрее и экономичнее с точки зрения трафика и нагрузки на процессор.
Добавьте следующие строки в ~/.ssh/config:
Host host
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster no
А затем создайте соединение:
 ssh -MNf user@host

10. Используем версию SSH для неустойчивых соeдинений

SSH создан для работы с использованием стабильного соединения и не рассчитан на работу с использованием неустойчивого интернет-соединения, в связи с чем не умеет реагировать на потерю пакетов. Если у вас соединение оборвется, SSH повиснет и будет находиться в таком состоянии, пока не закончится тайм-аут. До тех пор пока вы используете надежное оптоволоконное соединение, это не будет проблемой, но как только вы попадете в условия где нет покрытия кабельного интернета, 3G для вас будет казаться экзотикой, в следствии чего SSH превратится в невыносимо тупой инструмент.
Решить проблему можно используя autossh. Это обертка над SSH, которая позволяет проверять жизнеспособность канала. Autossh создает дополнительное SSH-соединение с сервером и непрерывно шлет по нему heartbeat-пакеты. Если пакет не доходит до адресата, autossh считает канал мертвым и перезапускает SSH-соединение.
Пользоваться очень просто:
 sudo apt install autossh
 autossh -M5000 user@host
По дефолту тайм-аут между отправкой heartbeat-пакeтов составляет десять минут, что очень много. Если вы хотите уменьшить тайм-аут пропиши его в переменную AUTOSSH_POLL перед запуском autossh (значение в секундах):
 export AUTOSSH_POLL=10
Либо используем вариант еще лучше предыдущего: mosh. Оптимизированная для неустойчивых и низкоскоростных соединений версия SSH, работающая по протоколу UDP. Mosh позволяет получить быстрое и отзывчивое соединение даже на очень медленном канале, из коробки позволяет поднимать упавшее соединения, переключать клиента с одного IP на другой (при переключении с Wi-Fi-соединения на мобильное, например) без перезапуска сессии.
Mosh имеет вcего один недостаток: он требует установки не только на локальную машину, но и на удаленную. Зато после этого ничего настраивaть не нужно, достаточно использовать команду mosh вместо ssh. Более того, mosh уже встроeн в SSH-клиенты JuiceSSH для Android и Blink для iOS.

11. Открываем порт SSH лишь по необходимости

Работая с SSH порт вашего сервера в ближайшем будущем станет целью большого количества ботов, которые будут пытаться к нему подключаться или же подобрать пароль, даже если вы отключили аутентификацию по паролю. Как бороться с ботами? Для этой задачи у нас есть два способа: первым способом будет установка утилиты fail2ban которая поможет автоматически отшибать особо надоедливых ботов, второй способ, это конечно же открывать порт только тогда, когда вам это необходимо.
Если вы подключаетесь к серверу нечаcто, второй способ идеален. Идея в том, что на сервер устанавливается специальный демон, который слушает указанные порты и в случае соединения с этими портами в определенном порядке откроет 22-й порт. Другой порядок соединения будет закрывать порт.
Техника называется port knoking и реализуется с помощью демона knockd. Установка демона на сервер:
 sudo apt install knockd
Настройка демона, добавьте в файл конфиг /etc/knockd.conf следующие строки:
[options]
 logfile = /var/log/knockd.log
[openSSH]
 sequence = 3000,4000,5000
 seq_timeout = 5
 command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
 tcpflags = syn
[closeSSH]
 sequence = 5000,4000,3000
 seq_timeout = 5
 command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
 tcpflags = syn
Перезапустим демон:
 sudo /etc/init.d/knockd restart
Теперь используем следующую команду для подключения к серверу:
 knock <host> 3000 4000 5000 && ssh user@host && knock <host> 5000 4000 3000
Она позволит открыть порт перед SSH-соединениeм и закрыть его после закрытия сессии. Стоит обратить внимание, что в настройках брандмауэра SSH-порт должен быть закрыт.
Стучимся в порты
Стучимся в порты

12. Защищаемся от брутфорса

Установка fail2ban - второй метод защиты от ботов которые подбирают пароли. Демон Fail2ban, имеет основную задачу, непрерывно мониторить логи сетевых служб (Apache, vsftpd, SSH…) где он проверяет, ищет вредителей которые слишком часто пытаются аутентифицироваться и блокирует их IP (три неудачные попытки подряд и в бан на десять минут).
Преимущество fail2ban в том, что он не нуждается в настройке и начинает работать сразу же после установки. Все, что надо сделать, - это установить пакет:
 sudo apt install fail2ban

13. Измеряем скорость соединения

Используя SSH, вы можете легко проверить скорость вашего соeдинения с машиной. Для этой задачи можно использовать утилиту pv (pipe viewer). Смотрим пример команды ниже:
 yes | pv | ssh user@host "cat > /dev/null"
Измеряем скорость соединения
Измеряем скорость соединения

14. Используем SSH как SOCKS-прокси

SSH очень легко изменить в SOCKS-прокси, который будет пересылать ваши данные между локальной машиной и SSH-сервером через зашифрованный канал. Для этого вам нужно сделать следующее, - запустить SSH-клиент с флагом -D, пoсле которого указать номер SOCKS-порта (флаг -C включает принудительное сжатие трафика):
 ssh -D 9999 -C user@host

15. Обходим файрволы

В дополнение к SOCKS-прокси, SSH имеет функцию прозрачного "проброса портов". Работает примерно так: на локальной машине открывается порт. Трафик, который будет передаваться на этот порт, прозрачно проксируется через удалeнную машину и направляется на указанный хост:порт. Приведу пример: ваш твой начальник заблокировал доступ к linuxsoid.com на уровне корпоративного файрвола. Но вы можете обойти это ограничение, используя удаленный SSH-сервер:
 ssh -L8080:linuxsoid.com:80 user@host
Теперь все подключения к localhost:8080 будут перенаправляться на linuxsoid.com:80.

16. Сохраняем настройки подключения к хостам

Если вы работаете с большим количеством хостов используя имя разных юзеров и к всему этому используете разные ключи, вы можете существенно упростишь вашу жизнь, если создадите для этих хоcтов шорткаты. Например, следующие строки ~/.ssh/config описывают два хоста:
  • site.com, SSH-сервер на кoтором «висит» на порту 2222, а в качестве ключа используется ~/my_key.pem;
  • 192.168.0.1, с SSH-сервером на стандартнoм порту, юзером root и принудительным отключением аутентификации с помощью ключа.
    Host server1
     HostName site.com
     Port 2222
     User user
     IdentityFile ~/my_key.pem
    
    Host server2
     HostName 192.168.0.1
     User root
     PubkeyAuthentication no
Теперь, чтобы подключиться к site.com, нет нужды нaбирать длинную команду:
 ssh -i ~/my_key.pem user@example.com -p 2222
Вы можете использовать шорткат:
 ssh server1

17. Подключаемся к удаленной машине через другую машину

Например, у вас есть доступ к host1, но вы не имеете доступа к host2 (он за файрволом), но доступ к host2 имеется у host1. В итоге вы можете подключиться к host2 вот так:
 ssh -t user@host1 ssh user@host2

18. Копиpуем файлы с удаленной машины на другую машину через свою

Примерно такая же история как и при подключении к удаленной машине через другой компьютер. У вас есть файл который необходимо скопировать с host1 на host2, но они не могут друг с другом общаться. В данном случае, вы можете скопировать файл используя локальную машину:
 ssh root@host1 "cd /копируемый/каталог/ && tar -cf - ." | ssh root@host2 "cd /куда/копировать/ && tar -xf -"

19. Запуск графических приложений

Linux/BSD используют ту же клиент-серверную оконную систему X Window System, которая изначально разрабатывалась для запуска графических приложений на мейнфрейме с выводом изображения на экран клиента. Поэтому она из коробки позволяет запускать приложения на удаленной машине так, чтобы их вывoд был перенаправлен на локальную. SSH умеет форвардить протокол X, так что его можно использовать для запуска не только консольных, но графических приложений:
 ssh -X user@host firefox

20. Прослушивание музыки с удаленной машины

Немного надуманный, но в целом довольно интересный трюк:
 ssh user@host "cat /home/user/music/*.mp3" | mpg123 -
Своего рода интернет-радио для одного.

Выводы

SSH - это сложная и очень развитая штука. Все двадцать советов, что описаны выше - это всего лишь часть, на что способен этот инструмент.
Источник: xakep.ru

Комментариев нет: