viernes, 19 de enero de 2018

Instalación de Apache Web Server

Podemos instalar el servidor web Apache desde webmin. Para ello, desplegaremos la opción Unused modules>Apache Webserver


y hacemos click en el enlace para iniciar la instalación


o desde la linea de comandos

>sudo apt-get update
>sudo apt-get install apache2

Al instalar se crean:
- Los archivos de configuración.
- El usuario www-data dentro del grupo tambien llamado www-data.
- La carpeta /var/www

Comprobar que se ha creado el usuario www-data y el grupo del mismo nombre.

>cat /etc/passwd | grep www-data

y el grupo

>cat /etc/group| grep www-data

Mediante el usuario y el grupo www-data se ejecutan los procesos hijos de apache que se encargan de atender peticiones.

Comprobar que
Se ha creado el directorio /var/www
Su propietario es root y grupo root

Este es el directorio raiz del "servidor virtual por defecto".

>ls -l /var/www


Iniciar el servidor apache

Para iniciar el servicio, como cualquier otro servicio de ubuntu utlizamos el siguiente comando:

>/etc/init.d/apache2 start  (o service apache2 start)

y para comprobar el estado

>>/etc/init.d/apache2 status

El servidor se iniciará correctamente, podemos comprobarlo leyendo el fichero de registro de eventos des sistema, aunque nos dará un pequeño error, el cual consiste en que no puede determinar el nombre del equipo.

>cat /var/log/syslog | grep apache2




La opción Others>System and Server Status de Webmin también nos permite saber el estado en que se encuentran nuestros servicios, entre ellos Apache.


Para iniciar y detener el servidor apache tambien podemos usar el script apachectl de la siguiente manera

>sudo apachectl start
>sudo apachectl stop

Haciendolo de esta manera obtenemos información que apache envia al syslog, pues también no saca esta misma infomacion directamente por el terminal.




Podemos apreciar el error antes comentado y la forma de solucionarlo (más tarde)

Comprobamos que se han creado los directorios y archivos de configuración en la carpeta /etc/apache2



Consultamos su contenido

/etc/apache2/apache2.conf





/etc/apache2/ports.conf



/etc/apache2/envars

Comprobar los subdirectorios

Directorios de configuración de módulos disponibles y habilitados

/etc/apache2/mod-available
/etc/apache2/mods-enabled

Directorios de configuración de sitios (o servidores) virtuales

/etc/apache2/sites-available
/etc/apache2/sites-enabled

Directorios de configuraciones
/etc/apache2/conf-available
/etc/apache2/conf-enabled




Comprobar que el proceso está en ejecución, es decir, que el servidor esta iniciado.

>ps -ef \ grep apache

Las opciones utilizadas corresponden a:
-e para ver todos los procesos
-f (full) para ver la informacion completa de cada proceso






Desde Webmin también podemos visualizar procesos en ejecución desde la opción System>Running Processes

Para buscar  procesos tenemos varias opciones dependiendo de la caja de texto que seleccionemos marcado el boton de radio a su lado.



Por ejemplo, matching y escribiendo "apache" o Using Port y escribiendo 80.




Observar que existen varios procesos iniciados por apache2
Uno de ellos es el proceso padre cuyo propietario es root, y el resto son los procesos hijos o trabajadores, creados para atender peticiones y su propietario es www-data.

Podemos saber que son procesos hijos fijandonos en la tercera columna, que nos dice su PPID, el ID de proceso del proceso padre y vemos que coincide con el PID del primero proceso de la lista.

Tambien mediante Wemin podemos hacer click en el PID de un proceso hijo para ver una pagina de detalle del proceso y fijarnos donde dice parent process. A continuación, hacer click en este enlace y ver que nos lleva a lainfo del proceso padre.



Comprobar que el servidor está escuchando en el puerto TCP 80.

>netstat -ltn

