Friday, June 19th, 2009 08:31 am

Это для веб-девелоперов, остальным неинтересно будет.

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

Вот в файловой системе как – приложение, конечно, может и само проверять, надо ли позволять  текущему пользователю выполнять ту или иную операцию с файлом или директорией, но администратор системы дополнительно устанавливает права на чтение/запись/…, которые приложение обойти не может.

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

Вопрос: а что мешает веб-приложению, работающему в “режиме обычного пользователя” и в “режиме администратора сайта” подключаться к базе от имени разных пользователей, которым назначены разные привилегии – первому поменьше, второму побольше? Чтобы хакер, работающий с приложением в первом режиме, в принципе не имел возможности поменять “системные” данные.

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

Понятно, что это не панацея, но как дополнительная мера защиты покатит. Но я ни в одном распространенном движке для веб-приложений такого не видел. Кто-нибудь такие знает?

P.S. Про Windows Integrated Authentication в IIS я в курсе, но у него область применения довольно узкая. Если его включить, то придётся всех пользователей заводить на уровне ОС. Для публичных веб-приложений с большим количеством пользователей это неприемлемо.

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Friday, June 19th, 2009 07:47 am (UTC)
Делают так, делают

хотя редко, да :(
Friday, June 19th, 2009 07:53 am (UTC)
Альтернативный вариант - хранимыми процедурами, но архитектуру придется проектировать самому.
Friday, June 19th, 2009 09:01 am (UTC)
http://dil.livejournal.com/825912.html?thread=5482296&format=light#t5482296
Friday, June 19th, 2009 07:57 am (UTC)
С учетом того, что хостингов, кроме вдс, позволяющих такое сделать - около нуля - нет и поддержки со стороны приложений.
Friday, June 19th, 2009 07:59 am (UTC)
вот-вот, кто ж тебе даст хотя бы и двух пользователей создать?
Friday, June 19th, 2009 08:01 am (UTC)
Вот кстати о - у нас шаред хостинговых клиентов где-то около 300 с хвостиком и за пять лет раздельные права для баз просил только один, на сколько я помню.

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:02 am (UTC) - Expand

(no subject)

[identity profile] knutov.livejournal.com - 2009-06-19 09:03 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:04 am (UTC) - Expand

(no subject)

[identity profile] knutov.livejournal.com - 2009-06-19 09:07 am (UTC) - Expand
Friday, June 19th, 2009 09:02 am (UTC)
не понял. а кто не даёт?

(no subject)

[identity profile] dmarck.livejournal.com - 2009-06-19 09:05 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:06 am (UTC) - Expand

(no subject)

[identity profile] dmarck.livejournal.com - 2009-06-19 09:09 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:12 am (UTC) - Expand

(no subject)

[identity profile] dmarck.livejournal.com - 2009-06-19 09:15 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:43 am (UTC) - Expand

(no subject)

[identity profile] mcjabberwock.livejournal.com - 2009-06-20 10:12 am (UTC) - Expand
Friday, June 19th, 2009 07:59 am (UTC)
Во-первых, далеко не все базы предоставляют разграничение доступа на уровне отдельных записей в таблицах. Это о "своих данных".

Во-вторых, за лишние пользовательские лицензии жадные вендоры хотят _очень_ много денег.

В-третьих, заведение пользователей на уровне ОС не сильно отличается по геморойности от заведения пользователей на уровне БД.

В-четвёртых, это напрочь убивает persistent database connections. После генерации каждой страницы коннект надо закрывать. Иначе можно сломать выбор коннекта из пула, получить коннект другого пользователя, и мы получим ту же самую систему с одним пользователем, но со всеми вышеперечисленными недостатками.
Friday, June 19th, 2009 08:59 am (UTC)
1) я про разграничение прав на уровне таблиц, а не отдельных записей. в таблицу "post" пользователь web_user писать может, а в таблицу "templates" - нет, только читать. а писать туда может web_admin.

2) не понял. какие вендоры, какие лицензии? обычный LAMP для веб-форумов, или там, блогов.

3) на уровне базы я предлагаю завести только двух пользователей: непривилегированный web_user и привилегированный web_admin.

4) пул держать только для непривилегированного пользователя. для нечастых административных операций открывать отдельные коннекты по мере надобности и закрывать после использования

Friday, June 19th, 2009 09:53 am (UTC)
А. Это тема, конечно, но на хостингах отдельных пользователей Не Дают, как тебе уже писали выше :)

Но опять же - ну чего ты хочешь от пхп-программистов?

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 10:03 am (UTC) - Expand

(no subject)

[identity profile] dma.livejournal.com - 2009-06-19 10:49 am (UTC) - Expand

(no subject)

[identity profile] blacklion.livejournal.com - 2009-06-19 11:04 am (UTC) - Expand
Friday, June 19th, 2009 08:22 am (UTC)
Хранимые процедуры и виды - решают. Всё уже придумано.
Friday, June 19th, 2009 09:00 am (UTC)
что они решают? если пользователь с точки зрения базы один и тот же, он может запускать все эти хранимые процедуры, включая административные
Friday, June 19th, 2009 09:02 am (UTC)
Пользователь может запускать только то, что ему можно.

(no subject)

[identity profile] dmarck.livejournal.com - 2009-06-19 09:07 am (UTC) - Expand

(no subject)

[personal profile] sanmai - 2009-06-19 09:11 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:15 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:08 am (UTC) - Expand

