Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

Muchas veces suele escribirse y propagarse a través de internet o por otros lados verdades a media caña bien documentadas que apuntan a ser la ley para el mundo o para muchos. Particularmente soy bastante desconfiado con casi todo el mundo, siempre trato de probar lo dicho o leído, creo poco si me cuentan que en la experiencia esto es así o en algún escenario tal o cual feature es de utilidad o se comporta anormalmente. Siempre deseo experimentarlo y comprobarlo por mi mismo, y no me contento con que me lo cuenten o con que en la documentación esté dictaminado de tal manera, todo lo documentado son cosas que debo verificar. Bien se me viene a recordar algo que leí en alguna parte:

"In theory there is no difference between theory and practice. But, in practice, there is." (Jan L.A. van de Snepscheut)

Hoy día es uno de esos tantos días que decido compartir una verdad a media caña o mentira existente en SQL Server 2000 y bien documentada, uso el término “bien” para “justificar” lo que siempre he escuchado a ciertos ponentes predicar en algunas charlas y eventos hace ya tantísimos años. Debo entender que para todos aquel que conociere algo de SQL Server es conciente de que todas las versiones y ediciones de SQL Server han dado parto a la famosa cuenta sa (system Administrator), sí, aquella cuenta heredada de sybase y que Microsoft ha empadrinado como su hijo intocable.

Bien, siempre se ha dicho que hasta SQL Server 2000 no podíamos deshacernos de esta cuenta, Microsoft siempre recomendó y sigue recomendando no usar esta cuenta y protegerlo con alguna contraseña muy compleja, pues no queda otra opción ya que según documentación y más gente esta cuenta no puede eliminarse o modificarse. Mismo Microsoft en su documentación de SQL Server 2000 (actualizado al SP3) nos dice que el privilegio sysadmin de la cuenta sa no puede cambiarse, esto para muchos ha sido un mandamiento, a las pruebas me remito: http://msdn.microsoft.com/en-us/library/aa905197(SQL.80).aspx 

System administrator (sa) is a special login provided for backward compatibility. By default, it is assigned to the sysadmin fixed server role and cannot be changed. Although sa is a built-in administrator login, do not use it routinely. Instead, make system administrators members of the sysadmin fixed server role, and have them log on using their own logins. Use sa only when there is no other way to log in to an instance of Microsoft® SQL Server™ (for example, when other system administrators are unavailable or have forgotten their passwords).

En resumen, se ha dicho hasta SQL Server 2000 que la cuenta sa no puede cambiarse de nombre ni eliminarse y mucho menos crearse una cuenta con este mismo nombre dándole el titulo de cuenta intocable y no modificable, aspecto que es totalmente falso, y esto es justamente lo que deseo compartir y demostrar en este post, …pero antes quiero aclarar que no lo hago con fines  anti Microsoft ni con el ánimo de fastidiar a alguien, el único fin es aportar con fines profesionales evitando interpretaciones parciales, considerando importante y crítico todo aspecto relacionado a seguridad lo cual debe saberse para reducir la superficie de ataque en los pocos o muchos servidores en SQL Server 2000 que puedan aún seguir vivos a lo largo y ancho del planeta…  y si hay algún pingüino por aquí buscando algún motivo para fastidiar, es mejor que se abstenga con sus comentarios.

Toda la demostración debe comprobarlo usted sobre un servidor de base de datos en SQL Server 2000 con Service Pack 3a. Una de las buenas prácticas de seguridad que todo DBA desea aplicar en SQL Server 2000 es eliminar la cuenta sa, o tal vez mantenerla pero quitándole el privilegio de sysadmin con fines de auditoria para saber quienes y desde donde existen usuarios que anhelan entrar al servidor con dicha cuenta, pero siempre la meta final será controlar la administración de esta cuenta, lo cual puede realizarse si nos echamos a analizar un poquito cómo se maneja la seguridad de esta cuenta. Lo primero que debemos saber es que se esconde en la base de datos master, pero dentro del archivo como tal, es decir cual es el código existente que valida restricciones para esta cuenta  y en base a que parámetros. Que les parece si detenemos el servicio del motor de base de datos y nos echamos a darle un vistazo al archivo mdf de la base de datos master, y encontraremos entre tanto código lo siguiente:

