¿Existe algún riesgo particular de seguridad o rendimiento al usar el CLR en SQL Server?
sql-server
performance
security
sql-clr
SQLBen
fuente
fuente
Respuestas:
La pregunta, como señaló Remus, es demasiado genérica para obtener una respuesta, ya que la respuesta depende del contexto de qué funcionalidad se usará y cómo se usará.
En cuanto a "Seguridad":
Si está preguntando acerca de cualquier cosa que se pueda hacer en un ensamblaje marcado con
PERMISSION_SET = SAFE
, entonces no hay ningún problema que haya podido encontrar. Y SQLCLR es "más seguro" que usarxp_cmdshell
o los maravillosos procesos (eso fue sarcasmo)sp_OA*
(o incluso Procedimientos almacenados extendidos, pero con suerte ya nadie está creando ninguno de esos).Si desea un recorrido de lo que significa "SEGURO" en términos prácticos, consulte este artículo: Escalera a SQLCLR Nivel 3: Seguridad (Asambleas generales y SEGURAS) (se requiere registro gratuito).
Si está preguntando sobre cualquier cosa que se pueda hacer en un ensamblaje marcado con
PERMISSION_SET = EXTERNAL_ACCESS
, entonces ciertamente existen riesgos, de nuevo, dependiendo de qué funcionalidad se esté utilizando. Si escribe una rutina para leer directorios y nombres de archivos (es decir, solo lectura), entonces es solo una cuestión de lo que debe verse y no verse. Si está escribiendo código que permite eliminar un archivo, el riesgo aumenta. Pero lo que se puede hacer con esos recursos externos está controlado por:Si está preguntando sobre algo que se puede hacer en un ensamblaje marcado con
PERMISSION_SET = UNSAFE
, eso es bastante abierto. Se considera que una gran cantidad de funcionalidades solo se pueden usar en ensamblajes INSEGUROS porque son cuestiones de estabilidad y / o comportamiento consistente más que seguridad o rendimiento. Por ejemplo, en un ensamblaje INSEGURO es posible tener una variable estática grabable. Por lo general, esto no es algo bueno ya que las clases SQLCLR se comparten en todas las sesiones. Si su intención es compartir datos en la memoria en todas las sesiones y ha planificado las condiciones de carrera (y ha realizado muchas pruebas), entonces debería estar bien ya que espera este comportamiento. Pero si simplemente deseaba que una variable estática grabable almacenara en caché un valor para una sesión en particular para no tener que buscarlo nuevamente o calcularlo nuevamente, y no sabía que otras sesiones están leyendo ese valor y posiblemente sobreescribiéndolo, bueno, Eso sería un problema.Pero si le preocupa que alguien escriba en el Registro, pero aún no tiene ningún código que realmente escriba en el Registro, entonces probablemente no necesite preocuparse por esto ;-).
Si desea un recorrido de cómo EXTERNAL_ACCESS y UNSAFE funcionan en términos prácticos, y la diferencia entre establecer
TRUSTWORTHY ON
(no preferido) versus usar un inicio de sesión basado en clave o certificado asimétrico, consulte este artículo: Escalera al nivel 4 de SQLCLR: Seguridad (Asambleas EXTERNAS e INSEGURAS) (se requiere registro gratuito).Con respecto al "rendimiento":
Todo esto es cuestión de lo que está tratando de hacer y cómo lo hace. Hay algunas cosas que son mucho más rápidas en SQLCLR, y algunas cosas que son más lentas. Pero al igual que con T-SQL, es posible realizar una tarea algo simple y / o eficiente y hacerla complicada y / o ineficiente haciendo las cosas incorrectamente. Pero el uso de SQL CLR no es inherentemente, por su propia naturaleza, más lento.
fuente
Asambleas SQLCLR se pueden instalar con tres niveles de acceso de seguridad:
SAFE | EXTERNAL_ACCESS | UNSAFE
. Esto está ampliamente documentado, consulteCREATE ASSEMBLY
y Diseño de ensamblajes :Existen más restricciones sobre los atributos CLR permitidos y solo se admite un subconjunto de los ensamblados de .Net Framework. Nuevamente, consulte la documentación vinculada.
En cuanto al rendimiento, lo más importante es recordar que SQL Server es un entorno cooperativo multitarea, mientras que CLR no lo es. El código SQLCLR debe llamar en
Thread.BeginThreadAffinity()
cualquier momento que acapare la CPU por cualquier duración (incluido el bloqueo). Adam Machanic tiene una excelente presentación sobre el tema, ver Datos, más rápido: Técnicas de rendimiento de Microsoft SQL Server con SQLCLR .El tema es vasto y la pregunta vaga. SQLCLR puede realizar algunas tareas únicas que ninguna otra característica puede igualar. Y SQLCLR es solo otra arma en el arsenal de SQL Server con el que puedes dispararte en el pie, con rendimiento o seguridad. Lee la documentación.
fuente