Про SSH, туннелинг и их реализацию в FREESCO.
Введение
Начиная с версии 0.3.4 в фриске вместо телнет сервера в поставку включен dropbear, маленькая и быстрая реализация сервера и клиента ssh v2. Цитата с официального сайта:Dropbear is a relatively small SSH 2 server and client. It runs on a variety of POSIX-based platforms. Dropbear is open source software, distributed under a MIT-style license. Dropbear is particularly useful for "embedded"-type Linux (or other Unix) systems, such as wireless routers.
Features
- A small memory footprint suitable for memory-constrained environments - Dropbear can compile to a 110kB statically linked binary with uClibc on x86 (only minimal options selected)
- Dropbear server implements X11 forwarding, and authentication-agent forwarding for OpenSSH clients
- Can run from inetd or standalone
- Compatible with OpenSSH ~/.ssh/authorized_keys public key authentication
- The daemon, keygen, key converter, and client can be compiled into a single binary (ala busybox)
- Features can easily be disabled when compiling to save space
- TCP forwarding support
Единственное что не вкомпилено в версию для FreeSCO это 'key converter', ради экономии места на дискете... Также до версии 0.3.5 не был реализован scp, протокол передачи файлов на основе ssh. В версии 0.3.5 это упущение исправлено, и теперь вообще можно забыть о FTP, самом незащищенном протоколе из всех используемых в FreeSCO. Разве что только для анонимного FTP-сервера.
Что вытекает из этой информации? Первое, мы в принципе можем производить идентификацию по ключу, то есть не набирая пароль каждый раз... Второе, мы можем создавать различные туннели, что зачастую оказывается намного проще чем поднимать полноценный VPN с помощью IPSEC, PPTP, GRE, PPPoE, или еще как. И третье, мы можем сделать защищенный портфорвардинг, который реализуется намного проще, чем туннелинг а результат зачастую одинаков.
Наверх
Putty
SSH является самым гибким, мощным, удобным и защищенным средством управления.
И к сожалению наверно самым нелюбимым у новичков :(.
Терминальный клиент PuTTY умеет очень многое. Он может быть удобнейшим Telnet или SSH клиентом. В его составе еще несколько полезных утилит. Описывается версия под Windows, но его реализация есть под многие платформы. Я расскажу какие минимальные настройки нужно произвести чтобы пользоваться им было удобно.
Первого окно немного не привычно для пользователя виндовз который привык видеть сразу запущенный продукт. Здесь нам предлагают сконфигурировать наше соединение. Первая секция это Session, в ней производиться управление вашими соединениями. По умолчанию все настройки соответствуют сессии Default Settings. После измененй, чтобы каждый раз не производить настройку пропишите осмысленное имя сессии в верхнем поле Saved Sessions, и нажмите Save. В последствии это соединение будет доступно в списке, и вызвать его вы сможете или двойным щелчком или выбором из списка и последующим нажатием Open. Кнопка Load позволит вам загрузить конкретную сессию и произвести в ней изменения перед соединением, или для последующего сохранения.
После создания соединения нужно настроить терминал под специфику фриски, чтобы они нормально взаимодействовали. В разделе Terminal->Keyboard под заголовком The Function keys and keypad выберите тип Linux, иначе функциональные клавиши будут не доступны на прямую. По этому поводу я вот что еще замечу. Управление свойствами терминала производится с помощью так называемых escape-последовательностей. Это символ с кодом 27 соответствующий клавише ESC, и следующий за ним один или несколько символов управления терминалом. На древних терминалах выбор клавиш был очень скуден, поэтому многие функции были доступны только в комбинации с ESC, или Meta - еще одно название, часто обозначают как заглавную M. Но благодаря этому некоторые сочетания работают практически всегда и везде. К примеру функциональны клавиши можно эмулировать последовательно нажав ESC и цифру. Зачастую можно встретить клавиши F13-F20 которых на современных клавиатурах нет :) этим клавишам соответствую функциональные но при зажатом Shift. В режиме совместимости ее можно нажать как Shift+ESC и потом клавишу с цифрой. Кстати F11 соответствует Shift+F1, а F12 соответствует Shift+F2.
Теперь перейдем в раздел Window. Здесь можно установить количество символов в окне по вертикали
и горизонтали. У меня стоит 30 на 80. Некоторые полноэкранные программы не считывают параметры экрана и в любом
случае работают в стандартных 25 на 80. К ним к сожалению относиться и дефолтный редактор.
По умолчанию, при изменении размеров окна будет изменено и количество строк и столбцов. Что очень удобно.
Другое поведение можете определить сами.
В секции Window->Appearance можно определить шрифт которым это все отображать и размер по умолчанию. Как правило применяют Courier. Но вы можете определить любой моноширинный. Я в некоторых случаях использую шрифты dejavu. Они весьма неплохо подходят для програмирования. По крайней мере у них визуально можно отличить маленькую L и большую i, а так же O и ноль. Хотя и они не без греха, алиасинг(сглаживание) в русских шрифтах оставляет желать лучшего :(.
Секция Window->Behaviour нам интересна только для установки галочки в пункте 'Full screen on Alt-Enter'. Это позволит нам разворачивать окно в полноэкранный режим нажатием Alt+Enter. Не максимизировать окно а именно полноэкранный, без любых елементов интерфейса виндовз.
В секции Window->Translation нужно задать кодировку отображаемых символов. Это необходимо если вы будете редактировать файлы на русском, или еще каком языке, не использующем латинницу. У меня стоит там KOI8-U, как более универсальный вариант для кириллицы. Рекомендую его и для русского. Кстати, если вам попадется документ в другой кодировке, то увидать его поможет смена именно этой опции.
Некоторые свойства сессии можно поменять во время работы. Дополнительное меню доступно по нажатию правой кнопки мыши на заголовке окна. Эти изменения временные и будут работать только для текущего сеанса.
Большинство виндузятников знают про Ctrl-X, Ctrl-C и Ctrl-V, стандартные клавиши применяемые для вырезания копирования и вставки. Они пришли на замену более стандартным и старым комбинациям по причине прихода в мир компьютеров мыши. Чтобы одной левой рукой можно было производить эти действия. Но к моему удивлению не все знают об их исторической альтернативе. Shift-Del, Ctrl-Ins и Shift-Inst делают абсолютно тоже самое и практически везде, даже там, где Ctl-X-C-V не работают. Эти комбинации со служебными а не алфавитными клавишами были удобны при активной работе на клавиатуре.
Ну вот копирование и вставка в putty работают именно таким методом. Таким способом можно копировать даже небольшие текстовые файлы если их содержимое помещается на небольшом количестве экранов. Это наверно самый простой способ обмена информацией. Выделение же в putty производиться мышью, если при этом нажата Alt то будет выделен вертикальный блок. Двойной щелчек выделяет слово, а тройной строку. Если на удаленном хосте загружен драйвер мыши, то выделение будет работать с нажатой Shift, вертикальное с Shift+Alt.
Наверх
Авторизация по ключам
Это раздел идет одним из первых, потому как эта информация будет использоваться в последующих разделах, а для некоторых решений она вообще жизненно необходима.
Как видно из описания dropbear умеет производить аутентификацию по ключу. У него есть даже специальный ключ '-g', который предписывает руту подключаться только с помощью ключа, и откажет в доступе при залогинивании root с использованием пароля.
При первом старте dropbear создает два ключа один rsa другой dsa. Это ключи которы будут использоваться при обычных способах аутентификации, для генерации сессионных ключей. И у вас при первом их использовании, когда вы каким либо клиентом конектитесь к ssh серверу запросят разрешение на принятие этих ключей. Потом они будут храниться в кеше и в повторной активизации не нуждаются.
Нас же больше интересуют ключи парные, приватный и публичный. С помощью которых можно авторизироваться в автоматическом режиме, без ввода каких-либо дополнительных данных.
Такие ключи генерируются всеми дистрибутивами ssh. Не всегда в переносимом формате, хотя файл autorized_keys и можно считать универсальным хранилищем публичных ключей для ssh серверов.
файл имеет простой формат: одна строка - один ключ. Каждая запись состоит
из трех полей, разделенных пробелами.
тип_ключа тело_ключа некая_идентификация
тип_ключа: обычно ssh-rsa или ssh-dsa
тело_ключа: понятно
некая_идентификация: что-либо позволяющее в удобном виде идентифицировать
ключ, чаще всего там содержиться email владельца.
Располагается такой файл как правило в домашнем каталоге пользователя в .ssh
подкаталоге.
Приватные же ключи зовутся id_rsa или id_dsa, хотя это и не обязательною. Хрянятся они также по умолчанию в .ssh в домашнике пользователя. Также желательно сохранить резервные копии в месте защищенном от повреждения, утери или других форс-мажоров.
владельцем файлов должны быть пользователь и его группа, а права
на каталог:
drwx------ .ssh
на файлы
-rw------- authorized_keys
-rw------- id_rsa
Генерация пары ключей в случае dropbear выполняется так:
dropbearkey -t rsa -f private.key
Параметр -t может принимать также значение и 'dsa', ну а -f определяет
файл в котором будет сохранен приватный ключ.
Так как публичный ключ выдается прямо на экран вот приблизитеьно в таком
виде:
[root@Freesco] dropbearkey -t rsa -f private.key
Will output 1024 bit rsa secret key to 'private.key'
Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwC+oW39C6UZZfHAhziYnGFwRLG2nRqFHvIErusyISQWMxLe7OBe7ATOxjvO5JOi58KrvJ0jVNsShRtzAoxx+IBbfik+RmPqQdU2Lfvjai/hBcT3Y/B6gokC0sZBA/HlcA5yOcXZpdelm0gTE8m8mEHnPIaDW0ZCx3M5SN5Ax3eixzNl
Fingerprint: sha1 17:81:8d:52:a6:12:c5:92:f9:a7:23:ca:d6:da:f7:9e:11:e4:05:05
то могу посоветовать применить такую команду:
dropbearkey -t rsa -f private.key | sed -n '/ssh/p' > public.key
ну или при необходимости сразу в хранилище публичных ключей:
dropbearkey -t rsa -f private.key | sed -n '/ssh/p' >> $HOME/.ssh/authorized_keys
Для OpenSSH генерация ключа производиться подобным способом:
ssh-keygen -t rsa
в .ssh должны появиться id_rsa и id_rsa.pub, приватный и публичный ключи
соответственно.
Для putty в виндовс версии воспользуйтесь puttygen, входящем в поставку.
[4]
Вот та часть которая отражается в верхней части окна после генерации
ключей это и есть публичный ключ в формате пригодном для включения в
authorized_keys.
Теперь есть все компоненты которые нужны для авторизации по ключу.
переносите публичный ключ на машину к которой необходимо коннектиться и
добавляем его в хранилище ключей.
cat public.key >> $HOME/.ssh/autorized_keys
Теперь попробуем законнектиться:
[root@Freesco] ssh nab@192.168.2.29 -i /home/root/.ssh/private.key
[nab@Freesco]
все проходит нормально и появляется приглашение уже удаленной системы.
У putty для сессии необходимо указать в свойствах соединения Auto-login username, и в разделе SSH->Auth в поле Private key file for authentication необходимо прописать путь к приватному ключу.
Все, теперь у нас есть надежный способ безпарольной весьма криптостойкой аутентификации.
Наверх
SFTP/SCP
Еще один вопрос который можно расмотреть в связи с SSH, это SCP (Security Copy Protocol), Это протокол
защищенного копирования файлов, часть пакета SSH. Настоятельно рекомендую его как замену FTP, в отличии
от ftp он не использует открытые пароли, а основываясь на SSH весьма защищен.
В комплект putty входит утилита PSCP.EXE которая и реализует командный интерфейс к этому протоколу.
Использовать ее можно для всех целей по копированию, резервированию или синхронизации файлов.
Только для фриски нужно принудительно указать используемый протокол -scp.
pscp -scp -i private.key root@192.168.1.1:/etc/passwd c:/backup/passwd
Хотя конечно удобнее применять инструменты реализующие более удобный интерфейс.
Для винды это WinSCP.
Или их же плагин для файлового менеджера FAR, что я сильно и вам рекомендую.
Наверх
PortForwarding
SSH предоставляет два основных типа форвардинга портов:
локальный порт мапиться на хост удаленной сети.
порт удаленного хоста маппиться на порт хоста в локальной сети.
Еще один тип реализован не везде, но нам он очень интересен будет... Динамический маппинг, реально это получается локальный SOCKS сервер.
Локальный маппинг
Дано: офисная локальная сеть, админская машина под виндой с установленным Radmin, в интернет смотрит router на FREESCO. Админ дома, и надо подправить что-то в сети.
Запускаем putty, выбираем соединение с нашим офисом и в свойствах Connection->SSH->Tunnels выбираем Local port, указываем номер Source port 2222, а в Destination прописываем имя или адрес админского компа в офисной сети и порт Радмина: admin.local.net:4899. И жмем Add что бы получилось как на картинке.
Соединяемся. Запускаем локально радмин вьювер, создаем новое соединение указываем на localhost на порт 2222, и вуаля, мы за своим рабочим столом в офисе :)
второй пример: вам необходимо из домашней сети которая тоже стоит за freesco отправить почту через офисный почтовик.
Запускаете так:
ssh root@router.local.net -L 25:exchange.local.net:25 -i /home/root/.ssh/private.key
все, можете отправлять почту на вашу собственную фриску, она уйдет через
офисный exchange сервер.
Удаленный маппинг
Это когда у вас в текущей вашей локалке есть ftp сервер, к которому вы хотите предоставить доступ другу из офиса. Вы конектитесь в офис и пробрасываете порт с тамошней freesco на ваш локальный ftp сервер.
в свойствах putty указываете Remote Port, в качестве Destination адрес или имя локального ftp сервера. Соединяетесь, и с офисной сети при коннекте ftp клиентом на 2222 порт офисной freesco попадают на локальный сервер в вашей домашней сети.
Или если у вас и дома стоит FreeSCO:
ssh root@router.local.net -R 2222:ftp.home.net:21 -i /home/root/.ssh/private.key
Динамический портфорвардинг я покажу на вот таком примере.
Если к примеру зарубежный трафик стоит дорого, а городской копеечный или
вообще шаровой, то ходить в инет надо за счет работодателя :)
В настройках выбираем Dynamic. Указываем Local port 4545.
Соединяемся. Все, у нас есть локальный SOCKS4/5 сервер.
Проги которые умеют ходить через socks настраиваем на localhost:4545.
Для тех которые не умеют берем любой из доступных соксификаторов
[5].
Наверх
SSH Туннелинг
Туннелинг сродни портфорвардингу особенно последнему описанному, но намного более универсальнее. К сожалению тот тип туннеля что я сейчас, опишу мне не удалось реализовать под виндой, хотя я еще не потерял надежду :). Зато он прерасно реализуется на *nix системах. В том числе на FreeSCO без дополнительных пакетов, начиная с версии 0.3.4, (когда в дистрибутив включили ssh).
Основательную статью на эту тему можно прочитать на ситфоруме
[2].
Я же расскажу вкратце.
У ssh есть возможность включить псевдотерминал опцией -t.
У ppp есть возможно использовать псевдотерминал опцией pty.
В результате можем пропустить ppp сквозь ssh.
Команда:
/sbin/pppd connect-delay 5000 noauth \
pty 'ssh -t root@192.168.2.29 -i /home/root/.ssh/private.key \
/sbin/pppd noauth 192.168.4.50:192.168.4.51'
Разберем по косточкам: /sbin/pppd connect-delay 5000 noauth pty - запускаем pppd без аутентификации (noauth), с опцией pty (псевдотерминал) и командой которая нам этот псевдотерминал предоставит.
ssh -t root@office.net -i /home/root/.ssh/private.key - безпарольно соединяемся с удаленным хостом эмулируем, '-t', псевдотерминал и вызываем команду на удаленном узле
/sbin/pppd noauth 192.168.4.50:192.168.4.51' - также без аутентификации соединяемся с псевдотерминалом с той стороны и присваиваем сторонам IP адреса.
Это именно тот случай когда нам без идентификации по ключу не обойтись, ибо пароль вводить просто негде...
ВАЖНЫЙ параметр connect-delay описание которого я пропустил в первой команде задает время ожидания в миллисекундах, выставлено 5 секунд. При тестировании в локалке pppd не хотели у меня соединятся, и заставили меня устроить пляски с бубном :) Потому как друг друга не засекали. Этот параметр заставляет одну из сторон дожидаться первого ppp пакета именно 5 секунд. В вашем случае время может быть другим.
Теперь прописываем роутинг для удаленной сети:
route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.4.51 dev ppp0
И при необходимости на удаленной стороне, заодно и доступ открываем через
файрвол.
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.4.50 dev ppp0
ipfwadm -I -i accept -D 192.168.3.0/24
ipfwadm -F -a accept -D 192.168.3.0/24 -S 192.168.4.51
Эти команды нужно выполнять на удаленной стороне.
Так как добиться выполнения одной командой не удалось,
приходиться еще раз соединятся, для выполнения этих команд.
ssh -t root@192.168.2.29 -i /home/root/.ssh/private.key \
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.4.50 dev ppp0
ipfwadm -I -i accept -D 192.168.3.0/24
ipfwadm -F -a accept -D 192.168.3.0/24 -S 192.168.4.51
Наверх
Knock
В переводе это означает 'стук', ну во входную дверь к примеру.
Это весьма оригинальное средство защиты, и управления удаленным
компьютером.
Принцип его таков: knock сервер слушает кто стучиться, а knock клиент стучит по портам. При этом эти порты находятся в закрытом состоянии.
Knock сервер слушает сразу все порты на указанном интерфейсе, и
отлавливает пакеты приходящие на определенные порты в определенной
последовательности. Как только последовательность совпадет с заданной в
конфигурационном файле выполняется соответствующая команда. Любая.
То есть появляется возможность просто постучав клиентом по портам
запустить к примеру синхронизацию серверов или еще чего.
Хотя чаще всего используют для открытия доступа к сервисам. В комплекте с
пакетом идет пример конфигурационного файл knockd.conf:
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /bin/ipfwadm -I -i accept -P tcp -S %IP% -D 0/0 22
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /bin/ipfwadm -I -d accept -P tcp -S %IP% -D 0/0 22
tcpflags = syn
как видите, при стуке по портам 7000 8000 9000 открывается доступ к 22
порту, а если постучать в обратном порядке то закрывается...
Не уверен насчет наличия knock сервера под виндовз но клиент точно есть.
Ну и естественно под nix клиент тоже есть :)
knock 7000 8000 9000
И все, дверь открылась :)
Кстати стучать можно многими инструментами их хватает как под винду, так и
под nix. Тот же nmap к примеру...
Так как узнать какие именно порты слушает сервер почти не реально, то это
еще один неплохой рубеж в защите вашего роутера.
Пакет под фриску ставить так:
pkg -i ftp://ftp.linux.kiev.ua/pub/Linux/freesco/home/0.3.x/knock-0.5a-lightning
клиента под винду забирать здесь:
ftp://ftp.linux.kiev.ua/pub/Linux/freesco/win_utils/knock.exe
Наверх
Ссылки
- Безопасность на opennet.
- Статья на SurgutNet с которой все началось
- VPN = ppp over ssh
- Автоматический вход на роутер FreeSCO используя SSH и authorized_keys
-
FreeCap
SocksCap
23554250