This commit is contained in:
Vasco
2026-04-27 13:21:58 +01:00
parent 5bd7355e8b
commit ddb5ad81ac
11 changed files with 750 additions and 401 deletions

View File

@@ -4,7 +4,7 @@
source VM_CONFIG.sh source VM_CONFIG.sh
sudo yum install -y epel-release sudo yum install -y epel-release
sudo yum install -y openssl httpd mod_ssl mod_authnz_pam mod_authnz_pam google-authenticator sudo yum install -y openssl httpd mod_ssl mod_authnz_pam google-authenticator
sudo yum install -y mod_session sudo yum install -y mod_session
if_dentro="enp0s8" if_dentro="enp0s8"

View File

@@ -8,21 +8,21 @@ Listen 443 https
SSLCertificateKeyFile /etc/httpd/ssl/apache.key SSLCertificateKeyFile /etc/httpd/ssl/apache.key
SSLCACertificateFile /etc/httpd/ssl/ca.crt SSLCACertificateFile /etc/httpd/ssl/ca.crt
# Mutual Authentication (Client Cert) # mutual authentication
SSLVerifyClient require SSLVerifyClient require
SSLVerifyDepth 1 SSLVerifyDepth 1
# OCSP Validation against CA # ocsp validation
SSLOCSPEnable on SSLOCSPEnable on
SSLOCSPDefaultResponder "http://10.60.0.1:8888" SSLOCSPDefaultResponder "http://10.60.0.1:8888"
SSLOCSPOverrideResponder on SSLOCSPOverrideResponder on
SSLOCSPUseRequestNonce off SSLOCSPUseRequestNonce off
# Session management for Form Auth # session management
Session On Session On
SessionCookieName session path=/;HttpOnly;Secure SessionCookieName session path=/;HttpOnly;Secure
# Protected Area # proteger
<Location "/"> <Location "/">
AuthType Form AuthType Form
AuthName "Coimbra VPN" AuthName "Coimbra VPN"
@@ -32,26 +32,28 @@ Listen 443 https
Require valid-user Require valid-user
</Location> </Location>
# Public Login Page # public login page
<Location "/login.html"> <Location "/login.html">
AuthType None AuthType None
Require all granted Require all granted
</Location> </Location>
# Login Handler # login handler
<Location "/dologin"> <Location "/dologin">
SetHandler form-login-handler SetHandler form-login-handler
AuthType Form AuthType Form
AuthName "Coimbra VPN" AuthName "Coimbra VPN"
AuthFormProvider PAM AuthFormProvider PAM
AuthPAMService httpd-totp AuthPAMService httpd-totp
Require all granted
AuthFormLoginSuccessLocation "/index.html" AuthFormLoginSuccessLocation "/index.html"
AuthFormLoginRequiredLocation "/login.html?error=1" AuthFormLoginRequiredLocation "/login.html?error=1"
</Location> </Location>
# Logout Handler # logout handler
<Location "/logout"> <Location "/logout">
SetHandler form-logout-handler SetHandler form-logout-handler
AuthFormLogoutLocation "/login.html?loggedout=1" AuthFormLogoutLocation "/login.html?loggedout=1"
</Location> </Location>
</VirtualHost> </VirtualHost>

View File

@@ -6,19 +6,15 @@
\providecommand\HyField@AuxAddToFields[1]{} \providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{} \providecommand\HyField@AuxAddToCoFields[2]{}
\babel@aux{portuguese}{} \babel@aux{portuguese}{}
\def\@LN@column{1}
\@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}Preparação Inicial}{2}{section.2}\protected@file@percent }
\def\@LN@column{1} \@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Criação de Certificados}{2}{subsection.2.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3}Configuração geral}{3}{section.3}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3}Configuração geral}{3}{section.3}\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.1}Configurar TOTP}{3}{subsection.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Configurar TOTP}{3}{subsection.4.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Encaminhamento e Firewall}{4}{subsection.3.2}\protected@file@percent }
\def\@LN@column{1} \@writefile{toc}{\contentsline {section}{\numberline {4}Configuração do Cliente (Road Warrior)}{5}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Encaminhamento e Firewall}{4}{subsection.4.2}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {5}Servidor Apache e OCSP}{5}{section.5}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5}Configuração do Cliente (Road Warrior)}{4}{section.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Revocation e OCSP}{5}{subsection.5.1}\protected@file@percent }
\def\@LN@column{1} \@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Testes}{6}{subsection.5.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6}Servidor Apache e OCSP}{5}{section.6}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {6}Conclusão}{6}{section.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}Revocation e OCSP}{5}{subsection.6.1}\protected@file@percent } \gdef \@abspage@last{6}
\@writefile{toc}{\contentsline {section}{\numberline {7}Conclusão}{5}{section.7}\protected@file@percent }
\xdef \mintedoldcachechecksum{\detokenize{\minted@cachechecksum }}
\gdef \@abspage@last{5}

