Использование fwknop для авторизации с помощью единственного крипто-пакета (Single Packet Authentication) на Ubuntu 12.04

Незащищенные сервисы в Интернете всегда подвержены опасности, поскольку злоумышленники или автоматизированные скрипты могут множество раз просканировать и даже попытаться получить доступ к какому-либо открытому порту или уязвимому сервису.  

В то время как некоторые сервисы должны оставаться доступными, так как предназначены для общего использования (к примеру, веб-сервер, на котором расположен сайт), другие сервисы должны быть доступны только одному или нескольким авторизованным пользователям и никому более (например, SSH). По крайней мере, такие сервисы должны быть надежно защищены и доступны только в случае необходимости.

Авторизация при помощи единственного крипто-пакета (Single Packet Authorization)  – это метод, позволяющий фаерволу блокировать доступ к сервису до тех пор, пока на прослушивающий сервис не будет отправлен специальный шифрованный пакет. Как только сервис подтверждает данный пакет, он изменяет правила фаервола и открывает нужный порт.

Инструмент по имени fwknop, что расшифровывается как Firewall Knock Operator, используется для интерпретации таких пакетов и изменения правил фаервола. Данное руководство описывает конфигурирование сервера и клиента fwknop на Ubuntu 12.04. Это позволит оградить SSH-сервер до специального запроса.

Установка сервера fwknop на VPS

Выполнение описанных тут конфигураций предполагает наличие двух выделенных серверов Ubuntu 12.04. Также подразумевается наличие доменного имени, направленного на VPS, и работающего IP-адреса. Чтобы получить помощь по настройке доменных имен от 8host, нажмите сюда.

На серверной машине установите компонент сервера fwknop с помощью apt-get:

sudo apt-get update
sudo apt-get install fwknop-server

Во время установки появятся некоторые вопросы по конфигурированию сервиса и связанных с ним компонентов.

Первый вопрос связан с postfix. Выберите «Internet Site» и введите доменное имя в следующее поле.

Следующий вопрос касается того, хотите ли вы, чтобы fwknop защищал SSH-порт по умолчанию, используя менее безопасную систему ключей. Выберите «yes», чтобы сервис сконфигурировал некоторые параметры. Более безопасные настройки будут описаны ниже.

Выберите интерфейс, который нужно защитить. Обычно это «eth0». Теперь укажите ключ шифрования, используемый для шифра. Позже его нужно будет изменить, потому то, что будет выбрано здесь, не имеет значения. Просто убедитесь, что это одно слово, иначе конфигурация выдаст ошибку.

Установка клиента fwknop на второй VPS

На VPS, который будет использоваться как клиент, нужно установить клиентский компонент. Эта часть системы будет создавать зашифрованный пакет для отправки на другую машину:

sudo apt-get update
sudo apt-get install fwknop-client

В данный момент клиентская часть не нуждается в дополнительной настройке.

Настройка GPG-ключей

GPG-ключи обеспечивают аутентификацию передачи пакетов. Поскольку этот шифр асимметричен, следующие действия должны быть выполнены как на клиенте, так и на  сервере. GPG должен быть установлен по умолчанию.

На каждой машине создайте ключ, набрав:

gpg --gen-key

Это выведет несколько вопросов, в большинстве случаев можно принять настройки по умолчанию.

Введите и подтвердите пароль. Генерирование достаточно случайной информации для создания ключа займет некоторое время.

Затем нужно записать или как-либо иначе скопировать идентификаторы для каждого из созданных ключей. Их можно получить, введя:

gpg --list-keys
/home/test/.gnupg/pubring.gpg
-------------------------------
pub   2048R/11111111 2014-01-09
uid                  client <c[email protected]>
sub   2048R/C1C26BA6 2014-01-09
</c

Выделенная выше часть понадобится для каждого ключа. Скопируйте куда-нибудь данную запись и отметьте как компонент сервера или клиента.

