\documentclass[12pt,a4paper,titlepage]{article}
\usepackage[spanish]{babel}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{minted}

\title{Proyecto Final ASO}
\author{Nicolás A. Ortega Froysa}

\begin{document}
\maketitle

\tableofcontents
\listoffigures
\listoftables

\pagebreak

\section{Resumen de Topología}

\begin{figure}[ht!]
	\centering
	\includegraphics[width=0.75\textwidth]{imgs/intranet-map.png}
	\caption{Mapa de intrenet.}
	\label{fig:intranet-map}
\end{figure}

El objetivo será montar una red interna que se asemeja a lo visto en la figura
\ref{fig:intranet-map}. Se ha decido montar el servidor LDAP con Windows Server
2019, ya que ya tuvimos una máquina de este tipo, y nuestro superior aconsejaba
el uso de Active Directory para servir de LDAP. Todo lo demás hemos decidido
usar Debian, ya que es una distribución estable, y así evitamos que las
actualizaciones rompan nuestras máquinas. También tiene una comunidad muy grande
para proveer soporte, aunque éste no sea de carácter profesional. Para servidor
web hemos decidido por Nginx por familiaridad y también por facilidad de uso.
Para nuestro servidor de bases de datos se ha elegido a MariaDB, también por
familiaridad, pero también por facilidad de instalación en Debian respecto a
otros más comerciales como Oracle. Finalmente nuestro terminal administrador,
que también corre Debian, servirá para conectarse y administrar los demás
dispositivos por medio de SSH, en el caso de los servidores Debian, o VNC en el
caso del Windows Server.

En cuanto a la identificación de cada dispositivo, usaremos las direcciones IP y
los nombres de {\it host} que aparecen en la tabla \ref{tbl:ip-table}.

\begin{table}[ht!]
	\centering
	\begin{tabular}{|c|c|c|}
		\hline
		{\bf Nombre} & {\bf Servicio} & {\bf Dirección IP} \\ \hline
		{\tt ad-serv} & Active Directory & 10.0.2.50 \\
		{\tt web0} & Servidor Web & 10.0.2.5 \\
		{\tt db-serv} & Base de Datos & 10.0.2.10 \\
		{\tt admin} & Administración & 10.0.2.2 \\ \hline
	\end{tabular}
	\caption{Tabla de direcciones IP.}
	\label{tbl:ip-table}
\end{table}

Para nuestra red, usaremos el dominio de {\tt nortega.local}. Todos nuestros
dispositivos tendrán un nombre por debajo de este dominio de acuerdo a su nombre
de {\it host}.

A todos nuestros dispositivos tendremos al menos una tarjeta de red para
conectarse a la red local <<ASO>>. Esto se hará en forma de una Red NAT. El
servidor web ({\tt web0}) en particular tendrá otra tarjeta red configurado como
Adaptador Puente Promiscuo, que habilitará la conexión a él desde el exterior.

\section{Configuración Inicial Windows Server}

El servidor Windows necesita más recursos, ya que consume más por causa de todo
lo que tiene instalado por defecto -- no es una instalación mínima, por así
decirlo. Así que asignaremos a él las especificaciones siguientes:

\begin{itemize}
	\item Procesadores: 2
	\item Memoria: 4096 MB
	\item Disco: 50 GB
\end{itemize}

Instalaremos Windows Server utilizando las opciones por defecto. No hay mucho
misterio. Es darle para adelante en cada paso.

\section{Configuración Inicial Linux}

Nuestros servidores Debian no ocupan mucho espacio en sí, como lo hace Windows
Server, por eso nos podemos permitir reducir los recursos alojados a éstos. A
estas máquinas alojaremos los recursos siguientes a todos:

\begin{itemize}
	\item Procesadores: 1
	\item Memoria: 1024 MB
	\item Disco: 10 GB
\end{itemize}

\subsection{Instalación}

En la instalación de Debian, queremos modificar varias cosas de forma
particular. Primero, el dominio que queremos configurar es, como se mencionó
anteriormente, {\tt nortega.local}. También, a la hora de especificar un
{\it hostname}, usamos el especificado anteriormente para cada servidor. Esto se
hará en la configuración de red.

Cuando llega la hora de escribir las particiones al disco, vamos a usar una
tabla de LVM para permitir más flexibilidad en cuanto a modificación del tamaño
de las distintas particiones, y sobre todo poder ampliar su tamaño con
facilidad, y poder hacerlo {\it en caliente}. Asignaremos todo el disco a un
mismo grupo, y crearemos las particiones de acuerdo a la tabla
\ref{tbl:debian-partitions}.