En este caso las opciones utilizadas son las siguientes:
-l para mostrar los sockets que estan a la escucha (listening)
-t para quedanos con aquellos que usan el protocolo TCP
-n para que no resuelva nombres y nos muestre numeros (IPs, puertos, etc)

Podemos ver la diferencia entre el uso de la opcion -n o no.




En este caso, como webmin no tiene una opción específica para ver esta información debemos hacer uso de la opción general que permite ejecutar un comando en el servidor. La opcion está ubicada en Others>Command Shell. Una vez ahí, introducir los comandos.



Hasta aqui todas las comprobaciones necesarias.

---







Criterio para determinar el host virtual que atiende la solicitud HTTP recibida en el servidor web Apache

El criterio para asociar una solicitud con un host virtual de entre todos los que integran la lista será el siguiente.

A partir de la información procedente de las cabeceras de la solicitud HTTP realizada por el cliente se usarán los siguientes datos (entre paréntesis con que parametro del host virtual se compara):

- Nombre DNS utilizado (ServerName)
- puerto TCP (puerto)
- IP a la que se resuelve el nombre DNS (Addresss)
- IP especificada explícitamente, si se ha usado directamente la IP en la URL en lugar de un nombre DNS. (Address)


El criterio para seleccionar el host virtual que atiende la petición HTTP recibida en el servidor se basa en el número de parámetros que coinciden con los de la solicitud, pero en un orden de prioridad. En primero lugar la IP, a continuación el número de puerto y por último el ServerName.

Por lo tanto, si encontramos en la lista de hosts virtuales un solo host virtual con la IP establecida de forma explicita y esta coinicide con la IP de la solicitud (o la IP del nombre DNS una vez resuelto) este será el host virtual asociado con la solicitud.

Si existieran varios hosts virtuales con la IP coincidente, entonces entre ellos se escogerá aquel que explicite el número de puerto TCP y este coincida con el de la solicitud HTTP recibida.

Nuevamente, en caso de haber varios hosts, se debe seguir probando con el siguiente criterio, y este ya, por fin, es el parametro ServerName, de modo que aquel host virtual que coincida con el valor del ServerName será el seleccionado.

El último criterio para desempatar, caso de que no se haya podido decidir todavía que host virtual atiende la petición, sera el nombre del fichero de configuración del host virtual en orden alfabético descendente.

No obstante, puede suceder que, mientras se está seleccionando el host virtual, aparte del caso en que exista uno o varios host virtuales que cumplen el criterio, también puede ocurrir el caso de que no exista ninguno. En este caso se pasa al criterio siguiente, es decir, si se trata de la IP se pasará al puerto, y si se trata del puerto se pasará al ServerName y finalmente si no hay mas remedio al nombre del fichero de configuración.


Certificados de cliente en Apache


 Si queremos validar un usuario mediante un certificado emitido por alguna autoridad de certificación...

Fuentes:
http://www.garex.net/apache/#CCCreate

Generar una solicitud de certificado para una autoridad de certificación




Un CSR (Certificate Signing Request) es un archivo que contiene la información necesaria para solicitar un certificado a una CA Autoridad de Certificación, incluida una clave publica.

Usaremos el comand:

openssl req -nodes -newkey rsa:2048 -keyout myserver.key -out server.csr


openssl req -nodes -newkey rsa:2048 -keyout servidorweb.key -out servidorweb.csr

-nodes no encriptar la clave generada con una frase de paso DES
-newkey rsa:bits -> genera un clave RSA de el numero tamaño 'bits' bits
-keyout fichero -> archivo donde ser va a escribir la clave privada
-out -> fichero donde se va a escribir la solicitud de certificado para la CA


La solicitud la tendremos que autofirmar con nuestra propia CA.


Fuentes:
http://acidx.net/wordpress/2013/02/enabling-ssl-on-your-webserver/

http://acidx.net/wordpress/2012/09/creating-a-certification-authority-and-a-server-certificate-on-ubuntu/

Configurar los servidores virtuales en Apache