-- CANNOT CHANGE SA ROLES -- 
if @loginame = 'sa' 
begin 
   
raiserror(15405, -1 ,-1, @loginame) 
   
return (1) 
end

Con esto, usted puede darse cuenta que la cosa es sencilla. Basta que cambie el nombre a la cuenta sa para que pueda quitarle el privilegio de sysadmin. Si seguimos más abajo, veremos que validación de eliminación de cuenta se realiza mediante el sid, si el sid es igual a 0x01 no te dejará eliminarla. Así que para conseguir eliminar la cuenta sa, hay que cambiarle el valor del sid y adicionalmente el nombre de la cuenta.

Para conseguir estos cambios en SQL Server 2000 podemos jugar con las tablas del sistema, pero antes debemos preparar el terreno:

sp_configure 'allow updates', 1 
go 
reconfigure with override 
go 

Cuando vayamos a modificar esta cuenta SQL Server 2000 no nos dejará:

sp_dropsrvrolemember sa,'sysadmin'

Server: Msg 15405, Level 11, State 1, Procedure sp_dropsrvrolemember, Line 40 
Cannot use the reserved user or role name 'sa'.

Lo mismo sucederá cuando intentemos eliminarla:

sp_droplogin sa

Server: Msg 15405, Level 11, State 1, Procedure sp_droplogin, Line 39
Cannot use the reserved user or role name 'sa'.

Pero como nosotros ya nos autohabilitamos para modificar las tablas del sistema podemos pasar a la acción, pero antes revisemos nuestro target:

select * from sysxlogins where name='sa'

Veremos que la cuenta sa tiene como sid igual a 0x01:

srvid   sid    xstatus  xdate1                                xdate2                        name   password       dbid  language  isrpcinmap ishqoutmap selfoutmap
------  ------  -------    ------------------------          ----------------------- -        -------  ---------------    ----- ---------      ---------- ------------------ -------------
NULL  0x01   18      2000-08-06 01:27:52.687   2009-04-27 23:55:41.670  sa      0x01006E449...     1      NULL         0                  0                  0

(1 row(s) affected)

Ahora, si deseamos quitarle el privilegio de sysadmin debemos primero cambiarle de nombre a sa2 (puede ser cualquier otro nombre)

update sysxlogins set name='sa2' where name='sa'

Luego ejecutamos lo siguiente:

sp_dropsrvrolemember sa2,'sysadmin' 
go

Con resultado que nos indica éxito total, lo hemos conseguido:

'sa2' dropped from role 'sysadmin'.

Tal vez lo que usted desee ahora es eliminar esta cuenta, para esto, tiene modificar un valor más que viene a ser el sid de la cuenta:

 update sysxlogins set sid=0x02 where name='sa2' 

Finalmente eliminamos la cuenta:

sp_droplogin 'sa2'

Sucede que ya eliminamos la cuenta sa, pero que pasa si necesitamos crear nuevamente la cuenta. Se nos ocurre lo siguiente:

sp_addlogin 'sa'

El mensaje obviamente es de un error, el nombre de cuenta sa es reservada, no podremos utilizarla.

Server: Msg 15405, Level 11, State 1, Procedure sp_addlogin, Line 49
Cannot use the reserved user or role name 'sa'.

…pero podemos realizar lo siguiente para crearla:

sp_addlogin 'sa2' 
go 
sp_addsrvrolemember sa2,'sysadmin' 
go

Ahora le cambiamos de nombre a “sa”

update sysxlogins set name='sa' where name='sa2'

Si nos fijamos en el sid de esta cuenta veremos que es algo asi: 0x621D6A5D371EDA45A6502CBEFD45AD05… pero nosotros necesitamos que ésta sea igual a 0x01 pues es así como el sistema la válida para otros fines, claro suponiendo que quieres recuperar la misma cuenta que dropeaste, pero si éste no fuera el caso, no hay necesidad de que le cambies el sid.

update sysxlogins set sid=0x01 where name='sa'

Con todo lo anterior hemos conseguido controlar la administración de esta cuenta, la decisión la tiene usted, usted decide como administrar esta cuenta de acuerdo al entorno y las políticas de seguridad para su compañia. En SQL Server 2005 y 2008 ya no tenemos que realizar estas jugadas porque en estas nuevas versiones la administración de esta cuenta es común a cualquier otra cuenta de usuario.

