Uso del bloqueo en la configuración de IIS 7.0

por Saad Ladki

Abstract

En este documento se explica cómo bloquear y desbloquear la configuración en el servidor. Conocerá qué opciones de configuración pueden invalidar los archivos de configuración en el nivel de aplicación y cómo usar el elemento <location> para bloquear secciones completas.

Experimentará con un bloqueo más detallado de las opciones de configuración, dentro de las secciones como, por ejemplo:

  • El bloqueo de elementos y atributos específicos
  • El bloqueo de todo excepto elementos o atributos específicos
  • El bloqueo de directivas de colección específicas, como las directivas <add>, <remove> y <clear>
  • El bloqueo de elementos específicos en la colección

Después de leer este documento, sabrá cómo administrar diferentes características del bloqueo de configuración mediante la edición directa de elementos XML en archivos de configuración (la interfaz de programación para realizar estas tareas sigue muy estrechamente la estructura XML).

Este documento solo se centra intencionadamente en la edición de elementos XML en los archivos de configuración, en lugar de mostrar formas de realizar las mismas tareas mediante la API de administración, los scripts o la interfaz de usuario (UI).

Introducción

IIS 7.0 y versiones posteriores permiten opciones de configuración de bloqueo y desbloqueo en varios niveles y ámbitos. El bloqueo de la configuración significa que no se puede invalidar (ni modificar en absoluto) en los niveles inferiores de la jerarquía. El desbloqueo de la configuración solo se puede realizar en el nivel en el que se bloqueó. Esto es útil, por ejemplo, al crear una configuración diferente para diferentes sitios o rutas de acceso, y solo algunos de los sitios y rutas de acceso pueden invalidarlo. El bloqueo se puede realizar en el nivel de sección o para elementos, atributos, elementos de colección y directivas de colección específicos dentro de secciones.

Tarea 1: Bloquear una sección mediante una etiqueta <location>

En esta tarea, aprenderá a usar la etiqueta <location> para bloquear (o desbloquear) secciones de configuración completas en el nivel global para que no se puedan invalidar en los niveles de aplicación de la jerarquía de configuración.

Nota:

De forma predeterminada, la mayoría de las secciones de IIS de applicationHost.config están bloqueadas y ninguna de las secciones de .NET Framework están bloqueadas (incluidas las secciones de ASP.NET del grupo de secciones <system.web> de machine.config y root web.config).

Con un editor de texto como Bloc de notas, abra el archivo applicationHost.config en la siguiente ubicación:

%windir%\system32\inetsrv\config\applicationHost.config

Revise la sección <configSections> en la parte superior del archivo: tiene metadatos sobre las secciones de configuración de este archivo, como los nombres de secciones, grupos de secciones que las contienen, y si están bloqueadas o no.

Las secciones bloqueadas se especifican mediante el atributo "overrideModeDefault", que puede ser "Allow" ("Permitir") o "Deny" ("Denegar"). Algunas secciones no están bloqueadas de manera predeterminada, como se especifica en esta línea, por ejemplo:

<section name="defaultDocument" overrideModeDefault="Allow" />

En este caso, tratamos con la sección <windowsAuthentication>. Está bloqueada de manera predeterminada.

Para desbloquear toda la sección en todas las aplicaciones del servidor, mueva su contenido de su ubicación actual en el archivo a la parte inferior de este y colóquela dentro de un elemento <location overrideMode="Allow">. Recuerde también disponer los grupos de secciones que la rodean: <system.webServer>, después <security> y, después, <authentication>. El resultado final debe tener este aspecto:

<location overrideMode="Allow">
  <system.webServer>
     <security>
        <authentication>
          <!-- the content of windowsAuthentication section is here -->
        </authentication>
     </security>
  </system.webServer>
</location>

Ahora, la sección está desbloqueada para todas las aplicaciones. Puede especificar una ruta de acceso en la etiqueta de ubicación para que la sección se desbloquee solo para esta ruta de acceso. La ruta de acceso predeterminada, si no se especifica (como sucedía en el paso anterior), es path="." (o path="", que es lo mismo), lo que significa "en este nivel actual". En este caso, dado que se trata de applicationHost.config, el nivel actual significa el nivel global. También puede usar etiquetas de ubicación en cualquier lugar de la jerarquía de espacios de nombres, por ejemplo, en un archivo web.config en el nivel de vdir, para bloquear la configuración desde este punto hacia abajo.

Este es un ejemplo de cómo desbloquear esta sección solo para el sitio "AdminSuperTrusted". Esto significa que los archivos web.config de ese sitio pueden invalidar la configuración de esta sección; pero, para todos los demás sitios del cuadro, la configuración está bloqueada en el nivel global y no se puede invalidar.

