Introducción a la configuración en IIS 7 y versiones posteriores

por Tobin Titus

Resumen

El sistema de configuración de IIS 7 y versiones posteriores se basa en archivos XML distribuidos, de texto no cifrado que contienen las opciones de configuración de toda la plataforma de servidor web, incluidos IIS, ASP.NET y otros componentes, y se pueden establecer opcionalmente en los directorios de contenido junto con el contenido web. El administrador de la máquina puede delegar distintos niveles de la jerarquía de configuración a otros usuarios, como el administrador del sitio o el desarrollador de aplicaciones. Los valores predeterminados seguros y el confinamiento preconfigurado limitan el acceso de escritura a las configuraciones solo para el administrador de la máquina; sin embargo, las características de bloqueo sofisticadas y granulares permiten el desbloqueo seguro y la delegación de la gestión de configuraciones específicas a más usuarios, en el ámbito de su espacio de nombres web. El sistema es compatible con versiones anteriores, en el nivel de API, con versiones anteriores de IIS y en el nivel XML, con versiones anteriores de .NET Framework. En este documento se proporciona información general sobre el nuevo sistema de configuración.

Introducción

El sistema de configuración de IIS se basa en archivos XML distribuidos, de texto no cifrado que contienen las opciones de configuración de toda la plataforma de servidor web, incluidos IIS, ASP.NET y otros componentes, y se pueden establecer opcionalmente en los directorios de contenido junto con el contenido web. El administrador de la máquina puede delegar distintos niveles de la jerarquía de configuración a otros usuarios, como el administrador del sitio o el desarrollador de aplicaciones. Los valores de configuración seguros por defecto y el bloqueo estándar limitan el acceso de escritura a las configuraciones solo al administrador de la máquina. Sin embargo, las características de bloqueo sofisticadas y detalladas permiten el desbloqueo seguro y la delegación de la administración de configuraciones específicas a más usuarios, dentro de su ámbito en el espacio de nombres web. El sistema es compatible con versiones anteriores, en el nivel de API, con versiones anteriores de IIS y en el nivel XML, con versiones anteriores de .NET Framework.

El nuevo sistema de configuración está diseñado para ser:

  • Simple: todo el estado está en archivos; No se utiliza ningún almacén propietario; No hay ninguna base de datos de configuración en memoria que sea el patrón real del estado de configuración (a diferencia del servicio IISADMIN en IIS 6.0); El esquema está controlado por datos y es 100% declarativo y reconocible.

  • TCO bajo: la configuración se puede copiar junto con el contenido web; La administración delegada opcional elimina la participación del administrador de la máquina en cada cambio de configuración; La unificación de las opciones de configuración y el modelo en IIS, ASP.NET y el resto de la plataforma de servidor web proporciona una tienda única para administrar el servidor mediante el mismo conjunto de herramientas y API (por ejemplo, los archivos web.config pueden contener la configuración de IIS y ASP.NET, y hay un lugar en ambos para controlar características como autenticación, autorización, errores personalizados); backup, restore, security management (ACL) se basan en procesos y herramientas estándar del sistema de archivos.

  • Seguro: cuando IIS se instala, el estado de configuración se encuentra en un archivo protegido solo para el acceso de administrador de equipo; No hay ninguna delegación habilitada de forma predeterminada; No se almacena información confidencial (como contraseñas) de forma predeterminada; Cuando es necesario escribir información confidencial en los archivos de configuración, se cifra automáticamente en el disco; La configuración por aplicación se puede colocar y aislar en un archivo dedicado (protegido por la ACL del sistema de archivos), de modo que otras aplicaciones no puedan compartir ni leer la configuración.

  • Extensible: agregar al esquema es simplemente una cuestión de quitar un archivo XML a la carpeta de esquemas; No es necesario llamar a las API ni ejecutar herramientas para ampliar el esquema; La configuración se organiza en bloques relacionados lógicamente denominados "secciones" (exactamente igual que en la configuración de .NET Framework) y agregar nuevas secciones es fácil (no es necesario escribir ningún código, a diferencia de en la configuración de .NET Framework); Leer la configuración de sección personalizada desde un módulo de servidor o una aplicación es sencillo y sencillo.

  • Compatible: las aplicaciones IIS existentes pueden seguir llamando a interfaces como Objetos base de administración (ABO), el proveedor ADSI de IIS y el proveedor WMI de IIS 6.0; Las aplicaciones de .NET Framework existentes pueden seguir llamando a interfaces como System.Configuration y System.Web.Configuration; Los usuarios que están familiarizados con el formato XML de machine.config y web.config seguirán experimentando el mismo formato y sintaxis en estos archivos, además de que podrán editar manualmente la configuración de IIS que sigue el mismo formato y modelo; Los usuarios que están familiarizados con los nombres de propiedades de Metabase de IIS encontrarán los mismos nombres para las propiedades en los nuevos archivos de configuración de IIS 7.0 y versiones posteriores.

