{"id":18985623,"url":"https://github.com/gematik/ref-epa-av-gate","last_synced_at":"2025-10-19T19:32:31.290Z","repository":{"id":45224795,"uuid":"449766421","full_name":"gematik/ref-ePA-AV-Gate","owner":"gematik","description":"Reference implementation of an Anti-Virus solution with proxy between primary system and Konnektor","archived":false,"fork":false,"pushed_at":"2024-11-27T14:30:16.000Z","size":2229,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-01-01T12:44:26.389Z","etag":null,"topics":["epa","reference-implementation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gematik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-19T16:19:58.000Z","updated_at":"2024-11-27T14:30:15.000Z","dependencies_parsed_at":"2024-11-08T16:34:30.202Z","dependency_job_id":"acb9aea8-f069-4fe5-a515-33b4fdf4c691","html_url":"https://github.com/gematik/ref-ePA-AV-Gate","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Fref-ePA-AV-Gate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Fref-ePA-AV-Gate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Fref-ePA-AV-Gate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gematik%2Fref-ePA-AV-Gate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gematik","download_url":"https://codeload.github.com/gematik/ref-ePA-AV-Gate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239994005,"owners_count":19730780,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["epa","reference-implementation"],"created_at":"2024-11-08T16:27:27.024Z","updated_at":"2025-10-19T19:32:31.172Z","avatar_url":"https://github.com/gematik.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg align=\"right\" width=\"200\" height=\"37\" src=\"images/Gematik_Logo_Flag_With_Background.png\"/\u003e \u003cbr/\u003e\n  \n# Electronic Health Record System (Anti-Virus-Gate)\n\n\n---\n\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\u003ca href=\"#Dokumentation\"\u003eDokumentation \u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#release-notes\"\u003eRelease Notes\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributions\"\u003eContributions\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contact\"\u003eContact\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e   \n\n\n## Dokumentation\n\n## Wichtiger Hinweis\n\u003e Die hier dargestellte Antivirus-Lösung basiert auf der elektronischen Patientenakte der Version 2 (bis einschließlich ePA Version 2.6). \nFür die ePA der Version 3 (\"ePA für alle\" bzw. \"ePA Opt-Out\") ist sie nicht anwendbar.\n\n___\n\n\n## AV-Gate\n\nProxy für den Antivirus-Scan von Dokumenten zu der elektronischen Patientenakte (ePa). Dieser Proxy wird zwischen dem Konnektor der Gematik und den Primärsystemen geschaltet und überprüft sämtliche Dokumente der ePA vor der Übertragung an die Primärsysteme. \n\nBei einem Fund von Malware wird das Dokument aus der Übertragung herausgenommen. Stattdessen wird eine Fehlermeldung für das entsprechende Dokument an das Primärsystem übergeben. Veränderungen an dem Repository der ePA selbst werden nicht vorgenommen.\n\nAlternativ kann das Dokument bei Fund von Maleware durch eine Datei gleichen Types (Mime-Type) ersetzt werden. In diesem Fall wird der Payload des Soap-Responses nicht verändert. Dies ist notwendig, wenn das Primärsystem die Fehlermeldungen nicht verarbeiten kann. Die Ersatz-Dokumente liegen in dem Unterverzeichnis `replacements` und enthalten jeweils den Hinweis:\n\n\u003e Das Dokument wurde ersetzt, weil beim originären Dokument potentiell schadhafter Code entdeckt wurde.  \nDas Original wird nicht ausgeliefert. \n\nFür den AV-Scan wird die open-source Lösung [ClamAV](https://www.clamav.net/) genutzt. Es erkennt schadhaften Code auch in Anhängen zu PDF, Excel und Word und OpenOffice Dokumenten. Testdateien mit der harmlosen [EICAR](https://www.eicar.org/?page_id=3950) Test-Signatur befinden sich für alle Mime-Typen im Verzeichnis `testfiles`. Nachdem Virenscanner regelmäßig auch bei den EICAR Testfiles aufschreien, wurden die Testfiles und Samples in einem zip-File abgelegt (password ist password).\n\nAlternative AV-Scanner können nicht verwendet werden, da keine andere der bekannten Lösungen über eine programatische Schnittstelle für den Scan verfügt.\n\nMacros in Excel und Word-Dokumenten sind für die zugelassenen Dateitypen (.xlsx .docx) nicht möglich bzw. enthalten. (Die Entsprechenden Dateitypen für Dokumente mit Macro  lauten .xlsm und .docm)\n\n## Architektur und Funktionsweise\n\n![architektur](docs/architektur.png)\n\nDas AV-Gate fungiert als Proxy zwischen Primärsystem und Konnektor. Die Verbindungen zwischen Primärsystem und NGINX sowie zwischen AV-Gate und Konnektor sind TLS gesichert. Die Requests an den Konnektor sind technisch komplett getrennt von den Requests an das AV-Gate (bzw. dem NGINX).\n\nDie Autorisierung für den Konnektor wird bei Basic-Auth aus dem ursprünglichen Request übernommen. Client-Zertifikate müssen je Konnektor für das AV-Gate gesondert konfiguriert werden; eine Übername aus dem Request ist hier nicht möglich.\n\nDie Verbindung zum ClamAV Dienst erfolgt über unix Socket. Daher muss der clamd auf der gleichen Maschine installiert sein.\n\n![sequence](docs/sequence.png)\n\nDie Trennung zwischen NGINX und AV-Gate wurde aus Gründen der Übersichtlichkeit weggelassen.\n\n1: Request der connector.sds  \nDie connector.sds ist ein Verzeichnis der Service-Adressen.\n\n2: Request an den Konnektor  \nHier wird ein neuer Request erzeugt (kein Forward oder Proxy). Der Request aus 1 wird gehalten.\n\n4: Die Adresse für PHRService, welche den Endpunkt RetrieveDocumentSet enthält wird durch die Adresse des AV-Gates ersetzt. Diese wird aus dem Request an das AV-Gate ermittelt.\n\n7: Response vom Konnektor\nDer Response beinhaltet neben SOAP-Response auch die Dokumente als [XOP](https://de.wikipedia.org/wiki/XML-binary_Optimized_Packaging).\n\nResponses zu anderen Endpunkten als RetrieveDocumentSet werden direkt an das Primärsystem weitergegeben.\n\n8: AV-Scan\nDie aus dem Response extrahierten Dokumente werden via socket stream an den clamd übergeben. Die Dateien werden nicht im Filesystem gespeichert. Die Latenz durch den Scan ist sehr gering (\u003c100ms).\n\n9: Remove Document  \nDer XOP Teil der Nachricht für die betroffenen Dokumente wird entfernt und eine Fehlermeldung wird in den SOAP-Response geschrieben.\nAlternativ wird hier das Dokument ersetzt und der SOAP-Response ansonst nicht verändert.\n\nDer Ersatz der schadhaften Dokumente erfolgt mit den jeweiligen Dateien aus dem Verzeichnis `replacements'. Es sind für folgende Dateitypen/Mime-Typen Dokumente vorhanden:\n- application/pdf\n- image/jpeg\n- image/png\n- image/tiff\n- text/plain\n- text/rtf\n- application/xml\n- application/hl7-v3\n- application/pkcs7-mime\n- application/fhir+xml\n\n### Office Dokumente\n- application/vnd.openxmlformats-officedocument.wordprocessingml.document (.docx)\n- application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (.xlsx)\n- application/vnd.oasis.opendocument.text (.odt)\n- application/vnd.oasis.opendocument.spreadsheet (.ods)\n\nDie Office-Dokumente sind in der aktuellen Version von ePA nicht mehr zugelassen, dennoch werden diese hier noch berücksichtigt, weil bestehende Dokumente unverändert ausgeliefert werden.\n\n## ClamAV\n\nDer Virenscanner läuft als Daemon. Die Aktualisierung der Viren-Signaturen erfolgt über einen eigenen Dienst. \n\n- [Installation](https://docs.clamav.net/manual/Installing.html)\n- [SignatureManagement](https://docs.clamav.net/manual/Usage/SignatureManagement.html)\n\n## Installation\n\nEs werden benötigt:\n- Python 3.8 \n- uWSGI 1.19 \n- NGINX 1.18.0\n- ClamAV 0.105\n\nBislang wurde als Host-System Ubuntu Server 20.04.3 LTS verwendet. Die oben genanten Versionen entsprechen dieser Konfiguration. \n\n1. ClamAV   \n/etc/clamav/clamd.conf  \n`LocalSocket /tmp/clamd.socket`\n\n2. Signaturen laden  \n/etc/clamav/freshclam.conf   \n`sh\u003e freshclam`\n\n1. NGINX   \nEine vollständig Beispielkonfiguration `nginx.conf` liegt bei. Ports, SSL-Zertifikate und ggf. Socket müssen angepasst werden. Angaben der Ports als Range sind seit NGINX 1.15.10 möglich.\n\n1. uWSGI   \nBeispieldatei `uwsgi.ini` liegt bei. Socket und chdir müssen angepasst werden. Virtualenv kann weggelassen werden, wenn auf dem Server keine weiteren, anderen Python-Versionen benötigt werden.\n\n5. AV-Gate  \nDateien av_gate.py, av_gate.ini, requirements.txt in ein Programmverzeichnis kopieren (z.B. /usr/local/av_gate/). \n`sh\u003e pip3 install -r requirements.txt` - oder mit `pip`, wenn pip3 nicht verfügbar.  \nDer Pfad für den Socket in `av_gate.ini` ist ggf anzupassen.\n\n## Konfiguration\n\nIn der `av_gate.ini` ist für jeden Konnektor eine Gruppe anzulegen. Der Gruppenname beschreibt das Routing über IP-Adresse mit Port `[\u003cip-address\u003e:\u003cport]` - oder aber ausschließlich über den Port `[*:\u003cport\u003e]`. Gruppen mit IP-Adresse werden vor den Gruppen ohne IP-Adressen berücksichtigt.\n\n\u003e Auf die Verwendung von Namen statt IP-Adressen wurde verzichtet, weil ein Großteil der Primärsysteme keine Namen in der Konfiguration verwenden kann.\n\nFür jede Konnektor (jede Gruppe) kann konfiguriert werden:\n- konnektor = https://\u003chost\u003e\u003cport\u003e\n- ssl_verify = true  \nDie Zertifikate des Konnektors werden auf Gültigkeit überprüft. Verbindungen mit ungültigen (auch selfsigned) Zertifikaten werden abgelehnt.\n- ssl_cert = \u003cpfad.crt\u003e  \n- ssl_key = \u003cpfad.key\u003e  \nClient-Zertifikat für Autorisierung gegenüber Konnektor. Die Zertifikate können als als .crt oder .pem hinterlegt werden und dürfen nicht verschlüsselt sein.\n\nAuf jeden Arbeitsplatzrechner muss in der Konfiguration der Primärsysteme die IP-Adresse des AV-Gates als Konnektor eingetragen werden.\n\n\u003e **Warnung:** Wird auf einem Arbeitsplatzrechner der Konnektor nicht angepasst, erfolgt kein AV-Scan der Dokumente! Das Primärsystem wird aber dennoch wie bisher auch funktionieren - dies lässt sich technisch auch nicht verhindern.\n\nDas Logging des AV-Gates erfolgt über uWSGI.\n## Docker\n\nDas Dockerfile ist vollständig lauffähig und soll die Installation veranschaulichen. Es es nicht empfehlenswert, das Docker-Image für den produktiven Einsatz zu verwenden, da es aufgrund fehlender Threads sehr ineffizient ist. Die Logs wurden nicht für Docker optimiert.\n\n## Primärsysteme\nDas AV-Gate wurde für folgende Primärsysteme getestet:\n\n| Primärsystem | Version | Status | Anmerkung |\n|---|---|---|---|\n| Dedalus - Orbis | | voll funktionsfähig | `proxy_all_services` muss gesetzt sein |\n| medatixx - x.concept | | voll funktionsfähig |  |\n| KIS - iMedOne | | voll funktionsfähig | `proxy_all_services` muss gesetzt sein |\n\n\n---\n\n---\n## Release Notes\nSee [ReleaseNotes.md](./ReleaseNotes.md) for all information regarding the releases.\n\n\n## License\n \nCopyright 2024 gematik GmbH\n \nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License.\n \nSee the [LICENSE](./LICENSE) for the specific language governing permissions and limitations under the License.\n \nUnless required by applicable law the software is provided \"as is\" without warranty of any kind, either express or implied, including, but not limited to, the warranties of fitness for a particular purpose, merchantability, and/or non-infringement. The authors or copyright holders shall not be liable in any manner whatsoever for any damages or other claims arising from, out of or in connection with the software or the use or other dealings with the software, whether in an action of contract, tort, or otherwise.\n \nThe software is the result of research and development activities, therefore not necessarily quality assured and without the character of a liable product. For this reason, gematik does not provide any support or other user assistance (unless otherwise stated in individual cases and without justification of a legal obligation). Furthermore, there is no claim to further development and adaptation of the results to a more current state of the art.\n \ngematik may remove published results temporarily or permanently from the place of publication at any time without prior notice or justification.\n\n\n## Contributions\n\nThis repository is for information. Updates, fixes and improvements are not handled via GitHub contributions.\nTherefor submission of issues or pull requests is not recommended. Please contact us via gematik website (see \u003ca href=\"#contact\"\u003eContact\u003c/a\u003e below) \n\n## Contact\n\nPlease use the contact sheet https://fachportal.gematik.de/kontaktformular and choose \"elektronische Patientenakte (ePA)\" as request category in drop-down list \"Thema der Anfrage/Kategorien\".\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgematik%2Fref-epa-av-gate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgematik%2Fref-epa-av-gate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgematik%2Fref-epa-av-gate/lists"}