This commit is contained in:
Vasco
2026-04-24 18:42:23 +01:00
5 changed files with 127 additions and 80 deletions

View File

@@ -10,14 +10,15 @@
\@writefile{toc}{\contentsline {section}{\numberline {1}Introdução}{2}{section.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {1}Introdução}{2}{section.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2}Criação de certificados}{2}{section.2}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {2}Criação de certificados}{2}{section.2}\protected@file@percent }
\def\@LN@column{1} \def\@LN@column{1}
\@writefile{toc}{\contentsline {section}{\numberline {3}Configuração da \textit {Gateway} VPN}{3}{section.3}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3}Configuração geral}{3}{section.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Configurar TOTP}{3}{subsection.3.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4}Configuração da \textit {Gateway} VPN}{3}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Encaminhamento e Firewall}{3}{subsection.3.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Configurar TOTP}{3}{subsection.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4}Configuração do Cliente (Road Warrior)}{3}{section.4}\protected@file@percent }
\def\@LN@column{1} \def\@LN@column{1}
\@writefile{toc}{\contentsline {section}{\numberline {5}Servidor Apache e OCSP}{4}{section.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Encaminhamento e Firewall}{4}{subsection.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Revocation e OCSP}{4}{subsection.5.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {5}Configuração do Cliente (Road Warrior)}{4}{section.5}\protected@file@percent }
\def\@LN@column{1} \def\@LN@column{1}
\@writefile{toc}{\contentsline {section}{\numberline {6}Conclusão}{5}{section.6}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {6}Servidor Apache e OCSP}{5}{section.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}Revocation e OCSP}{5}{subsection.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7}Conclusão}{5}{section.7}\protected@file@percent }
\xdef \mintedoldcachechecksum{\detokenize{\minted@cachechecksum }} \xdef \mintedoldcachechecksum{\detokenize{\minted@cachechecksum }}
\gdef \@abspage@last{5} \gdef \@abspage@last{5}

View File