\begin{table}[ht!]
	\centering
	\begin{tabular}{|l|l|}
		\hline
		{\bf Mountpoint} & {\bf Tamaño} \\ \hline
		{\tt /} & 1.9 GB \\
		{\tt /boot} & 451 MB \\
		{\tt /tmp} & 463 MB \\
		{\tt /usr} & 3.7 GB \\
		{\tt /var} & 2.8 GB \\
		Swap & 496 MB \\ \hline
	\end{tabular}
	\caption{Tabla de particiones lógicas en los sistemas Debian.}
	\label{tbl:debian-partitions}
\end{table}

En cuanto a los usuarios, crearemos un usuario {\it proxy}; es decir, sólo sirve
para luego pasarte al usuario root. En el caso este, se ha creado el usuario
{\tt nicolas} con contraseña {\tt nicolas} -- en realidad poner otra contraseña
más compleja. Para el usuario {\tt root} le asignaremos la contraseña {\tt
toor}.

\begin{figure}[ht!]
	\centering
	\includegraphics[width=0.75\textwidth]{imgs/debian-install-choices.png}
	\caption{Selección de {\it software} adicional.}
	\label{fig:debian-install-choices}
\end{figure}

Cuando nos pregunta si hay otros paquetes que queremos instalar queremos
especificar los <<standard system utilities>> y también el <<SSH server>>. No
instalamos <<web server>> porque esto instalará Apache, que no nos interesa.
Debería de aparecer como en la figura \ref{fig:debian-install-choices}.

El resto de la instalación se realizará de forma normal, eligiendo las opciones
correspondientes.

\subsection{Post-Instalación}

Una vez instalado, debemos de configurar nuestros servidores Debian en cuestión
de configuración red, sobre todo nuestro servidor DNS -- que será el servidor de
Windows con Active Directory -- y también se configurará la dirección IP de
forma estática.

Primero, para configurar las direcciones IP estáticas. Para esto, debemos de
deshabiltar el servicio de NetworkManager que lo tiene Debian por defecto:

\begin{minted}{bash}
systemctl stop network-manager.service
systemctl disable network-manager.service
\end{minted}

Una vez deshabilitado el NetworkManager, ya podemos empezar a modificar los
archivos de configuración de red. El primer paso será definir una dirección IP
estática. Para empezar, encontramos cuál es el nombre de nuestro interfaz, que
se puede hacer utilizando el comando {\tt ip a}.

\begin{minted}{text}
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state
UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:31:09:eb brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.2/24 brd 172.16.40.255 scope global dynamic
enp0s3
       valid_lft 595981sec preferred_lft 595981sec
    inet6 fe80::a00:27ff:fe76:1cdf/64 scope link
       valid_lft forever preferred_lft forever
\end{minted}

Vemos en este ejemplo que queremos hacer uso de la interfaz {\tt enp0s3}, que es
la interfaz red de {\it ethernet}. Luego, en el archivo {\tt
/etc/network/interfaces}, vamos a configurarlo de la forma siguiente asumiendo
aquel interfaz y que queremos la dirección IP estática 10.0.2.2:

\begin{minted}{text}
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp0s3
iface enp0s3 inet static
    address 10.0.2.2
    netmask 255.255.255.0
\end{minted}

También queremos configurar nuestro servidor de DNS, que será el Windows Server
2019 con Active Directory. Para esto hemos de modificar el archivo {\tt
/etc/resolv.conf} con el contenido siguiente:

\begin{minted}{text}
domain nortega.local
search nortega.local
nameserver 10.0.2.50
\end{minted}

Una vez acabado debemos de hacer que el archivo sea inmutable, ya que muchos
servicios intentan modificar este fichero. Para eso corremos simplemente el
comando {\tt chattr +i /etc/resolv.conf}. Una vez configurado ya podemos
reiniciar el servicio de {\it networking} y veremos como hace uso de la
configuración especificada. Esto lo hacemos del modo siguiente:

\begin{minted}{bash}
systemctl restart networking.service
ifup enp0s3
\end{minted}

\section{Active Directory}

En la máquina Windows Server 2019 montaremos el servicio de Active Directory.
Este proceso lo podemos dividir en dos partes distintas: la instalación de
Active Directory en el servidor de Windows, y su configuración en los demás
servidores Linux.

