Capitulo 11 - Seguridad de aplicaciones

 
Lección 1- entendiendo la seguridad de acceso a código Code Access Security (CAS)
 
¿Qué es el código de seguridad de acceso?
La seguridad de acceso a código (CAS) es un sistema de seguridad que permite a los administradores y desarrolladores de aplicaciones controlar y autorizar a los usuarios. Con CAS, se puede permitir que una aplicación lea y escriba en el registro. Se puede controlar la autorización usando seguridad basada en roles de sistema (RBS), de:
  • El sistema de archivos
  • El registro
  • Impresoras
  • Los registros de sucesos
 
Elementos de seguridad de acceso a código
Cada sistema de seguridad necesita una forma de identificar a los usuarios y determinar lo que un usuario puede o no puede hacer. Como CAS identifica y asigna los permisos a las aplicaciones en lugar de a la gente, que no puede utilizar los nombres de usuario, contraseñas y listas de control de acceso (ACL). En cambio, CAS identifica assemblies usando evidencias. Una evidencia es una manera de identificar la ubicación donde se almacena, un hash del código del assembly, o su firma. Un conjunto de pruebas determina el código de grupo al que pertenece y le otorga permisos.

¿Qué es la evidencia?
La evidencia es la información que se obtiene en tiempo de ejecución acerca de un assembly a para determinar qué grupos de código pertenece. Las formas comunes de pruebas incluyen la carpeta o el sitio Web donde el assembly se está ejecutando y sus firmas digitales.

Clases del namespace System.Security.Policy:

Evidencia Descripción
Application directory Directorio donde se encuentran los assemblies.
Hash El hash criptográfico del assembly, identifica de forma exclusiva una versión específica de un ensamblado. Cualquier modificación al assembly, el hash no es válido.
Publisher Firma digital del editor de assemblies, que identifica de forma única el desarrollador de software.
Site El sitio del cual se baja el assembly
Strong Name Nombre de cifrado fuerte del assembly, que identifica de forma exclusiva el espacio de nombres de este.
URL URL del cual se baja el assembly
Zone Zona donde se ejecuta el assembly, Internet o intranet Local.
 
¿Qué es un permiso?
Un permiso es una entrada de control de acceso del CAS. Por ejemplo, el permiso de diálogo de archivos que determina si un assembly puede interactuar con el usuario con un cuadro de diálogo Abrir, el cuadro de diálogo Guardar, ambas o ninguna.
image

De forma predeterminada, 19 permisos están disponibles para la configuración en el archivo.
Permisos Descripcion
Directory Services Otorga un acceso al Active Directory. se pueden especificar las rutas, o ver si el acceso de escritura está disponible.
DNS Activa o restringe el acceso de un ensamblado a presentar peticiones DNS.
Environment
Variables
Otorga a los assemblies acceso a las variables de entorno, Ruta de acceso, nombre de usuario, y número De Procesadores.
Event Log
Proporciona un acceso a los registros de sucesos. Puede permitir el acceso ilimitado o limitar el acceso a la navegación o auditoría.
File Dialog
Controla si un assembly puede pedir al usuario el cuadro de diálogo Abrir, el cuadro de diálogo Guardar, o ambos.
File IO Restringe el acceso a los archivos y carpetas.
Isolated Storage
Permite el acceso al almacenamiento aislado. Se puede configurar el nivel de aislamiento y el tamaño de la cuota de disco.
Message Queue
Permite acceder a las colas de mensajes, que puede ser restringido por la ruta y el tipo de acceso.
Performance Counter Controla si un assembly puede leer o escribir los contadores de rendimiento.
Printing Limita la capacidad que tiene un ensamblado para imprimir