@@ -1,4 +1,4 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.4.13) 24 APR 2026 17:22 This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.4.13) 24 APR 2026 18:42
entering extended mode entering extended mode
\write18 enabled. \write18 enabled.
%&-line parsing enabled. %&-line parsing enabled.
@@ -840,9 +840,9 @@ LaTeX Font Info: Font shape `T1/Raleway-OsF/bold/n' aliased to
LaTeX Font Info: Font shape `T1/Raleway-OsF/b/n' will be LaTeX Font Info: Font shape `T1/Raleway-OsF/b/n' will be
(Font) scaled to size 10.95pt on input line 2. (Font) scaled to size 10.95pt on input line 2.
LaTeX Font Info: Font shape `T1/Raleway-OsF/bold/it' aliased to LaTeX Font Info: Font shape `T1/Raleway-OsF/bold/it' aliased to
(Font) `T1/Raleway-OsF/b/it' on input line 4. (Font) `T1/Raleway-OsF/b/it' on input line 5.
LaTeX Font Info: Font shape `T1/Raleway-OsF/b/it' will be LaTeX Font Info: Font shape `T1/Raleway-OsF/b/it' will be
(Font) scaled to size 10.95pt on input line 4. (Font) scaled to size 10.95pt on input line 5.
) )
\tf@toc=\write5 \tf@toc=\write5
\openout5 = `relatorio.toc'. \openout5 = `relatorio.toc'.
@@ -852,7 +852,7 @@ LaTeX Font Info: Font shape `T1/Raleway-OsF/b/it' will be
{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}{/usr/share/texmf-dist/fonts {/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}{/usr/share/texmf-dist/fonts
/enc/dvips/raleway/a_itoun2.enc}] /enc/dvips/raleway/a_itoun2.enc}]
LaTeX Font Info: Font shape `T1/Raleway-OsF/m/it' will be LaTeX Font Info: Font shape `T1/Raleway-OsF/m/it' will be
(Font) scaled to size 10.95pt on input line 46. (Font) scaled to size 10.95pt on input line 42.
(/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty (/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
File: lstlang1.sty 2025/11/14 1.11b listings language file File: lstlang1.sty 2025/11/14 1.11b listings language file
) )
@@ -860,30 +860,30 @@ File: lstlang1.sty 2025/11/14 1.11b listings language file
File: lstlang1.sty 2025/11/14 1.11b listings language file File: lstlang1.sty 2025/11/14 1.11b listings language file
) )
LaTeX Font Info: Font shape `T1/Raleway-OsF/m/n' will be LaTeX Font Info: Font shape `T1/Raleway-OsF/m/n' will be
(Font) scaled to size 9.0pt on input line 73. (Font) scaled to size 9.0pt on input line 86.
LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <9> not available LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <9> not available
(Font) Font shape `T1/cmtt/m/n' tried instead on input line 82. (Font) Font shape `T1/cmtt/m/n' tried instead on input line 95.
LaTeX Font Info: Font shape `T1/Raleway-OsF/bold/it' aliased to
(Font) `T1/Raleway-OsF/b/it' on input line 93.
LaTeX Font Info: Font shape `T1/Raleway-OsF/b/it' will be
(Font) scaled to size 14.4pt on input line 93.
LaTeX Font Info: Font shape `T1/Raleway-OsF/bold/n' aliased to
(Font) `T1/Raleway-OsF/b/n' on input line 95.
LaTeX Font Info: Font shape `T1/Raleway-OsF/b/n' will be
(Font) scaled to size 12.0pt on input line 95.
[2{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}] [2{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}]
<google-authenticator.jpg, id=58, 225.84375pt x 447.6725pt> LaTeX Font Info: Font shape `T1/Raleway-OsF/bold/it' aliased to
(Font) `T1/Raleway-OsF/b/it' on input line 141.
LaTeX Font Info: Font shape `T1/Raleway-OsF/b/it' will be
(Font) scaled to size 14.4pt on input line 141.
LaTeX Font Info: Font shape `T1/Raleway-OsF/bold/n' aliased to
(Font) `T1/Raleway-OsF/b/n' on input line 143.
LaTeX Font Info: Font shape `T1/Raleway-OsF/b/n' will be
(Font) scaled to size 12.0pt on input line 143.
<google-authenticator.jpg, id=60, 225.84375pt x 447.6725pt>
File: google-authenticator.jpg Graphic file (type jpg) File: google-authenticator.jpg Graphic file (type jpg)
<use google-authenticator.jpg> <use google-authenticator.jpg>
Package pdftex.def Info: google-authenticator.jpg used on input line 120. Package pdftex.def Info: google-authenticator.jpg used on input line 169.
(pdftex.def) Requested size: 225.84319pt x 447.6714pt. (pdftex.def) Requested size: 87.59998pt x 173.64207pt.
LaTeX Warning: `h' float specifier changed to `ht'. LaTeX Warning: `h' float specifier changed to `ht'.
[3] [4 </home/raw/uni/fsi/trabalho/relatorio/google-authenticator.jpg>] [3] [4 </home/raw/uni/fsi/trabalho/relatorio/google-authenticator.jpg>]
[5] [5]
runsystem(latexminted cleantemp --timestamp 20260424172206 C117BC0880C49B7BB81 runsystem(latexminted cleantemp --timestamp 20260424184203 C117BC0880C49B7BB81
87B6D1568B650)...executed. 87B6D1568B650)...executed.
(/home/raw/uni/fsi/trabalho/relatorio/relatorio.aux) (/home/raw/uni/fsi/trabalho/relatorio/relatorio.aux)
@@ -899,32 +899,28 @@ Package rerunfilecheck Warning: File `relatorio.out' has changed.
Package rerunfilecheck Info: Checksums for `relatorio.out': Package rerunfilecheck Info: Checksums for `relatorio.out':
(rerunfilecheck) Before: <no file> (rerunfilecheck) Before: <no file>
(rerunfilecheck) After: 97318B6716690DCCEA5502A17BBBBFD0;1443. (rerunfilecheck) After: 421D094394457CC27F2EA2D1C1EC716E;1586.
) )
Here is how much of TeX's memory you used: Here is how much of TeX's memory you used:
20169 strings out of 469495 20227 strings out of 469495
373283 string characters out of 5470098 373994 string characters out of 5470098
1295490 words of memory out of 5000000 1301885 words of memory out of 5000000
48459 multiletter control sequences out of 15000+600000 48492 multiletter control sequences out of 15000+600000
830020 words of font info for 92 fonts, out of 8000000 for 9000 830020 words of font info for 92 fonts, out of 8000000 for 9000
16 hyphenation exceptions out of 8191 16 hyphenation exceptions out of 8191
90i,6n,99p,490b,1296s stack positions out of 10000i,1000n,20000p,200000b,200000s 90i,6n,99p,490b,2124s stack positions out of 10000i,1000n,20000p,200000b,200000s
</usr/share/texmf-dist/fonts/type1/impallari/raleway/Raleway-Bold.pfb></usr/s
pdfTeX warning (dest): name{subsection.3.3} has been referenced but does not ex hare/texmf-dist/fonts/type1/impallari/raleway/Raleway-BoldItalic.pfb></usr/shar
ist, replaced by a fixed one e/texmf-dist/fonts/type1/impallari/raleway/Raleway-Italic.pfb></usr/share/texmf
-dist/fonts/type1/impallari/raleway/Raleway-Regular.pfb></usr/share/texmf-dist/
</usr/share/texmf-dist/fonts/type1/impallari/raleway/Raleway-Bold.pfb></usr/sha fonts/type1/public/cm-super/sfit0900.pfb></usr/share/texmf-dist/fonts/type1/pub
re/texmf-dist/fonts/type1/impallari/raleway/Raleway-BoldItalic.pfb></usr/share/ lic/cm-super/sftt0900.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sf
texmf-dist/fonts/type1/impallari/raleway/Raleway-Italic.pfb></usr/share/texmf-d tt1095.pfb>
ist/fonts/type1/impallari/raleway/Raleway-Regular.pfb></usr/share/texmf-dist/fo
nts/type1/public/cm-super/sfit0900.pfb></usr/share/texmf-dist/fonts/type1/publi
c/cm-super/sftt0900.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sftt
1095.pfb>
Output written on /home/raw/uni/fsi/trabalho/relatorio/relatorio.pdf (5 pages, Output written on /home/raw/uni/fsi/trabalho/relatorio/relatorio.pdf (5 pages,
167001 bytes). 176238 bytes).
PDF statistics: PDF statistics:
158 PDF objects out of 1000 (max. 8388607) 189 PDF objects out of 1000 (max. 8388607)
134 compressed objects within 2 object streams 165 compressed objects within 2 object streams
72 named destinations out of 1000 (max. 500000) 97 named destinations out of 1000 (max. 500000)
6 words of extra memory for PDF output out of 10000 (max. 10000000) 6 words of extra memory for PDF output out of 10000 (max. 10000000)

