10

Для базы данных веб-приложений с точки зрения безопасности только, что аргументы сравниваются с точкой для единственного решения sp, где учетная запись приложения db не имеет прав на таблицы и представления и только exec на sps?Хранимые процедуры против отсутствующих хранимых процедур - точка зрения безопасности

Если кто-то перехватывает учетную запись приложения db, площадь поверхности, подверженная атаке, намного меньше, чем когда таблицы и представления не отображаются. Какими преимуществами безопасности было бы предложение non-sp (или нет)? Я вижу много преимуществ использования не-sp-решения, но разоблачение всех таблиц оставляет меня немного обеспокоенным.

Вопрос для крупных поставщиков баз данных продуктов в целом, но конкретно, SQL Server 2008.

ответ

13

С точки зрения безопасности только, я не вижу никаких преимуществ не-SP подход будет иметь над SP подход, потому что:

  • вы должны предоставить разрешения непосредственно базовых таблиц и т.д.
  • с sproc, вся информация о реальной основной схеме может быть воплощена/спрятана (П могут быть зашифрованы тоже)
+0

+1 для абстракции («инкапсулировано/скрыто») –

3

Ну, я думаю, вы действительно захватили суть проблемы сами: если вы не используете хранимые процедуры для всех CRUD вы должны предоставить хотя бы пользовательскую учетную запись пользователя, зависящую от приложения, по крайней мере, права SELECT для всех таблиц.

Если вы хотите, чтобы учетная запись db выполняла еще больше работы, этой учетной записи могут потребоваться и другие разрешения, например, возможность UPDATE и, возможно, DELETE в определенных таблицах.

Я не вижу, как не сохраненный подпроцесс будет иметь какие-либо преимущества в плане безопасности - он открывает ворота чуть больше, на самом деле вопрос: можете ли вы себе позволить? Можете ли вы защитить эту учетную запись конкретного приложения, чтобы она не ухудшала общую безопасность вашей системы?

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

Как это часто бывает - это классический компромисс между удобством (не-sp-подход, возможно использование ORM) и безопасность (все подходы SProc, вероятно, более громоздкие, но немного более безопасные).

Marc

+0

Спасибо. Я подумал о вашем частичном решении - выберите таблицы, обновления для sps. Вы пробовали этот подход? Что-нибудь непредвиденное вызвало проблемы? – Steve

+0

@Steve: нет, я никогда не делал этого гибридного подхода. Моя предыдущая работа была все-SProc-safe, но боль для работы против. Мой текущий - все прямой доступ к таблице - удобный, но не очень безопасный .... –

4

Это одна из тех областей, где общепринятая является правильным: выставляя только хранимые процедуры дает вам больший контроль над безопасностью. Предоставление прямого доступа к таблицам и представлениям проще, и вам нужно сделать это, но это будет менее безопасно.

5

Самым большое преимущество безопасности, чтобы не использовать хранимые процедуры ясность. Вы точно знаете, что может сделать учетная запись, видя, какой доступ к имеющимся таблицам. При хранящихся процедурах это не обязательно. Если учетная запись имеет возможность выполнить процедуру X, это ограничивает учетную запись для ее выполнения и не ударяет по базовой таблице, но X может сделать что угодно. Он может отбрасывать таблицы, изменять данные, удалять данные и т. Д.

Чтобы узнать, что учетная запись может делать с хранимыми процедурами, вы должны посмотреть хранимую процедуру. Каждый раз, когда sproc обновляется, кто-то должен будет посмотреть, что он делает, чтобы убедиться, что что-то не попало «случайно» в него. Реальная проблема с безопасностью в sprocs происходит изнутри организации, а не от злоумышленников-изгоев.

Вот пример:

Допустим, вы пытаетесь ограничить доступ к таблице сотрудников. Без хранимых процедур вы просто запрещаете доступ к таблице. Чтобы получить доступ, кто-то в значительной степени должен явно просить вас предоставить разрешения. Конечно, они могут заставить вас запустить сценарий для предоставления доступа, но большинство людей по крайней мере пытаются просмотреть сценарий, который изменяет схему базы данных (при условии, что скрипт не обновляет sproc, о чем я расскажу ниже).

Существуют потенциально сотни хранимых процедур для приложения. По моему опыту, они обновляются довольно часто, добавьте сюда поле, удалите его. Для того, чтобы кто-то просматривал количество скриптов процедуры обновления, все время становится сложным, и в большинстве организаций команда базы данных начинает только быстро смотреть на процедуру (или не смотреть на все это) и перемещать ее. Здесь возникает реальная проблема. Теперь, в этом примере, если кто-то из ИТ-персонала хочет разрешить доступ к таблице, этот человек просто должен проскользнуть в строке кода, предоставляющей доступ или делая что-то еще. В идеальном мире это поймает. Большинство из нас не работают в совершенном мире.

Реальная проблема с хранимыми процедурами заключается в том, что они добавляют уровень обфускации в систему. С обфускацией приходит сложность, и со сложностью в конечном итоге становится больше работать, чтобы понять администрирование базовой системы. Большинство людей в ИТ перегружены работой, и все проскальзывает. В этом случае вы не пытаетесь атаковать систему, чтобы получить доступ, вы используете ответственного за систему, чтобы получить то, что вы хотите. Митник был прав, в безопасности люди - проблема.

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

Помните, что если я пытаюсь атаковать систему: я не твой друг; Я не интересуюсь вашими детьми или хобби; Я буду использовать вас в любом случае, чтобы получить то, что я хочу; Меня не волнует, предам тебя. Идея «но он был моим другом, и именно поэтому я верил ему, что он верит в то, что он делает, правильно», это не утешение после этого факта.

