Skip to content
andyceo edited this page Oct 14, 2023 · 17 revisions

SSH и другие ssh-related утилиты

На этой странице описывается установка и настройка OpenSSH и утилит, связанных с SSH.

Настройка сервера OpenSSH

В конфигурацию по умолчанию внести следующие настройки (файл /etc/ssh/sshd_config):

    PermitRootLogin no
    AuthorizedKeysFile  %h/.ssh/authorized_keys
    PasswordAuthentication no
    MaxStartups 10:30:60
    Banner /etc/issue.net

Прежде, чем выставить PasswordAuthentication no, сначала нужно скопировать на сервер ключи со всех рабочих машин, с которых планируется входить. Сделать это можно с помощью команды, выполняемой на рабочей станции:

    ssh-copy-id REMOTE_USER@REMOTE_SERVER

Кроме того, я создал файл /etc/ssh/sshrc, в котором написал команду для отсылки сообщения на электронную почту при логине пользователя: sudo nano /etc/ssh/sshrc

    echo $(date) $SSH_CONNECTION $USER $SSH_TTY | mail -s "ssh login" <yourmail@example.com>

Перед этим нужно установить пакет mailutils (чтобы работала команда mail). Об этом смотрите выше пункт "5. postfix. Установка почтового сервера postfix".

Полезные ссылки:

Настройка рабочей станции

  1. SSH-ключ пользователя. Создаем ключ:

     ssh-keygen
    

    По умолчанию создается ключ RSA. Опция -t ed25519 создаст более короткий и защищенный ключ в формате ed25519. Опция задаст метку ключа (может быть любой строкой):

     ssh-keygen -t ed25519 -C "`whoami`@`hostname`"
    

    Если был создан ключ с паролем (passphrase), то отключить пароль можно так:

     ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
    

    Или просто напечатать ssh-keygen -p в терминале, и пройти процесс смены (отключения) пароля интерактивно. См. How do I remove the passphrase for the SSH key without having to create a new key?

    Github рекомендует использовать ed25519 для новых ключей, а в качестве legacy RSA:

     ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    
  2. Пользовательский файл настроек SSH. В случае каких-то особенных настроек подключения к удаленным хостам, например, использования другого ключа и/или порта, можно создать алиас хоста со всеми нужными настройками в файле ~/.ssh/config (права на файл должны быть 0644, создать и править одной командой: touch ~/.ssh/config && chmod 644 ~/.ssh/config && nano ~/.ssh/config):

     Host dev
       IdentityFile ~/.ssh/your_private_key
       Hostname dev.example.com
       Port 1837
       User user_at_dev
    
     Host sources
       IdentityFile ~/.ssh/your_private_key
       Hostname sources.example.com
       Port 1837
       User user_at_sources
    

    После этого можно зайти на сервер разработчика dev.example.com просто напечатав в консоли: ssh dev

  3. Копируем ключ на свои сервера (можно использовать короткую запись из файла ~/.ssh/config):

     ssh-copy-id REMOTE_USER@REMOTE_SERVER
    

    Можно использовать ключ -i ~/.ssh/id_ed25519.pub чтобы скопировать какой-то определенный ключ (их может быть несколько)

  4. Копируем в аккаунты Github, Bitbucket

Проблемы?

Прописываем вручную в ssh: ssh_add

Источники:

SCP

Указать порт можно опцией -P 2022 (в отличие от ssh, в котором порт ставится маленькой буквой -p 2022):

scp -P 2022 ....

Если нужно скопировать директорию:

scp -rp sourcedirectory user@dest:/path

Ключи означают следующее:

-r рекурсивно,
-p сохраняет время изменения, доступа и права оригинальных файлов.

Внимание! scp не сохраняет пользователя (и возможно группу) даже при передаче ключа -p. Лучше использовать rsync для более точного копирования всех атрибутов файлов: rsync -av source 192.0.2.1:/dest/ination

  1. LOCAL => REMOTE:

    Запускаем на LOCAL, чтобы положить файлы на REMOTE:

     scp file1 file2... user@host.domain:path
    

    Пример:

     scp ann beth clyde forsythe@linux.nmt.edu:/u/forsythe/tmp
    
  2. REMOTE => LOCAL

    Запускаем на LOCAL, чтобы взять файлы с REMOTE:

     scp user@host.domain:path file1 file2... dest
    

    Пример:

     scp 'forsythe@linux.nmt.edu:/u/forsythe/images/*.jpg' pictures/LaborDay
    

Источники:

Socks-proxy через SSH

Данное руководство будет дано для случая, когда для работы с ssh используется файл ~/.ssh/config.

  1. Допустим у нас есть запись в config для какого-то сервера:

     Host myserver
     Hostname myserver.example.com
     User myuser
     Port 8927
    

    И мы можем залогиниться на этот сервер, набирая:

     ssh myserver
    
  2. Теперь мы поднимем туннель, создав особое соединение с этим сервером myserver:

     ssh developer3072 -D 4444
    

    Эта команда открывает локально порт 4444, и теперь нам надо настроить все клиентские приложения использовать этот прокси: 127.0.0.1:4444. Можно задать настройки центрального прокси для операционной системы в целом.

  3. Если нужно, чтобы трафик на какой-либо другой сервер myserver2 шел также через прокси myserver, нужно задать следующие соединения в файле config для сервера myserver2:

     Host myserver2
     Hostname myserver2.example.com
     User myuser2
     ProxyCommand ssh -W %h:%p myserver
     Port 8672
    

    Можно даже пробросить порт с сервера myserver2 на 127.0.0.1. На примере порта MySQL 3306, допишите в конфигурацию myserver2 следующую строчку:

     LocalForward 3306 127.0.0.1:3306
    

SSH-подключение к серверу через SOCKS-прокси

SSH не умеет напрямую работать с SOCKS-прокси, и не читает переменные окружения вида socks_proxy, поэтому нужно использовать например netcat, чтобы направить трафик через прокси:

ssh -o ProxyCommand='nc -X 5 -x 127.0.0.1:9050 %h %p' swarm01

Отличный ответ здесь: Run SSH over a SOCKS proxy?

Работа SSH с запароленным ключом

Если вы зашли по ssh на хост под пользователем, у которого запароленный ssh-ключ, то при каждом действии, требующем ключа, придется вводить пароль от ключа. Чтобы ввести его один раз и дальше не вводить в течении сессии, сделайте так:

ssh-agent bash
ssh-add ~/.ssh/id_rsa

После этого введите пароль от ключа один раз, и дальше можно будет уже не вводить его.

Sidebar is under construction

Clone this wiki locally