Ontwerpen van een veilige architectuur voor verspreide systemen

Beveiliging van gedistribueerde systemen is een complexe uitdaging vanwege de diversiteit en schaal van de betrokken componenten. Met vele diensten die interactie voeren over potentieel onveilige netwerken, wordt de kans op niet-autoriseerde toegang en dataverlies significant vergroten. In dit artikel wordt een praktische aanpak besproken om gedistribueerde systemen te beveiligen met behulp van een opensourceproject. Het project laat zien hoe verschillende beveiligingsmechanismen en technologieën worden geïntegreerd om algemene beveiligings uitdagingen zoals autorisatie, autorisatie en veilige communicatie aan te pakken.

Beveiligingsuitdagingen in gedistribueerde systemen begrijpen

Gedistribueerde systemen omvatten meerdere diensten of microservices die veilig over een netwerk moeten communiceren. Key beveiligings uitdagingen in dergelijke architecturen omvatten:

  1. Veilige communicatie: Zorgen dat gegevens tussen diensten geëncrypteerd zijn en veilig zijn tegen afgeluisterd of veranderd worden
  2. Autorisatie: Verifiëren van de identiteiten van gebruikers en diensten om geen niet-autoriseerde toegang te voorkomen
  3. Autorisering: Beheersen wat geautoriseerde gebruikers en diensten zijn toegestaan te doen, gebaseerd op hun rollen en toestemmingen
  4. Beleid naleving: Implementeren van fijne-grootte toegangsbesturing en beleid dat de interacties tussen dienst-en gebruikersregels beheert.
  5. Certificatenbeheer: Beheer van digitale certificaten voor het versleutelen van data en het opbouwen van vertrouwen tussen diensten

Dit open-source project gaat deze uitdagingen aan door middel van verschillende geïntegreerde technologieën en oplossingen.

Projectinstellingen en configuratie

Het project begint met het opzetten van een veilige omgeving met behulp van shellscripts en Docker. De opzet omvat het voorzien van digitale certificaten en het starten van de nodige services om ervoor te zorgen dat alle componenten klaar zijn voor veilige communicatie.

Stappen om de omgeving in te stellen

1. Certificaten voorzien

Het project gebruikt een shellscript (provisioning.sh) om een Certificate Authority (CA) te simuleren en de nodige certificaten voor de services te genereren.

   ./provisioning.sh

2. Services starten

Docker Compose wordt gebruikt om alle in het project gedefinieerde services te starten, om ervoor te zorgen dat ze correct zijn geconfigureerd voor veilige operationeel zijn.

   docker-compose up

3. Testen van service-tot-service communicatie

Om service-tot-service communicatie te valideren met behulp van certificaten en JWT tokens, wordt het script test_services.sh aangeboden. Dit script laat zien hoe verschillende services veilig met elkaar interacteren door middel van hun toegewezen certificaten.

Oplossen van Veiligheidspunten in Gedistribueerde Systemen

Het project integreert verschillende belangrijke technologieën om de eerder genoemde primaire veiligheidspunten aan te pakken. Hieronder wordt beschreven hoe elk probleem wordt opgelost:

1. Veilige Communicatie Met Mutuele TLS (mTLS)

Challenge

In een gedistribueerd systeem moeten services veilig communiceren om geautoriseerde toegang en dataverliezen te voorkomen.

Solution

Het project gebruikt Mutuele TLS (mTLS) om de communicatie tussen services veilig te maken. mTLS zorgt ervoor dat zowel de cliënt als de server elkaar authenticeren door middel van hun respectievelijke certificaten. Deze gezamenlijke authenticatie voorkomt dat niet geautoriseerde services met legitieme services communiceren.

Implementatie

Nginx is ingesteld als een omgekeerd proxy om mTLS af te handelen. Het vereist zowel client- als servercertificaten voor het opzetten van een veilige verbinding, waardoor de gegevens die tussen services worden overgezet, geheim en onherstelbaar blijven.

2. Authenticatie Met Keycloak

Challenge

Het correcte autoriseren van gebruikers en services is crucial om ongeautoriseerde toegang te voorkomen.

Oplossing

Het project gebruikt Keycloak, een open-source identiteits- en toegangsbeheeroplossing, om authenticatie te beheren. Keycloak ondersteunt verschillende authenticatormethodes, inclusief OpenID Connect en clientrechten, waardoor het geschikt is voor zowel gebruikers- als serviceauthenticatie.

  • Gebruikersauthenticatie:
    Gebruikers worden geauthenticëeerd met behulp van OpenID Connect. Keycloak is geconfigureerd met een client (`appTest-login-client`) die de authenticatiefasen voor gebruikers behandelt, inclusief aanmelden, tokenuitgifte en callabackbehandeling.
  • Serviceauthenticatie:
    Voor service-tot-serviceauthenticatie gebruikt het project een Keycloakclient (`client_credentials-test`) die is geconfigureerd voor het clientrechtentype. Deze methode is ideaal voor het authenticëeren van services zonder gebruikersinterventie.