Binary file not shown.

View File

@@ -38,18 +38,27 @@
\section{Introdução} \section{Introdução}
Este projecto tem como âmbito implementar uma rede virtual privada (VPN) em um cenário de road-warrior, Este projeto tem como âmbito implementar, uma rede virtual privada (VPN) num cenário
ou seja, onde o administrador de acesso da rede é o cliente ou tem acesso a ele. de road-warrior, configurar \textit{two-factor authentication} (2FA) com os serviços
OpenVPN e Apache, e gerir certificados X.509 utilizando OCSP.
Para tal, foi implementado um servidor e um cliente OpenVPN, certificados por uma autoridade central (CA) % NOTE(vasco): Eu acho que basta explicar o cenario e explicar como decidimos
que em si é self-signed. Para além disto, foi implementado um sistema de autenticação de dois factores % implementar
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 % Para tal, foi implementado um servidor e um cliente OpenVPN, certificados por uma
projecto foram colocados na mesma maquina virtual, mas por razoes de seguranca poderia querer ter % autoridade central (CA) que em si é \textit{self-signed}. Para além disto, foi implementado
estes serviços separados. % um sistema de autenticação de dois factores através do plugin
% \textit{google-authenticator} para o OpenVPN e para o servidor de Apache.
Temos então três máquinas virtuais: Decidimos utilizar apenas três máquinas virtuais: o cliente (ou \textit{road warrior}),
a \textit{gateway} que utiliza OpenVPN e um servidor interno com OpenSSL e Apache.
Isto simplifica a elaboração do projecto, mas por razões de segurança poderia querer
separar a máquina de OpenSSL de outras máquinas destinadas a serviços da rede intera,
pois esta contém o \textit{certificate authority} CA.
% Ambos o OpenVPN eo servidor Apache utilizam 2FA,
% recebendo o utilizador, e uma password que é uma concatenação da palavra-passe do utilizador
% e de uma password temporária (TOTP) de 6 dígitos. O servidor de Apache implementa a mesma autenticação.
\begin{tabular}{l l l} \begin{tabular}{l l l}
@@ -59,15 +68,19 @@ Temos então três máquinas virtuais:
OpenSSL / Apache & VM\_OPENSSL\_APACHE.sh & Rede Interna 10.60.0.0/24 \\ OpenSSL / Apache & VM\_OPENSSL\_APACHE.sh & Rede Interna 10.60.0.0/24 \\
\end{tabular} \end{tabular}
\section{Criação de certificados} \section{Criação de certificados}
Criar chaves com 2048 bits. Os certificados utilizados foram auto-certificados por uma autoridade central que "pertence"
à máquina de OpenSSL. Esta mesma faz a gestão da lista de revogação.
Todos os certificados são criados de uma so vez e são depois copiados para as respetivas Todas as chaves foram criadas no mesmo computador, com as variáveis que estão
máquinas virtuais. neste código, aspetos importantes para mais tarde serão os parâmetros de CN
que precisam de ser passados mais tarde para aceder ao Apache e ao gateway.
Numa situação normal teríamos uma autoridade de certificação para enviar e
no fundo gerir todos, mas para este cenário podemos inicializar as máquinas
com as chaves, requests e certificados necessários.
O código para gerar os certificados X.509:
\begin{lstlisting}[language=bash] \begin{lstlisting}[language=bash]
cert_ca="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=CoimbraVPN" cert_ca="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=CoimbraVPN"
@@ -90,6 +103,41 @@ openssl req -new -key apache.key -out apache.csr -subj "$cert_apache" -addext "s
openssl ca -batch -in "apache.csr" -cert "ca.crt" -keyfile "ca.key" -out "apache.crt" -config cheese.cfg openssl ca -batch -in "apache.csr" -cert "ca.crt" -keyfile "ca.key" -out "apache.crt" -config cheese.cfg
\end{lstlisting} \end{lstlisting}
% Porque é que precisamos de uma chave secreta?
% Criar chave secreta.
\begin{lstlisting}[language=bash]
openssl --genkey secret ta.key
\end{lstlisting}
\section{Configuração geral}
Para configurar as VMs era preciso introduzir os mesmos comandos várias vezes, o que levava muitas vezes a erros de escrita, ou a correr o mesmo comando várias vezes, por isso criamos vários ficheiros .sh para conseguir facilitar o processo. A utilização de ficheiros .sh também vem com outros positivos pois facilita a testagem, e a recriação do cenário rapidamente.
No entanto para os serviços que configuramos, instalar, desativar e dar flush às iptables não foi suficiente, tivemos que criar pastas e sincronizar os relógios de todas as VMs visto que elas estarem ligeiramente atrasadas nunca conseguíamos acertar na password do google-authenticator que utiliza o tempo local para calcular a sua chave.
\begin{lstlisting}[language=bash]
yum install -y epel-release
yum install -y openvpn iptables-services dhcp-client
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl enable iptables
iptables -F
CA_DIR="/etc/pki/CA"
mkdir -p "${CA_DIR}/newcerts"
mkdir -p "${CA_DIR}/private"
touch "${CA_DIR}/index.txt"
cp ca/serial "${CA_DIR}/serial"
mkdir -p /etc/openvpn/server
mkdir -p /etc/openvpn/client
# NOTE(vasco): tive problemas com a sincronizacao de tempo
# se nao tiver sincronizado, o TOTP nao funciona
systemctl stop chronyd
ntpdate pool.ntp.org
systemctl start chronyd
\end{lstlisting}
\section{Configuração da \textit{Gateway} VPN} \section{Configuração da \textit{Gateway} VPN}
\subsection{Configurar TOTP} \subsection{Configurar TOTP}
@@ -112,13 +160,13 @@ ProtectHome=false
\end{lstlisting} \end{lstlisting}
Primeiro, na gateway, entramos como o utilizador desejado e obtemos a chave Primeiro, na gateway, entramos como o utilizador desejado e obtemos a chave
do gerador de palavras passes temporarias. Ao inserir a chave no do gerador de palavras passes temporárias. Ao inserir a chave no
\texttt{google authenticator} podemos obter um código QR, a nossa primeira \texttt{google authenticator} podemos obter um código QR, a nossa primeira
chave de 6 digitos. chave de 6 dígitos.
\begin{figure}[h] \begin{figure}[h]
\centering \centering
\includegraphics{google-authenticator} \includegraphics[width=8em]{google-authenticator}
\end{figure} \end{figure}
\begin{lstlisting}[language=bash] \begin{lstlisting}[language=bash]
@@ -151,8 +199,8 @@ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp0s8 -j MASQUERADE
\section{Configuração do Cliente (Road Warrior)} \section{Configuração do Cliente (Road Warrior)}
O cliente encontra-se na rede externa (\texttt{193.136.212.10}) e liga-se à VPN 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) gateway na porta 1194. Para garantir a segurança, utilizamos autenticação mútua (os certificados X.509)
e um \textit{two factor authentication} (2FA) como palavras-passe temporarias, geradas através do e um \textit{two factor authentication} (2FA) como palavras-passe temporárias, geradas através do
\textit{Google Authenticator}. \textit{Google Authenticator}.
\begin{lstlisting}[language=bash] \begin{lstlisting}[language=bash]
@@ -175,7 +223,6 @@ da autoridade de certificação.
\subsection{Revocation e OCSP} \subsection{Revocation e OCSP}
\begin{enumerate} \begin{enumerate}
\item Estabelecer a ligação VPN e verificar a conectividade à rede interna. \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: \item No diretório da autoridade de certificação (máquina \textit{host}), revogar o certificado do utilizador:
@@ -187,13 +234,15 @@ openssl ca -revoke user.crt -config cheese.cfg -keyfile ca.key -cert ca.crt
\end{enumerate} \end{enumerate}
\section{Conclusão} \section{Conclusão}
A implementação deste projeto permitiu consolidar conhecimentos sobre redes privadas virtuais e segurança em comunicações. % Conclusão!!!
A combinação de certificados digitais com autenticação de dois fatores (TOTP) garante uma robustez significativa contra Atingimos o objetivo deste trabalho, conseguimos configurar o VPN tunnel,
ataques de interceção e roubo de credenciais. o two-factor authentication e conseguimos criar e retirar acesso aos
certificados que emitimos. Utilizar mais maquinas para simular um cenario
maior seria redundante, teriamos que emitir mais certificados mas não iamos
aprender muito mais.
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. % Para aprofundar (???)
\end{document} \end{document}