SERVER: 11111111
CLIENT: 99999999

На клиентской машине создайте файл client.asc, ascii-копию ключа, переместив его в файл. Нужно сослаться на только что скопированный для клиента идентификатор ключа.

gpg -a --export 99999999 > client.asc

Повторите данную процедуру на главной машине, ссылаясь на идентификатор ключа сервера, чтобы создать файл server.asc:

gpg -a --export 11111111 > server.asc

Передача ключей между серверами

Теперь нужно обменяться ключами машин, чтобы на каждой из машин была копия каждого ключа.

На клиентской машине это делается при помощи инструмента «scp».

Скопируйте файл «client.asc» с клиентской машины на сервер при помощи подобной команды:

scp client.asc server_domain_or_ip:/path/to/user/home/directory

Будет  предложено пройти аутентификацию при помощи обычного пароля учетной записи сервера. Измените путь, чтобы отразить домашнюю папку используемой учетной записи.

Далее нужно получить файл «server.asc» при помощи подобной команды:

scp server_domain_or_ip:/path/to/user/home/directory/server.asc .

Теперь на обеих машинах есть два нужных файла.

Импортирование и подпись ключей

Теперь, получив доступ ко всем ключам на каждой машине, можно импортировать противоположный ключ (то есть, ключ сервера на клиенте, и клиентский ключ на сервере) в локальную базу данных GPG.

На сервере введите:

gpg --import client.asc

На клиенте наберите:

gpg --import server.asc

Теперь, когда ключи внесены в базы данных, нужно подписать каждый ключ, подтверждая его.

На каждой машине введите следующую команду, ссылаясь на идентификаторы только что импортированных ключей. В данном случае на клиенте нужно набрать:

gpg --edit-key 11111111

а на сервере:

gpg --edit-key 99999999

Появится  GPG-строка. Чтобы подписать ключи, введите:

sign

Когда будет запрошено подтверждение, введите:

Y

Затем можно сохраниться и выйти:

save

Теперь на каждой машине есть копия каждого GPG-ключа. То, что эти ключи подписаны, значит, что они подлинные и им можно доверять.

Настройка доступа на fwknop-сервер

Теперь нужно настроить сервис fwknop использовать сгенерированные GPG-ключи и позволить клиенту подключаться и проходить аутентификацию.

На сервере откройте конфигурацию доступа с root-правами:

sudo nano /etc/fwknop/access.conf

Данный файл должен содержать примерно четыре активных строки и выглядеть приблизительно так:

SOURCE: ANY;
OPEN_PORTS: tcp/22;   ### for ssh (change for access to other services)
KEY: throw_away_password;
FW_ACCESS_TIMEOUT: 30;

Эти параметры были сконфигурированы после ввода пароля при установке сервиса. Но они не понадобятся, так как вместо этого будет использоваться GPG-аутентификация. Закомментируйте строку «KEY»:

SOURCE: ANY;
OPEN_PORTS: tcp/22;   ### for ssh (change for access to other services)
# KEY: throw_away_password;
FW_ACCESS_TIMEOUT: 30;

Затем нужно внести некоторые дополнительные параметры, которые скажут сервису fwknop о GPG-ключах. Добавьте следующую информацию:

SOURCE: ANY;
OPEN_PORTS: tcp/22;   ### for ssh (change for access to other services)
# KEY: throw_away_password;
FW_ACCESS_TIMEOUT: 30;
REQUIRE_SOURCE_ADDRESS: Y;
DATA_COLLECT_MODE: PCAP;
GPG_REMOTE_ID: 99999999;                    ## Client key goes here
GPG_DECRYPT_ID: 11111111;                   ## Server key goes here
GPG_DECRYPT_PW: your_GPG_passphrase_here;   ## Place the GPG passphrase here
GPG_HOME_DIR: /home/test/.gnupg;            ## Path to your user's GPG directory. Usually
## this is in your user's home directory.

