====== openssh ====== https://habr.com/ru/companies/skillfactory/articles/503466/ ===== ssh-keygen ===== Программа-генератор RSA/DSA ключей ==== Синтаксис ==== ssh-keygen [-q] [-b ] [-t ] [-N ] [-C ] [-f ] ssh-keygen -p [-P ] [-N ] [-f ] ==== Опции ==== - ''-f <~/.ssh/id_srv2>'' - указывает имя/путь файла ключа.\\ - ''-t <технология шифрования>'' - выбор технологии (''rsa1'', ''dsa'').\\ - ''-b <размер ключа в битах>'' - задаем размер ключа.\\ - ''-N <_new_passphrase_>'' - обеспечивает ввод новой ключевой фразы.\\ - ''-P '' - обеспечивает ввод (старой) ключевой фразы.\\ - ''-p'' - запрашивает изменение ключевой фразы приватного ключа вместо создания нового приватного ключа. Предложит указать имя файла содержащего приватный ключ, старую ключевую фразу и, дважды, новую ключевую фразу.\\ - ''-C '' - обеспечивает ввод нового комментария.\\ - ''-D '' - копировать публичный RSA-ключ на smartcard в устройстве _reader_. ===== sshd ===== ''sshd'' - это демон, который ожидает соединения от клиентов. Обычно он запускается при загрузке системы из ''/etc/rc''. Он создает нового демона для каждого нового соединения. Ответвленный демон обрабатывает обмен ключами, шифрование, аутентификацию, выполнение команд и обмен данными. Эта реализация sshd поддерживает обе версии протокола SSH, 1 и 2, одновременно. Синтаксис команды: sshd [-deiqtDL46] [-b <битов>] [-f <файл_конфигурации>] [-g <время_задержки_регистрации>] [-h <файл_ключа_машины>] [-k <время_генерации_ключа>] [-p <порт>] [-u <величина>] [-V <идентификатор_протокола_клиента>] ==== Опции ==== - ''-b <биты>'' - Определяет число бит в ключе сервера эфемерного протокола версии 1 (по умолчанию 768).\\ - ''-d'' - Режим отладки. Сервер посылает отладочную информацию в файл регистрации событий системы и не переходит в фоновый режим работы. Также сервер не создает дочерних процессов и обрабатывает только одно соединение. Этот параметр предназначен только для настройки сервера. Несколько параметров -d, указанных один за другим, повышают уровень отладки. Максимум это 3.\\ - ''-е'' - Если указан этот параметр, sshd направит вывод в консоль вместо механизма регистрации событий системы. - ''-f <файл_конфигурации>'' - Определяет имя файла конфигурации. По умолчанию это ''/etc/openssh/sshd_config''. sshd отказывается работать не имея файла конфигурации.\\ - ''-g <время_задержки_регистрации>'' - Позволяет клиенту растянуть время в течении которого клиент должен себя аутентифицировать (по умолчанию 600 секунд). Если клиент не смог аутентифицировать себя в течение этого времени, сервер отключается. Значение равное нулю означает неограниченное время ожидания.\\ - ''-h <файл_ключа_машины>'' - Определяет файл, из которого будет считан ключ машины (по умолчанию это ''/etc/openssh/ssh_host_key''). Этот параметр должен быть указан, если sshd запущен не от имени суперпользователя. - ''-i'' - Определяет, что sshd должен быть запущен из inetd.\\ - ''-k <время_генерации_ключа>'' - Определяет, как часто будет регенерирован ключ сервера эфемерного протокола версии 1 (по умолчанию 3600 секунд).\\ - ''-p <порт>'' - Определяет порт, на котором сервер будет ожидать соединения (по умолчанию 22).\\ - ''-q'' - Режим молчания. В системный журнал регистрации событий не будет занесено никакой информации.\\ - ''-t'' - Режим тестирования. Только проверяет соответствие файла конфигурации и безопасность ключей.\\ - ''-u <величина>'' - Определяет размер полей в структуре utmp хранящей имя удаленной машины.\\ - ''-D'' - Когда указан этот параметр, sshd не будет переведен в режим работы демона.\\ - ''-V <идентификатор_протокола_клиента>'' - SSH-2 совместимый режим.\\ - ''-4'' - Принуждает sshd использовать только IPv4 адреса.\\ - ''-6'' - Принуждает sshd использовать только IPv6 адреса. ==== Конфиг ==== ''sshd'' настраивается через ''/etc/ssh/sshd.conf'' Для применения настроек нужно дёрнуть службу ''sshd'' Пример: # слушать 22ой порт Port 22 # использовать вторую версию протокола Protocol 2 # запрет логинится под root@* PermitRootLogin no # доступ к ssh только для определенного пользователя или группы AllowUsers User1, User2, User3 AllowGroups Group1, Group2, Group3 # резрешить запуск X11 приложений X11Forwarding yes Интересный факт: приветствие, выводимое при подключение ===== ssh ===== Мощный инструмент, позволяющий как выполнять удаленные команды, так и вертеть трафиком. Синтаксис команды выглядит так:\\ ''ssh [опции] [имя пользователя@]<сервер> [команда]'' Tip: В ''.ssh/config'' можно задать псевдонимы в следующем формате:\\ Host radi0ss HostName 188.227.87.62 User root Port 22 ProxyCommand ssh -W %h:%p root@188.227.87.62 ==== Опции ==== Общие параметры \\ - ''-f'' - перевести ssh в фоновый режим; \\ - ''-g'' - разрешить удалённым машинам обращаться к локальным портам; \\ - ''-l <имя>'' - имя пользователя, под которым собираемся подключаться к удаленной машине; \\ - ''-n'' - перенаправить стандартный вывод в /dev/null; \\ - ''-N'' - указывает, что не запускать удалённый сеанс shell; \\ - ''-p '' - указать порт для подключения на удалённой машине; \\ - ''-q'' - не показывать сообщения об ошибках; \\ - ''-v'' - режим отладки, указанный несколько раз (max 3), сделает ssh более многословным; \\ Перенаправление X11 \\ - ''-X'' - включить перенаправление X11; \\ - ''-x'' - отключить перенаправление X11; \\ Перенаправление портов и туннелирование\\ - ''-L [локальный_адрес:]локальный_порт:удаленный_адрес:удаленный_порт'' - перенаправление локального порта на порт удаленной машины; \\ - ''-R [удаленный_адрес:]удаленный_порт:локальный_адрес:локальный_порт'' - перенаправление удаленного порта с удаленной машины на локальный порт; \\ - ''-D [bind_address:]порт'' - создание локального SOCKS-прокси-сервера, перенаправляющего трафик с определенного сокета по зашифрованному каналу на удалённый сервер; \\ - ''-w local_tun[:remote_tun]'' - создает туннель между локальным и удаленным [[Виртуальные сетевые интерфейсы|виртуальными сетевыми интерфейсами]] (TUN или TAP) с номерами ''local_tun'' и ''remote_tun''. Если указать ''any'' - выбирается любой. Если не указать ''remote_tun'' - подразумевается ''any''. честно говоря, не получалось настроить туннель через tun интерфейсы \\ Аутентификация и ключи \\ - ''-i '' - явно указать приватный ключ для подключения; \\ - ''-A'' - включить переадресацию агента Протоколы и адреса \\ - ''-4'' - принудительное использование только IPv4 адресов; \\ - ''-6'' - принудительное использование только IPv6 адресов; \\ - ''-1'' - принудительное использование SSH протокола только версии 1; \\ - ''-2'' - принудительное использование SSH протокола только версии 2; \\ Дополнительные параметры \\ - ''-C'' - включить сжатие данных; \\ - ''-t'' - переназначить псевдо-терминал для выполнения программ;\\ - ''-T'' - послать на выполнение команду, не подключаясь к shell;\\ Примеры: # выполнить команду, не заходя в полноценный сеанс ssh user@host ls # перенаправление бекапа прямо на удалённый сервер sudo dd if=/dev/sda | ssh user@host 'dd of=sda.img' # восстановление бекапа с удаленного сервера ssh user@host 'dd if=sda.img' | dd of=/dev/sda # взятие пароля из файла ssh user@host < local_file.txt # выполнять на сервере прогу "eclipse" и транслировать её окно нам ssh -XC user@remotehost "eclipse" # создание ssh туналя (проброс порта с удалённой машины на локальную) ssh -L локальный_порт:удаленный_адрес:удаленный_порт пользователь@сервер ===== scp ===== Утилита для копирования файлов на удаленный сервер. scp /адрес/локального/файла пользователь@хост:адрес/папки Примеры использования: scp ~/test.txt user@host:documents # scp непосредственно копирует файл, в то время как передавать файл можно при помощи ssh, но он принимает поток, а не файл. cat localfile | ssh user@host "cat > remotefile" # аналогично: ssh user@host "cat > remotefile" < localfile # Пойдем еще дальше, вы можете сжимать файлы перед передачей с помощью tar, а потом их сразу же на лету распаковывать: tar czf - /home/user/file | ssh user@host tar -xvzf -C /home/remoteuser/ ===== ssh-agent ===== По простому:\\ ''\''- это "связка с ключами". Сначала добавляешь ключи туда через ''ssh-add'', а потом эта чудо-связка сама ищет подходящий для сервера, к которому пытаемся подключится, ключ.\\ Подробнее:\\ ''\''- это менеджер ключей для SSH, работающий независимо от последнего, запускаясь при первом включении ''ssh''. Хранит в памяти ключи, избавляя от необходимости вводить ключевую фразу каждый раз при подключении куда то. Он не записывает ключи на диск и не позволяет экспортировать их. \\ Вот как проверяется ключ пользователя во время SSH-соединения, с точки зрения сервера:\\ - Клиент предоставляет серверу публичный ключ.\\ - Сервер генерирует и отправляет короткое случайное сообщение, прося клиента подписать его с помощью приватного ключа.\\ - Клиент просит **агента** SSH подписать сообщение и пересылает результат обратно на сервер.\\ - Сервер проверяет подпись, используя публичный ключ клиента.\\ - Теперь у сервера есть доказательство того, что клиент владеет приватным ключом.\\ Позже в процессе соединения генерируется набор новых, эфемерных и симметричных ключей, которые используются для шифрования трафика сеанса SSH. Эти ключи могут даже не длиться весь сеанс; событие "''rekey''" происходит через регулярные промежутки времени. ==== ssh-add ==== команда ssh-agent для добавления ключей к "ключнице", которую ssh-agent автоматически использует для ssh. При запуске без параметров ищет и добавляет ключи со стандартными путями:\\ - ''~/.ssh/id_rsa''\\ - ''~/.ssh/id_ed25519''\\ - ''~/.ssh/id_dsa''\\ - ''~/.ssh/id_ecdsa'' ==== переадресация агента ==== Когда для соединения включена переадресация агента (обычно с использованием ''ssh -A''), в фоновом режиме открывается второй канал для переадресации любых запросов агента обратно на ваш локальный компьютер. Для ssh нет разницы между локальным и удаленным ssh-agent, так как ssh смотрит лишь на ''$SSH_AUTH_SOCK''. При подключении к удаленному хосту с включенной переадресацией агента SSHD создаст удаленный доменный сокет Unix, связанный с каналом переадресации агента, и экспортирует ''$SSH_AUTH_SOCK'', указывающий на него. > [!warning] > Когда вы переадресовываете доменный сокет ''ssh-agent'' Unix на удаленный хост, это создает угрозу безопасности: любой человек с root доступом на удаленном хосте может незаметно получить доступ к вашему локальному SSH-agent’y через сокет. Они могут использовать ваши ключи, чтобы выдавать себя за вас на других машинах в сети. > > Совет: > Заблокируйте свой ssh-агент, когда вы используете переадресацию агента. ''ssh-add -x'' блокирует агент паролем, а ''ssh-add -X'' разблокирует его. Когда вы подключены к удаленному хосту с переадресацией агента, никто не сможет проникнуть в ваш агент без пароля.