(Возврат на основную страницу)
Некоторое время назад я написал обзор Vormetric CoreGuard — средства, выполняющего шифрование файлов на уровне операционной системы. Я указал, что данное решение повышает защищенность БД, но не стал развивать эту тему. Управление доступом к определенным сегментам базы данных — только часть того, что называют безопасностью. Необходимо обеспечить контроль на уровне ОС, и CoreGuard неплохо заполняет эту нишу.
Мрачная правда состоит в том, что на уровне ОС можно достаточно легко пробиться в БД, и даже самый квалифицированный администратор вряд ли способен предотврать это вторжение. Несколько месяцев назад я получил новое напоминание на эту тему в серии статей1. Ниже я опишу прием, который позволит вам вернуть контроль над системой, но, как всегда, оборотная сторона технологии — это возможность получить такой контроль.
Для получение полных административных прав на БД SQL Server просто остановите сервис. Затем скопируйте master.mdf и mastlog.ldf на любой сервер, где уже установлен SQL Server. После этого у вас есть два пути. Вы можете присоединить master под новым именем, например masterHack или любым другим. Затем посмотрите на содержимое таблицы sysxlogins и, используя шестнадцатеричный редактор или другую копию SQL Server, просто назначьте SA тот пароль, который сочтете нужным, и замените на его шестнадцатеричный эквивалент. Проще всего создать локальный бюджет и установить ему пароль в NULL, а потом просто перенести это значение пользователю SA. После этого отсоедините БД, верните ее на старое место и запустите сервис. Теперь у вас полный доступ к ней. А теперь заприте всех остальных администраторов, чтобы они и дохнуть не могли.
В зависимости от установленного уровня безопасности подключитесь к другим серверам и придушите администраторов и там. Если же вам повезло и SQL Server исполняется от имени доменного бюджета с высоким уровнем привилегий, почувствуйте себя хозяином положения с помощью xp_cmdshell и команд DOS.
Привилегии SA на сервере, где установлен SQL Server, могут оказаться очень мощным инструментом, и я готов утверждать, что большинство компаний не понимает, насколько большими возможностями обладает администратор баз данных. Нужно отметить, что такой подход работает не только с SQL Server. Собственно говоря, большинство СУБД позволяет выполнить сходную операцию.
Вероятно, вам нужен некоторый уровень привилегий, чтобы начать работу, но это вовсе не административный уровень. Вам всего лишь требуются привилегии «act as a service», а ими обладают многие программы, и многие разработчики знают пароли таких бюджетов.
Использование шифрования на уровне файлов и ограничение доступа к маркированному цифровой подписью файлу не позволит провести описанную выше атаку. Подумайте, это одна из брешей в безопасности, о которой много говорят, но не предпринимают никаких шагов, чтобы устранить ее. Как я уже говорил, данный способ позволяет получить доступ к системе. Из среды SQL Server вы можете запирать администраторов домена, менять IPадреса, создавать папки с разделяемым доступом, перекачивать конфиденциальные данные — да все, что угодно!
Это не игрушки — не доводите до ситуации, когда вам придется жалеть, что необходимые действия не были предприняты раньше.
1Мы планируем в ближайшее время опубликовать все три статьи серии «How to hack SQL Server». — Прим. ред.
Приходилось ли вам внедрять в своей организации какоелибо корпоративное приложение на базе SQL Server, такое как SAP, Siebel или PeopleSoft? Если нет, думается, вам будет полезно прочитать эту статью. И даже если на вашем счету имеется пара внедрений корпоративных приложений, вам захочется сравнить свой опыт с опытом Джо Людке.
Как известно, Microsoft SQL Server все шире применяется для крупных корпоративных приложений, включая продукты таких фирм, как SAP и PeopleSoft. Фактически платформами баз данных, которые требуются большинству корпоративных приложений ERP, CRM и SCM, их производители считают Oracle, DB2 и SQL Server.
Завершив недавно установку систем Siebel CRM и PeopleSoft ERP, я был удивлен не столько уникальными требованиями к серверу баз данных и конфигурации самих БД, сколько их общими чертами. Другими словами, несмотря на существенные различия в функциональных возможностях и положенных в основу Siebel и PeopleSoft архитектурных концепциях, я был поражен аналогиями в базовых руководящих принципах конфигурирования — настолько, что поймал себя на том, что мысленно составляю перечень рекомендаций. В этой статье я классифицировал их по фазам жизненного цикла внедрения и надеюсь, что они окажутся полезными читателям.
• Планирование — определение размеров сервера и необходимого количества серверов.
• Установка и конфигурирование — конфигурирование сервера баз данных и дисков.
• Сопровождение и поддержка — забота о сервере баз данных и их подпитка.
Агрегирование, широко используемое при формировании отчетов для пользователей, часто заметно снижает производительность. Чтобы гарантировать наивысшую возможную производительность, необходимо исследовать несколько версий запросов и выбрать самую лучшую. Том Моро рассказывает, как надо работать с агрегированием нескольких потомков.
Эта статья навеяна дискуссией в одной из сетевых конференций, заставившей меня еще раз поразмышлять, что часто имеется множество способов решения одной проблемы. С точки зрения бизнеса, требуется доставить столбцы и строки так, как указано в спецификации. Если сроки жестко ограничены, скорее всего, вы решите схитрить и воспользоваться методом кодирования, который уже работал в прошлом. Чаще всего именно так и бывает: действует — и хорошо. Дает ту информацию, которую просят, — отлично. На доставку!
Уже много лет я работаю в информационной сфере и могу смело свидетельствовать, что вот такие рассуждения «на доставку» встречаются слишком часто. Подозреваю, что их приверженцы не понимают, что пользователи помнят о низком качестве и плохой производительности даже тогда, когда они давно забыли о просроченной дате сдачи. Конечно же, поставленные сроки важны, но разумные люди обычно соглашаются их немного сдвинуть, если им продемонстрировать получаемые при этом преимущества.
Рекурсия является классическим приемом, который изучается во всех профилирующих курсах по компьютерной технике. Чаще всего при этом пишут программу «Ханойская башня». (Чтобы освежить память, взгляните на статью Q41154, где приведено решение Ханойской башни на QuickBasic 4.5.)
В моей жизни был период, когда я обучал студентов колледжа. Приступив к теме подзапросов, я попросил их найти самого молодого служащего в таблице служащих employees базы данных Northwind. Большинство решило задачу довольно просто:
SELECT *
FROM employees
WHERE BirthDate =
(SELECT MAX(BirthDate) FROM employees)
Однако просьба найти следующего молодого сотрудника у многих вызвала затруднения. Некоторые предложили такое решение:
SELECT *
FROM employees
WHERE BirthDate=
(SELECT MAX(BirthDate)
FROM employees
WHERE BirthDate <
(SELECT MAX(BirthDate) FROM employees))
Рекурсивный характер запроса был очевиден, и помню, что я торжественно пообещал себе написать хранимую процедуру, которая будет возвращать nй член любой иерархии (возраст, вес, очки и т. д.). В конце концов, я создал ее, но двумя годами позже, во время работы над проектом по электронной коммерции, и мне за это платили.
В этой статье описаны две чрезвычайно удобные хранимые процедуры, которые почти наверняка сократят время, затрачиваемое на ручное кодирование выдачи результатов.
Когда доходит до поддержки разработчиков, Query Analyzer становится все лучше и лучше. Например, в Query Analyzer 2000 специалисты Microsoft добавили облегчающие написание кода возможности, включая шаблоны, генерацию кода определения объектов, цветовое подкрашивание синтаксиса и, разумеется, браузер для просмотра объектов Object Browser. Но всегда найдется место и для хитроумных приемов, таких как описанные ниже.
У меня есть подозрение, что значительная часть дня типичного разработчика баз данных уходит на генерацию списков данных и манипулирование ими. Иногда благодаря принятым в организации стандартам кодировки разработчики вынуждены составлять спецификации на списки столбцов, даже когда этого можно избежать.
Когда порядок доступа к данным действительно важен, возникает искушение воспользоваться курсором. В этой статье доктор Том Моро показывает, что стоит проявить немного усидчивости и хорошенько подумать — и можно исключить курсор и реализовать гораздо более интеллектуальное и политически корректное (по крайней мере, с точки зрения SQL) решение на уровне множеств.
Иногда я могу воспользоваться чьейто подсказкой. Просматривая общедоступные телеконференции, я увидел задачу, отправитель которой хотел получить не просто MAX или MINгруппы чисел, а почти предельные (какова формулировка, а?) MAX и MIN. Другими словами, ему нужно было получить второе наибольшее и второе наименьшее числа. Для его конкретного набора данных предлагались различные решения, но потом он заявил, что ему нужно решение в общем виде на тот случай, если требования изменятся и понадобятся, к примеру, третьи сверху и снизу значения. Спустя примерно месяц Карин прислала мне фрагмент кода, написанного читателем, который тоже пытался получить почти предельный MAX и спрашивал меня, нет ли в его коде синтаксических ошибок. Счастлив доложить, что — разумеется, да — я нашел в его коде ошибку, но сама проблема меня заинтриговала. В данной статье я покажу этот код в контексте базы данных Northwind.
В заключительной части статьи мы перейдем к одной из самых мощных, но часто не понимаемых возможностей SQL Server 2005. С помощью пользовательских типов данных (userdefined type, UDT) вы можете расширить систему скалярных типов базы данных (помимо определения вашего собственного имени для системного типа, что было доступно уже в предыдущих версиях SQL Server).