El servidor principal o por defecto atiende las peticiones a menos que se configuren servidores virtuales.
Su cofiguración está definida directamente en los ficheros de configuración de apache, concretamente en el fichero /etc/apache2.conf.

Podemos comprobar como da igual lo que escribamos en la barra direcciones del navegador siempre que el nombre DNS se pueda resolver a la IP 192.168.100.254, es decir, la del propio servidor web.

Podemos probar con

http://servidor.aulasri.com
http://192.168.100.254
http://127.0.0.1

Y también con los alias

http://www.aulasri.com
http://dns1.aulasri.com
http://smtp.aulasri.com

Estos alias y en general toda la información para resolver el nombre DNS a la IP del servidor se crearon cuando vimos BIND9 y ahora vemos su utilidad.

El directorio raiz de documentos predeterminado del servidor web Apache para Ubuntu es /var/www/html.

Podemos abrir este archivo con el navegador y ver su contenido.
Comprobamos de este modo que se trata del mismo documento que el servidor web nos está sirviendo via web, usando el puerto 80 tcp, cuando lo hacemos a través del servidor escribiendo en la barra de direcciones las URLs anteriormente citadas.

 
Para cada host virtual definido en Apache se pueden establecer 3 parámetros diferentes. Estos son:

- Address (direccion)
- port (puerto)
- ServerName (nombre DNS del servidor / host virtual)

Para Address y port se puede establecer un valor explicito o dejarlo sin definir mediante Any en webmin o * directamente en la directiva VirtualHost (para la dirección o el puerto).

En el caso del ServerName se puede utilizar el valor por defecto de la configuración global o establecer un valor diferente que lo reemplace.


Estos parámetros permitirán establecer los criterios de correspondencia o no con el sitio web (host virtual) una vez confrontados con los propios valores de la solicitud.

Si hemos establecido el valor Any para algo de ellos estaremos indicando que nos valdría cualquier valor proporcionado en la solicitud (request) para ese parámetro a la hora de admitirlo como acierto (match).





Comparando todos datos proporcionados por la solicitud con los parámetros de cada host virtual de la lista en el servidor, se eligen aquellos que mejor se ajustan a la solicitud.

Se entiende que los host virtuales que mejor se ajustan son aquellos en lo que coinciden un mayor número de parámetros explícitos (no cuentan los establecidos como Any, ya que estos solo sirven para descartar)

Primero, se descartan hosts cuyo puerto o dirección no coincide con el de la solicitud. Para saber si la dirección no coincide se resuelve el nombre DNS proporcionado en la solicitud.

Aunque para aquellos hosts virtuales que estén configurados con la opción Any se entenderá que pueden corresponder con la solicitud y no serán descartados de la lista.




Si al final, después de tener en cuenta estos filtros solamente hay un ganador en cuanto número de parámetros coincidentes (3,2,1 o 0 y los Any no cuentan) ese será el host virtual al que se asociará la solicitud.

En caso de empate, habrá que tener en cuenta criterios de desempate.

El criterio para desempatar será escoger a aquel que se encuentre antes en la lista, que será aquel cuyo archivo de configuración tiene un nombre en el sistema de archivos menor en orden alfabético.

Hay que tener en muy en cuenta que pasa cuando usamos al mismo tiempo hosts virtuales basados en IP y host virtuales basados en nombre. La precaución que hay que tener en cuenta es la siguiente:

Toda solicitud HTTP recibida indicando un nombre DNS es resuelta a su correspondiente IP mediante el servicio DNS. Si existiera un host virtual basado en IP asociado a ese nombre que además indica número de puerto, este tendría preferencia sobre un host virtual que si coincidiera el nombre DNS pero que no indica número de puerto.


De DNS a IP.

Primero aquel que coincida la IP de forma explicita, si varios, aquel que explicite el puerto y coincida, y si varios (o ninguno explicita el puerto) entonces aquel que coincida en ServerName,

y después el primero fichero alfabético.


Criterio para determinar el host virtual que atiende la solicitud HTTP recibida en el servidor web Aache