Leer en inglés

Compartir a través de


Fundamentos de seguridad de .NET Framework

La seguridad de acceso a código es la parte de .NET Framework que controla el acceso a los recursos controlando la ejecución de código.Esta característica de seguridad es independiente de la seguridad proporcionada por el sistema operativo y se agrega a ella.

Cómo funciona

Cuando un usuario ejecuta su aplicación, es asignado a una zona por Common Language Runtime de .NET Framework.Las cinco zonas son:

Zona

Descripción

Mi PC

El código de aplicación reside en el equipo del usuario.

Local Intranet

El código de aplicación se ejecuta desde un recurso compartido de archivos en la intranet del usuario.

Internet

El código de aplicación se ejecuta desde Internet.

Sitios de confianza

Éstas son aplicaciones de sitios definidos como "De confianza" a través de Internet Explorer.

Sitios que no son de confianza

Éstas son aplicaciones de sitios definidos como "Restringidos" a través de Internet Explorer.

La asignación de las tres primeras zonas, Mi PC, Intranet local e Internet, se basa en la ubicación del código.Puede reemplazar la asignación mediante la indicación de sitios concretos en los grupos Sitios de confianza o Sitios restringidos en Internet Explorer.

Cada una de estas zonas tiene permisos de acceso concretos establecidos por un administrador del sistema.El nivel de seguridad para una zona se puede establecer en plena confianza, nivel de confianza medio, confianza baja o ninguna confianza.Los niveles de confianza definen los recursos a los que puede tener acceso la aplicación.La zona, junto con otros elementos de seguridad como el editor, el nombre seguro, el sitio Web y la dirección URL del código, determina los permisos concedidos al código en tiempo de ejecución.(Para obtener más información sobre la evidencia de seguridad, vea Prueba.) No dispone de control sobre la configuración de seguridad en el equipo del usuario y su aplicación debe trabajar con la configuración que encuentra cuando se ejecuta.Esto puede significar que se denegará a su aplicación el acceso a recursos determinados.Por ejemplo, es posible que la aplicación deba escribir datos en un archivo pero que el sistema del usuario impida el acceso de escritura en tiempo de ejecución iniciando una excepción.

Su trabajo consiste en desarrollar su aplicación para controlar esta situación.Esto no significa necesariamente que buscará otro método para que su aplicación pueda escribir los datos.Significa que la aplicación debe anticipar que es posible que no pueda escribir los datos y por tanto, debe responder a esta posibilidad.Quizás desee usar más el control de excepciones o algunos de los objetos del espacio de nombres System.Security.Permissions para que el código sea más robusto.Un breve descripción de estos métodos se incluye en una sección posterior de este artículo, "Desarrollar para entornos de confianza parcial".

Los niveles de seguridad para las zonas se establecen utilizando las herramientas de administración cuando se instala .NET Framework.Para obtener más información sobre el establecimiento de niveles de seguridad en las zonas de un equipo, vea Herramientas de administración.

Full Trust

Los desarrolladores trabajan a menudo en un entorno de plena confianza.Mantienen su código fuente en sus discos duros y prueban sus aplicaciones en sus equipos de desarrollo.En este entorno de plena confianza, cualquier código que el desarrollador compila se puede ejecutar en el equipo local.No se producen excepciones de seguridad, porque el equipo local se define como un entorno de plena confianza de forma predeterminada.

Confianza parcial

La confianza parcial describe cualquier zona que no es una zona de plena confianza.Cuando se implementa una aplicación, se puede mover a una nueva zona, quizás una que no concede plena confianza a la aplicación.Los dos escenarios más comunes que ejecutan código en confianza parcial son:

  • Ejecutar código que se descarga de Internet.

  • Ejecutar código que reside en un recurso compartido de red (intranet).

Algunos ejemplos de recursos que se podrían denegar en una zona de confianza parcial son:

  • Operaciones de E/S de archivos, incluida la lectura, escritura, creación, eliminación o impresión de archivos.

  • Componentes del sistema, como valores del Registro y variables de entorno.

  • Componentes del servidor, incluidos servicios de directorio, Registro, registros de eventos, contadores de rendimiento y colas de mensajes.

¿Qué es lo que no se permite en la confianza parcial?Eso no es fácil de determinar.Cada clase y cada método de cada clase en .NET Framework dispone de un atributo de seguridad que define el nivel de confianza necesario para ejecutar el método; este atributo puede resultar no accesible en tiempo de ejecución debido a estas características de seguridad.El nivel de zona no es una simple asignación de nivel de confianza a los atributos, sino una colección de permisos concretos asignados a clases y métodos determinados.Su aplicación no podrá simplemente consultar el nivel de confianza y a continuación, predecir qué recursos no están disponibles.Puede determinar si su aplicación se ejecuta con plena confianza.Un método para ello se describe en la sección siguiente, "Desarrollar para entornos de confianza parcial".

Desarrollar para entornos de confianza parcial

En esta sección se presenta una introducción muy breve a cómo los aspectos de seguridad pueden afectar al código que escribe.No hay ninguna solución única para el desarrollo en un entorno de confianza parcial.Su solución dependerá de la aplicación que escribe.Además, dado que el nivel de confianza puede cambiar durante la ejecución de la aplicación, no puede simplemente comprobar el nivel de confianza existente y continuar.

Código de excepción de seguridad