\subsection{Instalación}

\begin{figure}[ht!]
	\centering
	\begin{subfigure}{0.45\textwidth}
		\includegraphics[width=0.95\textwidth]{imgs/ad-00-add-roles.png}
		\caption{Añadir un nuevo servicio.}
		\label{fig:ad-add-roles}
	\end{subfigure}
	\hfill
	\begin{subfigure}{0.45\textwidth}
		\includegraphics[width=0.95\textwidth]{imgs/ad-01-server-selection.png}
		\caption{Selección del servidor.}
		\label{fig:ad-server-selection}
	\end{subfigure}
	\hfill
	\begin{subfigure}{0.45\textwidth}
		\includegraphics[width=0.95\textwidth]{imgs/ad-02-server-features.png}
		\caption{Seleccionar características del servidor.}
		\label{fig:ad-server-features}
	\end{subfigure}
	\hfill
	\begin{subfigure}{0.45\textwidth}
		\includegraphics[width=0.95\textwidth]{imgs/ad-03-promote-to-controller.png}
		\caption{Promocionar nuestro servidor a controlador.}
		\label{fig:ad-promote-to-controller}
	\end{subfigure}
	\caption{}
\end{figure}

Cuando lanzamos el servidor Windows Server 2019, lo primero que nos abrirá será
el panel de control de nuestro servidor. Aquí, si nos vamos al apartado
<<Manage>>, queremos dar a <<Add Roles and Features>> para poder añadir un nuevo
servicio a este (figura \ref{fig:ad-add-roles}). Esto abrirá una nueva interfaz
donde podremos comenzar el proceso de instalación.

Lo primero que nos preguntará será el tipo de instalación, dándonos dos
opciones:

\begin{itemize}
	\item {\it Role-Based or feature-based installation}: configuración de un
		único servidor en donde instalamos servicios.
	\item {\it Remote Desktop Services installation}: instalación de requisitos
		para terminales virtuales.
\end{itemize}

En nuestro caso, nos interesa el primero, <<Role-based or feature-based
installation>>, ya que queremos instalar el Active Directory en el mismo
servidor, no en una máquina virtualizada encima. Entonces en la página siguiente
nos preguntará en qué servidor queremos hacer esta instalación, mostrándonos una
lista de servidores Windows en nuestra red (que nosotros tan sólo tenemos uno).
Escogemos el nuestro y seguimos (figura \ref{fig:ad-server-selection}).

Próximamente nos pedirá qué características queremos para nuestro servicio. Nos
interesa escoger <<Active Directory Domain Services>> (figura
\ref{fig:ad-server-features}). En la pantalla siguiente veremos una lista de
cajas de opciones, pero aquí no hace falta hacer nada. Y ya podremos seguir con
el proceso que nos instalará este servicio.

\subsection{Configuración en Linux}

\section{Terminal de Administración}

En este dispositivo lo más importante que debemos instalar, para el propósito de
administrar los servidores de la red, es SSH. Esto debería de estar disponible
ya si hemos instalado nuestro Debian con la opción <<SSH server>> mencionado
antes (que instala el cliente y el servidor).

\section{Base de Datos}

La base de datos, como se explicó anteriormente, será un servidor con el
programa MariaDB. Lo primero es instalar MariaDB como tal:

\begin{minted}{bash}
apt update
apt install mariadb-server
\end{minted}

Aunque el paquete se llama {\tt mariadb-server}, incluye también un cliente muy
espartano: {\tt mysql}. Pero antes de interactuar con la base de datos queremos
finalizar la instalación. Esto se hace con el comando siguiente: {\tt
mysql\_secure\_installation}.

