Советы и рекомендации по управлению доступом - ACL - установка отрицательных ролей для пользователей, которые атакуют сайт - PullRequest
4 голосов
/ 10 ноября 2009

КОНТЕКСТ

Я только что читал о Zend ACL http://framework.zend.com/manual/en/zend.acl.html

ВОПРОС

Я запускаю три приложения Zend на одном сервере.

  • My Front End App
  • Приложение My Front-Members
  • My Back End App (администратор владельца сайта)

В приложениях я рассматриваю два типа ACL.

  • Application Wide ACL - «ACL приложения» имеют только «доступ» (или, может быть, называют его «чтение» (или даже «SendHTTPRequests»))
  • Учетная запись - оставляя все остальные разрешения отдельным '' ACL's учетной записи ''

Я думаю, это облегчит блокировку спамеров и других атакующих

if (UserActivityScoresHighProbabilityOfHacking_Specification->IsSatisfiedBy(User))
 {
 User->addrole(Attacker)
 }

Возможно, с правилами что-то вроде этого:

Контроль доступа к моему внешнему приложению

  • Имя = Атакующий
  • Уникальные разрешения = НЕТ
  • Наследовать разрешения от = N / A

  • Имя = Гость
  • Уникальные разрешения = SendHTTPRequests
  • Наследовать разрешения от = N / A

  • Имя = Участник
  • Уникальные разрешения = SendHTTPRequests
  • Наследовать разрешения от = Гость

  • Имя = Администратор
  • Уникальные разрешения = (ВСЕ разрешения)
  • Наследовать разрешения от = N / A

В других приложениях будут более строгие правила, запрещающие доступ гостям и т. Д.


Итак, вопрос, на который нужно ответить:

Является ли назначение роли «атакующий» (отрицательная роль) пользователю разумной вещью?

Или это противоречит общепринятой практике?

Ответы [ 4 ]

4 голосов
/ 17 декабря 2009

Существует два основных принципа использования ACL:

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

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

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

2 голосов
/ 12 ноября 2009

После пары дней размышлений ... вот мой ответ на мой вопрос выше:

Является ли назначение роли «атакующий» (отрицательная роль) пользователю разумной вещью?

Мой ответ:

Нет, это очень глупо.

Почему

Помимо вопросов, изложенных Коеном и Робертом Харви.

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

Я имею в виду «положительный» в смысле:

  • «пусть кто-то что-то делает, только если он играет эту роль»

В отличие от «отрицательного» в смысле:

  • «пусть кто-то что-то делает, только если он НЕ играет эту роль»

Поэтому, если вы собираетесь добавить роль для определения «хакера», было бы лучше сохранить ее в позитиве (отрицая негатив) - то есть «НЕ хакер». Или перефразировать это rolename: '' FriendlyUser ''

Все положительные:

  • + Role1: FriendlyUser
  • + Role2: Гость
  • + Role3: Member
  • + Role4: Admin

В отличие от смешанного:

  • - Роль 1: Хакер
  • + Role2: Гость
  • + Role3: Member
  • + Role4: Admin

Второй список ролей гораздо более запутанный.

1 голос
/ 10 ноября 2009

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

deny user access when user has property/behavior X

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

Я думаю, что вам лучше всего взглянуть на утверждение в правилах:

http://framework.zend.com/manual/en/zend.acl.advanced.html

В зависимости от ваших конкретных потребностей это может быть хорошим решением.

изменить: ответить на комментарий -> Я ценю то, что вы делаете. Я думаю, что это указывает на то, почему RBAC будет заменен более мощными средствами управления доступом, такими как управление доступом на основе атрибутов. Это позволит правилам основываться на атрибутах пользователей и контролируемых объектов / ресурсов. В идеале вы хотите, чтобы контроль доступа имел как можно больше логики принятия решения. Когда вы неявно назначаете роли пользователям, некоторые из решений будут приниматься вне контроля доступа (например, какой пользователь будет администратором, в основном определяется тем, кто владеет сайтом). Но вы хотите минимизировать принятие решений вне acl, потому что это добавляет уровень доступа, который не контролируется acl. Таким образом, решение о том, кто будет играть определенную роль, часто подразумевается и за пределами ACL. Но все же это контроль доступа, определяемый некоторой логикой, и лучше всего хранить в программе столько же логики, которая отвечает за обработку этого домена. Надеюсь, что этот бессмысленный разговор имеет смысл: -)

1 голос
/ 10 ноября 2009

Нередко пользователи разделяют общий IP-адрес, поэтому я не уверен, насколько практично запретить пользователей по IP.

Если это заполненные формы, спамеры лучше всего останавливать с помощью капчи.

...