View File

@@ -0,0 +1 @@
openssl ca -revoke user.crt -config cheese.cfg -keyfile ca.key -cert ca.crt

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -1,27 +1,8 @@
\documentclass[11pt,a4paper]{article} \documentclass[11pt,a4paper]{article}
\usepackage[portuguese]{babel} \usepackage[portuguese]{babel}
\usepackage[lining]{ebgaramond} \usepackage[lining]{ebgaramond}
\usepackage{listings}
\usepackage{booktabs}
\usepackage{style} \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{\parindent}{0em}
\setlength{\parskip}{2ex} \setlength{\parskip}{2ex}
@@ -71,9 +52,11 @@ pois esta contém o \textit{certificate authority} CA.
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{Preparação Inicial}
Os certificados utilizados foram auto-certificados por uma autoridade central que "pertence" \subsection{Criação de Certificados}
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. à máquina de OpenSSL. Esta mesma faz a gestão da lista de revogação.
Todas as chaves foram criadas no mesmo computador, com as variáveis que estão Todas as chaves foram criadas no mesmo computador, com as variáveis que estão
@@ -85,7 +68,7 @@ com as chaves, requests e certificados necessários.
O código para gerar os certificados X.509: O código para gerar os certificados X.509:
\begin{lstlisting}[language=bash] \begin{codeblock}[bash]{create\_all\_keys.sh}
cert_ca="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=CoimbraVPN" 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_vpn="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=gateway"
cert_user="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=warrior" cert_user="/C=PT/ST=Coimbra/L=Coimbra/O=UC/CN=warrior"
@@ -104,19 +87,14 @@ openssl ca -batch -in "user.csr" -cert "ca.crt" -keyfile "ca.key" -out "user.crt
openssl genrsa -out apache.key 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 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 openssl ca -batch -in "apache.csr" -cert "ca.crt" -keyfile "ca.key" -out "apache.crt" -config cheese.cfg
\end{lstlisting}
% Porque é que precisamos de uma chave secreta?
% Criar chave secreta.
\begin{lstlisting}[language=bash]
openssl --genkey secret ta.key openssl --genkey secret ta.key
\end{lstlisting} \end{codeblock}
\section{Configuração geral} \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. 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. 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] \begin{codeblock}[bash]{VM\_CONFIG.sh}
yum install -y epel-release yum install -y epel-release
yum install -y openvpn iptables-services dhcp-client yum install -y openvpn iptables-services dhcp-client
systemctl stop firewalld systemctl stop firewalld
@@ -139,26 +117,26 @@ mkdir -p /etc/openvpn/client
systemctl stop chronyd systemctl stop chronyd
ntpdate pool.ntp.org ntpdate pool.ntp.org
systemctl start chronyd systemctl start chronyd
\end{lstlisting} \end{codeblock}
\subsection{Configurar TOTP} \subsection{Configurar TOTP}
Foi criado o ficheiro \texttt{totp} com a configuração de autenticação a Foi criado o ficheiro \texttt{totp} com a configuração de autenticação a
ser utilizada pelo plugin de PAM para o openvpn. ser utilizada pelo plugin de PAM para o openvpn.
\begin{lstlisting}[language=bash] \begin{codeblock}{/etc/pam.d/totp}
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so totp plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so totp
\end{lstlisting} \end{codeblock}
Adicionalmente, devido às restrições de segurança do \textit{systemd}, Adicionalmente, devido às restrições de segurança do \textit{systemd},
foi necessário desativar o \texttt{ProtectHome} no serviço do OpenVPN 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 para que o plugin PAM consiga ler os ficheiros de segredo do Google Authenticator
localizados nas diretorias \textit{home} dos utilizadores. localizados nas diretorias \textit{home} dos utilizadores.
\begin{lstlisting}[language=bash] \begin{codeblock}{override.conf}
[Service] [Service]
ProtectHome=false ProtectHome=false
\end{lstlisting} \end{codeblock}
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 temporárias. Ao inserir a chave no do gerador de palavras passes temporárias. Ao inserir a chave no
@@ -170,10 +148,10 @@ chave de 6 dígitos.
\includegraphics[width=8em]{google-authenticator} \includegraphics[width=8em]{google-authenticator}
\end{figure} \end{figure}
\begin{lstlisting}[language=bash] \begin{codeblock}[bash]{}
su john su john
google-authenticator google-authenticator
\end{lstlisting} \end{codeblock}
\subsection{Encaminhamento e Firewall} \subsection{Encaminhamento e Firewall}
@@ -188,7 +166,7 @@ de IP (NAT).
%e utilizar as regras apenas para encaminhar corretamente. %e utilizar as regras apenas para encaminhar corretamente.
% Colocar isso na conclusão tho % Colocar isso na conclusão tho
\begin{lstlisting}[language=bash] \begin{codeblock}[bash]{firewall.sh}
# Ativar encaminhamento # Ativar encaminhamento
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf sysctl -p /etc/sysctl.conf
@@ -198,7 +176,7 @@ 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 tun0 -o enp0s9 -j ACCEPT
iptables -I FORWARD 1 -i enp0s9 -o tun0 -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 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp0s8 -j MASQUERADE
\end{lstlisting} \end{codeblock}
\section{Configuração do Cliente (Road Warrior)} \section{Configuração do Cliente (Road Warrior)}
@@ -207,7 +185,7 @@ gateway na porta 1194. Para garantir a segurança, utilizamos autenticação mú
e um \textit{two factor authentication} (2FA) como palavras-passe temporárias, 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{codeblock}{client.conf}
client client
dev tun dev tun
proto udp proto udp
@@ -218,7 +196,7 @@ key user.key
auth-user-pass auth-user-pass
cipher AES-256-GCM cipher AES-256-GCM
auth SHA256 auth SHA256
\end{lstlisting} \end{codeblock}
\section{Servidor Apache e OCSP} \section{Servidor Apache e OCSP}
@@ -230,13 +208,17 @@ da autoridade de certificação.
\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:
\begin{lstlisting}[language=bash] \begin{codeblock}[bash]{revoke.sh}
openssl ca -revoke user.crt -config cheese.cfg -keyfile ca.key -cert ca.crt openssl ca -revoke user.crt -config cheese.cfg -keyfile ca.key -cert ca.crt
\end{lstlisting} \end{codeblock}
\item Atualizar o ficheiro \texttt{index.txt} no servidor OCSP e reiniciar o serviço para carregar o novo estado de revogação. \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. \item Tentar estabelecer uma nova ligação VPN e verificar que a autenticação falha devido à resposta \texttt{revoked} do responder OCSP.
\end{enumerate} \end{enumerate}
\subsection{Testes}
Podemos validar que o OCSP
\section{Conclusão} \section{Conclusão}

