White paper

SOFiE umožňuje bezpečně sdílet soubory (“zásilky”) se zákazníky a dodavateli. Pomocí interních a externích detekčních nástrojů dokáže zablokovat nebezpečný nebo nepovolený obsah.

Architektura aplikace

Funkce aplikace zajišťuje několik spolupracujících komponent. Jde jak o komponenty interní (námi napsané) tak o komponenty externí (napsané třetími stranami).

Interními komponentami jsou:

  • webový server umožňující uživatelům nahrávat a stahovat soubory a administrátorům spravovat aplikaci a její nastavení

  • “worker” proces zajišťující spouštění detekčních nástrojů, odesílání e-mailů a dalších úloh na pozadí

  • “scheduler” proces spouštějící pravidelné úlohy (kontrolu časových limitů, platnosti zásilek apod.)

Interní komponenty jsou napsané v jazyce Java.

Externími komponentami jsou:

  • open-source HTTP server nginx fungující jako reverzní proxy pro webový server

  • externí detekční nástroje jako např. ClamAV, Eset, Kaspersky, FortiSandbox a další (nejsou součástí standardní dodávky aplikace)

  • PostgreSQL databáze pro ukládání dat

  • Apache Kafka server sloužící jako message broker (fronta zpráv)

Aplikace je optimalizována pro operační systémy CentOS/RHEL verze 7 nebo 8. Výchozí instalace je dostupná jen pro tyto systémy.

Webový server

Ve výchozí instalaci poslouchá na loopback rozhraní na TCP portu 9090, ze sítě je dostupný skrze nginx server. Neposkytuje přímo zabezpečenou HTTPS komunikaci, to je odpovědností nginx serveru.

Front-end webové aplikace je napsán v jazyce TypeScript s využitím knihovny React. Komunikaci s back-endovou částí aplikace probíhá pomocí HTTPS. Autentizace uživatelů je řešena JWT tokenem vytvořeným po přihlášení uloženým v HTTP cookie.

Bezpečnost aplikace je pravidelně kontrolována podle doporučení projektu OWASP Top Ten (https://owasp.org/www-project-top-ten/).

“Worker” proces

Jde o samostatně běžící proces který neposlouchá na žádném portu. Má na starosti spouštění déletrvajících úloh na pozadí jako je např. spouštění detekčních nástrojů, odesílání e-mailů, pravidelné úlohy údržby apod. Práci kterou má proces vykonávat získává z Apache Kafka serveru do kterého mu úkoly zadávají webový server a “scheduler” proces.

“Scheduler” proces

Jde o samostatně běžící proces který neposlouchá na žádném portu. Proces spouští pravidelné úlohy potřebné pro správnou funkci aplikace (kontrola časových limitů, platnosti zásilek apod.) - úlohy běží v rámci “worker” procesu, “scheduler” mu je předává skrze Apache Kafka server.

Nginx server

Nginx funguje jako reverzní proxy pro webový server. Umožňuje TLS (HTTPS) offloading, ve výchozí instalaci s pomocí certifikační autority Let’s Encrypt. Dále poskytuje offloading při stahování souborů - soubory posílá klientům namísto webového serveru přímo nginx, autorizace požadavků probíhá pomocí interního požadavku HEAD na webový server (viz. http://nginx.org/en/docs/http/ngx_http_auth_request_module.html). V rámci autorizačního požadavku předá nginx server webovému serveru veškeré dostupné informace a ověření tak může probíhat stejně jako u ostatních webových požadavků (tj. pomocí JWT tokenu v HTTP cookie).

Ukázka nasazení

Požadavky na firewall

Webový server potřebuje z internetu dostupný:

  • příchozí TCP port 443 pro webové rozhraní uživatelů a administrátorů

  • příchozí TCP port 80 pokud je ve výchozí instalaci použita certifikační autorita Let’s Encrypt

“Worker” proces potřebuje:

  • odchozí TCP port pro SMTP server (podle aktuální konfigurace aplikace)

  • odchozí UDP/TCP porty pro potřeby externích detekčních nástrojů (např. pro aktualizaci virových databází apod.)

  • odchozí TCP port 443 na server https://license.sonpo.io/ pro možnost kontroly platnosti licence

Ukládání a bezpečnost dat

Data jsou ukládána do adresářové cesty podle nastavení aplikace (výchozí adresář je /var/sofie/data). Využití vzdálených úložišť je možné v rámci příslušné konfigurace serveru (připojený iSCSI svazek, NFS svazek apod.).

Přenos dat mezi webovým prohlížečem a serverem je chráněn pomocí HTTPS.

Aplikace v současné době nepodporuje end-to-end šifrování a ve striktní podobě, ve které by server nikdy neviděl data, ho ani podporovat nemůže - server potřebuje vidět obsah zásilky, aby ho mohl zkontrolovat pomocí detekčních nástrojů. Šifrování při ukládání dat (“encryption at rest”) není v současné době podporováno. Částečně je to možné vyřešit použitím šifrovaného svazku na úrovni operačního systému. Do budoucí verze bude implementována funkce, kdy bude možné uložit data zásilky šifrovaně po proběhlé kontrole obsahu - nešifrovaná data tak budou na serveru dostupná jen po omezenou dobu probíhajících kontrol obsahu.

Škálovatelnost a vysoká dostupnost

Při velmi vysokých požadavcích na výkon je možné horizontálně (navýšením počtu serverů) škálovat webový server, “worker” proces, nginx server a Apache Kafka server. Ostatní komponenty je možné škálovat jen vertikálně (navýšením výkonu serveru).

Vertikální škálování je oproti horizontálnímu jednoduší pro údržbu a je proto doporučeno.

Vysokou dostupnost je nutné řešit individuálně podle podmínek konkrétního nasazení aplikace.