Virenscan in enaio® coLab einbinden

enaio® coLab 11.10 »

In enaio® coLab kann per Webhook ein Virenscanner eingebunden werden, der Dokumente, die Benutzer in coLab-Projekträume hochladen bzw. ersetzen wollen, prüft (siehe enaio® coLabLink extern - Symbol). Dieser erweitert diese Funktionen durch HTTP-Aufrufe. Das Objket des HTTP-Aufrufs besteht in diesem Fall aus der in enaio® coLab hochgeladenen Dokumentdatei und der Webhook-ID.

Je nach Art der Implementierung sind zwei Arten von Aufrufen möglich: blockierend und nicht blockierend. Entwickler können die Implementierungsart entsprechend ihren Anforderungen wählen. Beispielsweise kann für kleine Dateien und schnelle Dienste eine blockierende Implementierung besser geeignet sein als eine nicht blockierende. Dies kann auch vom Typ der Antivirensoftware und der Geschwindigkeit des Servers abhängen, auf dem die Software installiert ist.

  • Beispiel für das Blockieren von Anrufen – mehrteilige Anfrage – Antwortstatus 200

    POST http://<antivirus_service_IP:8067upload/{id} HTTP/1.1
    accept: application/json
    accept-encoding: gzip
    connection: Keep-Alive
    content-length: 235
    content-type: multipart/form-data; charset=UTF-8; boundary=1847a97df6a
    host: localhost:8067
    user-agent: okhttp/4.3.1

    --1847a97df6a
    Content-Disposition: form-data; name="file"; filename="9067d1f2-8b46-40fe-886a-a06740dcfd6d"
    Content-Type: application/octet-stream
    Content-Transfer-Encoding: binary

    ...
    Dies ist der Dateiinhalt
    ...
    --1847a97df6a--                

    HTTP/1.1 200 OK
    Connection: keep-alive
    Content-Type: application/json
    Date: Tue, 15 Nov 2022 09:21:30 GMT
    Keep-Alive: timeout=60
    Transfer-Encoding: chunked

    {"status":"OK","description":null}

    Mögliche Ergebnisse mit entsprechender Beschreibung:

    * OK – zeigt an, dass die Datei sauber ist und im CoLab-Flow verarbeitet werden kann. Beschreibung Feld ist leer
    * GEFUNDEN – Datei ist infiziert, zusätzliche Vireninformationen im Beschreibungsfeld
    * FEHLER – Fehler bei der Dateiverarbeitung, zusätzliche Fehlerinformationen im Beschreibungsfeld
  • Beispiel für nicht blockierende Aufrufe – mehrteilige Anfrage – Antwortstatus 202

    HTTP/1.1 202 Accepted
    Connection: keep-alive
    Date: Tue, 15 Nov 2022 09:30:23 GMT
    Keep-Alive: timeout=60
    Transfer-Encoding: chunked

    Nach Annahme der Anfrage führt der Antivirendienst hinter dem Webhook-URI-Endpunkt die Dateiprüfung durch. Nach Abschluss des Jobs muss der Dienst das Ergebnis mit der entsprechenden ID an die Callback-URL senden.

    POST http://<gateway-IP>/colab/epr/av/callback/{id} HTTP/1.1
    accept: application/json
    authorization: ******
    connection: keep-alive
    content-length: 34
    content-type: application/json
    host: localhost:8066
    user-agent: Java/17.0.4.1

    {"status":"OK|FOUND|ERROR","description":null}

Einrichten des Spring Boot-Antivirus-Dienstes mit Java

Diese Beispiele sind nicht für die Produktion gedacht, sondern dienen als Demonstration.

Um die Verarbeitung eingehender Anfragen zu implementieren, müssen wir einen Endpunkt in der Controller-Klasse konfigurieren.

  • Blockierende Implementierung (Antwortstatus 200)

    @RestController
    public class ExampleRestController
            
            @PostMapping(value = "/upload/{id}", consumes = "multipart/form-data")
            public ResponseEntity<WebHookResult> scan(@RequestPart("file") MultipartFile file, @PathVariable("id") String id) {
            
                    WebHookResult result = doVirusScan(file, id);
            
                    return ResponseEntity.ok(result);
            }
        
            @Data
            public class WebHookResult {
                private String status;
                private String description;
            
            }
    }
  • Nicht blockierende Implementierung (Antwortstatus 202)

    @RestController
    public class ExampleRestController {
        
        @PostMapping(value = "/upload/{id}", consumes = "multipart/form-data")
        public ResponseEntity<?> asyncScan(@RequestPart("file") MultipartFile file, @PathVariable("id") String id) {

            new Thread(() -> {

                WebHookResult result = doVirusScan(file, id);

                OkHttpClient client = new OkHttpClient();
                MediaType JSON = MediaType.parse("application/json; charset=utf-8");
                String json = new ObjectMapper().writeValueAsString(result);
                RequestBody result = RequestBody.create(json, JSON);

                Request request = new Request.Builder()
                        .url("http://<gateway-IP>/colab/epr/av/callback/{id}")
                        .post(result)
                        .build();

                Response response = client.newCall(request).execute();

            }).start();

            return ResponseEntity.accepted().build();
        }
    }

Antivirus-Webhook in coLab aktivieren

Der Webhook ist in enaio® coLab aktiviert, wenn colab-prod.yml die folgenden Konfigurationseigenschaften hat:

  • Erkennungsmodus

    Funktioniert innerhalb des Service Managers.

    web-hooks:
      registration:
        antivirus:
          url: <service_name>
          discoverable: true
  • Nicht-Erkennungsmodus

    Funktioniert außerhalb des Service Managers

    web-hooks:
      registration:
        antivirus:
          url: http://<antivirus_service_ip>:8067
          discoverable: false

Um den Erkennungsmodus zu aktivieren (arbeitet innerhalb des OS Service Managers), setzen Sie die Eigenschaft discoverable auf true und geben Sie den Instanznamen an.