En este ejemplo, debe dejar el contenido de la sección en su lugar original en applicationHost.config y, a continuación, especificar la sección en la etiqueta de ubicación con una ruta de acceso específica:

<location path="AdminSuperTrustedSite" overrideMode="Allow">
  <system.webServer>
    <security>
      <authentication>
        <!-- note: this is different than previous example, in that  -->
        <!-- the content of the section is in the original place and -->
        <!-- was not moved here; in addition, the section is also    -->
        <!-- specified here, just by its name, so that it gets       -->
        <!-- unlocked only for the site specified in the location.   -->
        <windowsAuthentication/>
      </authentication>
    </security>
  </system.webServer>
</location>

Volviendo al tercer ejemplo anterior, la sección se desbloquea para todas las aplicaciones de todos los sitios (ubicación path="."). Compruebe que el grupo de secciones de <autenticación> principal (el que está fuera del elemento <location> que apareció anteriormente en el archivo) no contiene una sección <windowsAuthentication>. Una sección no puede aparecer en el mismo archivo fuera de una etiqueta de ubicación y dentro de una etiqueta <location path=".">; esto se considera una configuración no válida.

Para probar si una sección está bloqueada o no, vaya a http://localhost/app en el explorador.

Si la sección está bloqueada, el explorador muestra un error porque el archivo web.config en el nivel de aplicación tiene la sección <windowsAuthentication> en él. Esto significa que web.config intenta invalidar <windowsAuthentication> en su nivel. Sin embargo, dado que esa sección ahora está bloqueada en el nivel global, la configuración en el archivo web.config no es válida.

Cambie la etiqueta de ubicación para que incluya overrideMode="Deny". Esto bloquea de nuevo la sección. Experimente con otras secciones, como las secciones de ASP.NET en machine.config o root web.config. Intente bloquearlos en el nivel global e invalidarlos en el nivel web.config.

Tarea 2: Bloquear elementos y atributos específicos

Basándose en la tarea anterior, busque la sección <windowsAuthentication> dentro de la etiqueta <location>. Establezca la etiqueta de ubicación para desbloquear la sección: overrideMode="Allow". Solo vamos a no bloquear partes específicas de la sección.

Establezca el atributo enabled en true y, a continuación, bloquéelo estableciendo lockAttributes="enabled".

Esto impide que un archivo de configuración en el nivel de aplicación cambie el valor del atributo enabled de la sección <windowsAuthentication>.

Si desea bloquear otros atributos, agréguelos al valor lockAttributes separados por comas, como en el ejemplo siguiente:

lockAttributes="enabled,attribute1,attribute2"

También puede bloquear todos los atributos mediante "*", como en este ejemplo:

lockAttributes="*"

Ahora, la sección debería tener un aspecto similar al siguiente:

<location path="." overrideMode="Allow">   <system.webServer>
    <security>
      <authentication>
        <windowsAuthentication enabled="true" lockAttributes="enabled">          
          <providers>
            <add value="Negotiate" />
            <add value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</location>

En el archivo web.config de la aplicación, intente invalidar la configuración de la sección <windowsAuthentication>.

En el explorador, solicite la página para comprobar que puede invalidar todas las configuraciones excepto la que ha bloqueado, en este caso, el atributo enabled.

Nota:

Solo por especificar el atributo en el archivo web.config se produce un error de configuración, incluso si el atributo que estableció en el archivo Web.config tiene el mismo valor que en el archivo ApplicationHost.config. Si se establece un atributo bloqueado en cualquier valor, se considerará un intento de invalidar el atributo y, por tanto, se producirá un error. (Tenga en cuenta también que los atributos son diferentes de los elementos; en la siguiente tarea, bloqueará un elemento).

Elimine el atributo lockAttributes.

Establezca lockElements="providers" para bloquear el elemento <providers> dentro de la sección.

Si desea bloquear otros elementos, puede agregarlos separados por comas, de la siguiente manera:

lockElements="providers,element1,element2"

Ahora, la sección debería tener un aspecto similar al siguiente:

<location path="." overrideMode="Allow">   <system.webServer>
    <security>
      <authentication>
        <windowsAuthentication enabled="true" lockElements="providers">
          <providers>
            <add value="Negotiate" />
            <add value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</location>

En el archivo Web.config de la aplicación, invalide el elemento <providers> configurándolo, o bien, intentando agregar, eliminar o borrar la colección.