Saludos,

PercyReyes,

Nota: (27/06/2009): Se cambió el título del post para evitar confusiones e interpretaciones erróneas en los lectores, debido a que no es exactamente una vulnerabilidad en SQL Server 2000. El fin es demostrar como controlar la administracion de la cuenta sa a pesar que la documentacion de Microsoft dice que no se puede, un recurso útil para todo DBA que desea deshacerse de dicha cuenta...

Published 26/6/2009 0:15 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2009/06/26/151301.aspx

Comentarios

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

No entiendo porque se puede hacer esto, habia oido desde hace tiempo que no era recomendable usar 'sa', pero imaginemos que nos quedemos sin Active Directory, sería la unica forma de poder acceder a Sql Server, como se podría solucionar esto sin incurrir en la vulnerabilidad.

Friday, June 26, 2009 9:30 PM por Juan Irigoyen

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

Juan:

La seguridad en SQL Server 2000 no es buena como para admirarse, en mi opinión, el acceso para modificar las tablas del sistema conlleva alto riesgo en la seguridad que cualquier instancia con cualquier service pack. Todas la información desplegada en estas tablas pueden ser de mucha utilidad para vulnerar cualquier servidor de base de datos en SQL Server 2000. Esto último en SQL Server 2005 y SQL Server 2008 se ha mejorado bastante la seguridad con la llegada de las vistas de administración, ocultando las tablas del sistema, las cuales ya no residen en la base de datos master sino en otra base de datos que vive en segundo plano llamado mssqlsystemresource.

Es buena práctica no usar la cuenta sa para fines de administración ni otros temas, se recomienda eliminarla, y optar por crear otra cuenta con nombre complejo para tales fines.Por otra lado, para temas de auditoria podrias mantener dicha cuenta pero quitándole el privilegio sysadmin, le asigna una clave muy compleja y listo!. De esta manera podrias realizar un seguimiento de posible accesos fallidos no autorizados al servidor.

Para no incurrir en la vulnerabilidad en el caso de quedarte sin active directory, la opción sería que tengas creado una cuenta alternativa SQL Server sólo para estos fines (diferente de la cuenta sa), claro esto trae consigo la habilitación de autenticación mixta, no te queda otra.

Espero sirva...

Friday, June 26, 2009 10:26 PM por Percy Reyes

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

Me parece algo decepcionante las vulnerabilidades que puedan existir en productos-software, peor aún con licencia pagada, y particularmente en productos como este. Y a la vez, no me parece nada descabellado.

Si es de total acceso, y de cuestión de lógica, y que además es una "piedra en el zapato" de cualquier DBA... en buena hora.

--

Gerardo Fernández

Saturday, June 27, 2009 5:37 AM por Gerardo Fernández

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

como te lo dije por msn... no habria por que emocionarse tanto, por algo asi, ya que hablas de una tecnologia de hace 10 anios... no? si fuera del sql 2008 pos alli si... pero no es asi.

salu2

Ddaz

Saturday, June 27, 2009 7:09 PM por David Daniel Arroyo Zari "Ddaz"

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

@Gerardo:

Seguro que duele un poco más estos temas cuando el producto es pagado, pero ningún producto de software está libre de bugs... en algunos es más grave que otro, pero al final, siempre aparecen... la idea es convivir con lo bueno y los bugs de cada producto, tratar de administrarlo con buenas prácticas para reducir la superficie de ataque, mininizar el impacto.  Con este post todo DBA podrá decidir quitarse o no esa "piedra del zapato" aunque Microsoft te dice que no se puede, cosa que no es cierta.

@Ddaz: 

Como te dije, existen miles de empresas que aún trabajan cómodos con SQL Server 2000, no tienen "necesidad" de migrar...

Aunque sea una tecnología de hace 10 años, a las empresas que la usan y donde les sirve, no les importa cual es la antiguedad de la tecnologia, si funciona pues bien, no se hable más...

