SSH с ключами и тунелированием
Бывают такие нехорошие места где кроме веб портов все закрыто, а частенько очень хочется залезть на свой сервер к некоторому приложению. Перебрасывание портов на открытые дело неразумное, да и вообще открывать какие-то сервисы наружу не стоит. В какой-то момент меня достала эта проблема, и поэтому я озадачился возможностью сделать тунель. Как оказалось все гениальное просто и название ему OpenSSH.
На самом деле сначала я смотрел в сторону VPN. Но сложноcть настройки и еще один дополнительный сервис в системе не добавлял энтузиазма. Дальше я попытался поискать что-нить будь около http туннелирования, но не нашел ничего. В конце концов выяснилось что обычный OpenSSH умеет вместе с соединением пробрасывать порты. А как плюс еще и умеет выступать в качестве socket 5 прокси. Эта возможность лазить по интернету через зашифрованный канал мне показалось довольно приятной.
В сети довольно много статей как настроить ssh с ключами, но я толком ни где не нашел слов "почему" и "как" мы это делаем. Все больше набор команд что бы сделать "хорошо". Поэтому я решил немного осветить эту тему.
Если вы собираетесь открыть доступ по ssh, то вам крайне необходимо настроить аутентификацию по ключам. Если вам кажется что хватит и пароля, стоит посмотреть логи и вы убедитесь, что каждую минуту десятки ботов пытаются его подобрать.
С аутентификацией по ключам существуют открытый (public) и приватный (private) ключ. Приватный ключ содержится на компьютере с которого вы будете подключаться, например ноутбук. Публичный ключ храниться на машине к который вы собираетесь подключиться, например домашний сервер. Когда вы соединяетесь с сервером он шифрует сообщения публичным ключом и только ваш приватный ключ может расшифровать его. Те все атаки будут просто бесполезны. Так же ключ обычно храниться в зашифрованном виде так что даже если он утек у вас будет время что бы сгенерировать новый. Очень важно понимать что это не зашита, а лишь преграда и отсрочка. Пароль к ключу (passphrase) должен быть сложным.
SSH может использовать RSA (Rivest-Shamir-Adleman) или DSA (Digital Signature Algorithm), но рекомендуется использовать только RSA ключи.
Давайте уже создадим оба ключа. По умолчанию используется 2048 бит, но можно увеличить до 4096, это усложнит брутфорсную подборку. В ходе работы у вас будет спрошен пароль к приватному ключу. Сохраняются ключи в /home/{user}/.ssh/id_rsa
и /home/{user}/.ssh/id_rsa.pub
. Я же предпочитаю указывать имя вручную, что бы потом не путаться.
mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa -b 2048 -f .ssh/isudo.key
Теперь что бы скопировать публичный ключ на сервер необходимо сделать следующее. При условии что у вас есть доступ по ssh. Сам ключ будет храниться в фале .ssh/authorized_keys
ssh-copy-id admin@isudo.ru -p 22
Теперь можно зайти на удаленную машину.
ssh admin@isudo.ru -p 22
Теперь стоит убедиться что на сервере отключен вход по паролям. Заодно загляните в другие настройки. sudo nano /etc/ssh/sshd_config
# PubkeyAuthentication yes
# RSAAuthentication yes
# PermitRootLogin no
# PermitEmptyPasswords no
# PasswordAuthentication no
Перезагружаем sudo service ssh restart
Порты можно пробрасывать ключами к команде ssh
, но есть более приятный способ - описать присеты в .ssh/config
. Вот небольшой пример. Первое сокрашение для домашнего использования, с пробросом mysql и без сжатия. Второе для удаленного, тут мы пробросили cifs шару и прокси. Заодно указали какой ключ использовать.
Host home
HostName 172.17.1.10
User admin
Port 22
Compress no
LocalForward 3306 lcalhost:3306
Host isudo.ru
IdentityFile /home/admin/.ssh/isudo.key
HostName isudo.ru
User admin
Port 22
Compress yes
DynamicForward 1080
LocalForward 135 localhost:135
LocalForward 137 localhost:137
LocalForward 138 localhost:138
LocalForward 445 localhost:445
Теперь можно писать короче и наглядней. Последняя стройка может понадобиться если у вас проброшены привилегированные порты. Это может сделать только супер пользователь, но при этом приходиться указывать файл с настройками.
ssh home
ssh isudo.ru
sudo ssh isudo.ru -F /home/admin/.ssh/isudo.key
Если вы хотите прокси, то например в ubuntu надо зайти в Network Proxy и выбрать Socks host: localhost 1080. Браузеры понимаю настройки системы, но например месенжер Empathy нет.
На этом все, надеюсь я помог кому-то сэкономить время.