El primer paso para desarrollar en zonas de confianza parcial consiste en escribir código que reconozca que aparecerán excepciones de seguridad.Observe el código siguiente:

Public Sub MakeABitmap()
    Dim b As New System.Drawing.Bitmap(100, 100)
    ' Some code here to draw a nice picture in the bitmap
    b.Save("c:\PrettyPicture.bmp")
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b =
        new System.Drawing.Bitmap(100, 100);
    // Some code here to draw a nice picture in the bitmap
    b.Save("c:\\PrettyPicture.bmp");
}

Este método se ejecuta sin iniciar una excepción si el proyecto y el ensamblado del proyecto están almacenados en el disco duro de su equipo y si es miembro del grupo Administradores de su equipo.Si implementa esta aplicación en su intranet, se puede iniciar SecurityException cuando la aplicación intenta guardar el objeto de mapa de bits.Si no tiene un bloque Instrucción Try...Catch...Finally (Visual Basic) o try-catch-finally (C# Reference) que delimite este código, la aplicación finalizará con la excepción.Ésta probablemente no es una experiencia satisfactoria del usuario.Si agrega el código de control de excepciones, su aplicación puede:

  • Advertir al usuario que la aplicación no puede finalizar todas las tareas que necesita.

  • Limpiar cualquier objeto existente, para que el código que se ejecuta después del bloque catch no genere un error.

Podría modificar el código de almacenamiento del mapa de bits como se muestra a continuación.El código agregado advierte al usuario de que el archivo no se ha guardado debido a una denegación de seguridad y separa los errores de seguridad de otros errores de E/S de archivo, como nombres de archivo incorrectos.Este método no crea ninguna vulnerabilidad de seguridad.El usuario modificará la seguridad para confiar en su aplicación o la aplicación no se ejecutará.

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Try
        b = New System.Drawing.Bitmap(100, 100)
        b.Save("c:\PrettyPicture.bmp")
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;

    try
    {
        b = new System.Drawing.Bitmap(100, 100);
        b.Save("c:\\PrettyPicture.bmp");
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
            "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.");
    }
}

Las clases, atributos y enumeraciones de la compatibilidad del espacio de nombres System.Security.Permissions controlan más aún las tareas de seguridad en la aplicación.Si escribe bibliotecas que pueden llamar otras aplicaciones, deseará que la biblioteca compruebe los permisos del código que realiza la llamada.Por ejemplo, podría simplemente agregar el siguiente atributo del nivel de ensamblado en la parte superior de su archivo de código o en los archivos AssemblyInfo.vb o AssemblyInfo.cs.Para obtener más información, vea Configurar atributos de ensamblados.

<Assembly: System.Security.Permissions.FileIOPermissionAttribute( 
    System.Security.Permissions.SecurityAction.RequestMinimum, 
    Write:="c:\PrettyPicture.bmp")> 
[assembly: System.Security.Permissions.FileIOPermissionAttribute(
    System.Security.Permissions.SecurityAction.RequestMinimum,
    Write = "c:\\PrettyPicture.bmp")]

El tiempo de ejecución comprueba el permiso cuando se carga el ensamblado.Si el tiempo de ejecución deniega el permiso solicitado, el ensamblado no se carga y se inicia una excepción de seguridad.Si agrega este atributo a una aplicación independiente, la aplicación podría no ejecutarse.Si este atributo aparece en una biblioteca de clases, la biblioteca puede no cargarse en tiempo de ejecución.Necesitaría agregar un bloque try/catch al código que llama a la biblioteca de clases.

También puede pedir específicamente los permisos en tiempo de ejecución; esto se muestra a continuación con el método Demand.El tiempo de ejecución puede conceder o denegar la demanda.La demanda se deniega produciendo una excepción de seguridad.Podría reescribir el código de esta forma para exigir explícitamente el permiso para escribir el archivo de mapa de bits:

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Dim filename = "c:\PrettyPicture.bmp"
    Dim permission As New System.Security.Permissions.FileIOPermission( 
        System.Security.Permissions.FileIOPermissionAccess.Write, 
        filename)

    Try
        permission.Demand()
        Try
            b = New System.Drawing.Bitmap(100, 100)
            b.Save(filename)
        Catch ex As System.Exception
            MessageBox.Show("Unable to create and save the bitmap.")
        End Try
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Other error.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;
    string filename = "c:\\PrettyPicture.bmp";

    System.Security.Permissions.FileIOPermission permission;
    permission = new System.Security.Permissions.FileIOPermission(
        System.Security.Permissions.FileIOPermissionAccess.Write, filename);

    try
    {
        permission.Demand();
        try
        {
            b = new System.Drawing.Bitmap(100, 100);
            b.Save(filename);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show("Unable to create and save the bitmap.");
        }
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
               "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Other error.");
    }
}

Pruebas

El segundo paso para desarrollar en zonas de confianza parcial consiste en probar en varios entornos, sobre todo de su intranet e Internet.Esto obligará a iniciar las excepciones de seguridad.Una prueba importante consiste en crear una cuenta de usuario en el equipo local que no disponga de derechos de Administrador e intentar ejecutar la aplicación con dicha cuenta.

Vea también

Tareas

Cómo: Ejecutar código de confianza parcial en un recinto

Cómo: Solicitar permisos mínimos mediante el marcador RequestMinimum

Conceptos

Seguridad de acceso del código

Instrucciones de codificación segura

Cambios de seguridad en .NET Framework 4