Nach der Realisierung eines Prototyps für einen Netzwerkcontroller im Projekt 5 soll nun die komplette Architektur des bestehenden NeSeM-Servers neu konzipiert und teilweise implementiert werden. Der Server muss zukünftig in möglichst vielen Netzwerk-Architekturen von IT Providern für die Sicherung ihrer Kunden-Infrastrukturen eingesetzt werden können. Dabei sind Performance, Multitenancy und High Availabiliy die hauptsächlichen Anforderungen an die Architektur.
Netzwerksicherheit, NeSeM, Hochverfügbarkeit, Multitenancy, Docker, Go, RabbitMQ, PostgreSQL, React
In der Vorgängerarbeit wurde eine Beispielanwendung zur Steuerung von Netzwerkelementen geschrieben. Mit dem Ergebnis können Switches von Cisco über eine eigens erstellte REST-API angesteuert werden.
Der zentrale Server im Network Security Management Projekt (kurz NeSeM) des IMVS ist zurzeit ein in Go implementierter Monolith, welcher aus den folgenden grundlegenden Komponenten besteht:
Security Controller Zentrale Steuereinheit, kann Aktionen aufgrund von Agent-Events
auslösen.
Network Controller Alte Steuereinheit für die Isolation von Netzwerkteilnehmer ohne 802.1X. Wird
vom Proof-of-Concept ersetzt.
RADIUS Proxy Steuereinheit für die Isolation von 802.1X Netzwerkteilnehmer.
Agent Endpoint Kommunikationseinheit für die gRPC Kommunikation zwischen Agents und dem Server.
Events werden von
den Agents an den Server und Regel-Updates vom Server an Agents geschickt.
Die monolithische Architektur von NeSeM wurde aufgebrochen und die einzelnen Komponenten zu Modulen
unterschiedlicher Grösse gegliedert. Das Backend Modul besteht aus Security Controller, Netzwerk
Controller und RADIUS Proxy. Während das Endpoint Modul einzig aus dem Agent Endpoint besteht. Das
Backend kommuniziert mit dem Endpoint über Message Queues. Wobei RabbitMQ eingesetzt wird. Die
umfangreiche Restrukturierung der Applikation beinhaltet auch die Einführung einer zusätzlichen
Abstraktionsschicht zwischen Applikationslogik und Datenbank. Als Datenbank wird PostgreSQL
eingesetzt.
Um Hochverfügbarkeit zu erreichen wurde sämtliche in-memory Zustände der Applikation in Message Queues
und Datenbank ausgelagert. Wo dies nicht möglich war wurde eine Synchronisation der Zustände eingebaut.
So kann sichergestellt werden, dass sämtliche gestarteten Nodes der Applikation sich immer in
konsistentem Zustand befinden.
Multitenancy wurde durch einen radikalen Umbau des bestehenden Datenmodells realisiert. Es wurde eine
zentrale Kunden Tabelle eingeführt. Zusätzlich wurde den übrigen Tabellen ‐ wo nötig ‐ ein
Fremdschlüssel für die Kundenbeziehung angefügt. So können alle notwendigen Entitäten mit einem Kunden
verknüpft werden.
Um mit der Applikation interagieren zu können wurde eine REST API implementiert. Auf Basis dieser
Schnittstelle wurde zusätzlich ein grafisches Benutzerinterface mit React gebaut. Durch dieses
Webinterface wurde das manuelle Testen der Applikation wesentlich vereinfacht.
Nebst der Beseitigung zahlreicher Code Smells und der Bereinigung der Codebase von totem Code wurden
Unit- und Integrationstests zur Überprüfung der Implementation eingeführt. Ausserdem wurde auf der FHNW
GitLab Plattform eine Pipeline für CI/CD konfiguriert. Zusätzlich wurde ein umfangreicher Testaufbau im
Netzwerklabor der FHNW eingerichtet, womit die Applikation ständig auch manuell umfangreich getestet
werden konnte.
Um mögliche Deployment Konstellationen zu eruieren wurde zusammen mit einem Partner aus der Industrie ein Meeting abgehalten. Dabei kristallisiert sich Docker als Lösung heraus. Somit wurde der Build-Prozess um das Bauen von Docker Container erweitert. Die frisch gebauten Container werden nach erfolgreichem Build auch gleich im Netzwerklabor zum Testen installiert.
Projektdauer: 17. September 2020 ‐ 26. März 2021
Aufwand: 720
Personenstunden
Teamgrösse: 2 Personen
Bachelor Thesis
Prof. Dr. Peter Gysel
Institut für Mobile und Verteilte Systeme FHNW
Stephan Wagner, stephan.wagner@students.fhnw.ch
Oliver
Fabel, oliver.fabel@students.fhnw.ch
Prof. Dr. Peter Gysel, peter.gysel@fhnw.ch
MAS
Dominik Link, dominik.link@fhnw.ch