CSI-ES-2324/Projs/PD2
afonso 9951c4b9da
[PD2] Relatorio final
Co-authored-by: tsousa111 <tiagao2001@hotmail.com>
2024-05-31 23:57:09 +01:00
..
certs [PD2] Client done except jwt token, login and register functions 2024-05-30 21:02:28 +01:00
cmd [PD2] Made cert checks in cryptoutils 2024-05-30 15:48:28 +01:00
internal [PD2] Relatorio final 2024-05-31 23:57:09 +01:00
report_content [PD2] Relatorio final 2024-05-31 23:57:09 +01:00
token [PD2] Relatorio final 2024-05-31 23:57:09 +01:00
.gitignore Initial commit 2024-02-19 10:37:29 +00:00
gateway.db [PD2] Relatorio inicio 2024-05-31 23:14:14 +01:00
go.mod [PD2] Made cert checks in cryptoutils 2024-05-30 15:48:28 +01:00
go.sum [PD2] Gateway login, logout and auth middleware done. 2024-05-30 00:55:59 +01:00
README.md [PD2] Relatorio final 2024-05-31 23:57:09 +01:00
server.db [PD2] Relatorio inicio 2024-05-31 23:14:14 +01:00
tokefile.toml [PD2] Server done? 2024-05-28 20:13:33 +01:00

Relatório do Projeto de Desenvolvimento 2

Introdução

Após o sucesso do projeto inicial de partilha de mensagens, a empresa decidiu ampliar o sistema para atender a todas as empresas do grupo, melhorando a robustez e a segurança da aplicação. Este novo desenvolvimento, denominado PD2, concentra-se na criação de uma arquitetura mais segura e eficiente, integrando uma API Gateway para reforçar a autenticação e a segurança das comunicações.

A API Gateway introduzida desempenha um papel crucial ao atuar como intermediária entre clientes e servidores, gerindo a autenticação, encaminhamento de pedidos e garantindo canais de comunicação seguros através de TLS. Este componente centraliza a autenticação dos utilizadores, a gestão dos tokens JWT e a proteção das trocas de mensagens, garantindo a integridade e confidencialidade dos dados.

Optámos por utilizar a framework Gin para o desenvolvimento da REST API devido à nossa experiência prévia com esta tecnologia, o que facilitou a sua adoção e implementação. Gin é uma framework web em Go reconhecida pela sua alta performance e simplicidade, permitindo lidar eficientemente com um grande número de pedidos simultaneos. Oferece funcionalidades essenciais como routing flexível, middleware para gestão de autenticação e autorização, e uma documentação robusta.

Microsserviços

Arquitetura

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.

  2. Encaminhamento de Pedidos: A API Gateway recebe os pedidos dos clientes, verifica a autenticidade com tokens JWT, e encaminha-os para o servidor.

  3. 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.
  2. 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.

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.

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 mesma 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.

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 é dirigida a si.

Digital Envelope

Execução

Gateway

A gateway utiliza o valor da variável de ambiente "SECRET_KEY" para criar e validar os tokens JWT. Esta variável pode ser inicializada desta forma

> SECRET_KEY=thisisasecretkey go run ./cmd/gateway/gateway.go

Servidor

O servidor pode ser corrido da seguinte forma.

> go run ./cmd/server/server.go

Cliente

O cliente pode ser corrido da seguinte forma.

> go run ./cmd/client/client.go help
Comandos da aplicação cliente:
-user <FNAME>: Especifica o ficheiro com dados do utilizador. Por omissão, será assumido que esse ficheiro é userdata.p12.
send <UID> <SUBJECT>: Envia uma mensagem com assunto <SUBJECT> destinada ao utilizador com identificador <UID>. O conteúdo da mensagem será lido do stdin, e o tamanho deve ser limitado a 1000 bytes.
askqueue: Solicita ao servidor que lhe envie a lista de mensagens não lidas da queue do utilizador.
getmsg <NUM>: Solicita ao servidor o envio da mensagem da sua queue com número <NUM>.
register: Solicita ao servidor o registo do utilizador.
login: Solicita ao servidor o login do utilizador.
logout: Elimina o token de acesso do utilizador.
help: Imprime instruções de uso do programa.

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.