Это для веб-девелоперов, остальным неинтересно будет.
Как известно, у веб-девелоперов случаются ошибки, в результате чего в приложениях появляются уязвимости. Вопрос у меня о том, как можно дополнительно превентивно от этих уязвимостей защититься на уровне разграничения прав доступа в базе данных.
Вот в файловой системе как – приложение, конечно, может и само проверять, надо ли позволять текущему пользователю выполнять ту или иную операцию с файлом или директорией, но администратор системы дополнительно устанавливает права на чтение/запись/…, которые приложение обойти не может.
А в веб-приложениях, работающих с базой, обычно все операции выполняются от имени одного пользователя, и разграничение полномочий целиком возлагается на приложение. Поскольку обычно этому пользователю разрешены операции модификации данных в базе, то при эксплуатации уязвимостей хакер имеет возможность поменять не только “пользовательские” данные (скажем, содержание текстов на сайте), но и “системные” (например, шаблоны, привилегии веб-пользователей и прочие, которые нормально подлежат редактированию только администраторами сайта).
Вопрос: а что мешает веб-приложению, работающему в “режиме обычного пользователя” и в “режиме администратора сайта” подключаться к базе от имени разных пользователей, которым назначены разные привилегии – первому поменьше, второму побольше? Чтобы хакер, работающий с приложением в первом режиме, в принципе не имел возможности поменять “системные” данные.
Я никаких принципиальных ограничений не вижу, кроме небольшого усложнения приложения и необходимости разделения данных на две группы и более тонкой настройки прав в базе.
Понятно, что это не панацея, но как дополнительная мера защиты покатит. Но я ни в одном распространенном движке для веб-приложений такого не видел. Кто-нибудь такие знает?
P.S. Про Windows Integrated Authentication в IIS я в курсе, но у него область применения довольно узкая. Если его включить, то придётся всех пользователей заводить на уровне ОС. Для публичных веб-приложений с большим количеством пользователей это неприемлемо.
Оригинал этой записи. Комментировать можно тут или там.
no subject
хотя редко, да :(
no subject
no subject
no subject
no subject
no subject
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Во-вторых, за лишние пользовательские лицензии жадные вендоры хотят _очень_ много денег.
В-третьих, заведение пользователей на уровне ОС не сильно отличается по геморойности от заведения пользователей на уровне БД.
В-четвёртых, это напрочь убивает persistent database connections. После генерации каждой страницы коннект надо закрывать. Иначе можно сломать выбор коннекта из пула, получить коннект другого пользователя, и мы получим ту же самую систему с одним пользователем, но со всеми вышеперечисленными недостатками.
no subject
2) не понял. какие вендоры, какие лицензии? обычный LAMP для веб-форумов, или там, блогов.
3) на уровне базы я предлагаю завести только двух пользователей: непривилегированный web_user и привилегированный web_admin.
4) пул держать только для непривилегированного пользователя. для нечастых административных операций открывать отдельные коннекты по мере надобности и закрывать после использования
no subject
Но опять же - ну чего ты хочешь от пхп-программистов?
(no subject)
(no subject)
(no subject)
no subject
no subject
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Это я к тому, что как сдизайнишь, так и будет. Требуй передачи авторизационного тикета в процедуру, как обязательного параметра, и будет возможность проверить его для любого вызова. Неудобно, зато безопасно.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
Равно как и разграничение прав на уровне БД.
no subject
(no subject)
(no subject)
(no subject)
no subject
no subject
Хотя в MySQL Это давно есть.
И когда я писал веб-приложения я это активно использовал -- анонимус на форуме подключался пользователем только для чтения, залогинившийся -- с правами записи на таблицу messages, админ -- с правами на всю базу, модератор -- с правом DELETE в messages. Хотя, как ты правильно заметил, не панацея, так как теоретичесик модератор одного раздела мог снести все, потому что таблица messages -- одна. И ещё это не очень хорошо для пулинга
соединений к базе.
Да что говорить -- моя домашняя система обработк логов апача имеет 4 пользователя а не одного -- сам logger, нормализатор, интегратор, лочиститель. Это разные компоненты и у них даны минимальные потребные права.
no subject
вот, у тебя правильно построенная система, ибо не следует давать пользователю больше прав, чем ему действительно нужно :)
no subject
А как быть с такими сценариями, как "пользователь добавил контент на сайт" (например, комментарий) и "пользователь зарегистрировался"?
no subject
no subject
no subject
И как же будет грустно, когда во время транзакции прийдется поднять права!
no subject
а вот почему никто из фреймворков этого не умеет - в том и вопрос..
(no subject)
(no subject)
(no subject)
(no subject)