En el explorador, solicite la página y observe que aparece un error. En el archivo web.config, invalide otros elementos o atributos, como el atributo enabled. Vaya a la página y observe que no aparece ningún error.

Elimine el atributo lockElements.

Tarea 3: Bloquear todo excepto atributos específicos

En esta tarea, aprenderá a bloquear todos los elementos o atributos de una sección excepto aquellos que defina. Esto es útil en los casos en los que no está seguro de qué propiedades tiene o tendrá la sección en el futuro, y desea bloquear todo excepto las propiedades que establezca explícitamente para que estén desbloqueadas.

Basándose en la tarea anterior, busque la sección <windowsAuthentication> en la etiqueta de ubicación.

Establezca los atributos lockAllElementsExcept o lockAllAttributesExcept en una lista delimitada por comas de elementos o atributos que se van a bloquear. Por ejemplo, la sección podría tener un aspecto parecido a este:

<windowsAuthentication enabled="true" lockAllElementsExcept="providers">
     <providers>
          <add value="Negotiate" />
          <add value="NTLM" />
     </providers>
</windowsAuthentication>

O a este:

<windowsAuthentication enabled="true" lockAllAttributesExcept="enabled">
     <providers>
          <add value="Negotiate" />
          <add value="NTLM" />
     </providers>
</windowsAuthentication>

En esta sección específica, actualmente no hay otros atributos ni elementos. Si desea probar el efecto de establecer los atributos lockAllElementsExcept o lockAllAttributesExcept, agregue los mismos atributos a otras secciones que tengan un conjunto más completo de atributos.

Tarea 4: Bloquear algunas directivas de colección

En esta tarea, aprenderá a bloquear las directivas <add> y <remove> en una colección para que, en el nivel de aplicación, se puedan agregar elementos del archivo de configuración, pero no eliminarlos.

Basándose en la tarea anterior, busque la sección <windowsAuthentication> en la etiqueta de ubicación.

Establezca el atributo lockElements de la colección <providers> en remove,clear.

Cuando haya terminado, la sección tendrá el siguiente aspecto:

<windowsAuthentication enabled="true" >
  <providers lockElements="remove,clear">
    <add value="Negotiate" />
    <add value="NTLM" />
  </providers>
</windowsAuthentication>

En el archivo web.config de la aplicación, cree un elemento <remove> que elimine el elemento NTLM de la colección.

Cuando termine, el archivo web.config tiene el siguiente aspecto:

<configuration>
  <system.webServer>
    <security>
      <authentication>
        <windowsAuthentication>
          <providers>
            <remove value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</configuration>

En el explorador, solicite http://localhost/app.

Tarea 5: Bloquear elementos específicos de una colección

En esta tarea, aprenderá a bloquear elementos específicos de una colección. Los desarrolladores todavía pueden agregar elementos a la colección en niveles inferiores (aplicación) de la jerarquía y pueden eliminar elementos no bloqueados de la colección. Sin embargo, no pueden eliminar los elementos que ha bloqueado específicamente. No se puede borrar la colección, ya que borrar significa eliminar todos los elementos de la colección.

Basándose en las tareas anteriores, busque la sección <windowsAuthentication> en la etiqueta de ubicación.

En la colección <providers>, en el elemento <add> del proveedor NTLM, establezca lockItem en "true".

Cuando haya terminado, la sección tendrá el siguiente aspecto:

<windowsAuthentication enabled="true" >
  <providers>
    <add value="Negotiate" />
    <add value="NTLM" lockItem="true" />
  </providers>
</windowsAuthentication>

En el archivo web.config de la aplicación, cree un elemento <remove> que elimine el elemento NTLM de la colección.

Cuando termine, el archivo Web.config tiene el siguiente aspecto:

<configuration>
  <system.webServer>
    <security>
      <authentication>
        <windowsAuthentication>
          <providers>
            <remove value="NTLM" />
          </providers>
       </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</configuration>

En el explorador, solicite http://localhost/app: se produce un error en la solicitud.

Resumen

En este documento, ha aprendido a bloquear las opciones de configuración. Puede bloquear una sección completa, ya sea mediante un elemento <location> o estableciendo el atributo lockItem de una etiqueta en true. El bloqueo puede ser más flexible y detallado si usa las opciones lockAttributes, lockElements, lockAllAttributesExcept, lockAllElementsExcept o lockItem en los elementos de la colección, y si usa la opción lockElements en las colecciones para especificar directivas de colección concretas (<add>, <remove> o <clear>). El bloqueo puede producirse en cualquier nivel de la jerarquía, no solo en ApplicationHost.config. El bloqueo surte efecto desde ese nivel hacia abajo.