EPrints tips & tricks

EPrints Tips & tricks: limite upload e controllo antivirus – parte 1 di 2

See the article in English

In questo articolo parlo di EPrints  e di come poterlo configurare al meglio per poter limitare la dimensione dei file che possono esser trasmessi (upload) al server web e poter controllare il contenuto tramite un antivirus.

Introduzione

Per poter proseguire consideriamo che il software sia già installato alla versione 3.3.15, l’ultima attualmente disponibile per la produzione e che:

  • $EPRINTS punti alla base del software e
  • $ARCHIVEID sia il nome dell’archivio che gestiremo in questo articolo.

Quindi dovrà esistere la cartella $EPRINTS/archives/$ARCHIVEID/

Validazione dati in Eprints

In EPrints i controlli di validazione, lato configurazione, si possono fare sia a livello di singolo campo, sia di documento che sull’intero eprint che si sta depositando durante il flusso di lavoro (workflow) specifico del software.
In particolare si deve lavorare sui file di configurazione presenti in $EPRINTS/archives/$ARCHIVEID/cfg/cfg.d per poter applicare uno o più controlli.
Per semplicità descrittiva possiamo definire la variabile
$EPCONF=$EPRINTS/archives/$ARCHIVEID/cfg e descrivere le 3 validazioni presenti:

  1. del singolo campo
    che viene fatta modificando la funzione $c->{validate_field} = sub { … } presente nel file $EPCONF/conf.d/field_validate.pl e viene richiamata per ogni campo dell’eprint durante la navigazione nel workflow in avanti o indietro;
  2. del documento
    che viene fatta modificando la funzione $c->{validate_document} = sub { … } presente nel file $EPCONF/conf.d/document_validate.pl e viene richiamata per ogni documento dell’eprint durante la navigazione nel workflow in avanti o indietro;
  3. dell’eprint
    che viene fatta modificando la funzione $c->{validate_eprint} = sub [ … } presente nel file $EPCONF/conf.d/eprint_validate.pl e viene richiamata quando si clicca sul tasto “Deposita” (o “Deposit item now” nella traduzione in inglese)

Naturalmente se una qualunque di queste tre validazioni presenta un problema non è possibile proseguire se non si risolve il problema.

Cosa vogliamo ottenere

Dato che a noi interessa limitare la grandezza in byte del file caricato e che non contenga virus la funzione da utilizzare è senz’altro $c->{validate_document} in modo tale che il problema venga rilevato immediatamente al primo click sul tasto avanti o indietro durante il workflow.
Per far ciò abbiamo bisogno di installare l’antivirus che per questo articolo supponiamo che sia ClamAV.

Installazione antivirus

Per installare ClamAV basta utilizzare l’installazione classica della distribuzione presente nel server:
– ubuntu o simili usare: sudo apt install clamav-daemon
– redhat/centos usare: yum install -y epel-release; yum install -y clamav
– fedora usare: yum install -y clamav clamav-update
– gentoo usare: emerge clamav

Per maggiori informazioni andate nel sito ufficiale https://www.clamav.net/documents/installing-clamav

Implementazione

Per gestire questa nuova configurazione creiamo un nuovo file upload.pl dentro $EPCONF/conf.d/ dove mettiamo la variabile “upload_limit” che conterrà il limite massimo in byte per noi accettabile:

$c->{'upload'}={
upload_limit=>10*1024*1024,
};

In questo caso abbiamo impostato un limite di 10Mib.

Per il controllo vero e proprio creiamo un funzione “upload_file” che farà tutto il necessario e verrà richiamata da “validate_document

$c->{'upload_file'}=sub {
  my ($session,$fileobj,$nohtml)=@_;
  my (@problems);
  ...
  @problems=();
  # controllo dimensione file e se necessario creo un messaggio con il problema rilevato
  ...
  # controllo antivirus sul file e se necessario creo un messaggio con il problema rilevato
  ...
  # se ci sono problemi rilevati cancello il file per sicurezza
  # e se il file è unico nel documento cancello anche il documento
  # se il documento non è da cancellare controllo che il file cancellato non fosse quello principale
  # impostato nel campo "main" ed in caso di riscontro elimino il valore di "main"
  ...
  return @problems;
}

A questo punto basta aggiungere tale controllo nel file di configurazione $EPCONF/conf.d/document_validate.pl alla fine delle funzione “validate_document” e quindi prima di:

return( @problems );

Aggiungiamo quindi il seguente codice:


# start antivirus check: must be the last check
if ($repository->can_call('upload_file')) {
  my $files=$document->get_value( "files" );
  my @problems2=();
  foreach my $file (@{$files}) {
    my @problems2=$repository->call('upload_file', $repository,$file);
    push @problems,@problems2;
  }
}
# end antivirus check

Basta quindi riavviare il server web apache  per testare il funzionamento.
Per provare un file con un virus di test si può scaricare quello di ClamAV ovvero il file eicar.com.txt.

eprints find virus: error message eprints max upload: error message

Osservazioni

Naturalmente con questa configurazione riusciamo a non fa pubblicare un documento con dimensioni troppo grandi e che contenga un virus ma non siamo in grado di bloccarlo durante il caricamento o durante la selezione e per questo vi rimando al prossimo articolo, dal titolo “EPrints Tips & tricks: limite upload e controllo antivirus – parte 2 di 2“.

Codice online

Per scaricare tutto il codice completo potete andare sul mio progetto “eprints_validate_upload_file”  sotto github

Osservazioni di sicurezza

Per non farvi riempire il disco e per evitare attacchi del tipo denial-of-service è sempre utile definire la massima dimensione del messaggio in POST (e quindi anche degli allegati) che il server accetterà.
Naturalmente la dimensione del POST in genere non corrispondono con la dimensione dell’allegato e quindi per sicurezza io metterei tale dimensione almeno al 20% in più rispetto a quella massima dell’allegato.
Per evitare un POST molto grande si possono utilizzare uno dei seguenti metodi:

  1. metodo a livello Eprints: basta impostare la variabile $CGI::POST_MAX = 1024 * 1024 * 20; (20MB posts) in un file di configurazione (ad esempio proprio upload.pl)
  2. metodo a livello di apache: basta impostare “LimitRequestBody 20971520” (20MB posts). Come predefinito Apache 2.4  usa “LimitRequestBody 0” che corrisponde ad un massimo di 2GB.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

17 + = 25