вівторок, 25 грудня 2007 р.

Невидимый администратор

Работал я давненько с SQL Server 2000 в качестве разработчика. Разрабатывал себе БД, правда с одной особенностью. Работали все на одном серваке, и с одной базой. Прав для администрирования сервера не было, и все приятности типа профайлера были не доступны. Такое тяжелое положение вещей и заставляло меня мечтать про админские права, и чего уж греха таить по возможности, чтобы они оставались подольше. И вот долгожданный день настал и за трудовые заслуги перед Отечеством мне разрешили пользоваться благами цивилизации в виде профайлера. Сам факт недолговечности данных прав заставил меня подумывать над тем чтобы оставить их себе при возможности.
Сперва я подумал, что можно создать еще одну учетную запись SQL Server. Но созданная обычным способом учетная запись была бы очень заметна. Учетные записи SQL Server 2000 хранит в таблице dbo.sysxlogins из базы данных master. Признак того, что учетная запись является членом роли sysadmin определяется установленным битовым флагом 16 в поле xstatus. Так как эта таблица является не документированной, это позволяло надеяться, что напрямую ее никто проверять не будет, а вместо этого воспользуется соотвествующими хранимыми процедурами или представлениями. Для того чтобы скрыть я решил попробовать изменить системные ХП. По умолчанию SQL Server запрещает любые модификации системных объектов, но после выполнения приведенного ниже скрипта это становится возможным.

sp_configure 'allow updates', 1
GO
RECONFIGURE WITH OVERRIDE

Выполнение данного скрипта позволяет заниматься черной магией и начать настройку SQL Server. Конечно стоит понимать что изменение параметров которые не документированы и которые используются в неизвестном месте могут повлечь за собой непредсказуемые последствия.
Чтобы скрыть свою учетную запись я решил использовать следующий метод: Использовать дополнительный флаг 4096 который будет использоваться как признак sysadmin в GUI. Это позволить как создать пользователя без админских прав, который будет отображаться как sysadmin, так и спрятать учетные записи обладающие правами sysadmin. Я поменял ХП sp_addsrvrolemember, sp_dropsrvrolemember и представление syslogin так, чтобы они использовали флаг 4096. Суть этих изменений следующая:

  1. При добавлении учетной записи в роль sysadmin необходимо устанавливать сразу два флага 16 и 4096.
  2. При удалении учетной записи из роли sysadmin необходимо снимать только один флаг 4096.(Это исключительно, чтобы кто-то не снял админские права сначала добавив, а потом удалив из роли sysadmin).
  3. Использовать флаг 4096 вместо 16 как признак sysadmin в представлении syslogins.

Еще пришлось поменять флаги в таблице spt_values расположенной в БД master. Таблица использовалась SQL Manager для отображения списка администраторов. Необходимо в записях выбранных по запросу

select * from spt_values where type='SRV'

поменять значения соответсвующие sysadmin с 16 на 4096. Эти строки используются в GUI Enterprise Manager для определения каие флаги отвечают, за какую группу серверных ролей для учетной записи. После сделанного у меня оказалась учетная запись с административными правами, но которая не видима штатными средствами.