Secure Shell (SSH) – это криптографический сетевой протокол для надежной работы сетевых служб по незащищенной сети.
SSH был разработан как замена протоколов Telnet и Unsecured Remote Shell, а также протоколов Berkeley Rlogin, Rsh и Rexec.
Эти протоколы отправляют информацию, в частности пароли, в виде открытого текста, что делает их восприимчивыми к перехвату и раскрытию с использованием анализа пакетов.
Шифрование, используемое SSH, предназначено для того, чтобы обеспечить конфиденциальность и целостность данных по небезопасной сети, такой как Интернет, несмотря на то, что файлы, выпущенные Эдвардом Сноуденом, указывают, что Агентство национальной безопасности может иногда дешифровать SSH, позволяя им считать содержание сеансов SSH.
6 июля 2017 года WikiLeaks подтвердили, что Центральное разведывательное управление США разработало инструменты, которые могут использоваться на компьютерах под управлением операционных систем Microsoft Windows или GNU / Linux для перехвата SSH-соединений, запущенных клиентами SSH на скомпрометированных системах.
Вход в систему
# ssh user@hostname
# ssh -p 2222 user@hostname
# ssh -o "PubkeyAuthentication no" username@hostname
# ssh -i /path/to/identity.pem username@hostname
Конфигурация SSH
Если вы хотите настроить алиасы для доступа к серверам, к которым вы часто обращаетесь, вы можете создать файл ~ / .ssh / config и указать каждый
понравившийся вам сервер вместе с методом аутентификации:
# vim ~/.ssh/config Host somealias HostName example.com Port 2222 User someuser IdentityFile ~/.ssh/id_example IdentitiesOnly yes Host anotheralias HostName 192.168.33.10 User anotheruser PubkeyAuthentication no How aws HostName some.address.ec2.aws.com User awsuser IdentityFile ~/.ssh/aws_identity.pem IdentitiesOnly yes
Итак, есть несколько примеров, которые вы можете найти в файле ~ / .ssh / config (у вас может быть столько записей, сколько хотите).
Использование определенного хоста («алиас») так же просто:
# ssh somealias
Давайте рассмотрим следующие варианты:
- HostName – хост сервера (домен или ipaddress)
- Port – Порт, который следует использовать при подключении.
- User – имя пользователя для входа в систему
- IdentityFile – идентификатор ключа SSH для использования при входе в систему, если используется доступ по SSH-ключам
- IdentitiesOnly – “Yes” чтобы указать только попытку входа в систему через SSH-ключ
- PubkeyAuthentication – “No” если хотите обойти аутентификацию ключей SSH
SSH-туннель
SSH можно использовать для туннелирования, что является, по сути, переадресацией портов.
Есть несколько способов сделать это – локальные (исходящие), удаленные (inboud) и некоторые другие (динамические и агенты).
Локальное перенаправление портов
Локальная переадресация портов – это то, что вы используете, когда вам нужно туннелировать канал через брандмауэр или установить другие ограничения.
Общим примером является попытка подключения к удаленной базе данных, которая находится за брандмауэром или только слушает локальное соединение.
Например, MySQL по умолчанию использует только соединения localhost.
Вы не можете удаленно подключиться к нему без редактирования файла my.cnf и указать его во всех сетях.
В любом случае есть брандмауэр, подключенный к порту 3306 MySQL.
Предполагая, что у нас есть SSH-доступ к удаленному серверу, мы можем обойти его, создав туннель на сервере.
Как это могло бы выглядеть?
# ssh -L 3306:localhost:3306 username@hostname
Давайте посмотрим следующее:
-L – Настройка локальной переадресации портов
3306 – Локальный порт для пересылки
localhost: 3306 – В пределах удаленного сервера, какой адрес и порт для пересылки трафика. Поскольку сервер MySQL находится на удаленном сервере, мы туннелируем на «localhost» удаленного сервера на порт 3306, который слушает MySQL.
username @ localhost – Имя пользователя и хост SSH для подключения
Затем я могу использовать локальный клиент для подключения к удаленному серверу, как если бы он был локальным:
Теперь я использовал один и тот же порт локально и удаленно, но я мог бы указать другой локальный порт:
# ssh -L 3307:localhost:3306 username@hostname
Затем моему локальному клиенту mysql придется подключиться к порту 3307, который все равно будет туннелировать локальный 3306 удаленного сервера:
Удаленная переадресация портов
Удаленная переадресация портов хороша, если вам нужно предоставить доступ к локальному компьютеру другим пользователям, находящимся за пределами вашей сети.
Для этого нам нужен удаленный сервер, на который могут связаться все стороны. Будет что-то вроде сервера AWS или Digital Ocean.
Во-первых, давайте притворимся, что наш локальный компьютер имеет веб-сервер, работающий на порту 8001:
На нашей локальной машине
# curl localhost:8001 Hi!
Мы хотим, чтобы наши друзья увидели наш сайт, который просто говорит «Привет!».
Давайте использовать удаленный сервер для пересылки запросов на наш локальный компьютер:
По прежнему на локальной машине:
# ssh -R 9000:localhost:8001 username@hostname
Давайте рассмотрим эту команду:
-R – Использование перенаправления удаленных портов
9000 – Порт удаленного сервера (а не наш локальный сервер на этот раз!)
localhost: 8001 – местный адрес для пересылки. Поскольку наш веб-сервер находится на локальном порту 8001, это то, что мы укажем здесь. (Да, порядок этих аргументов изменился на -R вместо -L!)
имя пользователя @ hostname – доступ SSH к удаленному серверу
Если наш IP-адрес удаленного сервера был 123.123.123.123, наши друзья могут получить доступ к нашему сайту по адресу 123.123.123.123:9000, который отправит наш локальный сайт на localhost: 8001!
Примечание. Для этого брандмауэр удаленного сервера не должен блокировать порт 9000.
Вам также может потребоваться отредактировать /etc/ssh/sshd_config и установить директиву GatewayPorts в yes. (Не забудьте перезапустить SSH после любых изменений в sshd_config).
Одноразовые команды
Вы можете запускать команды удаленно, используя SSH, – на самом деле это может быть самый простой «трюк» для использования SSH.
Когда вы запускаете команду с использованием SSH, вы выполняете команду на удаленном сервере.
Однако любой результат будет отображаться в вашем терминале.
Давайте просто запустим несколько простых команд на удаленном сервере.
Следующее действие запустит команду pwd.
Мы увидим, что он вернет папку по умолчанию, в которой мы будем находиться после входа в систему
Мы запустим команду ls, чтобы увидеть вывод содержания каталога:
# ssh -p 2222 username@hostname pwd /home/username