gimntut / Informant

The server publishing information in the local network

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Informant - Сервер информации для локальной сети

Задача сервера - делиться информацией о других серверах в локальной сети

Это как DHCP, но для программ, а не для компьютеров

Сервер состоит из двух частей:

  • веб-сервер -- предназначен для публикации информации и управление настройками
  • сервер оповещения -- предназначен для первичного обнаружения Informant

Получение информации

Рассмотрим работу Informant на примере взаимодействия вымышленных клиентов и сервера резервных копий "hlBackup" (в реальности hlBackup не вымышленный продукт, а просто не находится в общем доступе).

При запуске клиенту необходимо знать по какому адресу находится сервер. Если клиент не знает адреса сервера или по известному адресу сервер не обнаружен, то клиент отправляет в сеть широковещательный запрос по адресу 255.255.255.255:19450 в котором должен сообщить серверу:

{ 
"needService": "hlBackup",
"returnProtocol": "http",
"returnPort":2000,
"returnWebHook":"/path/service/?address={{address}}",
}

needService нужен для того, чтобы не откликались серверы Informant, которые не знают ни чего hlBackup.

Возможна ситуация, когда злоумышленник разместит в сети свой сервер Informant, чтобы подменить информацию о серверах. Чтобы этого избежать, клиент всегда отдаёт предпочтение ip-адресу с наименьшим адресом. Задача администратора, стараться использовать только один сервер Informant на компьютере с наименьшим возможным адресом для данной локальной сети.

Сервер Informant отправляет информацию о себе на адрес клиента по указанному протоколу. Возможны следующие протоколы:

  • http
  • https
  • socket

В данном примере, придёт ответ по адресу http://192.168.0.33:2000/path/service/?address=http%3A%2F%2F192.168.0.2%2Finformant%2Fapi%3FneedService%3D%7B%7BneedService%7D%7D, где:

  • 192.168.0.33 -- адрес с которого пришёл широковещательный запрос
  • 2000 -- returnPort
  • address=http%3A%2F%2F192.168.0.2%2Finformant%2Fapi%3FneedService%3D%7B%7BneedService%7D%7D -- заполненный returnWebHook
  • http://192.168.0.2/informant/api?needService={{needService}} -- адрес который должен использоваться для получения информации о needService

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

Далее клиент hlBackup обращается по указанному адресу, получает настройки для informant, а потом для hlBackup

Примечание. В данном примере и клиент, и сервер hlBackup знают как работать с Informant. В большинстве случаев это не так, поэтому существует утилита informant-reader, который умеет получать информацию от сервера и передавать его скрипту или программе, который в свою очередь использует эту информацию для настройки клиентских программ. Например, сайт на php сможет быстро находить свой сервер MySQL:

informant-reader -s MySQL -o mysql.json init-php.sh

Примечание. Иногда бывает необходимо, чтобы настройки содержали пароли для доступа к серверу. Администратор должен позаботится о том, чтобы между клиентским компьютером и сервером Informant был установлен сеанс доверия. Установка сеанса доверия сложная процедура, для которой необходимо значительно больше информации, чем можно передать простым get-запросом. К счастью, Informant умеет предоставлять полную информацию о себе так же как и о других (см. ниже).

Публикация информации

Информация которую получает клиент не зависит от Informant. Это может быть любой файл, как правило, текстовый в форматах json, yaml, ini, xml. Он должен быть опубликован сервером предоставляющим доступ, но не всякий сервер это умеет, поэтому публикацию можно осуществить специальной утилитой:

informant-publish -s MySQL -f settings.json -n json -u user -p password
informant-publish -s contacts -f contacts.json -u user -p password --allowread All
  • MySQL -- имя сервиса
  • settings.json -- файл настроек для доступа к сервису
  • json -- имя настроек
  • user и password -- имя и пароль администратора Informant, соответственно
  • All -- группа, которой разрешено чтение настроек

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

Имя настроек является не обязательным параметром. По умолчанию оно равно 'default'.

# Три эквивалентные записи чтения настроек
informant-read -s MySQL -o mysql.settings
informant-read -s MySQL -n default -o mysql.settings
informant-read -s "MySQL/default" -o mysql.settings

# Пример для php
informant-read -s "MySQL/php" -o db.settings.php

# Пример получения настроек конкретного сайта
informant-read -s "MySQL/site1.php" -o db.settings.php
informant-read -s "MySQL/site2.nodejs" -o db.settings.js

Управление правами

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

# Установление доверия между текущим пользователем и сервером Informant
informant-trust -u user -p password -n newusername -s server
  • user и password -- имя пользователя и пароль администратора Informant
  • newusername -- имя под которым будет известен локальный пользователь в Informant
  • server -- имя сервера Informant. Необязательный параметр

Доверие гарантируется паролем администратора. Установка сеанса доверия подразумевает обмен открытыми ключами текущего пользователя и сервера Informant. Таким образом, распределив запуск клиентов между разными пользователями, можно гарантировать, что скомпрометировав одного клиента (например сайт на php), не удастся получить секретные сведения предназначенные для другого сервиса.

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

#
informant-group --add -g groupname -U username1 ... -G groupname2 ...
informant-group --delete -g groupname -U username1 ... -G groupname2 ...
informant-group --grouplist
informant-group --userlist
informant-group --userlist -g groupname
informant-group --allow --read -g groupname -S servicename1 servicename2 ...
informant-group --deny --read -g groupname -S servicename1 servicename2 ...
informant-group --reset --read -g groupname -S servicename1 servicename2 ...
informant-group --allow --publish -g groupname -S servicename1 servicename2 ...
informant-group --deny --publish -g groupname -S servicename1 servicename2 ...
informant-group --reset --publish -g groupname -S servicename1 servicename2 ...

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

About

The server publishing information in the local network

License:MIT License


Languages

Language:Python 100.0%