====== Esencias del Httpd en OpenBSD ====== Mientras **Httpd** carece de las mirriadas perillas y botones de algunos otros servidores web, su configuración es perfectamente adecuada para frustrarte. Empesaremos con una configuración básica y luego agregaremos opciones para mostrar las principales características de Httpd. Mientras que el programa **/usr/sbin/httpd** es el software real, Httpd tiene un montón de archivos circundantes. Las partes críticas son la configuración, **/etc/httpd.conf** y el chroot **/var/www/**. {{ :informatica:openbsd:puffy67.gif?610 |}} ===== Separación de Privilegios ===== Un servidor web debe realizar ciertas tareas con privilegios de **root**. Sólo **root** puede asociar a los puertos comunes de servicios web el 80 y 443. Sólo **root** puede abrir ciertos archivos de **logs**. Sólo **root** puede leer ciertos archivos de llaves privadas. Desafortunadamente, los procesos que se ejecutan como **root** puede probocar un montón de daño en el sistema. Los intrusos que comprometen un proceso de **root**, obtienen acceso a nivel de **root** de la máquina. OpenBSD utiliza la separación de privilegios para dividir tareas que requieren de **root** de aquellas que no lo necesitan. Cuando inicie Httpd, obtendrá un único proceso ejecutándose como **root**. Este proceso se enlaza a puertos, abre archivos de logs, lee archivos de claves privadas y maneja todas las otras tareas privilegiadas. Un segundo proceso perderá sus privilegios para todo excepto para manejar logs. También obtendrá procesos completamente separados que manejarán las solicitudes de los clientes. Un Httpd en su configuración estándar ejecutará cinco procesos. # ps -ax | grep http 73113 ?? Isp 0:00.05 httpd: logger (httpd) 66836 ?? Isp 0:00.09 httpd: server (httpd) 21188 ?? Isp 0:00.11 httpd: server (httpd) 95130 ?? Isp 0:00.10 httpd: server (httpd) 4838 ?? Isp 0:00.09 /usr/sbin/httpd Cuando un proceso no privilegiado necesita información privilegiada, la solicita a los procesos padres. El proceso padre privilegiado determina si el proceso hijo recibe esa información o no. No hay razón para que el logger tenga las claves privadas, por lo que nunca tendrá esa información. ===== httpd(8) ===== {{ :informatica:openbsd:puffy67.gif?610 |}} El software de demonio httpd, normalmente se ejecuta sin argumentos y se inicia en **boot** o por **rcctl(8)**. Si embargo, es posible que deba manipularlo ocasionalmente. Vamos a cubrir algunas de estas en las seciones apropiadas, aquí tenemos un par de opciones para empezar. No hay nada como la sensación enfermiza de reiniciar un servicio que está atendiendo solicitudes de clientes, sólo para obtener un mensaje de error como el error de sintaxis en la línea 831 y el demonio se siega completamente a ejecutarse. Valide el archivo de configuración antes de intentar reiniciar el servidor con **httpd -n**. Si está probando un archivo de configuración alternativo, especifique ese archivo con -f. # httpd -nf httpd.conf-test configuration OK Si el servidor web está haciendo cosas que no espera, puede ejecutar **httpd(8)** en modo de debug. Esto significa que httpd no se separará del terminal, si no que imprimirán en pantalla los detalles sobre lo que está haciendo. # httpd -d startup Agregue una o más **-v** para aumentar el nivel de detalle de los mensajes. Pulse **Ctrl-C** para terminar el modo de debug de httpd. Puede administrar httpd a través del mecanismo de **rcctl(8)** de OpenBSD, ejecutando comandos como **rcctl restart httpd** y **rcctl reload httpd**. Un reinicio borra todo de la memoria del sistema. Recargar indica al proceso principal que envíe la configuración y las claves privadas al proceso no privilegiado. Una recarga puede ser ligeramente más rápida, pero no le permitirá cambiar la configuración como **prefork** y el directorio **chroot**. ==== httpd.conf ==== El archivo de configuración de **httpd.conf** se asemeja a otros demonios de OpenBSD, con una sintaxis de palabras claves y valores. Los parentesis de llaves marcan algunas subsecciones, como la sconfiguraciones para hosts virtuales individuales. OpenBSD no instala un archivo de configuración, pero puede encontrar una configuración detallada de ejemplo en **/etc/examples/httpd.conf**. El ejemplo no funcionará fuera de la caja, usted debe fijar variables tales como la dirección IP y el nombre del servidor. Aquí tenemos un simple **httpd.conf** para el sitio web de mi cliente más grande, **http://www.mallard.info**. server "www.mallard.info" { listen on 192.0.2.101 port 80 root "/mallard.info" } Esta configuración define un nombre de servidor, asocia el demonio httpd a una dirección IP y un puerto, y señala el servidor a un directorio raíz de documento. Si su sitio contiene sólo paginas estáticas, una configuración como esta basta. Puede utilizar un archivo de configuración distinto de **/etc/httpd.conf**. Dale a httpd el argumento **-f** y el nuevo archivo de configuración. Si está configurando un nuevo archivo de configuración en **/etc/rc.conf.local**, dé la ruta completa al archivo. Los próximos capítulos se verán los detalles muy profundamente. ===== El chroot httpd ===== Todos los archivos del sitio web, los socket de Unix, los nodos de dispositivos, y la opción chroot en **httpd.conf** para especificar un nuevo directorio base del contenido web para *httpd*. Aqui abandonamos la configuración predeterminada de OpenBSD y creamos un nuevo **chroot** en **/www**. Ahora que ya sabes donde encontrar las partes donde se encontrará nuestro nuevo **chroot**, vamos a configurar algunos sitios web. ==== Configuración Httpd ==== Toda la configuración de **Httpd** se efectúa en **/etc/httpd.conf**. Puede agregar archivos adicionales, pero debe especificarlos en el archivo **httpd.conf**. Mientras **httpd(8)** tiene configuraciones predeterminadas razonables para la internet moderna, puede personalizar sitios individuales, archivos de logs y administración de servidores. **Httpd** no se iniciará, ni se ejecutará con una configuración no válida. Cada vez que cambie el archivo de configuración, valide la configuración como se describe en **httpd(8)** anteriormente en este capitulo antes de intentar reiniiar el servicio. También puede actualizar la mayoría de los ajustes de configuración con SIGHUP. Las funciones vitales incluyen la configuración por servidor, los tipos de medios, la configuración global y las macros. ==== Macros ==== Una de las maneras más fáciles de romper una configuración de servidor es actualizar de manera incompleta la información de repetición. Suponga que su servidor web tiene dos direcciones IP. Un centenar de sitios escuchan en una sóla IP, mientras otros cientos escuchan en la otra. Cada sitio tiene una entrada de configuración que especifica a qué IP se asocia. Esta configuración funciona bien, hasta que necesite cambiar una dirección IP. Olvida cambiar una línea de configuración y su sitio deja de funcionar. Sítios fallidos significan clientes infelices. Buscar y reemplazar ayuda, pero cualquiera que haya tenido que cambiar docenas o sientos de archivos de sitios webs, sabe cuan rápido el cerebro humano puede bloquearse. Multiplica este problema por todas las sentencias de configuración que se repiten y de repente tienes todo tipo de errores humanos potenciales. Evita toda esta clase de problemas con el uso de las *macros*. Una **macro** es una forma de reemplazar la información repetida con una variable. Las **macros** deben ir en la parte superior de **httpd.conf**, antes de cualquier otra declaración de configuración. Si necesita referirse a una dirección IP muchas veces, reemplace esa IP con una macro: public_ip="192.168.0.4" Puede utilizar esa **macro** en una configuración. Utilice un signo de **$** delante del nombre de macro para indicar que es una variable. Aquí utilizo la configuración del sitio web de la sección anterior con esa macro. server "www.mallard.info" { listen on $public_ip port 80 root "/mallard.info" } Con sólo un único sitio, la macro nos ahorra... nada. Sin embargo, en el momento en que agrega un segundo sitio, su configuración instantáneamente se torna más manejable. También puede poner estas macros en un archivo de **include** y compartir ese archivo de macros a través de varios servicios, no sólo **httpd**. Los nombres de macro sólo pueden contener letras, dígitos y subrayados. No puede utilizar una opción de configuración como nombre de macro. No puede utilizar macros para cualquier cosa que aparece dentro de las comillas. Utilizaremos las macros ampliamente. ==== Macros Imprescindibles ==== Es posible que desee anular una macro en la línea de comandos para realizar pruebas. Esta es una mala práctica en producción, pero es invaluable en las pruebas y la depuración. Utilice la opción **-D** para **https(8)**, seguido de la nueva definición de macro. Aquí ejecuto httpd en el modo de depuración y establesco la macro **public_ip** a 127.0.0.1. # httpd -dvv -D public_ip=127.0.0.1 La salida del comando, no muestra el cambio de *macro*, pero programas como *netstat(1)* muestran una diferencia. ===== Servidores Virtuales ===== **httpd** admite varios sitios web en una instancia **httpd**. Su granja web típica sirve a decenas o cientos de sitios fuera de cada instalación del sistema operativo. Cada sitio se denomina **Servidor Virtual**. La palabra clave **Servidor** marca la configuración de un único servidor virtual en **httpd.conf**. Nuestro ejemplo **httpd.conf** muestra una única instancia de servidor virtual. Puede agregar servidores virtuales hasta que la carga de tráfico TCP sobre su servidor físico decaiga a niveles inaceptables. Varios servidores pueden tener el mismo nombre, siempre que escuchen en diferentes puertos TCP o direcciones IP. Esto se utiliza más comúnmente para configurar el acceso no cifrado y TLSa un sitio. No puedo imaginar porqué querrías varios servidores con el mismo nombre en diferentes direciones IP eb un host, pero si alguna vez tienes ese caso de uso, **httpd** te apoya. ==== Opciones Globales versus Opciones por Servidor ==== De las muchas opciones de **httpd(8)**, algunas se aplican a la ejecución de la instancia **httpd** como un todo. Otras se aplican sólo en un único servidor virtual. Mira de nuevo nuestro archivo de configuración completo **httpd.conf**, con la macro. public_ip=192.168.0.4" server "www.mallard.info" { listen on $public_ip port 80 root "/mallard.info" } La macro **public_ip** es una opción global. Una vez establecida, se puede hacer referencia desde cualquier parte del **httpd.conf**. La palabra reservada **"sever"** indica el inicio del un servidor virtual. Las opciones dentro de las llaves se aplican sólo a ese servidor. Este breve ejmplo demuestra la flexibilidad de **httpd**. La mayoría de los servidores web consideran las direcciones y puertos TCP/IP como una caracteristica global. En **httpd**, es una opción por servidor. Sí, hay una macro que define una dirección IP, pero en realidad no configura ninguna red, es sólo una variable conveniente. No sólo puede configurar la dirección IP y el puerto en una base por servidor, puede ajustar las características TCP en una base por servidor. Discutiremos esas opciones de TCP en el capítulo 7. **Httpd** tiene opciones globales muy limitadas: macros, servidores virtuales y tipos de medios. También puede definir el directorio **chroot**, establecer el número de proceso *httpd* para iniciar cuando se inicia el daemon y definir el directorio de los logs. Todo lo demás es una propiedad por servidor. Incluso puede anular muchas opciones globales por base de servidor. ==== Archivos Include ==== Los archivos de configuración que incluyen más de unos pocos servidores virtuales se vuelven rápidamenre engorrosos. A menudo es conveniente dividir las configuraciones sel servidor virtual en archivos de configuración separados. Utilice la instrucción **include** para extraer otros archivos en **httpd.conf**. No puede utilizat caracteres comodín en las sentencias **include**, aunque se espera que aparezca un día. include "/etc/http-site2.conf" Tradicionalmente, el archivo de configuración incluido, tienen el nombre del sitio que cada archivo configura. Tendrás archivos como: "/etc/sites/mallard.info,conf" "/etc/sites/default.conf" "/etc/sites/openbsd.org.conf" y así sucesivamente. Muchos sistemas de automatización esperan exactamente esta configuración. Al hablar de los **servidores virtuales** asumiremos que cada sitio tiene su propio archivo de configuración en **/etc/sites/**. Los archivos **include** puede incluir otros archivos. Supongamos que tiene configuraciones que deben ir en cada sentencia del servidor. Las sentencias de **listen** o de configurar un estilo de registro de **logs**, son a menudo comunes entre los servidores. Estos los puede configurar en un archivo de configuración y disminuir el número de ajustes para cada servidor virtual. server "www.mallard.info" { include "/etc/global-httpd.conf" .... El archivo de configuración global, se vería algo así: listen on $public_ip port 80 listen on $public_ip6 port 80 log style combined Un archivo de configuración global es conveniente, pero ten cuidado con exagerarlos. Para tener un buen equilibrio, se puede hacer un archivo **include** para los sitios TLS y otro independiente para los sitios que no son TLS. ==== Configuración de Servidores Virtuales ==== La parte más interesante de la configuración de **httpd** ocurre en la parte del **Servidor Virtual**. Mientras que httpd tiene decenas de opciones para el servidor virtual, los 4 más importantes controlan el, directorio de documentos, la red, los alias de sitios y la configuración específica de la ubicación. === Document Directory === Tener un servidor en ejecución es agradable, pero tener el servidor ofreciendo sitios web es mejor. Use la opción *root* para indicar a httpd donde debe encontrar los documentos que componen el sitio. El directorio **root** del sitio es relativo al **chroot**. server "www.mallard.info" { listen on $public_ip port www listen on $public_ip6 port 80 root "/mallard.info" } Los documentos HTML, los scripts PHP, o cualquier otra cosa que componen el contenido del sitio deben ir en el directorio **mallard.info** en el directorio chroot de httpd o **/var/www/mallard.info**. Cualquier servidor virtual, sin una definición de un **DocumentRoot**, utiliza el directorio **htdocs**, como se explica al final de este capítulo, en el **"Servidor Predeterminado"**. === Networking === Conecte cada servidor virtual a la red con ls instrucción **listen**. Una instrucción **listen** debe definir una dirección de red y un puerto TCP. Httpd admite direcciones IPv4 e IPv6, pero deben especificarse por separado. La forma más fácil de configurar httpd es que escuche en todas las direcciones IP del host, es el puerto HTTP estandar (80). Utilice * (asterisco) para indicar todas las direcciones IPv4 y **::** para todas las direcciones IPv6. La palabra reservada de *port* da el puerto TCP/IP. El puerto común TCP/IP para los sitios web sin cifrar es el 80. server "www.mallard.info" { listen on * port 80 listen on :: port 80 root "/www1" } Para hacer que un servidor virtual escuche sólo en un IP en particular, en lugar de todas las direcciones IP, especifique la dirección: listen on 192.168.0.4 port 80 listen on 2001:db8::101 Httpd también puede usar nombres y grupos de interfaces. Cuando se le da un nombre de interfaz o un nombre de grupo, httpd se une a la dirección IPv4 primaria de esa interfaz. listen on re0 port 80 Los puertos se pueden especificar como números o como nombres de **/etc/services**. Mezclar nombres y números de puertos aumenta las probabilidades de que tus compañeros sysadmin te persigan y te golpeen. Puede utilizar cualquiera de estos nombres en macros. === Alias === Los sitios web a menudo tienen más de un nombre. Para la mayoría de los sitios, el **"www"** principal es opcional. Mientras que la opción del servidor da el nombre oficial del sitio, cualquier nombre adicional se puede dar con la palabra reservada del **alias**. Liste cada alias en una línea única, como se muestra a continuación. server "www.mallard.info" { alias "mallard.info" alias "ww.mallard.info" alias "wwww.mallard.info" listen on $ public_ip port www listen on $ public_ip6 port 80 root "/ www1" } Cualquier cliente que solicite uno de los nombres de alias (mallard.info, ww.mallard.info, o wwww.mallard.info) verá el sitio web **www.info.mallard.info**, siempre que existan las entradas DNS necesarias. === Índices === Cuando un cliente accede a un sitio web, el servidor busca un documento de índice (index) que sirva como la primera página. El archivo de índice tradicional es **index.html**. Algunas personas y aplicaciones utilizan otras extensiones, algunas por razones técnicas y otras por preferencia. Use la opción **directory index** para indicarle al servidor el nombre del archivo de indices. directory index index.html Sin embargo, algunos sitios no tienen ningún archivo de indice. Quizás el administrador del sitio quiera que el servidor web genere un índice para los usuarios, o tal vez los archivos sólo deben ser accesibles a las personas que saben en donde están esos archivos. Muchos servidores web crean automáticamente índices a menos que los desactiven, pero httpd no crea índices a menos que usted los haga. Use la función **directory auto-index** para habilitar la creación automática de índices. server "site10.mallard.info" { listen on $public_ip port 80 listen on $oublic_ip6 port 80 root "/site10" directory index index.htm directory auto index } Este sitio genera índices para el usuario y por defecto utiliza un archivo índice de **index.htm**. === Combinando Configuraciones === Fíjese en la configuración de la sección anterior. Utilizamos la palabra reservada **directory** dos veces. Esas dos entradas se pueden combinar en una sola línea, a través del uso de paréntesis de llaves. directory { auto index, index index.htm } ¿Esto es más legible y conveniente que hacer dos entradas separadas? quizás. Sin embargo, podría ser más difícil de usar con los sistemas de gestión de configuración. Elija el estilo de configuración que mejor funciona para usted. Muchas opciones de configuración de httpd se pueden expresar entre paréntesis de llaves. Utilizaremos ambos métodos. === Locations (ubicaciones) === Frecentemente necesitamos establecer reglas especiales para partes de un sitio web. Una sentencia de **locations** le permite cambiar las opciones dependiendo de la ruta requerida, se indican después del nombre del sitio. En un enlace como **http://www.mallard.info/awesome.htm**, la **location** es **/awesome.htm**. Puede utilizar **locations** para ensamblar sitios web fuera de directorios dispares en el **chroot**. El estándar **/var/www** tiene un directorio separado para los scripts CGI, **/var/www/cgi-bin**, pero ese directorio no está dentro de ningún directorio de sitio web. Usted debe utilizar **link simbólicos** para asociar el directorio **cgi-bin** a un sitio web o utilizar una directiva de **locations** en **httpd.conf** para lograr lo mismo: Considere el siguiente servidor, construido enteramente de los ejemplos proporcionados por OpenBSD. server "www.mallard.info" { listen on $public_ip port 80 root "/htdocs/bgplg" location "/cgi-bin/*" { root"/" } } El contenido principal del sitio web se encuentra en el directorio **/var/www/htdocs/bgplg**. La sentencia de **location** define la ruta de petición **/cgi-bin/**, indicando que la siguiente configuración se aplica cuando alguien navega a **http://www.mallard.info/cgi-bin/**. Ese directorio tiene su propio directorio principal (raíz), redefiniendo el directorio raíz como **"/"** o el directorio raíz del chroot de httpd. Esto asigna el directorio **/var/www/cgi-bin/** al sitio web, aunque el directorio raíz del sitio web es **/var/www/htdocs/bgplg**. Las ubicaciones de directorio que termian en un (/) se aplican al directorio y a todo su contenido. Si está habalndo de archivos en el directorio pero no en el propio directorio necesitará usar un nombre de archivo, un asterisco o un patrón, como se explica en el capítulo 3. Por eso la configuración de nuestro directorio *cgi-bin* especifica un asterisco. Puede utilizar las sentencias de ubicación (location), para cambiar la forma en que su servidor se comporta con las reglas de **location**. === Per-location Rules === Ejecutar servidores WEB, sería mucho más simple si las personas fueran coherentes. Uno de los desarrolladores web, es conocido por decir cosas como: **''Quiero índices en este directorio solamente, y que se autentifiquen acá, y no en cualquier lugar..- hoy este directorio es sólo PHP, así que hay que habilitar Scripts allí, y no en cualquier otro lugar''**. Con la configuración por ubicación, puede proteger por ejemplo con contraseña un directorio en particular o desactivar el registro o logs de un determinado tipo de archivo. Aquí deshabilito la creación automática de índices en su directorio. server "www.mallard.info { ... directory auto index location "/files/" { directory no auto index } } La primera sentencia de instrucción **directory** habilita la auto generación de los índices para todo el sitio. La sentencia de **location** la deshabilita para cualquier solicitud que coincida con **/files/**. Un usuario que visita **http://www.mallard.info** verá un índice auto generado, si lo requiere, pero un visitante en el sitio **http://www.mallard.info/files/**, obtiene un de prohibición **error 403 (forbidden)**. El servidor no tiene permiso para indexar el contenido de este directorio. Si bien estos ejemplos utilizan directorios como ubicaciones, también puede utilizar sentancias de ubicación para identificar archivos. Veremos muchos ejemplos más adelante. === Tipo Mime === Los autores de sitios WEB pueden cargar casi cualquier tipo de archivo en un servidor web. Tanto el Servidor como el cliente necesitan saber como manejar los tipos de archivos aleatorios. El protocolo HTTP utiliza tipos MIME (Multipropose Internet Mail Extensions) para identificar tipos de archivo. El Servidor utiliza estos tipos MIME para enviar las sugerencias al cliente acerca de como procesar el archivo. Así como un navegador web sabe que un archivo HTML debe ser procesado, pero un archivo MP3 no lo debe. Una definiciín de tipo MIME contiene dos partes: una definición de tipo y extensión de archivo. text/html html htm shtml Este ejemplo define el tipo de aplicación **text/html**. Es para el código HTML. La segunda parte enumera tres extensiones de archivo. Cuando un cliente solicita un archivo con un nombre que termina en **.html**, **.htm** o **.shtml**, httpd transmite el archivo con una nota que dice: **Este material es de tipo MIME text/html**. El navegador utiliza esa información para saber como tratar el archivo. No todos los archivo requieren definición MIME. La mayoría de los navegadores modernos saben que los archivos que terminan en **.html** son páginas web. Sin embargo, no puede confiar en cualquier navegador. Tampoco se puede adivinar en forma aleatorio que archivo puede cargar un propietario de sitio web en su servidor. Es mejor definir explícitamente los tipos MIME más comunes para que su servidor puedar manejar los archivos que ha deinido su diseñador. **Httpd** tiene definido los tipos MIME más esenciales incorporados en el código fuente. Si sabe que su servidor sólo ofrecerá archivos básicos como **html**, **css**, texto sin formato, imágenes y JavaScript, puede omitir la definición de tipos. Sin embargo, si su navegador va más allá de la más básico, un día verá que algo se rompe y volverá a definir tipos MIME. Ahorrese el problema e instálelos el día uno. Las definiciones en el archivo de configuración anulan los tipos incorporados. Utilice la instrucciones de tipos para definir los tipos MIME en *httpd.conf*. Si necesita más razones para trabajar, puede definir cada tipo MIME directamente en el archivo de configuración en **httpd.conf**. types { text/html html htm shtml } OpenBSD incluye una lista de tipos MIME en **/usr/share/misc/mime.types**. Es mucho más fácil copiar estas definiciones en su configuración. types { include "/usr/share/misc/mime.types" } Puede definir tipos con un archivo de texto incluido o explícitamente dentro de **httpd.conf**, pero no en ambos. Recomiendo encarecidamente que utilice el archivo inluido. Si su servidor particular necesita un tipo MIME especialmente definido, no cambie **/usr/share/misc/mime.types**. Las actualizaciones del sistema sobrescriben ese archivo. Copie ese archivo en otra ubicación, incluya la copia y realice los cambios ahí. === Authentication === **Httpd** permite la authentication a través de archivos estándar **htpasswd** de la industria. Dígale a **httpd** que requiera un archivo de contraseñas con la sentencia **authenticate** ya sea directamente en una descripción de servidor o en una declaración de ubicación. Debe proporcionar un archivo de contraseñas dentro del **chroot**. location "/files/*" { authentication with "/htpasswords" } Este ejemplo autentica a los usuarios contra el archivo de password **/var/www/htpasswords**. Usted puede utilizar una definición de un dominio de seguridad, lo que le permite definir el texto que debe aparecer en el cuadro de contraseña del navegador. Sin embargo, no todos los navegadores mostrarán este mensaje. location "/files/*" { authenticate "Sólo autorizados" with "/htpasswords" } Una vez que requiere autenticación, nadie puede acceder al sitio hasta que ingrese un nombre de usuario y una contraseña correctos. **Httpd** incluye un programa **htpasswd(1)** escrito por la gente de OpenBSD. Donde **Apache htpasswd(1)** puede soportar varios algoritmos de cifrado diferentes. OpenBSD sólo admite **bcrypt** password. Si estás migrando a **Httpd**, investiga el formato **htpasswd** en tu antigua plataforma, antes de copiar los archivos de contraseña. Si mantienes manualmente el archivo de contraseñas, ejecute **htpasswd** con el nombre de usuario como argumento. Introduzca la contraseña cuando se le solicite y **htpasswd** escuchará la entrada del archivo de contraseñas. Aquí pongo una password para el usuario **mallard**, la cuenta **Bill** se utiliza para mantener el sitio **mallard.info**. $> htpasswd mallard Password: Retry Password: mallard: $2b$08$Sq5gmhbbZ08YznR1TwEOCuwPPEcepVbymQQ3DBH4JcfEGisF4VVca Para que **httpasswd(1)** añada la contraseña al archivo de contraseñas, dé a **httpasswd** el nombre del archivo de contraseñas y el nombre del usuario como argumentos, en ese orden. # htpasswd /var/www/htpasswd mallard Obtendrá la misma contraseña. Si el usuario ya existe, **htpasswd** cambia su contraseña. Si el usuario no existe en el archivo de contraseñas, lo hará ahora. La eliminación de los usuarios del archivo de contraseñas debe realizarse manualmente. === Default Server & Settings === **Httpd** utiliza el servidor predeterminado cuando nada más se ajusta. Tal vez el cliente llegó al sitio por su dirección IP en lugar de un nombre de sitio web. Tal vez un servidor no tiene un directorio **DocumentRoot** establecido. Si está ejecutando