Conjuntos de permisos
Permisos Descripción del conjunto
FullTrust Exime a un assembly de las comprobaciones de permisos CAS.
SkipVerification Permite a un assembly eludir las comprobaciones de permisos, que puede mejorar el rendimiento, pero sacrifica la seguridad.
Execution Permite a un assembly ejecutarse y no le otorga ningún otro permiso.
Nothing No otorga permisos. ni siquiera les permite ejecutarse.
LocalIntranet Otorga un conjunto abundante de permisos, incluyendo imprimir y tener acceso al registro de eventos. no permite acceder al sistema de archivos, excepto a través de los cuadros de diálogo, Abrir y Guardar.
Internet Conjunto restringido de permisos. se puede ejecutar un ensamblado con muy poco riesgo.
Everything Otorga todos los permisos.

¿Qué son los grupos de código? Los grupos de código de autorización que son dispositivos ensamblados asociados con conjuntos de permisos. Si un administrador desea conceder un conjunto de usuarios acceso a una carpeta, el administrador crea un grupo de usuarios, añade a los usuarios del grupo, y después asigna los permisos de archivos para el grupo.
Por ejemplo, cualquier código que se ejecuta a través de Internet debe ser un miembro del grupo de código Internet_Zone.
image

La autorización de control de grupos de usuarios está basado en ACL (Access control list- lista de control de acceso) distribuidas y asociadas a cada recurso, los grupos de código establecen el uso centralizado de autorización. Sin embargo, no se puede especificar los permisos individuales de un grupo de código. Un grupo de código debe estar asociado a un conjunto de permisos.
image
La Internet_zone asigna un conjunto de permisos de internet.

Grupos de código por defecto
Code Group Evidencia Conjunto de Permisos
My_Computer_Zone Zone: My Computer FullTrust
LocalIntranet_Zone Zone:Local Intranet LocalIntranet
Internet_Zone Zone:Internet Internet
Restricted_Zone Zone:Untrusted sites Nothing
Trusted_Zone Zone:Trusted sites Internet

¿Qué es la Política de Seguridad?
Una política de seguridad es una agrupación lógica de grupos de código y conjuntos de permisos. Puede contener ensamblados personalizados que definen otros tipos de políticas.
Las políticas de seguridad proporcionan a los administradores la flexibilidad para configurar opciones del CAS en múltiples niveles. Hay cuatro niveles de políticas configurables: empresa (enterprise), equipo (machine), usuario y dominio de aplicación.
El nivel de empresa es la política de nivel de seguridad más alta, se puede configurar mediante el servicio de directorio Active Directory. En el nivel equipo, se aplica a todo el código se ejecutan en un equipo determinado. Directiva de usuario es el tercer nivel, y define los permisos por usuario. Dominios de aplicación las tratamos en el capítulo 8.
 
Cómo funciona CAS con el sistema operativo de Seguridad?
CAS es completamente independiente de la seguridad del sistema operativo. De hecho, debe utilizar las herramientas diferentes para administrar CAS.
Al determinar si un assembly puede tomar una acción concreta, tanto CAS como la seguridad del sistema operativo se evalúan. Por ejemplo, si CAS otorga un acceso conjunto para escribir en el directorio C: \ Windows, pero el usuario no tiene ese permiso, el assembly no puede escribir en la carpeta.
image

Cómo utilizar la Herramienta de configuración de .Net Framework para configurar CAS? La herramienta de configuración. NET Framework proporciona una interfaz gráfica para la gestión la política de seguridad y las aplicaciones que utilizan servicios remotos. Tareas que se pueden realizar: La evaluación de un assembly para determinar de qué grupos de código que es miembro.
  • · Determinar los permisos que se le asignará a un assembly.
  • · Agregar nuevos conjuntos de permisos.
  • · Agregar nuevos grupos de código.
  • · Aumentar la confianza de un ensamblado.
  • · Ajustar la zona de seguridad.
  • · Restaurar los niveles de política.
Para mayor información de cómo configurar directivas de seguridad con el CAS, selecciones aqui
 