Después de configurar la contraseña de {\tt root}, veremos que nos pide si la
autenticación debería de ser por <<unix\_socket>>. Esto no es nuestro caso ya
que queremos conectarnos remotamente desde nuestro servidor web, así que
respondemos que no: <<n>>. Luego nos preguntará si queremos eliminar los
usuarios anónimos. Esto puede ser buena idea para evitar que aquellos que no
tengan la autorización para acceder a nuestro servidor de base de datos no lo
puedan hacer, así que respondemos que sí: <<y>>. La próxima pregunta tiene que
ver con el acceso remoto al usuario {\tt root} de la base de datos, y si se
debería de permitir. Esto puede ser un riesgo de seguridad, ya que {\tt root}
tiene privilegios para acceder y manipular todos los datos que tenemos. También,
si nosotros queremos acceder a este usuario, lo podemos hacer accediendo primero
a la máquina por SSH desde el terminal administrador y luego entrando localmente
como el usuario {\tt root} de la base de datos. Por eso lo racional es no
permitir (o {\it despermitir}): <<y>>. La próxima opción es para eliminar la
base de datos de prueba y todo acceso a ello. Como no tendremos necesidad de
utilizarla, podemos eliminarla: <<y>>. Finalmente nos pregunta si queremos
actualizar todos los privilegios en este momento. Ya se hará en un futuro
(cuando reiniciamos la máquina, por ejemplo), pero si queremos empezar a
trabajar ya sobre la base de datos, lo que nos conviene es actualizarlos: <<y>>.
Una vez que hayamos terminado, ya podremos conectarnos al servidor de base de
datos con el comando {\tt mysql} de la forma siguiente:

\begin{minted}{text}
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 10.5.18-MariaDB-0+deb11u1 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and
others.

Type 'help;' or '\h' for help. Type '\c' to clear the current
input statement.

MariaDB [(none)]>
\end{minted}

Para salir sólo hemos de insertar el comando {\tt quit;} o usar la combinación
de teclas Ctrl+D, como con cualquier otro {\it shell}.

\section{Servidor Web}

En nuestro servidor web, con nombre {\tt web0} queremos instalar el programa
Nginx. Para esto hemos de correr los comandos siguientes:

\begin{minted}{bash}
apt update
apt install nginx
\end{minted}

Esto no sólo instalará Nginx, sino que también lo inicializará, de tal modo que
si intentas acceder a nuestro servidor web en un navegador por el puerto 80, te
saldrá la página por defecto de Nginx (figura \ref{fig:default-nginx-page}).

\begin{figure}[ht!]
	\centering
	\includegraphics[width=0.75\textwidth]{imgs/default-nginx-page.png}
	\caption{Página de Nginx por defecto.}
	\label{fig:default-nginx-page}
\end{figure}

Como nuestra intención es crear una página web de WikiMedia, será necesario
instalar PHP además de algunos módulos:

\begin{minted}{bash}
apt install php php-intl php-xml php-mbstring php-fpm
\end{minted}

Una vez instalado, ya podemos instalar nuestra aplicación web WikiMedia. Para
hacer esto, descargamos primero la aplicación de la página
principal\footnotemark\ y pasarlo a nuestro servidor web (que se puede hacer
mediante el comando {\tt scp}). Ahí lo pasamos a un directorio que servirá de
directorio raíz para nuestro sitio web, que para nosotros será {\tt
/var/www/wiki}, y a este directorio le cambiamos el propietario de forma
recursiva a {\tt www-data}. Esto lo hacemos para que Nginx -- que corre como
este usuario -- pueda editar los archivos y crear algunos nuevos.

\footnotetext{\url{https://www.mediawiki.org/wiki/Download}}

\begin{minted}{bash}
chown -R www-data:www-data /var/www/wiki
\end{minted}

Ahora, para configurar Nginx para este directorio, hemos de navegar al
directorio {\tt /etc/nginx/sites-available}. Ahí crearemos una copia del archivo
{\tt default} que se denominará {\tt wiki.conf}. Lo editamos para que sea de la
forma siguiente (habilitando PHP):

\begin{minted}{text}
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/wiki;

        index index.php index.html index.htm;

        server_name nortega.local;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                fastcgi_pass unix:/run/php/php-fpm.sock;
        }
}
\end{minted}

Luego, nos pasamos al directorio {\tt /etc/nginx/sites-enabled} y hacemos dos
cosas: primero, eliminar el enlace a la configuración por defecto; segundo crear
un enlace simbólico a nuestra configuración que acabamos de crear. Una vez hecho
esto, podemos verificar si nuestra configuración está bien corriendo una prueba
de Nginx.

\begin{minted}{bash}
# rm default
# ln -s ../sites-available/wiki.conf ./
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is
successful
\end{minted}

\pagebreak

\section{Derechos de Autor y Licencia}

\noindent
Copyright \copyright\ \the\year\ Nicolás A. Ortega Froysa
<nicolas@ortegas.org> \\
\\
Este documento se distribuye bajo los términos y condiciones de la licencia
Creative Commons Attribution No Derivatives 4.0 International.

\end{document}