+0

ясность для кого? Если команда DB отвечает за доступ к db, тогда разработчики никогда не должны даже ЗНАТЬ имя объектов базы данных (таблиц). Не уверен, почему разработчики видят код db, это преимущество безопасности. –

+1

Обфускация - это не безопасность. Это как сказать, что разбойники не найдут украшения, потому что я спрятал его в шкафу. Если я действительно хочу ворваться во что-то, не зная схемы, это незначительная досада, а не помеха. Я хочу сказать, что не использовать sprocs сохраняет безопасность простой, что является самым важным фактором в обеспечении безопасности системы. Меньшие изменения в системе db делают систему более безопасной с этой точки зрения, потому что возможность чего-то забыть меньше. Изменение функциональности sprocs каждый выпуск увеличивает вероятность того, что что-то будет пропущено. – kemiller2002

+0

Если у вас встроенный SQL, вы более восприимчивы к SQL-инъекции, но с Sprocs его просто хранит в переменной и не влияет на структуру вызова. – AutomatedTester

1

В дополнение к традиционному разделению безопасности с хранимыми процедурами (разрешение EXEC на процедуры, опираться на цепочку прав доступа для доступа к данным) хранимые процедуры могут быть code signed, что приводит к очень гранулированному и конкретному контролю доступа к любым функциональным возможностям сервера, таким как связанные серверы, server scoped management views, контролируемый доступ к stored procedures and even data in other databases вне обычного доступа пользователя.

Обычные запросы не сделанные в пакетах T-SQL, независимо от того, как воображение и сколько слой за слоем генерации кода и ОРМ позади него, просто не может быть подписан, и, следовательно, не может использовать один из самых конкретных и мощный Доступные механизмы контроля доступа.

6

Давайте возьмем систему, которая должна быть действительно безопасной, скажем, систему учета вашей компании. Если вы используете procs и предоставляете доступ только к процессам, пользователи не могут делать ничего, кроме того, что делает proc. Это внутренний контроль, предназначенный для обеспечения того, чтобы бизнес-правила для системы не могли быть получены ни одним пользователем системы. Это то, что мешает людям совершать покупку компании, а затем утверждать средства, открывающие дверь для мошенничества.Это также мешает многим людям в организации удалять все записи в таблице учетных записей, поскольку они не имеют прав на удаление, кроме тех, которые были предоставлены из proc, что позволит одновременно удалять только одно.

Теперь разработчики должны иметь больше прав для разработки, но не должны иметь больше прав на производственной машине, если вы хотите рассмотреть вопрос о безопасности. Правда, разработчик мог написать malicous sp, который делает что-то плохое, когда ставится на prod. Тот же самый разработчик мог бы поместить тот же код в версию приложения и быть скорее пойманным или нет, как если бы они злонамеренно меняли proc. Лично я думаю, что процесс может быть легче поймать, потому что он может быть получен отдельно от кода dbas, что может означать, что менеджер или менеджер по настройке, и dbas имели возможность посмотреть на него как на менеджера, так и на менеджера по управлению конфигурацией. Мы все знаем, что реальность заключается в том, что никто не подталкивает код к prod, имеет время, чтобы пересмотреть каждую его часть лично, поэтому наем надежных разработчиков имеет решающее значение. Имея обзор кода и управление исходным кодом, вы можете найти вредоносное изменение или перевести его обратно в предыдущую версию, но использование кода приложения sps-вице-кода не зависит от разработчиков.

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

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

1

Это несовершенная аналогия, но мне нравится сравнивать таблицы в схеме «dbo» DB с «частными» данными в терминологии OO, а Views и Stored Procs - «public». Можно даже сделать «общедоступную» схему отдельно от схемы dbo, чтобы сделать различие явным. Если вы будете следовать этой идее, вы получите преимущество безопасности, а также преимущество расширения.

Одна учетная запись (а не учетная запись веб-приложения) имеет доступ к dbo и владеет базой данных, а веб-приложение подключается с использованием другой учетной записи, ограниченной только для публичных структур.

0

Единственный возможный аргумент в том, что я столкнулся с ситуациями, когда определенные операторы не могут быть эффективно параметризованы в SP (и требуется динамический sql), и это дает вам возможность SQL-инъекции внутри SP. Однако это очень узкое соображение, и это редкий случай. По крайней мере, в PostgreSQL я время от времени видел несколько случаев, когда это должно было быть предметом дополнительного обзора.

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

В целом, чем меньше пользователь, тем меньше вероятность воздействия на него. Это означает, что пользователь может сделать это с помощью инъекции sql-инъекций.

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

0

В большинстве ответов здесь указаны преимущества безопасности использования хранимых процедур. Без пренебрегая те преимущества, есть которые не были упомянуты несколько больших недостатков:

модели доступа
  • Этих данных иногда гораздо важнее конкретная процедура, проводимая. Мы хотим регистрировать/контролировать/анализировать/поднимать предупреждения/блокировать доступ к данным, когда и как. Мы не всегда можем получить эту информацию при использовании хранимых процедур.

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

  • Некоторые организации могут потребовать разделения проблем. Администраторы баз данных (или любой, кто пишет хранимые процедуры) не всегда являются частью личной безопасности. Иногда персоналу безопасности иногда нужно сосредоточиться только на данных просто потому, что они не несут ответственности за бизнес-логику, а ребята, которые пишут бизнес-логику, не полностью доверяют.