RoR: защита закрытого API - PullRequest
3 голосов
/ 03 марта 2009

У меня есть два приложения rails на отдельных виртуальных серверах, но на одном объекте. Оба приложения могут общаться через локальные IP-адреса.

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

1) Как проверить, откуда поступил запрос, и ограничить запросы только теми из этого местоположения?

2) Как вы думаете, это будет достаточно безопасно?

Мой инстинкт говорит мне, что это недостаточно безопасно из-за подмены IP-адресов, но я думаю, что OAuth или что-то вроде этого слишком жесткое для моих нужд. Хотя, может и нет.

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 03 марта 2009

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

Отвечая по порядку на две ваши проблемы:

  1. Настройте iptables для локальных интерфейсов, чтобы они принимали запросы, поступающие только на определенные порты, с определенных локальных IP-адресов (для лучшего понимания конфигурации iptables прочитайте учебное пособие .) Все другие виртуальные машины в локальной сети не должны быть в состоянии проверять вас, хотя они могут перехватывать ваш трафик (см. Ниже.)
  2. Нет; Вы должны использовать SSL для всех внутриузловых соединений . Это защитит вас двумя способами: во-первых, это защитит вас от подмены (злоумышленник будет отклонен, если у него нет вашего сертификата, даже если он обходит iptables путем подмены своего адреса или потому, что ваша конфигурация iptables перезаписана администратором), а во-вторых, это защитит ваши данные от посторонних глаз (например, злоумышленник не сможет отследить трафик для ваших паролей.) Некоторые приложения (например, большинство движков баз данных, net-snmpd, настроенные в режиме v3 и т. д.). ) Поддержка SSL изначально. В качестве альтернативы, установите и используйте ssh туннели или используйте stunnel

Пример базовой iptables конфигурации, позволяющей базовые службы (HTTP, SSH и т. Д.) На общедоступном (интернет) интерфейсе, а также позволяющую www1 и www2 подключаться к MySQL этого узла через порт 3306 на * Интерфейс 1029 * (www1 и www2 определены в /etc/hosts, поэтому они разрешаются на соответствующие IP-адреса.):

# * raw
#
#  Allows internal traffic without loading conntrack
# -A PREROUTING -i lo -d 127.0.0.0/8 -j NOTRACK

*filter

#  Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j DROP

#  Accepts all established inbound connections (TCP, UDP, ICMP incl. "network unreachable" etc.)
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allows all outbound traffic
#  You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allows SSH connections
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT

# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level debug

# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT

#  Allows MySQL within our cluster ONLY
-A INPUT -p tcp -s www1 -i eth0 --dport 3306 -j ACCEPT
-A INPUT -p udp -s www1 -i eth0 --dport 3306 -j ACCEPT
-A INPUT -p tcp -s www2 -i eth0 --dport 3306 -j ACCEPT
-A INPUT -p udp -s www2 -i eth0 --dport 3306 -j ACCEPT

COMMIT
1 голос
/ 03 марта 2009

Это на самом деле не похоже на вопрос Rails, это скорее вопрос веб-архитектуры. Я предполагаю, что обе машины доступны для внешнего мира через HTTP. Если это так, вы можете рассмотреть возможность установки брандмауэра перед обеими машинами, чтобы создать локальную сеть, в которой находятся две машины.

После того, как вы это сделаете, вы сможете настроить брандмауэр для запрета запросов на основе любых указанных вами критериев. Учитывая, что это приложение на Rails, я собираюсь предположить, что API - это набор ресурсов. В этом случае вы можете настроить брандмауэр для фильтрации запросов к частному API.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...