Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Вопросы и ответы по MS SQL Server" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
MS SQL Server - дело тонкое...
Информационный Канал Subscribe.Ru |
#104<< #105 |
СОДЕРЖАНИЕ БЕЗОПАСНОСТЬ
24 июля 2002г. Microsoft выпущен бюллетень безопасности: Microsoft Security Bulletin MS02-038 Обнаруженной две уязвимости: переполнение буфера DBCC позволяющее исполнить код в контексте учётной записи сервиса SQL Server, и уязвимость типа SQL injection, которой были подвержены две хранимых процедуры, используемые при репликации. Уязвимости подвержены следующие продукты:
Microsoft Desktop Engine (MSDE) 2000 Заплату можно загрузить тут:
24 июля 2002г. Microsoft выпущен бюллетень безопасности: Microsoft Security Bulletin MS02-039 Обнаружены три уязвимости: две переполнения буфера при атаке на порт не основного инстанса, и одна типа отказа в обслуживании, за счёт подмены пакетов, пересылаемых между двумя взаимодействующими серверами. Уязвимости подвержены следующие продукты: Microsoft SQL Server 2000, SP2 Заплату можно загрузить тут:
XML в MS SQL Server 2000 и технологиях доступа к данным (продолжение) Автор: Алексей Шуленин
01. Введение
Web-сервис - это компонент, к которому можно обращаться с помощью XML. Результаты вызова метода также
оборачиваются в XML. Протокол устройства XML-сообщений, которыми обмениваются клиент и Web-сервис,
называется SOAP. В отличие от RPC и других бинарных, зависимых от платформы протоколов, ориентированных
на плотное взаимодействие, SOAP предусматривает работу в слабосвязанных средах (Интернет) и, будучи
основан на XML, позволяет общаться компонентам независимо от операционной системе или инструмента
разработки, в которых они были созданы. Потребность в удаленном взаимодействии компонентов через Интернет
назрела давно. В свое время HTML-формы и ASP превратили посетителя Web-узла из пассивного зрителя,
просматривающего заранее подготовленные странички, в активного участника, формирующего страницу по
информации из базы на основе своих критериев. Однако эта информация доставлялась потребителю по-прежнему
в HTML-формате, что, может быть, удобно с точки зрения визуального восприятия, но никуда не годится,
если вы хотите, например, выцепить из полученной странички котировки акций, превратить их в recordset
и передать своему приложению. Web-сервисы публикуют описания своих интерфейсов в wsdl-файлах (аналог
библиотеки типов в СОМ). Например, методу, возвращающему котировки, нужно подать на вход интересующую
дату и биржевой символ. Чтобы найти подходящий Web-сервис или выяснить назначение найденного, можно
использовать универсальный реестр UDDI и протокол DISCO. В Visual Studio.Net входят средства создания
как самих Web-сервисов, так и клиентов, их использующих. Например, не составляет труда создать Web-сервис,
который будет принимать имя и параметры хранимой процедуры на SQL Server, выполнять ее и отсылать
результаты клиенту. Словом, типичная трехуровневая архитектура, только клиентская компонента, компонента
бизнес-логика и сервер теперь не ограничены пределами локальной сети, а находятся где угодно в Интернете.
Начиная с SQLXML 3.0 в роли Web-сервиса может выступать SQL Server 2000, так что надобность в промежуточной
компоненте теперь отпадает. Присутствие ПО промежуточного слоя наиболее часто оправдывают требованиями
безопасности, масштабируемости и программируемости. Последние два, вероятно, наиболее честные, потому
что я с трудом понимаю, как толщина middleware может влиять на устойчивость сервера к попыткам
несанкционированного проникновения. Если вы дыряво настроили политики безопасности на сервере, то
злоумышленник все равно на него придет независимо от того, 5 шагов ему перед этим придется сделать или 10.
Вот программируемость - это уже серьезней. Т-SQL до сих пор остается странной смесью мощи и ограничений.
Отсутствие многих обыденных для современных языков конструкций, не говоря уже об ООП, приводило к тому,
что народ утешал себя тем, что SQL не для того предназначался, и уходил писать логику на С++, Visual Basic,
Delphi и т.д. В последнее время круг задач, решаемых SQL Server, очень сильно расширился за рамки
пресловутого SQL, следовательно, возможности языка программирования на серверной стороне, как бы он ни
назывался, должны им соответствовать. И они будут соответствовать в следующей версии. Пункт третий -
масштабируемость. С целью повышения масштабируемости и распределения нагрузки в SQL Server 2000, как
известно, были введены распределенные фрагментированные представления. Несмотря на то, что благодаря
этому механизму SQL Server занимает в настоящий момент первые места в рейтингах производительности,
следует понимать, что в действительности это лишь первый этап на пути к базе данных, автоматически
распределяемой по многим серверам в сети, когда каждый узел, получивший запрос, разбивает его на подзапросы
к тем серверам, где в действительности лежат нужные данные (а если они продублированы, то к наименее
загруженным). Таким образом, понятно, что все три критерия обособления являются достаточно условными,
и не всегда компоненты бизнес-логики будут выноситься за пределы SQL Server. Следовательно, тот факт,
что клиентское приложение сможет общаться с ним напрямую как с Web-сервисом, на самом деле очень важен.
Вернемся к Скрипту 14. CREATE PROCEDURE CustomerOrdersForYear @Name nvarchar(20), @Year smallint AS SELECT c.ContactName, c.ContactTitle, o.OrderDate, o.Freight FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID WHERE c.ContactName like @Name + '%' and year(o.OrderDate) = @Year В качестве второго метода Web-сервиса выбираем шаблон из п.10 (рис.6). Он добавляется вызовом AddTemplateMethod. Параметрами служат внешнее имя метода, местоположение шаблона относительно данного скрипта и способ передачи ошибок (SOAP - да/нет). Результат шаблона можно передавать только как набор XML-элементов. Строка sqlWebSvc.SoapMethods.GenerateWSDL(); производит автоматическую генерацию wsdl-файла, который кладется в физическую директорию, соответствующую виртуальному подкаталогу типа soap. После этого Web-сервис становится доступным для обращений. Как и в классическом DCOM, на машине клиента нужно создать прокси, содержащего сигнатуру методов Web-сервиса. В графической среде разработки Visual Studio это происходит автоматически при добавлении ссылки на wsdl-файл в раздел Web References проекта. Прокси можно также сгенерировать с помощью утилиты командной строки wsdl.exe: wsdl.exe /l:CS /o:SQLSrvWebService_Proxy.cs /n:SQLSrvWebRef http://localhost/SQLXML3/websvc?wsdl
В качестве параметров здесь передаются язык, на котором будет создан прокси, имя файла с прокси, его
пространство имен и URI Web-сервиса с его описанием в виде wsdl. Обращение клиента к Web-сервису
показано в Скрипте 20.
static void SQLSrvWebService_Client() { SQLSrvWebRef.SQLSoapSample proxy = new SQLSrvWebRef.SQLSoapSample(); proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; Console.WriteLine("----------------------------------------------------------------"); Console.WriteLine("Результаты выполнения шаблона (всегда как массив XML-элементов):"); object[] resultXml = proxy.ПримерВызоваШаблона("20", "1000"); foreach (XmlElement x in resultXml) Console.WriteLine(x.OuterXml); Console.WriteLine("\n----------------------------------------------------------------"); Console.WriteLine("Результаты выполнения хранимой процедуры (заказаны как DataSet):"); int retVal; DataSet resultRel = proxy.ЗаказыКлиентаЗаГод("Maria", 1997, out retVal); DataRelation rel = resultRel.Relations[0]; Console.WriteLine("\nТаблицы связаны отношением " + rel.RelationName); Console.Write("Родительская таблица " + rel.ParentTable.TableName + ", родительский ключ - "); foreach (DataColumn c in rel.ParentColumns) Console.Write(c.ColumnName + " "); Console.Write("\nДочерняя таблица " + rel.ChildTable.TableName + ", дочерний ключ - "); foreach (DataColumn c in rel.ChildColumns) Console.Write(c.ColumnName + " "); Console.WriteLine(""); foreach (DataRow rParent in rel.ParentTable.Rows) { Console.WriteLine("\nТаблица " + rel.ParentTable.TableName); foreach (DataColumn cParent in rel.ParentTable.Columns) Console.Write(cParent.Caption + ": " + rParent[cParent] + "; "); Console.Write("\n\tСвязанные записи из таблицы " + rel.ChildTable.TableName); foreach (DataRow rChild in rParent.GetChildRows(rel)) { Console.Write("\n\t"); foreach (DataColumn cChild in rel.ChildTable.Columns) Console.Write(cChild.Caption + ": " + rChild[cChild] + "; "); } Console.WriteLine(""); } } Результат выполнения шаблона получается в виде массива XmlElement, состоящего из единственного элемента, OuterXml которого показан ниже: <Солянка xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <Employees EmployeeID="1" LastName="Davolio" FirstName="Nancy" Title="Sales Re presentative" TitleOfCourtesy="Ms." ... /> <Customers ContactName="Horst Kloss" Кол-во="28" /><Customers ContactName="Jos e Pavarotti" Кол-во="31" /><Customers ContactName="Roland Mendel" Кол-во="30" /> <Клиент Имя="Horst Kloss" Фирма="QUICK-Stop" Должность="Accounting Manager"><А дрес><Страна>Germany</Страна><Город>Cunewalde</Город><Улица_дом>Taucherstra?e 10 </Улица_дом></Адрес><Заказы><Заказ Номер="10273"><Дата>1996-08-05</Дата><Стоимос ть>76.07</Стоимость></Заказ><Заказ Номер="10285"><Дата>1996-08-20</Дата><Стоимос ть>76.83</Стоимость></Заказ>...</Заказы></Клиент> <Сотрудник Фамилия="Fuller" Имя="Andrew"><Сотрудник Фамилия="Davolio" Имя="Nan cy" /><Сотрудник Фамилия="Leverling" Имя="Janet" /><Сотрудник Фамилия="Peacock" Имя="Margaret" /><Сотрудник Фамилия="Buchanan" Имя="Steven"><Сотрудник Фамилия=" Suyama" Имя="Michael" /><Сотрудник Фамилия="King" Имя="Robert" /><Сотрудник Фами лия="Dodsworth" Имя="Anne" /></Сотрудник><Сотрудник Фамилия="Callahan" Имя="Laur a" /></Сотрудник> </Солянка>
DataSet как результат второго метода состоит из двух таблиц: Customers и Orders. Выбор
Row Formatting = Nested на стадии определения метода Web-сервиса приводит к тому, что условие соединения
таблиц в запросе (JOIN) переходит в свойство Relations объекта DataSet и позволяет для каждого клиента
выбрать сделанные им заказы:
Таблица Customers ContactName: Maria Larsson; ContactTitle: Owner; Customers_Id: 0; Связанные записи из таблицы Orders OrderDate: 03.02.1997 0:00:00; Freight: 17.92; Customers_Id: 0; OrderDate: 28.02.1997 0:00:00; Freight: 16.27; Customers_Id: 0; OrderDate: 12.05.1997 0:00:00; Freight: 188.04; Customers_Id: 0; OrderDate: 06.06.1997 0:00:00; Freight: 242.21; Customers_Id: 0; Таблица Customers ContactName: Maria Anders; ContactTitle: Sales Representative; Customers_Id: 1; Связанные записи из таблицы Orders OrderDate: 25.08.1997 0:00:00; Freight: 29.46; Customers_Id: 1; OrderDate: 03.10.1997 0:00:00; Freight: 61.02; Customers_Id: 1; OrderDate: 13.10.1997 0:00:00; Freight: 23.94; Customers_Id: 1; Таблица Customers ContactName: Maria Larsson; ContactTitle: Owner; Customers_Id: 2; Связанные записи из таблицы Orders OrderDate: 14.10.1997 0:00:00; Freight: 152.3; Customers_Id: 2; OrderDate: 02.12.1997 0:00:00; Freight: 328.74; Customers_Id: 2; OrderDate: 11.12.1997 0:00:00; Freight: 48.2; Customers_Id: 2; The program '[2460] ConsoleApplication1.exe' has exited with code 0 (0x0). У меня закончилось время, которое я отвел на написание данного материала. В соответствии с нашей договоренностью (п.1) я ставлю точку. Отрадно, что мы успели разобрать практически все основные моменты. Для дальнейшего чтения рекомендуются темы OpenXML, DiffGrams и XQuery. Спасибо за внимание.
По материалам статьи Brian Knight
"
10 Steps to Securing your SQL Server" Защита SQL Server довольно трудная задача, но весьма необходимая. Эта статья призвана заострить внимание на сравнительно простых способах защиты SQL Server. Хотя предлагаемые рекомендации позволят Вам избежать ряда наиболее распространённых проблем защиты SQL Server - Вы не должны полностью полагаться на эти рекомендации и ни в коем случае не отказываться от постоянного аудита и корректировок вашего плана безопасности. Ниже представлены рекомендации по защите десяти основных точек безопасности SQL Server: 1. Если возможно, всегда используйте Windows Authentication Почти в каждой уязвимости Microsoft SQL Server автор видел предупреждение в нижнем колонтитуле, которое обычно предостерегает, что "…хорошо было бы Вам использовать режим Windows Authentication, чтобы избежать этой проблемы…" (перефразировано, конечно). Использование режима Windows Only исключает приблизительно 95% проблем безопасности SQL Server, которые автор встречал, включая известные вирусы. Для хакера, чтобы проникнуть через вашу систему безопасности использующую режим Windows Only, необходимо сначала пройти подтверждение подлинности в домене, что является гораздо более трудной задачей, чем прохождение идентификации SQL. Что является наиболее важным, так это то, что пароли не передаются по сети, так как SQL Server будет использовать маркер пользователя. 2. Продумайте использование учетной записи sa
Старайтесь никогда не использовать учётную запись sa, даже если Вы являетесь администратором баз данных
(DBA). Если Вы DBA и не можете использовать Windows Authentication, создайте новую учётную запись системного
администратора и используёте в последствии только её. Многим это может не понравиться, поскольку Вы
измените пароль sa для всех рабочих серверов. Но, тем не менее, этот пароль необходимо изменить и он не
должен быть известен разработчикам. Многие разработчики, зная пароль sa, кодируют его в своих приложениях,
так как эта учетная запись имеет максимальные разрешения, после чего им не нужно беспокоиться о правах
своего приложения. 3. Удалите BUILTIN/Administrators Автор статьи считает на сегодняшний день это самой большой уязвимостью SQL Server. Он не может понять, для каких целей Microsoft по умолчанию предоставляет администраторам NT права равные sa. Первое, что автор делает после новой инсталляции - удаление этого логина. Будьте осторожны! Перед удалением этого логина, Вы должны убедиться, что учетная запись, от имени которой запускается SQL Server, имеет свой собственный логин. Если у SQL Server нет логина для учетной записи NT, от имени которой стартует SQL Server, наверняка Вы будете иметь проблемы с запуском SQL Server или SQL Server AGENT. 4. Измените учетную запись, от имени которой стартует MSSQLServer
По тем же причинам, автор считает целесообразным заменять учетную запись Localsystem, от имени которой
по умолчанию стартует SQL Server. Если Вы собираетесь сделать это через Enterprise Manager (щёлкните
правой кнопкой мыши по имени сервера и выберете пункт Properties | вкладка Security), Вы будете избавлены
от необходимость выполнить несколько дополнительных шагов по предоставлению необходимых разрешений
альтернативной учетной записи, которые ЕМ сделает за Вас. Когда вы измените учетную запись, под которой
запускается SQL сервер, убедитесь, что она имеет минимальные права на вашем компьютере (ни в коем случае
не обладает правами администратора!). Основная причина, по которой эти права должны быть минималными -
не позволить злоумышленнику получить полный контроль над операционной системой, если он сможет получить
права SysAdmin. 5. Проверка Failed Logins и Denied Access
Наилучший способ выявления попыток несанкционированного доступа в систему - это правильная установка
оповещения и предупреждения. Установкой опции Failed Login (Server Properties | Security tab), вы
предоставите себе возможность видеть, когда незваный гость пытался получить доступ к вашей системе.
Это особенно полезно, если у вас есть стандартная прикладная программа, которая использует только несколько
учетных записей. Как только вы обнаруживаете любой failed login, вы знаете, что он вызван не вашей
прикладной программой и, следовательно, это должен быть пользователь. Следующим шагом является запуск
Profiler и выявление Failed Logins и Hostname. Это даст вам имя компьютера, с которого производилась
попытка несанкционированного доступа.
-- Error Message #229: %ls permission denied on object '%.*ls', database '%.*ls', owner '%.*ls'. Если вы являетесь злоумышленником и хотите скрыть ваши действия на SQL сервере, то наилучшим способом для этого является перезапись всех журналов ошибок на SQL сервере с помощью утилиты DBCC ERRORLOG пять раз, таким образом заметая все следы вашего там пребывания. Для защиты против этого я рекомендую добавить registry key (если он еще не существует), который увеличит число хранящихся на SQL сервере журналов ошибок с 5 до по крайней мере 10. Для этого внесите следующую строку в Registry: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer] "NumErrorLogs"=dword:00000010 И в заключение, подумайте над тем, чтобы регулярно проверять логины, у которых отсутствует пароль. Вы можете делать это с помощью простого запроса (имейте ввиду, что учетная запись Windows никогда не хранит пароль, следовательно вы можете отфильтровать эти записи используя параметр isntname = 0).
use master 6. Следите за появлением новых Service Packs и Hot Fixes
Своевременная установка последних Service Packs и Hot Fixes является лучшим путем для защиты от наиболее
опытных злоумышленников. Большинством из известных мне уязвимых мест, которые были исправлены с помощью
Service Packs и Hot Fixes, очень тяжело воспользоваться, но если ними воспользовались, то это очень опасно.
Всегда планируйте установку на вашем SQL сервере, по крайней мере один раз в квартал, всех последних
Service Packs и Hot Fixes. Оперативно получать уведомления о выходе сервисных пакетов и заплаток можно
подписавшись на Microsoft Security Alerts по адресу: 7. Защищайте расширенные хранимые процедуры SQL сервер предоставляет ряд дополнительных удобств и поддерживает расширенные хранимые процедуры. Единственной проблемой является то, что эти хранимые процедуры обладают теми же правами, что и учетная запись, под которой стартует SQL сервер. Если вы не используете репликацию или SQL Mail, то запускайте SQL сервер под системной учетной записью. Далее вы можете заблокировать все хранимые процедуры, которыми вы практически не пользуетесь. В особенности такие расширенные хранимые процедуры, как xp_cmdshell. Эта расширенная хранимая процедура позволяет выполнить любую команду операционной системы и может косвенно использоваться для доступа в вашу сеть. Несмотря на это, автор не хотел бы удалять ни одну из этих хранимых процедур. Enterprise Manager обычно использует их для доступа к функциям системного уровня и удаление этих хранимых процедур может привести к возникновению новых ошибок. Автор статьи предпочитает запретить доступ к ним от имени любой учетной записи, для которой они без надобности и, если только если вы чувствуете, что всё достаточно хорошо проверили, то можете их удалить. 8. Измените порт, через который работает SQL сервер, и заблокируйте его Если вы измените порт SQL сервера, то злоумышленнику потребуется несколько больше времени для сканирования портов и обнаружения вашего SQL сервера. Большинство неквалифицированных злоумышленников прекратят попытки сканирования вашей сети после проверки общеизвестных портов. Однако для защиты от более опытных взломщиков, вы должны быть уверенны в том, что ваш firewall защищает ваш SQL сервер от любого не установленного траффика. Вы можете изменить порт вашего SQL сервера, воспользовавшись утилитой Server Network Configuration, выбрав протокол TCP/IP и затем Properties для него. Заранее согласуйте новый адрес порта с вашим системным администратором, чтобы он был доступен через ваш firewall. 9. Предоставляйте доступ к БД посредством хранимых процедур Всегда старайтесь не предоставлять прямой доступ к вашим данным. Вместо этого используйте доступ к данным только через хранимые процедуры и предоставляйте права доступа процедурам вместо того, чтобы огульно раздавать права db_datareader и db_datawriter. Если вы используете хранимые процедуры, убедитесь что вы правильно запрограммировали ADO для работы с ними. Это поможет вам защититься от SQL Injection атак. SQL Injection атаки позволяют злоумышленнику выполнить любую SQL команду, которую он пожелает, используя формы (для ввода информации) вашего приложения. Еще одним преимуществом использования хранимых процедур является то, что их легче использовать. Например, если вы не используете хранимые процедуры, то вам придется перекомпилировать ваше приложение или обновлять ASP страницы каждый раз, когда вы изменяете текст запроса. 10. Защищайте вашу операционную систему Если ваша ОС не защищена, то ваш SQL сервер открыт настежь. Это как запереть дверь и оставить рядом с ней открытыми окна. Не забудьте протестировать вашу систему после выполнения всех рекомендаций и делайте это как можно чаще! Документируйте все, что вы сделали, и когда вы будете устанавливать новый сервер, вы ничего не забудете. Автор надеется, что эта статья дает некоторые базовые знания для того, чтобы начать устанавливать систему защиты вашего SQL сервера. Отечественные статьи
От Informix к SQL Server Новые технические статьи Microsoft
BUG: BCP May Export Corrupted DBCS
Characters That Are Stored In a Char or Varchar Data Type (Q323502) ФОРУМ SQL.RU Самые популярные темы недели
Data
Warehouse и OLAP-кубы для CRM (оптовые продажи, склад, сервис, и прочее) Вопросы остались без ответа
Creating Dynamic View in stored
procedure
В настоящее время я рассматриваю варианты своего участия в новых проектах. Интерес представляют крупные системы
баз данных, как развивающиеся, так и разрабатывающиеся "с нуля". Если Ваша организациия находиться в Москве или
ближайшем подмосковье и нуждается в услугах MS SQL Server DBA, предлагаю рассмотреть моё резюме, которое
всегда доступно по этой ссылке:
http://www.sql.ru/subscribe/REZUME.shtml
|
#104<< #105 |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||