Limpiar esquema

Este es un ejemplo que muestra el esquema para la configuración.

Muestra cómo se organizan las opciones de autenticación en IIS 6 y en IIS 7.0 y versiones posteriores.

Nota:

Los lectores que no están familiarizados con los conceptos de IIS 6.0 simplemente pueden ignorar la comparación con IIS 6.0 y simplemente leer los conceptos y ventajas de IIS 7.0 y versiones posteriores.

Primero compararemos la forma en que la configuración se conserva en el archivo y, a continuación, echaremos un vistazo a la definición del esquema.

En el propio archivo de configuración:

//
// Snippet from IIS 6.0 Metabase.xml
//
<IIsWebService    Location ="/LM/W3SVC"
      ... many lines here ...
    AuthFlags="AuthAnonymous"
      ... many lines here ...
    >
</IIsWebService>
<IIsWebDirectory    Location ="/LM/W3SVC/1/ROOT/aspnet_webadmin/2_0_41016"
    AuthFlags="AuthAnonymous | AuthNTLM"
    >
</IIsWebDirectory>
<IIsWebVirtualDir    Location ="/LM/W3SVC/Info/Templates/Public Web Site/Root"
        AuthFlags="AuthAnonymous"
    >
</IIsWebVirtualDir>

//
// Snippet from IIS 7.0 applicationHost.config
//
<anonymousAuthentication enabled="true"  userName="…"  password="" />
<basicAuthentication enabled="false" />
<clientCertificateMappingAuthentication enabled="false" />
<windowsAuthentication enabled="true" >
    <providers>
        <add value="Negotiate" />
        <add value="NTLM" />
    </providers>
</windowsAuthentication>

Puntos clave:

  • IIS 6.0 usa una lista de propiedades muy larga, "plana". No hay ninguna jerarquía ni agrupación de propiedades. Es difícil buscar opciones de configuración entre cientos de opciones de configuración en la misma lista. IIS 7.0 y versiones posteriores usan una jerarquía de secciones y grupos de secciones, y sub elementos dentro de las secciones. Es fácil buscar la configuración de autenticación, buscándolos en el grupo de secciones de autenticación o en una sección de autenticación específica.
  • IIS 6.0 usa marcas para establecer esquemas de autenticación. IIS 7.0 y versiones posteriores usan una sección por esquema de autenticación, con enabled="true|false" en cada uno. La configuración adicional que solo es relevante para algunos esquemas de autenticación, solo se puede establecer en las secciones pertinentes (por ejemplo, el nombre de usuario y la contraseña solo se pueden establecer para la autenticación anónima).
  • IIS 6.0 usa rutas de acceso dentro del archivo Metabase para especificar el nivel de configuración (servicio, directorio virtual, directorio físico). La configuración de todo el servidor está en un archivo. IIS 7.0 y versiones posteriores usan un archivo de forma predeterminada, pero los usuarios pueden aprovechar los archivos distribuidos web.config en los directorios de contenido, que especifican las opciones de configuración para su ámbito.
  • IIS 6.0 usa nombres de propiedad largos en un intento de tener valores de configuración autodescriptos. Esto intenta mejorar la legibilidad del archivo y ayudar al usuario a comprender lo que hace la propiedad. IIS 7.0 y versiones posteriores usan nombres cortos, pero siempre están en el contexto de una sección específica, o incluso sub-elemento dentro de la sección.
  • IIS 6.0 usa multi-sz (elementos delimitados por comas en una propiedad de cadena), e indicadores para gestionar múltiples valores de elementos, como NTAuthenticationProviders. IIS 7.0 y versiones posteriores usan colecciones, con una sintaxis simple add/remove/clear, exactamente igual que la configuración de .NET Framework. Esto permite que los niveles inferiores de la jerarquía agreguen (o quiten) solo el elemento que necesitan, en lugar de duplicar los datos completos con (o sin) el elemento indicado. También proporciona mayor legibilidad del archivo (lo que se traduce en errores menos humanos al editarlo directamente).

En el archivo de esquema:

//
// Snippet from IIS 6.0 MBSchema.xml
//
<Property InternalName="AuthFlags" ID="6000" Type="DWORD" UserType="IIS_MD_UT_FILE" Attributes="INHERIT" >
    <Flag   InternalName="AuthAnonymous"   Value="1"   ID="6218"   />
    <Flag   InternalName="AuthBasic"             Value="2"   ID="6219"  />
    <Flag   InternalName="AuthNTLM"            Value="4"   ID="6220"  />
    <Flag   InternalName="AuthMD5"              Value="16"  ID="6221"  />
    <Flag   InternalName="AuthPassport"        Value="64"  ID="6299"  />
</Property>

//
// Snippet from IIS 7.0 IIS_Schema.xml
//
<sectionSchema name="system.webServer/security/authentication/basicAuthentication">
  <attribute name="enabled" type="bool" defaultValue="false" />
  <attribute name="realm" type="string" />
  <attribute name="defaultLogonDomain" type="string" />
  <attribute name="logonMethod" type="enum" defaultValue="ClearText">
    <enum name="Interactive" value="0" />
    <enum name="Batch" value="1" />
    <enum name="Network" value="2" />
    <enum name="ClearText" value="3" />
  </attribute>
</sectionSchema>

Puntos clave:

  • IIS 6.0 usa identificadores (números) para identificar la configuración. IIS 7.0 y versiones posteriores usan cadenas descriptivas para nombrar configuraciones.
  • IIS 6.0 usa conceptos no intuitivos como UserType y terminología como InternalName. IIS 7.0 y versiones posteriores usan nombres descriptivos que tienen sentido para los lectores humanos y no solo las aplicaciones.

Jerarquía de archivos de configuración

El estado "maestro" de la configuración siempre es los archivos de configuración (a diferencia de IIS 6.0, donde era la base de datos de configuración en memoria, que se vaciaba al disco periódicamente).

En el nivel raíz (o global), hay dos archivos independientes:

  • system32\inetsrv\config\applicationHost.config: contiene los valores predeterminados globales para la configuración del servidor web (IIS).
  • \windows\microsoft.net\framework\v2.0.50727\config\machine.config: contiene los valores predeterminados globales de la configuración de .NET Framework, incluidos algunos de los ASP.NET (el resto de ellos están en la web.config en la misma carpeta, que a veces se denomina raíz web.config).

La razón por la que todavía hay dos archivos independientes es porque las dos tecnologías tienen una versión diferente (según la programación y el producto). IIS forma parte de Windows y .NET Framework puede versionar de forma independiente, como parte de las versiones de Visual Studio.

En los directorios de contenido web, puede haber archivos opcionales web.config que controlan el comportamiento de su nivel de jerarquía y hacia abajo. Podrían ser locales o remotos (si el directorio de contenido está en un recurso compartido UNC, por ejemplo). Pueden contener IIS, ASP.NET o cualquier otra configuración de .NET Framework que se pueda especificar en su nivel. De forma predeterminada, no hay archivos web.config.

En términos de jerarquía de herencia, el archivo raíz es machine.config, a continuación, web.config en el mismo directorio (denominado root web.config), luego applicationHost.config, y a continuación, los archivos opcionales web.config a lo largo del namespace.

Configuración de archivos de inclusión

En algunos casos, es útil que el archivo web.config incluya otro archivo .config. Esto se puede hacer mediante el atributo configSource. Actualmente se limita a apuntar a rutas de acceso físicas relativas en subdirectorios, por motivos de seguridad (es decir, el archivo A solo puede incluir el archivo B si B está en subdirectorio físico de A). Este es un ejemplo básico que muestra cómo usar configSource:

<!-- in inetsrv\applicationHost.config -->
<configuration>
  <system.webServer>
  
    <!-- mimemaps moved by the customer to a different file -->
    <!-- so that this file is shorter and more readable -->
    <staticContent configSource="staticContent.config"/>
  
    <!-- the rest of system.webServer sections are here… -->
  </system.webServer>
</configuration>
  
<!-- in inetsrv\staticContent.config -->
<configuration>
  <system.webServer>
    <staticContent>
      <!-- all the mimemap definitions are here -->
      <mimeMap ….. />
      <mimeMap ….. />
      <mimeMap ….. />
    </staticContent>
  </system.webServer>
</configuration>

En este ejemplo, el cliente quería mover el contenido de la sección staticContent a un archivo independiente, con el fin de tener un archivo más corto, legible, applicationHost.config.

Tenga en cuenta que, cuando los valores de configuración cambian en un archivo de .config, el servidor recogerá automáticamente los cambios y actuará sobre ellos. El cliente no debe preocuparse por reciclar aplicaciones o grupos de aplicaciones o todo el servidor (el propio servidor puede reciclar grupos de aplicaciones, por ejemplo, dependiendo de qué opciones de configuración cambiaron).

Organización de la configuración

Dentro de un archivo de configuración (es decir, para un nivel determinado de la jerarquía), la configuración se organiza de forma estructurada y no como una lista plana. La unidad básica de implementación, registro y extensibilidad es la sección de configuración. Una sección se encuentra dentro de un grupo de secciones, que a su vez se puede contener en un grupo de secciones primario. Las secciones en sí no están anidadas. Los grupos de secciones son.