Убедитесь, что заменили значение строки «GPG_REMOTE_ID» идентификатором клиента, а значение «GPG_DECRYPT_ID» идентификатором сервера.

Кроме того, нужно внести фразовый пароль GPG и указать путь к каталогу «.gnupg» данного пользователя.

Сохраните изменения и закройте файл.

Создание правил IPTables

Теперь, задав новые конфигурации серверу fwknop, нужно создать несколько правил iptables. Для начала нужно закрыть порт (при необходимости сервис изменит это).

Во-первых, нужно позволить данное текущее соединение. Это правило подтвердит уже установленные соединения и связанные с ними данные:

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Сразу же после этого нужно запретить другие соединения к порту путем сбрасывания всех неопределенных попыток подключения:

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP

Теперь фаервол ограничивает доступ к этому порту, и можно перейти к настройке. Перезапустите fwknop-сервер, набрав:

sudo service fwknop-server restart

Теперь сервис fwknop будет отслеживать, совпадают ли входящие на сервер пакеты установленным правилам.

Подключение к серверу с клиента

Теперь, когда сервер настроен и запущен, нужно проверить, есть ли возможность подключиться к SSH-серверу с клиента. Поскольку зашифрованный пакет еще не был отправлен, время ожидания подключения будет превышено:

ssh root@server_domain_or_ip
ssh: connect to host server_domain_or_ip port 22: Connection timed out

Если не хотите ждать, можете нажать Ctrl-C.

Теперь можно отправить зашифрованный пакет для аутентификации на сервере. Это делается путем передачи команде fwknop ряда параметров:

  • A tcp/22: данная опция указывает протокол и порт, которые нужно открыть;
  • gpg-recip: данная опция указывает идентификатор GPG-ключа сервера;
  • gpg-sign: данная опция указывает идентификатор GPG-ключа клиента;
  • а: данный параметр говорит fwknop, какому IP-адресу позволен доступ. Это должен быть адрес клиента.
  • D: данный параметр сообщает команде место назначения отправляемого пакета. Это доменное имя или IP-адрес сервера.

Обладая всей необходимой в строке информацией, можете создать и отправить пакет:

fwknop -A tcp/22 --gpg-recip 11111111 --gpg-sign 99999999 -a client_ip_address -D server_domain_or_ip

Для дешифровки ключа будет запрошен фразовый пароль GPG. Затем пакет будет отправлен на сервер.

Если на данном этапе отправленный пакет был принят, у пользователя будет 30 секунд на то, чтобы установить SSH-подключение:

ssh root@server_domain_or_ip

Если все инструкции были выполнены верно, подключение к серверу должно быть успешно установлено.

Войдя на сервер после отправки пакета (и до того, как пройдет 30 секунд), можно увидеть новые добавленные правила, которые временно позволяют IP-адрес клиента:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N FWKNOP_INPUT
-A INPUT -j FWKNOP_INPUT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j DROP
-A FWKNOP_INPUT -s client_ip_address/32 -p tcp -m tcp --dport 22 -j ACCEPT

Утилита добавляет другую цепочку Iptables и фильтрует все входные данные с ее помощью. Затем она следит, чтобы подключение было установлено с машиной, отправившей пакет, и подтверждает его. В противном случае соединение сбрасывается.

Заключение

Посредством создания механизма аутентификации с помощью пакетов можно обеспечить дополнительный уровень безопасности при установлении подключения между серверами. Это позволит не только защитить SSH-сервер от случайных атак и атак методом подбора ключа, но и поможет определить вредоносный код в защищенных сервисах. Это обеспечит безопасность сервера во время устранения ошибок.

Хотя авторизация с помощью единственного крипто-пакета является сложной для многих пользователей темой, это отличный шанс усилить безопасность сервера. В сочетании с мерами безопасности SSH такая авторизация должна значительно обезопасить скрытые сервисы.

Tags: , , , , , , ,

Добавить комментарий