Защита базы данных SQL Server от умных администраторов? - PullRequest
3 голосов
/ 31 мая 2009

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

В таблице событий указаны PK, дата и время, а также 3 различных значения.

Проблема в том, что каждый администратор может войти в систему и вставить / обновить / удалить данные в этой таблице, например. используя sql management studio. Я создаю триггеры для предотвращения обновления и удаления, поэтому, если администратор не знает триггеры, он не может изменить данные, но если он знает триггер, он может легко отключить триггер и делать все, что ему захочется.

Так что после долгих раздумий у меня есть одна идея: добавить новый столбец (поле) в таблицу и сохранить в этом поле что-то вроде контрольной суммы, эта контрольная сумма будет рассчитываться на основе других значений. Эта контрольная сумма будет сгенерирована в операторах вставки / обновления. Если кто-то что-то вставит / обновит вручную, я узнаю об этом, потому что, если я проверю данные с помощью контрольной суммы, будут несоответствия.

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

Я использую SQL Server 2005.

Ответы [ 8 ]

10 голосов
/ 21 февраля 2014

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

ApexSQL Comply является таким решением и имеет встроенную опцию проверки целостности Существует несколько мер по борьбе с взломом, которые обеспечивают различные проверки целостности и обнаруживают несанкционированное вмешательство, даже если оно выполняется доверенной стороной. Для обеспечения целостности данных в решении используются хэш-значения. Хеш-значение - это числовое значение, созданное с использованием определенного алгоритма, который однозначно идентифицирует его

Каждая таблица в базе данных центрального репозитория имеет столбцы RowVersion и RowHash. RowVersion содержит метку времени строки - последний раз, когда строка была изменена. Столбец RowHash содержит уникальный идентификатор строки, рассчитанный с использованием значений других столбцов таблицы

Когда исходная запись в хранилище аудита изменяется, ApexSQL Comply автоматически обновляет значение RowVersion, чтобы отразить время последнего изменения. Для проверки целостности данных ApexSQL Comply вычисляет значение RowHash для строки на основе существующих значений строки. Значения, используемые при проверке целостности данных, теперь обновляются, и поэтому вновь рассчитанное значение RowHash будет отличаться от значения RowHash, хранящегося в базе данных центрального хранилища. Это будет сообщено как подозрение на подделку

Чтобы скрыть подделку, мне нужно будет вычислить новое значение для RowHash и обновить его. Это нелегко, так как формула, используемая для расчета, сложна и не раскрывается. Но это не все. Значение RowHash рассчитывается с использованием значения RowHash из предыдущей строки. Итак, чтобы скрыть подделку, мне придется пересчитать и изменить значения RowHas во всех следующих строках

Для некоторых таблиц в базе данных центрального репозитория ApexSQL Comply значения RowHash рассчитываются на основе строк в других таблицах, поэтому, чтобы охватить следы подделки в одной таблице, администратору необходимо изменить записи в нескольких базах данных центрального репозитория таблицы Это решение не защищено от несанкционированного доступа, но определенно затрудняет покрытие дорожек отпуска

Отказ от ответственности: я работаю в ApexSQL в качестве инженера службы поддержки

8 голосов
/ 01 июня 2009

Безопасность через неизвестность - плохая идея. Если есть формула для вычисления контрольной суммы, кто-то может сделать это вручную.

Если вы не можете доверять своим администраторам БД, у вас большие проблемы.

5 голосов
/ 01 июня 2009

Все, что вы делаете на уровне сервера, администратор может отменить. Это само определение его роли, и вы ничего не можете сделать, чтобы предотвратить это.

В SQL 2008 вы можете запросить аудит упомянутого сервера SQL с событиями X, см. http://msdn.microsoft.com/en-us/library/cc280386.aspx. Это решение, совместимое с CC, которое очевидно подделано. Это означает, что администратор может остановить аудит и выполнить его злонамеренные действия, но остановка аудита фиксируется.

В SQL 2005 для аудита рекомендуется использовать инфраструктуру profiler . Это может быть очевидно, если вмешиваться правильно. Вы можете предотвратить изменения данных с помощью триггеров и ограничений, а также проверить изменения DDL. Если администратор изменяет триггеры, это видно в аудите. Если администратор останавливает аудит, это также видно в аудите.

Планируете ли вы это как одноразовое действие против мошеннического администратора или как функцию, которая будет добавлена ​​в ваш продукт? Использование цифровых подписей для подписи всех данных вашего приложения может быть очень дорогостоящим в циклах приложения. Вы также должны разработать безопасную схему, чтобы показать, что записи не были удалены, включая последние записи (т. Е. Не простой пробел в столбце идентификаторов). Например. Вы можете вычислить CHECSUM_AGG более BINARY_CHECKSUM (*) , подписать результат в приложении и сохранить подписанное значение для каждой таблицы после каждого обновления. Надо сказать, что это замедлит работу вашего приложения, поскольку в основном вы сериализуете каждую операцию. Для отдельных строк контрольных сумм / хэшей вам потребуется вычислить всю сигнатуру в вашем приложении, и для этого потребуются возможные значения, которых ваше приложение еще не имеет (т. Е. Значение столбца идентификатора будет назначено вашей вставке) , И как далеко вы хотите пойти? Простой хеш может быть нарушен, если администратор завладеет вашим приложением и отслеживает, что вы хешируете, в каком порядке (это тривиально). Затем он может пересчитать тот же хэш. HMAC требует, чтобы вы хранили секрет в приложении, что в принципе невозможно против решительного хакера. Эти проблемы могут показаться излишними, но если это приложение, которое вы, например, продаете, то все, что нужно одному хакеру для взлома вашей последовательности хешей или секрета hmac. В конце концов, Google позаботится о том, чтобы об этом узнали все остальные.

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

4 голосов
/ 01 июня 2009

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

Если вы одитируете это, то когда они дают себе доступ, вы их увольняете.

Что касается эффективной контрольной суммы, защищающей от несанкционированного доступа, то можно использовать подпись с открытым / закрытым ключом. Это будет означать, что если подпись соответствует сообщению, то никто, кроме того, кто говорит, что запись создала / изменила запись, не смог бы это сделать. Любой может изменить и подписать запись своим собственным ключом, но не как кто-либо другой.

1 голос
/ 01 июня 2009

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

Вкратце, некоторые алгоритмы MAC (HMAC) используют хеш-функцию и включают секретный ключ как часть ввода хеш-кода. Таким образом, даже если администратор знает используемую хеш-функцию, он не может воспроизвести хеш, потому что он не знает все входные данные.

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

В идеале вы должны использовать сильную криптографическую хеш-функцию из семейства SHA-2. MD5 имеет известные уязвимости, и в SHA-1 подозреваются похожие проблемы.

1 голос
0 голосов
/ 01 июня 2009

Если вы беспокоитесь о людях, изменяющих данные, вы также должны быть обеспокоены тем, что они изменяют контрольную сумму.

Не можете ли вы просто защитить паролем определенные разрешения для этой базы данных?

0 голосов
/ 01 июня 2009

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

http://www.databasejournal.com/features/mssql/article.php/2246271/Managing-Users-Permissions-on-SQL-Server.htm

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