Ограничение доступа к REST API администратора SyncGateway

Согласно документация Admin REST API SyncGateway не должна быть раскрыта.

Цитировать:

По умолчанию Admin REST API работает на порту 4985 (если вы не измените параметр конфигурации adminInterface). Не открывайте этот порт — он защищен вашим брандмауэром. Любой, кто может подключиться к этому порту, имеет свободный доступ и контроль над вашими базами данных и учетными записями пользователей.

Это имеет смысл, но мне интересно, как я могу предоставить своему серверу приложений, который работает на Google AppEngine и который обрабатывает регистрацию/создание сеансов доступа к API, не раскрывая его? Есть ли возможность предоставить REST API администратора, но ограничить доступ к определенному серверу, отправляющему запрос или требующему комбинацию имени пользователя и пароля, например, GUI на порту :8091?

Редактировать

Просто для уточнения я добавляю свой комментарий к вопросу:

Сервер приложений (работающий на GAE) и сервер Couchbase (работающий на DigitalOcean) — это два разных физических устройства и, следовательно, имеют разные IP-адреса. Означает: я не могу изменить параметр конфигурации adminInterface в моем syncgateway_config.json на адрес обратной связи, так как подключение с моего сервера GAE к серверу Couchbase впоследствии не будет иметь никакого эффекта. Сервер был бы недоступен извне, если я не ошибаюсь?!


person user3420815    schedule 27.01.2016    source источник


Ответы (5)


Обычно ожидается, что ваш сервер базы данных и другие серверы, которым требуется доступ на уровне администратора, будут либо на одном хосте, либо во внутренней сети, защищенной брандмауэром. В последнем случае можно смело привязывать порт администратора к внутренней сети. Тогда, конечно, правила вашего брандмауэра разрешат внешние подключения только к общедоступному порту Sync Gateway (SG).

Если у вас есть сервер аутентификации, который находится в совершенно другой сети, все становится немного сложнее.

Одна из возможностей — использовать более сложные параметры брандмауэра, чтобы разрешить внешний доступ к порту администратора, но только с внешнего сервера аутентификации. Я могу представить себе несколько способов сделать это: (а) жестко закодировать только IP-адрес сервера аутентификации, (б) использовать SSL-соединение с сертификатом клиента или (в) открыть туннель SSH от сервера аутентификации к серверу SG.

Другая возможность — использовать распределенную систему аутентификации, такую ​​как OAuth, которая предназначена именно для таких вещей. Таким образом, ваше мобильное приложение будет обращаться к серверу аутентификации, чтобы получить токен, а затем представить токен SG, который затем покажет токен серверу аутентификации для его проверки. IIRC, у нас пока нет поддержки OAuth общего назначения в SG, поэтому вам нужно будет написать небольшой обработчик OAuth для запуска на сервере SG, который будет выполнять эту работу.

[Отказ от ответственности: я архитектор в Couchbase и работал над Sync Gateway, но в настоящее время я работаю только над Couchbase Lite, поэтому я не эксперт по текущим возможностям SG!]

person Jens Alfke    schedule 01.02.2016
comment
Кстати, существует существующая проблема Sync Gateway, запрашивающая аутентификацию для API администратора, точно ситуации, подобные вашей. Не стесняйтесь добавлять краткие комментарии +1 / палец вверх. - person Jens Alfke; 01.02.2016
comment
Спасибо за исчерпывающий ответ. После проверки параметров, которые вы упомянули, кажется, что лучшая идея - переместить мой сервер приложений на тот же хост, что и сервер диванной базы. SSH-туннелирование в GAE кажется невозможным, а кодирование IP-адреса невозможно, поскольку оно является динамическим в GAE. Я обязательно добавлю +1 к проблеме Github — спасибо, что упомянули об этом. - person user3420815; 05.02.2016

Что ж, новая информация в ваших комментариях должна быть рассмотрена. Я не эксперт в этой области, но я думаю, что предполагается, что служба аутентификации и шлюз синхронизации работают на одном сервере. Если нет, все становится немного сложнее, но я думаю, что это можно сделать, изменив раздел adminInterface конфигурации вашего шлюза синхронизации, указав внутренний IP-адрес и порт (например, 192.168.3.2:4985).