(no subject)

[personal profile] sanmai - 2009-06-19 09:10 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:14 am (UTC) - Expand
Friday, June 19th, 2009 09:10 am (UTC)
А пользователь ОС может вызывать все функции, включая административные, код с точки зрения ОС один и тот же :)

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

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 09:22 am (UTC) - Expand

(no subject)

[identity profile] dma.livejournal.com - 2009-06-19 09:55 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 10:02 am (UTC) - Expand

(no subject)

[identity profile] scarabeus.livejournal.com - 2009-06-20 12:32 pm (UTC) - Expand

(no subject)

[identity profile] dma.livejournal.com - 2009-06-20 08:06 pm (UTC) - Expand

(no subject)

[identity profile] scarabeus.livejournal.com - 2009-06-21 06:45 am (UTC) - Expand

(no subject)

[identity profile] dma.livejournal.com - 2009-06-21 06:48 am (UTC) - Expand

(no subject)

[identity profile] scarabeus.livejournal.com - 2009-06-21 07:05 am (UTC) - Expand

(no subject)

[identity profile] 1master.livejournal.com - 2009-06-19 11:59 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 12:01 pm (UTC) - Expand

(no subject)

[identity profile] 1master.livejournal.com - 2009-06-19 12:07 pm (UTC) - Expand

(no subject)

[identity profile] 1master.livejournal.com - 2009-06-19 12:07 pm (UTC) - Expand
Friday, June 19th, 2009 09:54 am (UTC)
Они решают проблему job security того, кто написал процедуры.
Friday, June 19th, 2009 09:59 am (UTC)
Хранимые процедуры и виды работают только для очень простых структур данных.
Равно как и разграничение прав на уровне БД.
Friday, June 19th, 2009 10:58 am (UTC)
как связана сложность данных с разграничением прав?

(no subject)

[identity profile] alexkuklin.livejournal.com - 2009-06-19 11:16 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-06-19 11:20 am (UTC) - Expand

(no subject)

[identity profile] alexkuklin.livejournal.com - 2009-06-19 11:28 am (UTC) - Expand
Friday, June 19th, 2009 10:04 am (UTC)
Проблема в том, что на большинстве публичных сервисов наибольшую ценность представляют не шаблоны и настройки - а контент созданный теми же пользователями. Так что, в первую очередь, нужно изолировать пользователей друг от друга.
Friday, June 19th, 2009 10:57 am (UTC)
Обычно мешает не очень богатая система прав. Вон, в PostreSQL только в грядущем релизе будут права на столбцы.
Хотя в MySQL Это давно есть.
И когда я писал веб-приложения я это активно использовал -- анонимус на форуме подключался пользователем только для чтения, залогинившийся -- с правами записи на таблицу messages, админ -- с правами на всю базу, модератор -- с правом DELETE в messages. Хотя, как ты правильно заметил, не панацея, так как теоретичесик модератор одного раздела мог снести все, потому что таблица messages -- одна. И ещё это не очень хорошо для пулинга
соединений к базе.

Да что говорить -- моя домашняя система обработк логов апача имеет 4 пользователя а не одного -- сам logger, нормализатор, интегратор, лочиститель. Это разные компоненты и у них даны минимальные потребные права.
Friday, June 19th, 2009 11:00 am (UTC)
ну вот хотя бы на таблицы права разграничить можно же?

вот, у тебя правильно построенная система, ибо не следует давать пользователю больше прав, чем ему действительно нужно :)

Friday, June 19th, 2009 07:03 pm (UTC)
Мысль интересная. Хорошо, пускай web_user и web_admin.

А как быть с такими сценариями, как "пользователь добавил контент на сайт" (например, комментарий) и "пользователь зарегистрировался"?
Saturday, June 20th, 2009 10:19 am (UTC)
А вот тут уже работают хранимые процедуры..
Monday, June 22nd, 2009 09:05 pm (UTC)
Сделать-то конечно можно. Но когда я пишу EJB, мне удобнее получать Entity Manager из контейнера, а там получается задать только одye настройку для всего приложения. Можно конечно написать все иначе, но по моему, лишние сложности не стоят того. Лучше те же силы потратить на проверку исходных данных. Тем более, что всякие SQL Injection при доступе к БД через фреймворки типа Hibernate или DB_DataObject в случае PHP - не сильно актуальны.
Thursday, November 5th, 2009 08:24 am (UTC)
Есть небольшая проблема с тем, что соединения то стараются не закрывать между запросами. В связи с этим надо иметь пул соединений под разными пользователями и уметь в зависимости от разной логики переключаться между ними. Это мало кто из фреймворков умеет из коробки.

И как же будет грустно, когда во время транзакции прийдется поднять права!
Thursday, November 5th, 2009 10:20 am (UTC)
во время транзакции права менять не придётся, к началу транзакции уже можно сообразить, будет ли она "администраторская" или "пользовательская"

а вот почему никто из фреймворков этого не умеет - в том и вопрос..

(no subject)

[identity profile] levgem.livejournal.com - 2009-11-05 10:38 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-11-05 10:41 am (UTC) - Expand

(no subject)

[identity profile] levgem.livejournal.com - 2009-11-05 10:59 am (UTC) - Expand

(no subject)

[identity profile] dil.livejournal.com - 2009-11-05 11:00 am (UTC) - Expand