Todo proyecto de migración debe justificarse en términos de retorno de inversión (ROI), si las nuevas versiones no le dan valor agregado a sus tareas diarias, pues no se migra... además por uno o varios issues de seguridad no es motivo para andar migrando... el tema seria como puedes minimizar estos riesgos y administrarlo de la mejor manera posible.

El fin de este post es demostrar como podemos controlar la administración de esta cuenta a pesar de las limitaciones que Microsoft indica en su documentación respectiva.

Saludos,

Saturday, June 27, 2009 7:24 PM por Percy Reyes

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

Caray que humildad Ddaz, como siempre sacando a relucir charlas del "MSN", te recuerdo una frase tuya: ["No todos los Programadores tienen el mismo Nivel: Esto es conocido por todos, aunque "NO ACEPTADO PUBLICAMENTE" – cuestiones de orgullo], comparto el punto de percy, del que muchas pero muchisimas empresas aun laboran con SQL 2000, tal vez esta entrada sea un motivo para el cambio no?,

gracias por el dato percy!! :)

@Posdata: Ddaz seguimos esperando los post de criptografía que prometistes en una entrada de Sergio Tarrillo :D, la comunidad no te olvida amigo! :D y como dijo sergio, no hablar de ello porque pueden atacar ya suena a floro!

@Otra Posdata: Y no me refiero ala entradita sobre: Seguridad de Aplicaciones I – Preludio..

Enjoy!

Saturday, June 27, 2009 9:05 PM por Ricardo S.

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

Hola Ricardo S.

si puse lodel msn, es que por que percy me hablo en el msn mucho antes de escribir este post y ayer volvio a tocar el tema.

y el punto es que si bien la documentacion esta herrada, esto no lo consideraria vulnerabilidad, ya que alguien de fuera, no podria modificarla, a menos que tuviera acceso..., y si bien tanto se quiere olvidar uno del SA, esto ayuda, en vez de perjudicar, o no?, asi eliminan el sa y ya... por que cambiar?.

sobre lo que dices k dije en el msn, no lo recuerdo, pero no me parece incorrecto eso que dices.

y lo de los post, no me e olvidado, y no es que me corra, pero ultimamente e tenido demasiadas complicaciones para poderme sentar y terminar con calma ese y otros post k tengo en borrador y no e podido terminar -el mas importante es mi hija de 2 meses la cual ahora acapara casi todo mi tiempo libre, y eso sumado a una sobrecarga de trabajo-.

y si lo se, espero que se me baje la chamba, sakura deje de dormirse a las 4 am y asi poder terminar los 9 post en borrador que tengo y no salen.

Salu2

Ddaz

Sunday, June 28, 2009 1:55 AM por David Daniel Arroyo Zari "Ddaz"

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

Hola, no veo aqui ninguna vulnerabilidad, usted para habilitar el acceso a las tablas de sistema debio ser sysadmin, el problema seria si cualquiera pudiera hacer esto, pero eso no es cierto. Lo que si podemos discutir es porque lo podemos hacer, pero recordemos que somos sysadmin y como estas cosas se pueden tocar muchas mas dentro del SQL, al igual que en otras bases de datos si uno es superuser, en Oracle pasa lo mismo al igual que en IBM,

Esto es como decir que mi casa es insegura cuando yo le di la clave de acceso a la gente o bien las llaves, ojo con estas cosas porque pueden confundir a la gente, asi como puede un sysadmin hacer esto, tambien puede hacer muchas mas cosas dentro del SQL, lo mismo pasa en windows con la regestry o en unix o en linux si sos root

Sunday, June 28, 2009 3:35 AM por Maxi

# re: Cómo controlar la administración de la cuenta sa (System Administrator) de SQL Server 2000

@Ricardo: Gracias, espero te sirva.

@Ddaz:  El DBA es quien decide que hacer con dicha cuenta de acuerdo a las políticas de seguridad que implemente. Tal vez el título no es lo más idóneo para este post pero el descrito es claro.

@Maxi: Gracias por el comentario, se cambiará el título del post para evitar confusiones e interpretaciones erróneas en los lectores. El fin del post es sólo demostrae como controlar la administracion de la cuenta sa a pesar que la documentacion de microsoft dice que no se puede, un recurso útil para todo DBA que desea deshacerse de dicha cuenta...

Sunday, June 28, 2009 3:43 AM por Percy Reyes