Table of Contents
Samba: problema con Alternate Data Streams
Descrizione del problema
Scenario
Copia di un file da una condivisione di rete (Windows server) ad un'altra (Samba server).
Problema
Il file non viene copiato, nella cartella destinazione viene creato un file con il nome corretto, ma dimensione zero.
La prima evidenza del problema è il seguente messaggio di avviso; Windows segnala che il file che si intende copiare potrebbe essere dannoso (in inglese il messaggio dovrebbe essere “This file came from another computer and might be blocked to help protect this computer”):
Se l'utente comunque accetta di effettuare l'operazione, si ottiene un errore successivo. In questo caso l'errore è abbastanza incomprensibile in quanto la cartella destinazione NON conteneva alcun file con lo stesso nome prima dell'operazione di copia:
Non importa quale opzione sceglie l'utente, è impossibile procedere con l'operazione di copia. In qualche circostanza è possibile che appaia anche un terzo messaggio di errore che fa riferimento ad una non meglio precisata autorizzazione necessaria:
Anche in questo caso ogni opzione fornita all'utente è destinata a fallire. Al termine del tentativo nella cartella destinazione troviamo il file, ma con lunghezza zero.
Cause del problema
Sembra proprio che la causa del problema è la creazione di un Alternate Data Stream aggiuntivo al file origine, il nome assegnato a tale stream è Zone.Identifier. È possibile evidenziare questo comportamento copiando il file dalla medesima origine, share Windows server, sul disco locale. Negli esempi che seguono il file di prova è un documento PDF con nome ze1.pdf.
Conviene eseguire una PowerShell invece di un semplice prompt dei comanid cmd per ispezionare e manipolare il file. Con il comando Get-Item è possibile verificare che il file copiato ha un Alternate Data Stream:
PS C:\Users\user\Desktop\prova> Get-Item ze1.pdf -stream * PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\user\Desktop\prova\ze1.pdf::$DATA PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\user\Desktop\prova PSChildName : ze1.pdf::$DATA PSDrive : C PSProvider : Microsoft.PowerShell.Core\FileSystem PSIsContainer : False FileName : C:\Users\user\Desktop\prova\ze1.pdf Stream : :$DATA Length : 207401 PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\user\Desktop\prova\ze1.pdf:Zone.Identifier PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\Users\user\Desktop\prova PSChildName : ze1.pdf:Zone.Identifier PSDrive : C PSProvider : Microsoft.PowerShell.Core\FileSystem PSIsContainer : False FileName : C:\Users\user\Desktop\prova\ze1.pdf Stream : Zone.Identifier Length : 26
Il data stream Zone.Identifier è un semplice file di testo, con Notepad è possibile ispezionarne il contenuto:
notepad "ze1.pdf:Zone.Identifier"
Questo è il contenuto che risulta nel nostro caso:
[ZoneTransfer] ZoneId=3
Questo evidenzia la probabile causa primara dell'anomalia: il server Windows da cui è stato copiato il file risiede nella medesima rete locale del client Windows utilizzato per i test, il codice 3 invece sta ad indicare la rete Internet non sicura:
0 | Local Machine zone |
1 | Local intranet |
2 | Trusted sites |
3 | Internet |
4 | Restricted sites |
Aggirare il problema
Se si tratta di copiare un singolo (o pochi) file. è possibile aggirare il problema in questo modo:
- Copiare il file dalla condivisione Windows al disco locale.
- Rimuovere l'ADS utilizzando la PowerShell.
- Copiare il file nella destinazione Samba.
Per manipolare gli ADS esistono diversi tool ufficiali e di terze parti, ad esempio Streams di Microsoft. Altri programmi di terze parti sembrano poco supportati. Nel nostro caso vogliamo solo rimuovere l'ADS Zone.Identifier, per questo scopo è possibile usare Unblock-File della PowerShell:
PS C:\Users\user\Desktop\prova> Unblock-File ze1.pdf
Soluzione tramite Criteri di gruppo (non funziona)
Molte pagine internet (e in particolare questa pagina Microsoft) indicano come soluzione al problema il cambio di una policy di gruppo. Si esegue il programma Editor Criteri di gruppo locali e si individua la sequente policy:
- Editor Criteri di gruppo locali
- Configurazione utente
- Modelli amministrativi
- Componenti di Windows
- Gestione allegati
- Non mantenere informazioni sull'area nei file allegati
L'impostazione predefinita per tale policy è Non configurato, è possibile modificare il valore in Abilitato.
Putroppo nel nostro caso non si è risolto il problema; probabilmente l'azione da inibire non è il mantenere le informazioni sull'area di origine del file, ma proprio la creazione di tale informazione.
Soluzione tramite chiave di Registry (non funziona)
Un'altra soluzione spesso indicata su Internet (e in particolare sempre su questa pagina Microsoft) è la modifica di una chiave del Registry. Si esegue RegEdit e si naviga fino al percorso:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Attachments
quindi si crea/modifica la chiave DWORD 32-bit SaveZoneInformation e la si imposta a 1.
Putroppo anche in questo caso la soluzione non ha funzionato. Si è provato anche a impostare la chiave al valore zero, ma il risultato non è cambiato. Probabilmente la copia di un file dalla condivisione Windows non rientra nelle policy di attachments.
Soluzione Internet Explorer (non correlato)
Circa il problema degli allegati c'è anche chi fa riferimento alle impostazioni di Internet Explorer, ma che ovviamente non riguardano il nostro problema:
- Internet Explorer
- Opzioni Internet
- Sicurezza
- Internet locale
- Livello di sicurezza per l'area ⇒ Bassa
- Attiva modalità protetta ⇒ No
Copiare un file con ADS sullo share Samba
Vediamo cosa succede se si copia un file che abbia un ADS dal disco locale allo share Samba. Creiamo un file di testo prova-con-ads.txt, quindi dalla riga di comando associamo ad esso un ADS:
echo "Questo è un ADS" > prova-con-ads.txt:invisibile.txt
Quando si tenta di copiare il file sulla condivisione Samba un messaggio di avviso segnala che alcune proprietà non saranno copiate nella cartella destinazione:
È possibile procedere con la copia, ma l'ADS non verrà copiato.
Copiare un file su share Samba senza crittografia
Un altro messaggio di avviso che può comparire quando si copia un file su una condivisione Samba riguarda l'assenza di crittografia. Si tratta presumibilmente di un avviso relativo al fatto che il protocollo microsoft-ds sulla porta 445/TCP non è cifrato: