Descripción de la delegación de configuración de IIS 7.0
por Saad Ladki
Introducción
En su séptima versión del producto, IIS presenta un nuevo sistema de configuración basado en archivos. Este nuevo sistema hace hincapié en un sistema controlado por datos adecuado para una plataforma web entera donde tecnologías como ASP.NET, Indigo e incluso componentes de terceros pueden usar y ampliar este almacén de configuración para hospedar cualquier propiedad de sitio o aplicación.
El sistema se basa en archivos XML definidos en un formato simple y claro con una sintaxis similar a los archivos web.config de ASP.NET. Estos archivos de configuración contienen valores en agrupaciones lógicas y cualquier cambio en los archivos se refleja inmediatamente en el sitio o la aplicación cuyas propiedades se están modificando.
Este nuevo sistema también proporciona una experiencia de administración delegada en la que los administradores pueden permitir que los propietarios de sitios y aplicaciones modifiquen una configuración específica; y, el impacto de estos cambios se limita al sitio o la aplicación en cuestión. Este modelo presenta el concepto de aplicaciones autocontenidas donde tanto el contenido como los valores de configuración se hospedan en el directorio del sitio o de la aplicación y se pueden implementar mediante x-copy de una máquina a otra.
Archivos y esquema de configuración
IIS 7.0 y versiones posteriores tiene un archivo de configuración central llamado applicationHost.config ubicado en %WINDIR%\System32\InetSrv\Config\
. Este archivo reemplaza el archivo metabase.xml que IIS 6.0 usó para su almacén de configuración. Este nuevo sistema de configuración es muy sencillo, basado en archivos y, sin embargo, muy eficaz. No hay ningún servicio de configuración, ya que IISADMIN no es necesario. Cada proceso de trabajo tiene una instancia de un componente de lector de configuración y captura la configuración de los archivos directamente.
Además, no hay ninguna representación en memoria de la configuración. Una vez que se emite un cambio en un archivo, el proceso de trabajo lo recoge inmediatamente y se refleja en el sitio, la aplicación o el directorio virtual especificados.
El archivo applicationHost.config alberga la configuración global de las diferentes características y componentes de IIS y otras tecnologías web. Cualquier propiedad establecida en este archivo se aplicará a todos los sitios, aplicaciones y directorios virtuales de la máquina.
El lector de configuración que usa IIS comprende el formato, la sintaxis y la nomenclatura correcta de cada sección de configuración, elemento y atributo porque están definidos en un archivo de esquema. El esquema de configuración se define en los archivos ubicados en el directorio %WINDIR%\System32\InetSrv\Config\Schema\
. Después de instancias del sistema de configuración, el proceso de trabajo lee el esquema en la memoria y esto le ayuda a comprender las propiedades que están disponibles para establecerse y su formato. Como mínimo, los archivos IIS_schema.xml, ASPNET_schema.xml, y FX_schema.xml se encuentran en este directorio y definen la estructura de configuración de las secciones que se aplican a IIS, ASP.NET y las características de .NET Framework, respectivamente.
El esquema define varios aspectos de la configuración y sus secciones, como la nomenclatura de secciones y propiedades, los tipos esperados de valores, el intervalo de estos valores o si alguno de ellos es único o necesario. Además, define el valor predeterminado que tomará un atributo específico. En el caso dado en el que una propiedad no está definida en applicationHost.config, su valor se toma de la configuración predeterminada que se indicó en el archivo de esquema.
Además de este archivo central, applicationHost.config, varios archivos web.config pueden aparecer en cualquier nivel de la jerarquía de direcciones URL. Estos archivos pueden aparecer a nivel de sitio, aplicación, directorio virtual o incluso de ruta de acceso física. Estos archivos definen propiedades cuyos valores invalidan la configuración global definida en applicationHost.config. Sin embargo, estos cambios solo se aplican en el ámbito en el que aparece el archivo, es decir, para el sitio, la aplicación, el directorio virtual o la ruta de acceso física en donde reside el archivo web.config.
Jerarquía de configuración y configuración eficaz
Además de applicationHost.config, IIS usa ASP.NET, que se basa tanto en el archivo machine.config como en el archivo web.config raíz. El archivo machine.config define las propiedades necesarias para todas las características de Framework. El archivo web.config raíz define la configuración global de las propiedades definidas para todas las aplicaciones web ASP.NET. Estos dos archivos son análogos a applicationHost.config de IIS. Los tres archivos existen porque las versiones de .NET Framework e IIS van por separado. Puede haber varias versiones de Framework instaladas en un sistema de Windows Server determinado que tenga una sola versión de IIS.
Por lo tanto, se define y calcula una jerarquía de configuración para las opciones de configuración del sistema. La jerarquía comienza en machine.config y, luego, avanza al archivo web.config raíz, seguido de applicationHost.config. A partir de entonces, se agrega y aplica a la jerarquía cualquier archivo web.config opcional que se encuentre a nivel de sitio, aplicación o directorio virtual. Al final, las propiedades heredan del archivo primario al secundario de machine.config hasta el último archivo web.config (si existe) y la configuración eficaz se calcula para una ruta de acceso determinada.
El comportamiento de herencia se realiza de forma predeterminada. Cualquier configuración en un nivel inferior de la jerarquía invalida una configuración primaria definida en un archivo por encima del nivel actual. Sin embargo, si se profundiza más en la jerarquía, el ámbito de configuración es más limitado. Mientras que la configuración de los archivos machine.config, web.config raíz y applicationHost.config se aplica a todo el sistema, la configuración de los archivos web.config opcionales solo se aplica a la ubicación actual y por debajo (ya sea un sitio, una aplicación o un directorio virtual).
Secciones de configuración
Dentro de un archivo de configuración, hay configuraciones que se pueden leer y establecer. Las configuraciones se agrupan de forma estructurada. Varias configuraciones que son similares o aplicables a una característica específica (por ejemplo, ASP, autenticación, ISAPI, etc.) se agrupan en bloques de unidades lógicas llamados secciones de configuración. Cada sección de configuración puede incluir otras secciones de configuración, pero normalmente definen elementos, colecciones o atributos.
Un elemento de configuración es un elemento XML que define varios atributos de configuración. Una colección de configuraciones es un caso especial de un elemento de configuración que contiene una lista de elementos definidos con las directivas de configuración add/remove/clear. Por último, los atributos de configuración son valores de configuración hoja que representan atributos XML.
En el fragmento de código siguiente se muestra la configuración de la sección <defaultDocument>. La palabra enabled es un atributo donde la palabra files es un elemento que incluye una lista de otros elementos definidos por la directiva add y una serie de atributos.
<defaultDocument enabled="true">
<files>
<add value="Default.htm" />
<add value="Default.asp" />
<add value="index.htm" />
<add value="index.html" />
<add value="iisstart.htm" />
<add value="default.aspx" />
</files>
</defaultDocument>
Esta sección de configuración tiene un esquema asociado. En el fragmento de código siguiente se muestra el esquema de la sección >defaultDocument< del archivo IIS_schema.xml. El esquema define el nombre de la sección y el espacio de nombres en el que aparece (en este caso, system.webServer). Además, el esquema describe los atributos y elementos y, para cada uno, el nombre, el tipo, los valores predeterminados y otros datos interesantes.
<sectionSchema name="system.webServer/defaultDocument">
<attribute name="enabled" type="bool" defaultValue="true" />
<element name="files">
<collection addElement="add" clearElement="clear" removeElement="remove" mergeAppend="false">
<attribute name="value" type="string" isUniqueKey="true"/>
</collection>
</element>
</sectionSchema>
Una sección especial: <configSections>
La sección de configuración <configSections>
es una sección especial definida en applicationHost.config. Se usa como punto del Registro para las secciones de configuración del servidor IIS. En esta sección se registran las secciones de configuración actuales disponibles en el sistema. En el caso dado de que el sistema de configuración se extienda y se agregue una sección personalizada al servidor, se debe registrar agregando una entrada de elemento a esta sección.
En el fragmento de código siguiente se muestra la entrada <configSections>
de la sección <defaultDocument>. Se han omitido otras entradas para mayor claridad. La parte interesante de <configSections>
es la entrada del grupo de secciones que define el espacio de nombres de cada sección; en este caso, system.webServer y el valor del atributo overrideModeDefault, que para esta sección es "Allow". Dado que allowDefinition no se declara, se toma del esquema y el valor predeterminado es "Everywhere".
<configSections>
<sectionGroup name="system.webServer">
<section name="defaultDocument" overrideModeDefault="Allow" />
</sectionGroup>
</configSections>
Además de definir una sección y su grupo de secciones, hay dos atributos clave definidos: overrideModeDefault y allowDefinition.
El atributo overrideModeDefault es un atributo opcional que define el estado bloqueado de una sección. Los valores disponibles son Allow o Deny. El valor predeterminado es "Allow". Todas las secciones de IIS relacionadas con cualquier rendimiento, seguridad o aspecto crítico del servidor se bloquean con este atributo establecido en "Deny". Si el atributo overrideModeDefault se establece en "Deny", los archivos de configuración de un nivel inferior (es decir, archivos web.config) que establecen un valor para una propiedad en la sección de configuración específica no pueden aplicarse e invalidar los valores globales. En este escenario se produce una infracción del bloqueo y se genera un error.
El atributo allowDefinition es otro atributo opcional que define el nivel de la jerarquía en la que se puede definir la sección y se pueden establecer propiedades. Si su valor es MachineOnly, la sección solo se puede establecer en applicationHost.config o machine.config. Si su valor es MachineToRootWeb, la sección se puede establecer en los archivos MachineOnly o también en el archivo web.config raíz. Si su valor es MachineToApplication, la sección se puede establecer en los tres archivos anteriores o también en los archivos web.config de la carpeta raíz de la aplicación. Por último, si su valor es Everywhere (que es el valor predeterminado), se puede establecer en cualquier archivo de configuración, tanto los que afectan a la configuración globalmente como a los archivos web.config que se aplican a un sitio, aplicación o directorio virtual determinado.
El concepto de ubicación
Cualquier configuración especificada en un archivo determinado de la jerarquía de configuración se aplica a ese nivel y por debajo con la posibilidad de que la invaliden archivos secundarios. Sin embargo, está la opción de especificar y aplicar valores de configuración a determinadas rutas de acceso en el archivo de configuración actual mediante la etiqueta location con un atributo path. Si el archivo de configuración es applicationHost.config, las etiquetas de ubicación pueden incluir una ruta de acceso que va desde todos los sitios, aplicaciones y directorios virtuales del sistema hasta un sitio, aplicación, directorio virtual o archivo específicos. La etiqueta location también se puede especificar en archivos web.config y puede incluir cualquier ruta de acceso relativa para las rutas de acceso debajo del sitio, aplicación o directorio virtual actuales.
En el fragmento de código siguiente se muestra cómo especificar una propiedad de configuración aplicable solo al sitio para desarrolladores. Esto también se puede lograr mediante un archivo web.config en el contenido del sitio. La configuración eficaz del sitio para desarrolladores será la lista de entradas de la colección de archivos en applicationHost.config más la ruta de acceso de ubicación y cualquier archivo web.config del sitio.
<location path="Developer Site" overrideMode="Allow">
<defaultDocument enabled="true">
<files>
<add value="Developer.htm" />
</files>
</defaultDocument>
</location>
Si no se declara ninguna ruta de acceso, lo que equivale a especificar un punto (.), se entiende que la ruta de acceso va desde este nivel y por debajo hasta todas las rutas de acceso secundarias. Hacer esto en applicationHost.config es especificar también la configuración para el nivel global.
Un atributo que se puede definir en una etiqueta location es overrideMode. Al igual que overrideModeDefault, especifica si la sección de configuración a la que se hace referencia y las propiedades establecidas en la etiqueta location actual pueden editarse y anularse en niveles inferiores de la jerarquía.
Bloqueo y desbloqueo de una sección
El concepto inicial de bloquear una sección a través de la etiqueta overrideModeDefault de la sección <configSections>
se puede tomar y ampliar para que sea más específico. Al permitir que se invalide una sección a nivel de <configSections>
, se abre la sección y cualquier usuario del sistema puede invalidar sus valores mediante archivos web.config en cualquier nivel del espacio de nombres de dirección URL. Sin embargo, esto puede suponer un riesgo de seguridad grave y puede causar efectos negativos en la disponibilidad o el rendimiento del sistema. Mediante etiquetas location, se puede usar el atributo overrideMode y especificar el estado de bloqueo de una sección y restringirlo para una ruta de acceso determinada.
En el fragmento de código siguiente se muestra cómo desbloquear la sección <windowsAuthentication>
en todos los sitios, aplicaciones y directorios virtuales del sistema. Para ello, establezca el atributo overrideModeDefault en ”Allow”. La desventaja de este enfoque es que desbloquea una sección para todos los usuarios y cualquier persona puede invalidar la configuración a nivel de su sitio o aplicación mediante archivos web.config.
<section name="windowsAuthentication" overrideModeDefault="Allow" />
El fragmento de código siguiente muestra cómo lograr lo mismo desbloqueando la sección <windowsAuthentication>
, pero solo para AdministratorSite para que las propiedades de esa sección se puedan modificar mediante archivos web.config a nivel administrador de sitio. Los otros sitios del sistema tienen el comportamiento predeterminado de una sección <windowsAuthentication>
bloqueada. Esto se logra mediante el atributo overrideMode.
<location path="AdministratorSite" overrideMode="Allow">
<security>
<authentication>
<windowsAuthentication enabled="false">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
</location>
The location tag path can be specified here a site, application or even a virtual directory to which the administrator wants to unlock configuration and/or apply configuration at that level.
Se puede lograr el comportamiento opuesto, que es bloquear una sección en un sitio específico, mientras que el resto del sistema puede editarlo. Por ejemplo, <defaultDocument> es una sección que tiene el atributo overrideModeDefault establecido en "Allow" en la sección <configSections>
, pero, mediante una etiqueta location, podemos bloquear esta sección para el sitio básico. Los siguientes fragmentos de código muestran cómo lograr esto y, al mismo tiempo, establecer que el único valor aceptado por el sistema como página predeterminada para que el servidor la muestre como página de inicio sea basic.htm. La directiva clear anula los valores heredados de los niveles superiores de la jerarquía de configuración, que, en este caso, es la lista global de archivos de applicationHost.config.
<location path="Basic Site" overrideMode="Deny">
<defaultDocument enabled="true">
<files>
</clear>
<add value="basic.htm" />
</files>
</defaultDocument>
</location>
Bloqueo pormenorización
Abrir una sección mediante una etiqueta location es una manera eficaz de desbloquear una sección y todas sus propiedades para el propietario del sitio o la aplicación de la ruta de acceso especificada. Se trata, en efecto, de un planteamiento de "todo o nada" que permite a los propietarios de sitios y aplicaciones tener acceso ilimitado a una sección. Sin embargo, a veces los administradores quieren control específico sobre determinadas propiedades de una sección y desean controlar ciertos valores. Otras pueden delegarse. Aquí es donde entra en acción el bloqueo pormenorizado.
El bloqueo pormenorizado es una agrupación de atributos específicos que se pueden establecer en elementos u otros atributos. El bloqueo pormenorizado puede declarar si las rutas de acceso por debajo del actual pueden modificar los valores de configuración. Los valores se pueden leer, pero si se establecen bloqueos, no se pueden editar ni declarar. No edite valores cuyos bloqueos estén establecidos, ya que dará lugar a errores de infracción del bloqueo de configuración.
El primer atributo de la agrupación de bloqueo pormenorizado es lockAttributes. El atributo lockAttributes define una lista separada por comas de atributos bloqueados en rutas de acceso por debajo del nivel de configuración actual. También acepta un asterisco (*) como valor, lo que significa que todos los atributos están bloqueados. En este punto, la sección de configuración se puede leer en rutas de nivel secundario e incluso los atributos bloqueados, pero la edición de los protegidos da lugar a errores.
En el fragmento de código siguiente se muestra cómo bloquear el estado habilitado de la sección <defaultDocument> del sitio para desarrolladores. Si el propietario del sitio para desarrolladores deshabilita la característica de documento predeterminado o incluso declara la propiedad con el mismo valor que se indica en la etiqueta location, se produce una infracción de bloqueo.
<location path="Developer Site" >
<defaultDocument enabled="true" lockAttributes="enabled" />
</location>
El segundo atributo de la agrupación de bloqueo pormenorizado es lockElements. El atributo lockElements define una lista separada por comas de atributos bloqueados en rutas de acceso por debajo del nivel de configuración actual. Al igual que lockAttributes, también acepta un asterisco (*) como valor, lo que significa que todos los atributos están bloqueados. Esto es muy útil para las secciones de configuración que tienen varios elementos o colecciones y deben protegerse en las rutas de acceso de nivel secundario. De nuevo, la edición de cualquiera de los valores bloqueados produce errores.
En el fragmento de código siguiente se muestra cómo bloquear la colección de archivos en el sitio para desarrolladores. Esto deja al propietario del sitio la decisión de si la característica de documento predeterminado está habilitada o no; pero, si está habilitada, no puede modificar los valores globales y hereda lo que el administrador de la máquina ha indicado en applicationHost.config.
<location path="Developer Site">
<defaultDocument enabled="true" lockElements="files" >
<files>
<add value="Developer.htm" />
</files>
</defaultDocument>
</location>
El ejemplo de lockElement también es útil en las colecciones para bloquear las directivas de dicha colección. Las directivas son las palabras clave, como add, remove, clear de una colección. Al bloquear las directivas, un administrador puede ajustar si una lista de colecciones está disponible para agregar o quitar determinados o todos los elementos.
En el fragmento de código siguiente se muestra cómo bloquear la eliminación y borrar las entradas actuales de la colección de archivos. El propietario del sitio puede agregar nuevas entradas a la colección de archivos si es necesario. Si el propietario del sitio especifica una etiqueta clear o intenta quitar una entrada, se produce una infracción de bloqueo.
<location path="Developer Site">
<defaultDocument enabled="true" >
<files lockElements="clear,remove">
<add value="Developer.htm" />
</files>
</defaultDocument>
</location>
Besides lockAttribute and lockElement, there are negative counterparts: lockAllAttributesExcept, and lockAllElementsExcept. These attributes achieve the inverse action of the previous ones in which the comma-separated list declares the attributes and elements to be unlocked while the rest are not available to be edited in child paths.
También hay un atributo lockItem. Este atributo bloquea un atributo y funciona a nivel de atributo XML. En el fragmento de código siguiente se muestra cómo el administrador del sitio puede hacer todo lo que quiera hacer, como agregar o quitar entradas de la colección, excepto modificar la entrada basic.htm en la colección de archivos.
<location path="Developer Site">
<defaultDocument enabled="true" >
<files>
<add value="basic.htm" lockItem="true"/>
</files>
</defaultDocument>
</location>
Resumen
En este documento se describe información general básica sobre el sistema de configuración, sus archivos y las funcionalidades de esquema y delegación. También se examina la jerarquía de configuración y la configuración eficaz. El artículo también presentaba una introducción a las secciones de configuración y su estructura de elementos y atributos. Se ejemplifica el concepto de ubicación, bloqueo y bloqueo pormenorizado.
En líneas generales, IIS presenta un nuevo sistema de configuración basado en archivos con funcionalidades para tener toda la configuración en un archivo de configuración central o distribuida mediante archivos web.config donde los administradores de sitios y aplicaciones pueden modificar las propiedades que se aplican a sus aplicaciones y contenido. Con el modelo de configuración distribuida, el concepto de aplicaciones autocontenidas donde los valores de contenido y configuración se hospedan en el directorio de la aplicación o el sitio y se puede implementar una copia x desde una máquina a otra está habilitada.