Como usar la herramienta de política de seguridad de código de acceso?
Podemos utilizar la herramienta Caspol.exe, para examinar y modificar la configuración de la máquina, el usuario y el nivel de la Enterprise de las políticas de seguridad de código de acceso. Esta proporciona una funcionalidad similar a la línea de comandos.

Algunas opciones más utilizadas en caspol
Opcion Descripcion
-addfulltrust assembly_file Agrega un assembly que implementa un permiso personalizado o una condición de pertenencia personalizada. El argumento assembly_file específica el ensamblado que se va a añadir. Este archivo debe estar firmado con un nombre seguro.
-addgroup parent_name
membership_condition
permission_set_name [flags]
Agrega un nuevo grupo de código. El argumento parent_name específica el nombre del grupo de código padre. El argumento membership_condition especifica la condición de pertenencia para este.
El argumento permission_set_name es el nombre del conjunto de permisos que se asociará con el nuevo grupo de código.

-all
Indica que todas las opciones siguientes éste se aplica a la empresa, equipo, y la directiva de usuario actual.
-chggroup name
{membership_condition |
permission_set_name |
flags}
Para cambiar el estado de un grupo de código, el conjunto de permisos, el nivel Final, etc. name: específica el nombre del grupo de código para cambiar.
permission_set_name: específica el nombre del conjunto de permisos a asociarse con el grupo de código. membership_condition: condiciones para el grupo.
-enterprise Indica que todas las opciones de la política de nivel empresarial. Los usuarios que no son administradores no tienen derechos para modificar la política de empresa, aunque pueden verla.
-execution {on | off} Activa o desactiva el permiso para ejecutar código antes de que se ponga en marcha.
-help Muestra la sintaxis de comandos y opciones para caspol.
-list Listas los grupos de código y permisos.
-listdescription Muestra todas las descripciones de grupos de código de un nivel específico.
-listfulltrust Enumera el contenido de la lista de confianza del nivel especificado.
-listgroups Muestra los grupos de código de nivel especifico.
-listpset Muestra los conjuntos de permisos del nivel especificado o todos los niveles
-machine Indica que todas las opciones que se aplican a la política machine.
-quiet Deshabilita temporalmente el mensaje que se muestra con una opción de hacer cambios de política.
-recover Recupera la política de seguridad desde una copia de seguridad.
-remgroup Quita el nombre de grupo de código especificado. Contiene otros grupos también los elimina a todos.
Para saber más información sobre cómo realizar configuraciones con Caspol, aquí.
 

Lección 2 – usando declarativas de seguridad para proteger Assemblies.
En algunas situaciones, la seguridad del CAS es tan restrictiva que la aplicación no tiene los permisos necesarios para las funciones más básicas. En otras, la aplicación tendrá más .
Se puede utilizar declarativa de demanda CAS para asegurar que tiene todos los permisos necesarios, pero ninguno de más.
 
Razones para utilizar las declaraciones de CAS del assembly
Hay tres razones principales:
  • · Para asegurarse de que en tiempo de ejecución no se ejecute la aplicación, sin permitir el acceso a los recursos necesarios. Se usa SecurityAction.RequestMinimum para declarar todos los permisos CAS que requiere la aplicación. Si un usuario intenta ejecutar la aplicación y la política de seguridad del CAS no otorga el permiso requerido, se produce una excepción. Los usuarios no podrían identificar el problema de la excepción, pero un administrador sí.
  • · Para crear un pequeño cajón de arena y asegurarnos de que un atacante no maneje la aplicación para hacer tareas no deseadas: tomar información del contenido de los archivos privados, destruir datos, multiplicación virus y gusanos.
  • · Para comprobar que la aplicación se puede ejecutar con permisos limitados CAS y se ejecutan en zonas de confianza parcial. Utilizando las declaraciones SecurityAction.RequestOptional, el tiempo de ejecución se otorgan sólo los permisos especificados.
 