Authenticatiefasevoorbeeld

  1. Gebruikers gaan naar de aanmeldingspagina.
  2. Na een succesvol inloggen wordt de gebruiker door Keycloak naar een callback-pagina met een autorisatiecode verwezen.
  3. De autorisatiecode wordt vervolgens uitgewisseld voor een JWT-token, dat wordt gebruikt voor volgende aanvragen. Het bestand authn.js in de nginx/njs map biedt een gedetailleerde implementatie van deze flow.

Voorbeeld van dienstauthenticatie met clientgegevens

curl -X POST "http://localhost:9000/realms/tenantA/protocol/openid-connect/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "grant_type=client_credentials" \
     -d "client_id=client_credentials-test" \
     -d "client_secret=your-client-secret-here"

3. Gebruikersautorisatie met Open Policy Agent (OPA) en JWT

Challenge

Toepassen van fijnere toegangsbeheersing om te zorgen dat geauthenticeerde gebruikers en services alleen toegang hebben tot geautoriseerde resources

Oplossing

Het project gebruikt een combinatie van Open Policy Agent (OPA) en JWT tokens om autorisatiepolicies te handhaven. Het project toont drie verschillende strategieën voor JWT-validatie om de robuste beveiliging te waarborgen:

  1. Certificaten ophalen van Keycloak: Haalt certificaten dynamisch van Keycloak af om het token te valideren.
  2. Gebruik van x5t (Vingerafdruk): Gebruikt de ingebedde vingerafdruk van het token om de publieke sleutel van een lokale vertrouwenswinkel te verkrijgen.
  3. Ingebedde certificaatvalidatie: Valideert het token met behulp van een ingebedd certificaat, waardoor het certificaat wordt geverifieerd tegen een vertrouwde Certificate Authority (CA).

Bekijk het bestand nginx/njs/token.js voor de gedetailleerde implementatie van deze strategieën.

4. Toepassing van beleidsregels met Open Policy Agent (OPA)

Challenge

Implementeren van dynamische en flexibele toegangsbeheersingspolitieken voor zowel services als gebruikers

Oplossing

OPA wordt gebruikt om fijne beleidsregels voor toegangsbeheer te handhaven. Beleidsregels zijn geschreven in een declaratieve taal (Rego) en opgeslagen in de map opa/. Deze regels bepalen de condities waaronder services kunnen communiceren en gebruikers toegang krijgen tot resources, waardoor toegangsbeheersing consistent wordt toegepast over het systeem.

5. Certificaatbeheer

Challenge

Beheren van digitale certificaten voor services om vertrouwen te stellen en communicatie veilig te maken.

Oplossing:
Het project omvat een robuust certificaatbeheersingsysteem. Een shellscript (provisioning.sh) wordt gebruikt om een Certificate Authority (CA) te simuleren en certificaten voor elk dienst te genereren. Deze aanpak simplificeert het beheer van certificaten en zorgt ervoor dat alle diensten de nodige verificatieschermen hebben voor veilige communicatie.

We hebben ook een endpoint toegevoegd om het dienstcertificaat bij te werken zonder nood aan een herstart van nginx.

curl --insecure  https://localhost/certs  --cert certificates/gen/serviceA/client.crt --key certificates/gen/serviceA/client.key -F cert=@certificates/gen/serviceA/client.crt -F key=@certificates/gen/serviceA/client.key

Conclusie

Het bouwen van een veilige distribueerd systeem vereist een voorzichtige consideratie van diverse veiligheidsaspecten, inclusief veilige communicatie, authenticatie, autorisatie, beleidsexecutie en certificaatbeheer. dit open-sourceproject biedt een uitgebreid voorbeeld van hoe verschillende veiligheidsmechanismen te integreren om deze uitdagingen effectief aan te spreken.

door de set-up en configuraties die in dit project getoond zijn, kunnen ontwikkelaars mutual TLS, Keycloak, Open Policy Agent en Nginx gebruiken om een robuuste veiligheidarchitectuur op te bouwen. Deze technologieën, wanneer gecombineerd, bieden een sterke basis voor het beveiligen van distribueerde systemen tegen een breed scala aan gevaren, waardoor zowel data bescherming als veilige toegangsbeheer worden gegarandeerd.

Source:
https://dzone.com/articles/designing-a-secure-architecture-for-distributed-systems