person borrrden    schedule 31.01.2016
comment
Спасибо за Ваш ответ. Я только что добавил свой комментарий к вопросу. Дополнительный вопрос: 192.168.3.2:4985 — это петлевой адрес, не так ли? Это сделало бы Admin REST API недоступным извне. - person user3420815; 31.01.2016
comment
Это не петлевой адрес, это адрес локальной сети (пример один). Вы не должны получать доступ к серверу из-за пределов локальной сети через порт администратора. Например, когда вы настраиваете экземпляр amazon, вы получаете внешний адрес и внутренний адрес, чтобы вы могли поддерживать связь между вашими экземплярами amazon, но не разрешать такое же общение для публики. - person borrrden; 31.01.2016
comment
Ok. Итак, в заключение это означает, что невозможно запустить AppServer и Couchbase Server на двух разных провайдерах/серверах? - person user3420815; 31.01.2016
comment
Я не знал, что это два совершенно разных независимых провайдера. В этом случае я не думаю, что вы можете многое сделать. Они могут быть на разных серверах, разном оборудовании, но обязательно, чтобы они были в одной сети. Нет встроенного способа аутентификации запросов к порту администратора. Возможно, вы сможете настроить прокси-сервер для аутентификации и пересылки запросов на Sync Gateway, но я думаю, что было бы проще переместить все к одному и тому же провайдеру. Я уточню у знающих людей, чтобы убедиться, что я говорю правильно. - person borrrden; 01.02.2016
comment
Спасибо за ваши усилия. Я думаю, что Йенс Альфке изложил в своем ответе все варианты, которые у меня есть. Кажется, что перенести все к одному и тому же провайдеру — действительно лучший вариант. - person user3420815; 05.02.2016

Вы можете установить http-прокси в той же локальной сети, что и Sync Gateway, например. нгинкс.

Вы должны настроить nginx для приема общедоступных SSL-соединений, аутентифицированных с использованием сертификатов на стороне клиента.

Настройте Sync Gateway так, чтобы он принимал административные подключения только из локальной сети, к которой открыт общий доступ с nginx.

Настройте свой сервер приложений для использования сертификата на стороне клиента при подключении к Sync Gateway через nginx.

Здесь есть хороший блог, посвященный настройке клиентского сертификата nginx: http://nategood.com/client-side-certificate-authentication-in-ngi

person ajres    schedule 01.02.2016

Рекомендуется обернуть то, что вам нужно, в службу аутентификации. Этот пост в блоге очень хорошо объясняет, как это сделать: http://ti.eng.br/configuring-your-very-first-couchbase-mobile-sync-backend/

person Laurent Doguin    schedule 27.01.2016
comment
Что ж, у меня уже есть служба аутентификации или сервер приложений (называйте как хотите). Проблема: сервер приложений (работающий на GAE) и сервер Couchbase (работающий на DigitalOcean) — это два разных физических устройства и, следовательно, имеют разные IP-адреса. Означает: подключение к localhost:4985/syncgateway не повлияет на мой сервер GAE. Может быть, я просто не понимаю, но, может быть, вы можете уточнить, как это должно / могло бы работать? Спасибо. - person user3420815; 27.01.2016

Этот момент упоминается в документации (Если я правильно понял вопрос). В разделе Управление доступом к API на странице Администрирование REST API.

Цитируя тот раздел, который содержит ответ на ваш вопрос:

Доступ к API осуществляется через разные TCP-порты, что упрощает доступ к API REST синхронизации на порту 4984 для конечных точек, сохраняя при этом REST API администратора на порту 4985 в безопасности за брандмауэром.

Если вы хотите изменить порты, вы можете сделать это в файле конфигурации.

Чтобы изменить порт Sync REST API, задайте свойство интерфейса в файле конфигурации.

Чтобы изменить порт Admin REST API, задайте свойство adminInterface в файле конфигурации.

Значением свойства является строка, состоящая из двоеточия, за которым следует номер порта (например, :4985). Вы также можете добавить имя хоста или числовой IP-адрес перед двоеточием, чтобы выполнить привязку только к сетевому интерфейсу с этим адресом.

В качестве полезного частного случая IP-адрес 127.0.0.1 привязывается к интерфейсу обратной связи, делая порт недоступным для любого другого хоста. Это настройка по умолчанию для интерфейса администратора.

Жирным шрифтом указано, что вы можете указать IP и порт, чтобы привязать его к конкретной сети.

Я думаю, это то, что вам нужно.

person kirtan403    schedule 05.02.2016
comment
Спасибо. Я это уже читал. Насколько я знаю, это в основном означает, что я могу изменить адрес, который прослушивает REST API (например, на порту 1337 вместо 4985), но я не думаю, что это позволит мне привязать его к любой другой внешней сети. - person user3420815; 05.02.2016
comment
Я думаю, вы можете указать имя хоста перед портом. - person kirtan403; 05.02.2016
comment
да, но на самом деле только внутренние IP-адреса - см. ответ borrrden. - person user3420815; 06.02.2016