Автор: Artur Trinidade Anjos, artur@arsoft.pt, July 2002
Оригинальный документ
Перевод: KDV, 10.08.2002.
Содержание
- Введение
- Что такое ZeBeDee?
- Настройка ZeBeDee для работы с Firebird
- Использование приватных ключей
- Прозрачная работа в приложениях Delphi
- Замечания
- Дополнительная информация
Введение
При работе с Firebird через интернет возникает два вопроса: производительность и безопасность. Firebird не имеет ни встроенной поддержки для сжатия пакетов ip, ни возможности шифрования передаваемых данных. Открытие порта 3050 в интернет также достаточно опасно.
Решение этой проблемы можно найти в сторонних продуктах – это может быть программное решение, аппаратное, или оба вместе. Лично я искал решение, которое можно было использовать в распространяемых мной дистрибутивах Firebird, поэтому начал искать программное решение, которое может шифровать и сжимать данные tcp/ip. Открытое, и поддерживающее Linux и Windows решение, было бы идеальным и в духе Firebird. Я нашел ZeBeDee.
Что такое ZeBeDee?
ZeBeDee – это программа, которая обеспечивает шифрованный и сжатый "туннель" для данных TCP или UDP, передаваемых между двумя системами. ZeBeDee работает как на Windows, так и на Linux, бесплатна для коммерческого использования, и распространяется в соответствии с лицензией GNU.
Установка ZeBeDee проста: за несколько минут можно подсоединить сервер Firebird к интернету, причем соединения будут зажифрованы и сжаты.
Как говорит Neil Winton, разработчик ZeBeDee, существуют другие продукты, которые обеспечивают ту же функциональность, но ZeBeDee понравилась мне легкостью настроек, простотой, небольшим объемом и достаточной функциональностью.
ZeBeDee проста для понимания: сервер ZeBeDee обрабатывает соединения от клиентов ZeBeDee. Сервер шифрует данные, сжимает их, и пересылает клиенту. Клиент расшифровывает, распаковывает, и пересылает данные программе.
Настройка ZeBeDee для работы с Firebird
ZeBeDee "вклинивается" в передачу данных между двумя компьютерами. Это может быть использовано в различных ситуациях, но этот документ содержит описание такого использования с Firebird.
Серверу ZeBeDee не нужно находиться на том же компьютере, где и Firebird. Клиент ZeBeDee также не обязан быть там, где находится приложение, работающее с Firebird. Существует масса возможных комбинаций, но я выберу только две: ZeBeDee и Firebird на одной машине (вариант А) и на разных (вариант Б).
Также я предполагаю, что существует много удаленных клиентов, и клиент ZeBeDee будет один для всех. Это наиболее характерный случай при работе через Internet.
Существуют другие случаи, когда ZeBeDee может оказаться полезной, например, для соединения удаленных офисов к главному офису используя низкоскоростные линии. В таких случаях может быть очень удобным, когда клиент ZeBeDee находится на одной машине, при этом он обслуживает несколько клиентских машин этого офиса.
Лично я не использую вариант А, по двум причинам: для того чтобы исключить прямое соединение между Firebird и интернетом, и чтобы Firebird был на отдельном сервере. Если кто то захочет использовать такой вариант, то он должен закрыть порт 3050 от доступа из Internet. Если порт не закрыть, то он будет доступен для любых клиентов Firebird, которые захотят подключиться из интернета. Оставлять открытым лучше только тот порт, который нужен ZeBeDee (11965 по умолчанию).
Я использую вариант Б: ZeBeDee работает на машине, напрямую подключенной к интернету, и независимой от сервера Firebird. На машине с ZeBeDee в интернет должен быть открыт только ее порт (11965 по умолчанию).
Помните, что возможны варианты. Приведены лишь наиболее характерные случаи.
Для установки нужно скачать дистрибутив ZeBeDee. Причем можно использовать ZeBeDee под Linux для доступа клиентов Firebird на Windows. Самостоятельно ZeBeDee не конфигурируется – это нужно делать вручную.
ZeBeDee может стартовать с параметрами в командной строке или конфигурационном файле. Рекомендуется именно файл, но я сначала покажу два примера использования параметров комнадной строки.
Я тестировал все примеры на Linux Mandrake и W2K в качестве серверов ZeBeDee. Клиентские приложения как правило на Windows машинах (Win98/W2K). Я думаю, что все будет работать точно так же на любом другом Linux или Windows.
Также я привожу примеры, предполагая что компьютер с сервером ZeBeDee имеет выход в интернет (т.е. его IP доступен из интернета). Если вы хотите проверить все в локальной сети, то все достаточно просто: используйте ip-адрес компьютера с сервером ZeBeDee.
Вариант А)
На сервере ZeBeDee запустите:
ZeBeDee -s localhost:3050
На клиенте запустите:
ZeBeDee 3051:fbzbd.com:3050
(поменяйте fbzbd.com на имя вашего сервера). Теперь ZeBeDee готова к работе!
Для подсоединения к серверу Firebird используйте строку коннекта
localhost/3051:c:/dir/data.gdb
Примечание KDV. Принимать номер порта в строке коннекта может только gds32.dll от Firebird или Yaffil. Для Interbase можно попробовать на клиентском компьютере в файле SERVICES указать
gds_db 3051/tcp
То же самое можно сделать и для Firebird и Yaffil – в этом случае не нужно будет прописывать номер порта во всех строках коннекта.
Вариант Б)
В этом случае изменится только расположение сервера Firebird. Сервер ZeBeDee надо запустить как:
zebedee –s 3050:адрес_IP_вашего_сервера_firebird:3050
Команда для клиента точно такая же, как в варианте А. При этом fbzbd.com – имя сервера ZeBeDee, а не сервера firebird.
Это наиболее простой способ работы Firebird и ZeBeDee. Но я рекомендую использовать конфигурационные файлы, поскольку так больше контроля над параметрами ZeBeDee.
Конфигурационные файлы – обычные текстовые файлы, с расширением 'zbd'. ZeBeDee может использовать такие файлы в режиме сервера или клиента. Просто запустите:
ZeBeDee -f имя_конфигурационного_файла
Приводимые дальше примеры полностью рабочие, вам останется только скопировать текст из этого документа в ваши конфигурационные файлы.
Конфигурационный файл – серверы ZeBeDee и Firebird на одной машине
#-----------------------------------------------------------
# Config file to use on a Server running Firebird & ZeBeDee
#
verbosity 2 # тип сообщений
server true # режим сервера
detached true # без консоли
udpmode false # нам не нужен UDP
logfile './zebedee.log' # лог-файлы полезны
keygenlevel 2 # уровень ключей
# для проверки ключей, как упомянуто в следующем разделе,
# закомментируйте следующую строку и используйте
# любое имя файла
#checkidfile './clients.ids'
redirect none # никаких перенаправлений
# разрешить соединения Firebird
redirect 3050 # порт Firebird по умолчанию
targethost localhost # сервер на этой же машине
# другие параметры
compression zlib:9 # максимальное сжатие zlib
keylength 256 # длина ключа 256 бит
keylifetime 36000 # share keys last for 10 hours
maxbufsize 16383 # макс. размер буфера
#-----------------------------------------------------------------------
Конфигурационный файл – серверы ZeBeDee и Firebird на разных машинах
Все что нужно сделать в этом случае – изменить файл конфигурации. Строка
redirect 3050 # порт Firebird по умолчанию
должна быть:
redirect 3050:IP_адрес_вашего_сервера_Firebird:3050 # порт Firebird
Также надо разрешить ZeBeDee общаться с сервером Firebird:
targethost IP_адрес_вашего_сервера_Firebird
Конфигурационный файл – клиент ZeBeDee
#----------------------------------------------------------
# Config File - Client
#
verbosity 1 # только базовые сообщения
server false # режим клиента
detached true # без консоли
# нужно изменить следующую строку в соответствии
# с вашей конфигурацией.
# Вы можете сменить порт 3051 на любой другой
tunnel 3051:fbzbd.com:3050
# если используются ключи, раскомментируйте
# следующую строку, и укажите имя файла в соответствии
# с именем клиента, если нужно
# include './myclient.key'
#--------------------------------------------------------------
Использование приватных ключей
В приведенных примерах не используются приватные ключи. Тем не менее, ZeBeDee шифрует данные, используя ключ, создаваемый в момент коннекта. Но, никакой аутентификации при этом не происходит.
Если вы не используете приватные ключи, то ZeBeDee просто шифрует данные между двумя точками, при этом разрешая соединение с сервером любых клиентов ZeBeDee. Но даже без приватных ключей ZeBeDee снимает проблему открытости пакетов при использовании 'sniffer' (просмотрщика пакетов) – шифрование идет с самого начала, и username вместе с путем и именем базы данных будет зашифрован, значительно затрудняя работу потенциального взломщика.
Если вы хотите, можно использовать приватные ключи. При этом на сервере ZeBeDee включится аутентификация, позволяющая соединяться только тем клиентам, у которых есть файл ключа.
Для создания ключа используйте команду:
ZeBeDee -p
Вы получите нечто вроде
privatekey "410dea0cbd9c10da057848c43a610f6bb859b769"
Результат будет разный при каждом выполнении команды, поэтому при повторах лучше перенаправлять вывод в файл:
ZeBeDee -p >myclient.key
Файл ключа должен тщательно оберегаться. При помощи этого ключа нужно создать fingerprint:
ZeBeDee -P -f myclient.key >myclient.id
При этом в файле myclient.id окажется примерно следующее:
135f04050961d37553731250d5c6f7495f088b32 myclient
Текст 'myclient' просто примечание, позволяющее помнить ссылку на оригинальный ключ. Вы можете изменить это имя на более приличное, например, Boss_Computer.
Теперь нужно изменить файл конфигурации клиента ZeBeDee и добавить в нем строку:
include "path-to-dir/myclient.key"
где "path-to-dir" – это каталог, где находится файл ключа (myclient.key).
Другими словами, данные myclient.id используются любым сервером ZeBeDee для аутентификации клиента, имеющего ключ в myclient.key.
Типичный файл, содержащий все идентификаторы, выглядит так:
ba077f6a42bea502f517cab5685e476a713d9621 Lydia’s Computer
3ad38cb1f16957d5c535272ce27557bdaa4389c6 John’s Computer
135f04050961d37553731250d5c6f7495f088b32 Rachel’s Computer
На сервере ZeBeDee нужно в файл конфигурации добавить строку:
checkidfile "path-to-dir/clients.ids"
(Файл clients.ids содержит строки из всех файлов myclient.id, которым разрешено соединяться с сервером ZeBeDee).
Теперь, если клиент без ключа попытается соединиться с сервером, то аутентификация не пройдет, и сервер откажет клиенту в соединении.
Прозрачная работа в приложениях Delphi
Если нужно, то можно прямо в приложении запускать клиента ZeBeDee до коннекта к серверу Firebird следующим образом:
WinExec( “ZeBedee 3051: ZeBeDeeServerAddress:3050’, 0 );
Не забыв изменить строку коннекта к базе данных на localhost/3051 вместо имени сервера Firebird.
Замечания
По безопасности коммуникаций в сети написано очень много книг. Я не упомяну ни одной – я разработчик, использующий Firebird, а не специалист по безопасности.
Важным свойством ZeBeDee для интернет-решений является возможность сжатия пакетов. В клиент-серверных приложениях часто передаются большие объемы данных, например, для отчетов – для интернета это будет очень неэффективно и медленно.
Вы можете попробовать ZeBeDee просто для уменьшения сетевого трафика даже в 10Мбит локальной сети. Но 99% случаев вы вряд ли получите какой-либо выигрыш. Время на сжатие-распаковку данных убьет всю выгоду от сжатия (KDV: можно попробовать коэффициенты сжатия менее 9. См. параметр compression zlib:9). Однако наличие шифрования, даже без ключей, может вполне оказаться полезным.
Дополнительная информация
Firebird – великолепный сервер баз данных с открытым кодом:
ZeBeDee находится по адресу:
http://www.winton.org.uk/zebedee
Artur Trindade Anjos
artur@arsoft.pt
Julho de 2002
Перевод впервые опубликован на www.ibase.ru.