Este es un ejemplo de applicationHost.config:

<!-- section group for web server configuration -->
<system.webServer>
  
  <!-- section group for web server security configuration -->
  <security>
    <!-- section group for web server authentication configuration -->
    <authentication>
  
      <!-- three sections for authentication -->
  
      <basicAuthentcation ... />
      <windowsAutnentication ... />
      <anonymousAuthentication ... />
    </authentication>
  </security>
</system.webServer>

Las opciones de configuración siempre pertenecen a una sección específica.

Los grupos de secciones solo existen para una mejor estructuración; no tienen opciones de configuración directamente en ellas, solo secciones.

Dentro de una sección, la estructura es la siguiente:

  • Elemento de configuración: contiene los valores de configuración y potencialmente otros elementos de configuración. Representado como un elemento XML. Las secciones también son elementos.
  • Colección de configuración: un caso privado del elemento de configuración, que contiene una lista de elementos de configuración, en forma de add/remove/clear (que se denominan directivas de colección). Representado como un elemento XML con los subelementos <add>, <remove>, <clear>.
  • Propiedad de configuración: se trata de un valor de configuración [hoja]. Representado como un atributo XML.

Este es un ejemplo de applicationHost.config:

<!-- "windowsAuthentcation" is a section which is an element -->
<!-- "enabled" is a property -->
<windowsAuthentication enabled="true">
  
  <!-- "providers" is a collection which is an element -->
  <providers>
  
    <!-- the collection contains two elements -->
    <!-- "add" is the collection directive; "value" is the property -->
    <add value="Negotiate"/>
    <add value=""NTLM/>
  </providers>
</windowsAuthentication>

De forma predeterminada, applicationHost.config contiene dos grupos de secciones principales: system.applicationHost y system.webServer. También contiene una sección denominada <configSections>, que es algo especial en que el sistema de configuración usa internamente para registrar todas las demás secciones.

De forma predeterminada, machine.config contiene varios grupos de secciones. La configuración de ASP.NET se encuentra en el grupo de secciones system.web.

Etiquetas de ubicación frente a archivos de configuración

En muchos casos, se desea evitar archivos web.config en los directorios de contenido, pero todavía se pueda tener una configuración por URL que invalida los valores predeterminados globales. Por ejemplo: el administrador quiere especificar que un sitio específico debe usar algún esquema de autenticación y los administradores de sitios (y desarrolladores de aplicaciones de ese sitio) no deben poder desactivarlo.

La manera más fácil de lograr esto es mediante etiquetas de ubicación. Este es un mecanismo para especificar la configuración de una ruta de acceso específica, sin tener un web.config en la carpeta asignada a la ruta de acceso virtual.

En este ejemplo se muestra cómo se usa una etiqueta de ubicación en applicationHost.config:

<!-- the following will take effect on MyAdminSite -->
<location path="MyAdminSite">
  <system.webServer>
    <security>
      <authentication>
        <basicAuthentication enabled="false"/>
        <windowsAuthentication enabled="true"/>
        <anonymousAuthentication enabled="false"/>
      </authentication>
    </security>
  </system.webServer>
</location>

Las etiquetas de ubicación se pueden usar para especificar la configuración del nivel global (path="."), para un sitio o para una ruta de acceso específica dentro de un sitio. Puede haber varias etiquetas de ubicación en un archivo. Las etiquetas de ubicación pueden estar en cualquier archivo de .config, no solo applicationHost.config ni machine.config.

Las etiquetas de ubicación también se pueden usar para bloquear y desbloquear secciones. Más detalles sobre esto en el laboratorio de bloqueo de configuración.

En algunos casos, no hay ninguna alternativa para usar etiquetas de ubicación:

  • Dos o más rutas de acceso virtuales asignadas a la misma carpeta física. Obviamente, si las dos rutas de acceso virtuales tienen una configuración diferente, no se puede especificar en un archivo web.config porque se comparte.
  • Configuración específica del archivo. No hay ningún archivo web.config para los archivos; solo para toda la carpeta.

Resumen

En este documento se proporciona información general inicial, de alto nivel, del sistema de configuración en IIS 7.0 y versiones posteriores. Resalta el formato de esquema más limpio; la naturaleza distribuida del sistema de configuración y cómo permite la delegación de opciones de configuración al propietario del sitio o al desarrollador de aplicaciones; la organización estructurada de la configuración en los archivos de configuración; y la integración entre los sistemas de configuración de IIS y ASP.NET.

Para obtener más información, se recomienda revisar el resto de los documentos de configuración y, en particular, el documento Intrínsecos de configuración, que entra en detalles de bajo nivel sobre el sistema, incluido su diseño y arquitectura.