Tenemos una situación en la que los Desarrolladores no tienen ningún UPDATE
permiso, PERO trabajan con aplicaciones y ven cadenas de conexión -> conocen las contraseñas de algunas cuentas SQL (ejemplo SQLLogin1
) que tienen permisos de ACTUALIZACIÓN. Nuestras operaciones actualmente no son perfectas y, a veces, es necesario modificar los datos de producción (todavía no hay GUI para eso).
En lugar de contactar a DBA y pedirle que modifique los datos, el Desarrollador usaría (incorrectamente) una cuenta SQL SQLLogin1
(que tiene permiso para modificar los datos) y se conectaría a través de SQL Server Management Studio para modificar los datos él mismo.
DBA no puede cambiar la contraseña SQLLogin1
sin que el Desarrollador vea la nueva cadena de conexión y la nueva contraseña, ya que la cadena de conexión de la aplicación que utiliza SQLLogin1
es mantenida por el Desarrollador.
Pregunta:
¿Hay alguna forma de denegar el acceso al SQLLogin1
inicio de sesión de SQL, pero solo si se conecta a través de SSMS?
Al mismo tiempo, si se SQLLogin1
está conectando .Net SqlClient Data Provider
( program_name
en el sys.dm_exec_sessions
), se debe permitir iniciar sesión.
De esta manera, no queremos permitir que Developer se conecte a través de SSMS usando SQLLogin1
, mientras que la aplicación que está usando SQLLogin1
, todavía podría conectarse.
fuente
Creo que no hay una solución confiable para su problema, ya que
Application Name
es modificableparameter
que cualquier usuario pueda cambiar la cámara.Aquí está cómo cambiarlo dentro de
SSMS
:En el
Connect to Database Object
cuadro de diálogo, elija Opciones, abraAdditional Connection Parameters
y elija cualquier nombre paraApplication Name
esto:Ahora
sys.dm_exec_sessions
DMV y Program_name () le mostrarán lo que pasó en su cadena de conexión en elApplication Name
parámetro:fuente
No puede cortar un cliente específico, como ya se detalla en las otras respuestas.
La solución es eliminar los privilegios de acceso a los sistemas de producción de las cuentas del desarrollador.
Cualquier cambio debe ser programado y un dba ejecutará el script.
La implementación la realiza un administrador del sistema; los desarrolladores producen un paquete que le dan a alguien con los privilegios adecuados y los desarrolladores nunca ven las configuraciones utilizadas en los sistemas de producción.
La depuración se organiza caso por caso con una copia de los datos de producción en un entorno provisional como una solución preferida o una cuenta temporal con privilegios limitados si es necesario.
fuente
En el sentido ideal, este es un problema de proceso / política / gestión. Incluso si alguien conoce la contraseña, si va en contra de la política de la compañía que alguien que no sea un DBA se conecte a Producción (bueno, es posible que tenga un equipo de Release Engineering y / o administradores de sistemas, etc.), y existen sanciones por infringir las reglas, entonces eso debería ser suficiente (suponiendo que se apliquen tales reglas).
Intentar evitar que una aplicación en particular se conecte es imposible. Como demostró Sepupic , es bastante fácil cambiar el "nombre del programa". Pero incluso si el desarrollador no puede resolver eso, hay muchos otros programas que pueden conectarse a SQL Server. La mayoría de las personas tendrán acceso a SQLCMD.exe e incluso al obsoleto OSQL.exe . El desarrollador puede conectarse desde Visual Studio, e incluso puede crear su propia aplicación para conectarse a través de ".Net SqlClient Data Provider". Ah, y ahora incluso tenemos Azure Data Studio. Son demasiados
Aún así, esto podría ser posible si lo enfocamos desde la otra dirección: en lugar de evitar que la aplicación X se conecte, ¿qué tal si solo permitimos que la aplicación Y se conecte? Claro, nuevamente ingresamos al "nombre del programa", e incluso el "nombre de host" puede ser falsificado, PERO, estoy bastante seguro de que la dirección IP del cliente no puede ser falsificada (al menos no a través de las palabras clave de la cadena de conexión). Conoce la dirección IP de los servidores de aplicaciones o puede encontrarla fácilmente desde el
sys.dm_exec_connections
DMV (en elclient_net_address
campo).Comenzando con el Logon Trigger sugerido por EzLo , podemos modificar la lógica que determina si la conexión es válida o no es la siguiente:
Las únicas formas en este momento serían iniciar sesión en la máquina de producción o hacer que su estación de trabajo falsifique la IP del servidor de aplicaciones. Esperemos que los desarrolladores no tengan acceso para iniciar sesión en Producción. Y falsificar una IP existente en una red causa problemas que podrían afectar negativamente a la producción, por lo que no lo intentarán, ¿verdad? ¿Derecho?
fuente
Anteriormente trabajé para una empresa que tenía este problema con un desarrollador. Fue despedido, pero también implementamos una tabla que tenía LoginName y AllowMachine (Application Server) a través de un desencadenador de inicio de sesión. Esto resolvió nuestros problemas. O tal vez se debió a los disparos.
fuente