Clases para los permisos CAS
CAS puede restringir el acceso a muchos tipos de recursos- archivos y carpetas, impresoras, acceso a la red:
PerformanceCounterPermission Para acceder a los contadores de rendimiento.
PrincipalPermission Para controlar el acceso de usuarios y de grupos. Se explica en el capítulo 12.
PrintingPermission Para el acceso a las impresoras.
ReflectionPermission Descubre información, en tiempo de ejecución, sobre un tipo.
RegistryPermission Para Leer, escribir, crear o eliminar claves del Registro y sus valores.
SecurityPermission Para Ejecutar, afirmar los permisos, permite llamar a código no administrado y omitir la comprobación.
ServiceControllerPermission Para acceder a servicios en marcha o parados.
SiteIdentityPermission Define un permiso de identidad para el sitio Web desde el que se origina el código.
SocketPermission aceptar Para realizar conexiones en una dirección de transporte.
SqlClientPermission Permite el Acceso a base de datos SQL.
StorePermission Contiene los certificados X.509.
StrongNameIdentityPermission Define el permiso de identidad para los nombres fuertes.
UIPermission Permite el acceso de los usuarios a la interfaz. Necesarios para depurar una asamblea.
UrlIdentityPermission Define el permiso de identidad para la dirección URL de donde se origina el código.
WebPermission Para Realizar o aceptar conexiones en una dirección Web.
ZoneIdentityPermission Define el permiso de identidad para la zona de donde se origina el código.


Tipos de declaraciones de permisos de assemblies
Todas las clases de permiso atributos definen la propiedad Action, que se especificará en tiempo de ejecución cuando se interprete el permiso, para establecer la propiedad Acción se usa uno de los tres miembros de la enumeración SecurityAction:
  • · SecurityAction.RequestMinimum requiere permiso para que el ensamblado se ejecute.
  • · SecurityAction.RequestOptional niega todos los permisos que no figuran en un SecurityAction.RequestOptional o en la declaración SecurityAction.RequestMinimum.
  • · SecurityAction.RequestRefuse Reduce los permisos asignados a la aplicación Se de. e utilizar este tipo de declaración para asegurar que la aplicación no tiene acceso a los recursos críticos de los que se podría abusar.
 
Cómo crear declaraciones de assemblies
Ejemplo de código que requiere acceso de lectura al archivo C: \ boot.ini. Si la política de seguridad no concede ese permiso a la asamblea, el tiempo de ejecución produce una excepción antes de ejecutarlo.
image


Lección 3 – Usando la seguridad imperativa y declarativa para proteger métodos
CAS puede ser utilizado tanto de forma declarativa, done el compilador comprueba la seguridad antes de que se ejecute el código, o imperativamente, donde el propio código realiza controles de seguridad.
 
Los tipos de solicitudes de permiso de los Métodos
Existen seis opciones para los permisos de imperativo y declarativo dentro de un método:
  • · Assert: se encarga de que en tiempo de ejecución se ignore el hecho de que los llamadores que no tenga el permiso especificado.
  • · Demand: hace en tiempo de ejecución se lance una excepción si algún llamador falta algún permiso especificado.
  • · Deny: causa que en tiempo de ejecución se reduzca el acceso del método mediante la eliminación del permiso especificado.
  • · InheritanceDemand : se encarga a de producir una excepción si el assembly que hereda de la clase no tiene el permiso especificado.
  • · LinkDemand: Causa que en tiempo de ejecución se lance una excepción si el llamador inmediato, pero no llamadores en la pila, la falta a un permiso especificado.
  • · PermitOnly se encarga de que en tiempo de ejecución se reduzca el acceso del método mediante la eliminación de todos los permisos excepto un permiso especificado.

