\documentclass[11pt,a4paper]{article} \usepackage[portuguese]{babel} \usepackage[lining]{ebgaramond} \usepackage{listings} \usepackage{booktabs} \usepackage{style} \lstdefinestyle{mystyle}{ basicstyle=\ttfamily\footnotesize, breakatwhitespace=false, breaklines=true, captionpos=b, keepspaces=true, numbers=left, numbersep=5pt, showspaces=false, showstringspaces=false, showtabs=false, tabsize=2 } \lstset{style=mystyle} \setlength{\parindent}{0em} \setlength{\parskip}{2ex} \title{Practical Assignment \#2} \author{ João Neto -- 2023234004\\[1em] Vasco Alves -- 2022228207 } \begin{document} \maketitle \tableofcontents \newpage \section{Introdução} Este projecto tem como âmbito implementar uma rede virtual privada (VPN) em um cenário de road-warrior, ou seja, onde o administrador de acesso da rede é o cliente ou tem acesso a ele. Para tal, foi implementado um servidor e um cliente OpenVPN, certificados por uma autoridade central (CA) que em si é self-signed. Para além disto, foi implementado um sistema de autenticação de dois factores através do plugin \textit{google-authenticator} para o OpenVPN. Existe ainda um servidor Apache e um servidor de OpenSSL OCSP. Para simplificar, a elaboração do projecto foram colocados na mesma maquina virtual, mas por razoes de seguranca poderia querer ter estes serviços separados. Temos então três máquinas virtuais: \begin{tabular}{l l l} {\bf Nome} & {\bf Script} & {\bf Rede} \\\toprule Road Warrior & VM\_ROAD\_WARRIOR.sh & Rede Externa 193.168.0.0/24 \\ VPN Gateway & VM\_OPENVPN\_GATEWAY.sh & Router \\ OpenSSL / Apache & VM\_OPENSSL\_APACHE.sh & Rede Interna 10.60.0.0/24 \\ \end{tabular} \section{Criação de certificados} Criar chaves com 2048 bits. Todos os certificados são criados de uma so vez e são depois copiados para as respetivas máquinas virtuais. \begin{lstlisting}[language=bash] cert_ca="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=CoimbraVPN" cert_vpn="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=gateway" cert_user="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=warrior" cert_apache="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=apache.coimbra" openssl genrsa -out "ca.key" 2048 openssl req -x509 -nodes -days 365 -key "ca.key" -out "ca.crt" -subj "$cert_ca" openssl genrsa -out "vpn.key" 2048 openssl req -new -key "vpn.key" -out "vpn.csr" -subj "$cert_vpn" openssl ca -batch -in "vpn.csr" -cert "ca.crt" -keyfile "ca.key" -out "vpn.crt" -config cheese.cfg openssl dhparam -out "dh2048.pem" 2048 openvpn --genkey secret "ta.key" openssl genrsa -out user.key openssl req -new -key user.key -out user.csr -subj "$cert_user" openssl ca -batch -in "user.csr" -cert "ca.crt" -keyfile "ca.key" -out "user.crt" -config cheese.cfg openssl genrsa -out apache.key openssl req -new -key apache.key -out apache.csr -subj "$cert_apache" -addext "subjectAltName = IP:10.60.0.1,DNS:apache" openssl ca -batch -in "apache.csr" -cert "ca.crt" -keyfile "ca.key" -out "apache.crt" -config cheese.cfg \end{lstlisting} \section{Configuração da \textit{Gateway} VPN} \subsection{Configurar TOTP} Foi criado o ficheiro \texttt{totp} com a configuração de autenticação a ser utilizada pelo plugin de PAM para o openvpn. \begin{lstlisting}[language=bash] plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so totp \end{lstlisting} Adicionalmente, devido às restrições de segurança do \textit{systemd}, foi necessário desativar o \texttt{ProtectHome} no serviço do OpenVPN para que o plugin PAM consiga ler os ficheiros de segredo do Google Authenticator localizados nas diretorias \textit{home} dos utilizadores. \begin{lstlisting}[language=bash] [Service] ProtectHome=false \end{lstlisting} Primeiro, na gateway, entramos como o utilizador desejado e obtemos a chave do gerador de palavras passes temporarias. Ao inserir a chave no \texttt{google authenticator} podemos obter um código QR, a nossa primeira chave de 6 digitos. \begin{figure}[h] \centering \includegraphics{google-authenticator} \end{figure} \begin{lstlisting}[language=bash] su john google-authenticator \end{lstlisting} \subsection{Encaminhamento e Firewall} Para que a gateway funcione como router entre a rede externa e a rede interna, foi necessário ativar o \textit{IP forwarding} no kernel e configurar as regras de \textit{iptables} para permitir o tráfego da VPN e realizar o mascaramento de IP (NAT). % NOTA(vasco): Não temos regras de DROP a packets % talvez deviamos mudar isso nao sei \begin{lstlisting}[language=bash] # Ativar encaminhamento echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf # Regras de Firewall iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT iptables -I FORWARD 1 -i tun0 -o enp0s9 -j ACCEPT iptables -I FORWARD 1 -i enp0s9 -o tun0 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp0s8 -j MASQUERADE \end{lstlisting} \section{Configuração do Cliente (Road Warrior)} O cliente encontra-se na rede externa (\texttt{193.136.212.10}) e liga-se à VPN gateway na porta 1194. Para garantir a segurança, utiliza-mos autenticação mútua (os certificados X.509) e um \textit{two factor authentication} (2FA) como palavras-passe temporarias, geradas através do \textit{Google Authenticator}. \begin{lstlisting}[language=bash] client dev tun proto udp remote 193.136.212.1 1194 ca ca.crt cert user.crt key user.key auth-user-pass cipher AES-256-GCM auth SHA256 \end{lstlisting} \section{Servidor Apache e OCSP} O servidor interno (\texttt{10.60.0.1}) alberga o serviço Apache e o responder OCSP da autoridade de certificação. \subsection{Revocation e OCSP} \begin{enumerate} \item Estabelecer a ligação VPN e verificar a conectividade à rede interna. \item No diretório da autoridade de certificação (máquina \textit{host}), revogar o certificado do utilizador: \begin{lstlisting}[language=bash] openssl ca -revoke user.crt -config cheese.cfg -keyfile ca.key -cert ca.crt \end{lstlisting} \item Atualizar o ficheiro \texttt{index.txt} no servidor OCSP e reiniciar o serviço para carregar o novo estado de revogação. \item Tentar estabelecer uma nova ligação VPN e verificar que a autenticação falha devido à resposta \texttt{revoked} do responder OCSP. \end{enumerate} \section{Conclusão} A implementação deste projeto permitiu consolidar conhecimentos sobre redes privadas virtuais e segurança em comunicações. A combinação de certificados digitais com autenticação de dois fatores (TOTP) garante uma robustez significativa contra ataques de interceção e roubo de credenciais. A integração do protocolo OCSP permite uma gestão dinâmica da confiança, possibilitando a revogação imediata de acesso a clientes comprometidos sem necessidade de redistribuição de listas de revogação (CRLs) volumosas. Em suma, o sistema cumpre os requisitos de confidencialidade, integridade e disponibilidade propostos. \end{document}