View File

@@ -1,10 +1,11 @@
\babel@toc {portuguese}{}\relax \babel@toc {portuguese}{}\relax
\contentsline {section}{\numberline {1}Introdução}{2}{section.1}% \contentsline {section}{\numberline {1}Introdução}{2}{section.1}%
\contentsline {section}{\numberline {2}Criação de certificados}{2}{section.2}% \contentsline {section}{\numberline {2}Criação de certificados}{2}{section.2}%
\contentsline {section}{\numberline {3}Configuração da \textit {Gateway} VPN}{3}{section.3}% \contentsline {section}{\numberline {3}Configuração geral}{3}{section.3}%
\contentsline {subsection}{\numberline {3.1}Configurar TOTP}{3}{subsection.3.1}% \contentsline {section}{\numberline {4}Configuração da \textit {Gateway} VPN}{3}{section.4}%
\contentsline {subsection}{\numberline {3.2}Encaminhamento e Firewall}{3}{subsection.3.2}% \contentsline {subsection}{\numberline {4.1}Configurar TOTP}{3}{subsection.4.1}%
\contentsline {section}{\numberline {4}Configuração do Cliente (Road Warrior)}{3}{section.4}% \contentsline {subsection}{\numberline {4.2}Encaminhamento e Firewall}{4}{subsection.4.2}%
\contentsline {section}{\numberline {5}Servidor Apache e OCSP}{4}{section.5}% \contentsline {section}{\numberline {5}Configuração do Cliente (Road Warrior)}{4}{section.5}%
\contentsline {subsection}{\numberline {5.1}Revocation e OCSP}{4}{subsection.5.1}% \contentsline {section}{\numberline {6}Servidor Apache e OCSP}{5}{section.6}%
\contentsline {section}{\numberline {6}Conclusão}{5}{section.6}% \contentsline {subsection}{\numberline {6.1}Revocation e OCSP}{5}{subsection.6.1}%
\contentsline {section}{\numberline {7}Conclusão}{5}{section.7}%