View File

@@ -1,11 +1,12 @@
\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}Preparação Inicial}{2}{section.2}%
\contentsline {subsection}{\numberline {2.1}Criação de Certificados}{2}{subsection.2.1}%
\contentsline {section}{\numberline {3}Configuração geral}{3}{section.3}% \contentsline {section}{\numberline {3}Configuração geral}{3}{section.3}%
\contentsline {section}{\numberline {4}Configuração da \textit {Gateway} VPN}{3}{section.4}% \contentsline {subsection}{\numberline {3.1}Configurar TOTP}{3}{subsection.3.1}%
\contentsline {subsection}{\numberline {4.1}Configurar TOTP}{3}{subsection.4.1}% \contentsline {subsection}{\numberline {3.2}Encaminhamento e Firewall}{4}{subsection.3.2}%
\contentsline {subsection}{\numberline {4.2}Encaminhamento e Firewall}{4}{subsection.4.2}% \contentsline {section}{\numberline {4}Configuração do Cliente (Road Warrior)}{5}{section.4}%
\contentsline {section}{\numberline {5}Configuração do Cliente (Road Warrior)}{4}{section.5}% \contentsline {section}{\numberline {5}Servidor Apache e OCSP}{5}{section.5}%
\contentsline {section}{\numberline {6}Servidor Apache e OCSP}{5}{section.6}% \contentsline {subsection}{\numberline {5.1}Revocation e OCSP}{5}{subsection.5.1}%
\contentsline {subsection}{\numberline {6.1}Revocation e OCSP}{5}{subsection.6.1}% \contentsline {subsection}{\numberline {5.2}Testes}{6}{subsection.5.2}%
\contentsline {section}{\numberline {7}Conclusão}{5}{section.7}% \contentsline {section}{\numberline {6}Conclusão}{6}{section.6}%

View File

@@ -17,7 +17,47 @@
\usepackage{pifont} \usepackage{pifont}
\usepackage{amssymb} \usepackage{amssymb}
\usepackage{minted} \usepackage[most]{tcolorbox}
\tcbuselibrary{listings, skins, breakable}
\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,
commentstyle=\color{gray},
keywordstyle=\color{MidnightBlue}\bfseries,
stringstyle=\color{ForestGreen}
}
\newtcblisting{codeblock}[2][]{
enhanced,
breakable,
colback=gray!2!white,
colframe=gray!20!black,
attach boxed title to top left={yshift*=-\tcboxedtitleheight/2, xshift=4mm},
boxed title style={
colback=gray!20!black,
outer arc=0pt,
arc=0pt,
top=1pt,
bottom=1pt,
},
fonttitle=\bfseries\ttfamily\footnotesize,
title={#2},
listing only,
listing options={
style=mystyle,
language=#1,
}
}
\setlength{\parskip}{1em}% \setlength{\parskip}{1em}%
\setlength{\parindent}{0em}% \setlength{\parindent}{0em}%

BIN
user2.p12

Binary file not shown.