CSI-ES-2324/Projs/PD2/README.md

100 lines
4.9 KiB
Markdown
Raw Normal View History

# Relatório do Projeto de Desenvolvimento 2
## Introdução
Neste segundo projeto de desenvolvimento (PD2), realizamos várias alterações em relação ao PD1, visando melhorar a estrutura e a segurança do sistema de mensagens seguro e autenticado. A principal mudança foi a introdução de uma API Gateway entre o cliente e o servidor, responsável pela autenticação dos utilizadores e pelo encaminhamento dos pedidos para o servidor. Este relatório detalha as modificações implementadas e os benefícios alcançados com essas mudanças.
Falar do gin
## Mudanças Implementadas
### Microsserviços
![Arquitetura](report_content/microservices-pd2.png)
#### Gateway
A principal alteração na arquitetura foi a introdução de uma API Gateway, que atua como intermediária entre o cliente e o servidor. A API Gateway é responsável pela autenticação dos utilizadores, criação de um canal seguro, e encaminhamento dos pedidos ao servidor.
##### Funções da Gateway
1. **Autenticação de Utilizadores**: A API Gateway lida com os processos de login e registo dos utilizadores, armazenando o ID do utilizador e uma hash da palavra-passe, e validando o certificado do utilizador.
1. **Encaminhamento de Pedidos**: A API Gateway recebe os pedidos dos clientes, verifica a autenticidade com tokens JWT, e encaminha-os para o servidor.
1. **Criação de Canal Seguro**: A comunicação entre o cliente e a API Gateway, assim como entre a API Gateway e o servidor, é protegida utilizando o protocolo TLS, garantindo a segurança dos dados transmitidos.
##### Endpoints da Gateway
Foram adicionados novos endpoints à API Gateway para lidar com a autenticação e as operações de mensagens:
1. **Autenticação e Registo**:
- `POST /register`: Permite que um novo utilizador se registe enviando a sua palavra-passe e certificado.
- `POST /login`: Permite que um utilizador existente faça login enviando o seu ID e palavra-passe. Se as credenciais forem válidas, um token JWT é gerado e enviado ao cliente.
1. **Operações de Mensagens**:
- `GET /message/:num`: Obtém uma mensagem específica para o utilizador autenticado.
- `GET /queue`: Obtém informações sobre mensagens não lidas.
- `GET /cert/:user`: Obtém o certificado de outro utilizador.
- `POST /message`: Envia uma mensagem para um destinatário.
### Servidor
O servidor foi ajustado para trabalhar em conjunto com a API Gateway.
Aceita conexões apenas provenientes da API Gateway, verificando isso através do certificado enviado pela gateway no início da conexão TLS.
O servidor confia plenamente na Gateway, enviando qualquer informação que seja pedida.
#### Endpoints do Servidor
Foram mantidos e ajustados os seguintes endpoints no servidor para corresponder às novas funcionalidades da API Gateway:
- `GET /message/:user/:num`: Devolve uma mensagem específica para um utilizador.
- `GET /queue/:user`: Devolve informações sobre mensagens não lidas de um utilizador.
- `GET /cert/:user`: Devolve o certificado de um utilizador.
- `POST /message/:user`: Armazena uma mensagem para um utilizador.
- `POST /cert/:user`: Armazena o certificado de um utilizador.
### Token de Autenticação JWT
Ao fazer login, a API Gateway gera um token JWT para o utilizador autenticado. Esse token é enviado ao cliente, que deve incluí-lo no campo "Token" do header de cada request subsequente.
### Base de Dados da API Gateway
A API Gateway utiliza uma base de dados SQLite3 para armazenar os utilizadores e as hashes das suas palavra-passes.
## Criptografia
O mecanismo de cifra das mensagens manteve-se, com a exceção de uma pequena alteração na assinatura do conteúdo. Decidimos colocar o id do recetor na assinatura digital, visando garantir que este tenha a certeza de que a mensagem é para ele.
![Digital Envelope](report_content/digital_envelope.jpeg)
## Execução
### Gateway
A gateway utiliza o valor da variável de ambiente "SECRET_KEY" para criar os tokens JWT.
Esta variável pode ser inicializada desta forma
```bash
SECRET_KEY=thisisasecretkey go run ./cmd/gateway/gateway.go
```
### Servidor
O servidor pode ser corrido da seguinte forma.
```bash
go run ./cmd/server/server.go
```
### Cliente
O cliente pode ser corrido da seguinte forma.
```bash
go run ./cmd/client/client.go -user ./certs/client2/client2.p12 COMANDO_AQUI
```
## Conclusão
As mudanças implementadas no PD2, com a introdução da API Gateway e as melhorias na segurança e na estrutura de autenticação, resultaram em um sistema de mensagens mais seguro e robusto. A API Gateway não apenas facilita a autenticação e a gestão de sessões com tokens JWT, mas também garante que as operações entre clientes e servidor sejam realizadas de forma segura e eficiente. Essas modificações reforçam a confidencialidade, integridade e autenticidade das comunicações no sistema, mantendo um alto padrão de segurança para as informações trocadas.