Recomendaciones para la utilización de la solicitud de permisos de métodos
Consejos para elegir los métodos CAS a utilizar:
  • · Se debe usar la declaración SecurityAction.PermitOnly para limitar los permisos disponibles para cada método. Hay que listar todos los permisos que el método requiere.
  • · Usar la declaración SecurityAction.Deny para refinar los permisos disponibles de cada método.
  • · Se debe utilizar CodeAccessPermission.PermitOnly para reducir permisos cuando una sección de un método requiere menos permisos que el resto del método.
  • · Usar CodeAccessPermission.RevertPermitOnly para restaurar el permiso.
  • · Se debe usar CodeAccessPermission.Assert cuando se desea permitir que el código de confianza parcial llame a un método que requiere permisos de la persona.
  • · Usar CodeAccessPermission.Demand sólo cuando el ensamblado implementa una funcionalidad ustomized, que no se basa en una funcionalidad incorporada en el framework de .NET, tales como las llamadas a código no administrado.
Técnicas para Exigir permisos
Mediante una enumeración que contiene las opciones Demand y LinkDemand. La diferencia entre las dos enumeraciones y métodos es que Demand hace que el permiso se verifique para cualquier caller (llamador), mientras que LinkDemand comprueba sólo el llamador inmediato.
 
Como realizar demanda declarativa permisos CAS?
Para crear una petición declarativa, se debe utilizar la clase SecurityAction.Demand o SecurityAction.LinkDemand:
Ejemplo de dos métodos que utilizan FileIOPermissionAttribute (en System.Security. licencias) y WebPermissionAttribute (en System.Net) para verificar la declaración que los llamadores de los métodos, para que tengan acceso a archivos específicos y al sitio Web www.microsoft.com.
image

Si hacemos clases que otros desarrolladores pueden obtener y no queremos que esto suceda, se puede restringir el assembly mediante la enumeración SecurityAction.InheritanceDemand. Por ejemplo, para assemblies que solo tengan la firma en el directorio C: \ Certificados \ MyCertificate.cer:
image
 
Como demandar imperativamente los permisos CAS?
En las declaraciones CAS, hay un método CodeAccessPermission con el mismo nombre y la función que se utiliza para los permisos de imperativo. Se utilizan las enumeraciones SecurityAction para la seguridad declarativa y los métodos CodeAccessPermission de seguridad imperativa.
El ejemplo de cómo realizar las mismas comprobaciones declarativas CAS, pero con la comprobación imperativa:
image
 
Cómo relajar permisos y mejorar el rendimiento?
Uso de las demandas CAS mejora la seguridad, pero disminuye el rendimiento.
Una llamada CAS obliga en tiempo de ejecución a comprobar sistemáticamente el permiso de cada persona que llama. LinkDemand, es una manera de mejorar el funcionamiento del método de la demanda, pero se sacrifica seguridad.

Otra técnica es el método Assert, que hace eludir los controles de seguridad en tiempo de ejecución.
Por ejemplo, si crea un objeto RegistryPermission y se llama al método Assert, se debe conceder RegistryPermission. Si se llama a otro método que utiliza Demand para exigir RegistryPermission, este tendrá éxito si a la persona que llama se le han concedido los permisos RegistryPermission. Para utilizar Assert (declarativa o imperativamente) la sintaxis es la misma a otros tipos de declaraciones de CAS:
Declarativa:
image
Imperativa:
image
Para ver otros ejemplos sobre el manejo de permisos haz clic aquí.



....................................................................................................................................................
Bajar esta capítulo en formato PDF                                                                Codigo Ejemplo
....................................................................................................................................................

3 comentarios:

  1. Impresionante!!

    Me esta sirviendo de gran ayuda, saludos desde ESPAÑA

    ResponderEliminar
  2. ¿Para cuando la próxima entrega?
    Estoy impaciente... jejeje

    Mil gracias por tu trabajo y Feliz Navidad

    ResponderEliminar
  3. me encanta, FELICIDADES!!!

    FELIZ AÑO NUEVO !!!

    ResponderEliminar