Seite 1 von 1

Löschbefehl mit Python?

Verfasst: Sonntag 8. April 2018, 09:47
von TanjaLorenz
Ich möchte ein Skript erstellen, mit dem ich die Partition F sicher löschen kann z.B. mit drei Durchläufen. Ich weiss, dass es viele Programme gibt, die diese Funktion können, aber mich interessiert der Weg mit Python.

Hat jemand einen Vorschlag?

Re: Löschbefehl mit Python?

Verfasst: Sonntag 8. April 2018, 15:00
von DeaD_EyE
Was für ein Betriebssystem wird verwendet?
Unter Linux ist alles eine Datei. Das macht den Vorgang recht einfach.
Du kannst das Blockdevice /dev/sdx als Datei im Schreibmodus öffnen,
musst aber als root angemeldet sein, da sonst die Berechtigung fehlt.

Ich bis jetzt selbst noch nicht auf Blockdevices geschrieben.
Erst hole ich mir die Größe des Blockdevices bzw. der Datei.

Dann eine for-schleife in der ich einfach mehrmals überschreiben kann.
Im while Block schreibe ich dann so lange, bis der rest == 0 ist.
Anstatt einfach \x00 zu schreiben, generiere ich Zufallszahlen.
Den Code konnte ich leider nur mit einer Datei testen.

Bei der Angabe des Devices sollte darauf geachtet werden, dass es das richtige ist.

Code: Alles auswählen

def erase(device, turns):
    if pathlib.Path(device).is_block_device():
        st = os.statvfs(device)
        size = st.f_blocks * st.f_bsize
    else:
        size = os.path.getsize(device)
    blocksize = 4096
    for i in range(turns):
        rest = size
        with open(device, 'wb') as fd:
            while rest != 0:
                chunksize = min(rest, blocksize)
                chunk = os.urandom(chunksize)
                fd.write(chunk)
                rest -= len(chunk)
Leider garantiert das Überschreiben nicht, dass Daten wirklich gelöscht worden sind.
Bei SSD wird es etwas komplexer. Dort können sich z.B. Daten auf den Flash-Chips verstecken, an die der normale User niemals wieder rankommt, auch nicht zum Löschen.

Re: Löschbefehl mit Python?

Verfasst: Sonntag 8. April 2018, 16:23
von noisefloor
Hallo,
Ich weiss, dass es viele Programme gibt, die diese Funktion können, aber mich interessiert der Weg mit Python.
Da gibt es nicht viel "pythonisches". Die Sprache ist hier ja nur Mittel zum Zweck, um das Laufwerk mit Nullen, Zufallszahlen oder was auch immer zu überschreiben.

So wie von DeaD_Eye gezeigt lässt sich das im Prinzip auch sehr ähnlich in anderen Sprachen implementieren.

Gruß, noisefloor

Re: Löschbefehl mit Python?

Verfasst: Dienstag 10. April 2018, 16:56
von darktrym
Was soll das eigentlich bringen mehrmals zu überschreiben?
Reicht dir nicht das Bittenichtentschlüsseln-Säckchen unter der Türschwelle um das zu verhindern?

Re: Löschbefehl mit Python?

Verfasst: Dienstag 10. April 2018, 17:08
von __deets__
Angeblich gibt es restmagnetisierungen, die bei nur-nullen-schreiben von der NSA wieder sichtbar gemacht werden koennen. Wie sehr das nun unter aluhutiges faellt oder nicht vermag ich nicht zu sagen. Prinzipiell vorstellbar ist es, aber warum nun *mehr* als einmal ueberschreiben mit Zufallszahlen wichtig sein sollte erschliesst sich mir auch nicht.

Re: Löschbefehl mit Python?

Verfasst: Dienstag 10. April 2018, 17:15
von noisefloor
Hallo,

@darktrym: früher™ war es mal so, dass bei klassischen, magnetischen Festplatten das 1-fache Überschreiben nicht reichte, um die Daten verlässlich zu löschen. Mit den entsprechenden (Hardware-) Tools und Aufwand ließen sich Daten rekonstruieren. Das hatte AFAIK was mit der Ausrichtung der Magnetpartikel (die die Daten speichern) zu tun, also dass man deren ursprüngliche Ausrichtung bei 1-fachem Überschreiben rekonstruieren konnte.

Zufallszahlen haben AFAIK den Vorteil, dass man einen nicht-definierten Endzustand hat. Überschreibt man "nur" mit Nullen oder Einsen, dann ist der Endzustand definiert und der Ausgangszustand leichter rekonstruierbar.

Ein paar weitere Infos gibt's hier: https://wiki.ubuntuusers.de/Daten_sicher_löschen.

Gruß, noisefloor

Re: Löschbefehl mit Python?

Verfasst: Dienstag 10. April 2018, 19:06
von DasIch
Am sinnvollsten ist es einfach alles zu verschlüsseln, dann reicht es das Passwort zu vernichten. Das funktioniert auch bei SSDs.

Wer wirklich paranoid ist sollte physikalisch die Hardware zerstören. Wobei bei der NSA o.ä. Organisationen natürlich https://xkcd.com/538/ gilt.

Auf StackOverflow gibt es übrigens einen Beitrag der ziemlich gut erklärt wo dass mit dem mehrfach überschreiben herkommt.

Re: Löschbefehl mit Python?

Verfasst: Mittwoch 11. April 2018, 19:29
von darktrym
@noisefloor: Das mag auf Magnetbänder vielleicht zugetroffen haben auf Festplatten kenne ich keine Bestätigung dass das jemals sinnvoll war.

Re: Löschbefehl mit Python?

Verfasst: Mittwoch 11. April 2018, 21:42
von noisefloor
Hallo,

@darktrym; was beim Löschen "sinnvoll" ist hängt auch stark davon ab, wie paranoid man ist. Oder: Glaube versetzt Berge. Oder: Placebo-Effekt. ;-)

Ansonsten ist es im vom DasIch verlinkten Artikel ja ganz gut erklärt.

Gruß, noisefloor

Re: Löschbefehl mit Python?

Verfasst: Sonntag 15. April 2018, 15:26
von TanjaLorenz
Danke für die ausführliche Antwort. Nehmen wir an ich möchte die Datei C:\Daten\Beispieldatei sicher löschen. Wo muss ich deinen Code ergänzen? Ich nutze Windows7 64 BIT

Danke
Tanja


DeaD_EyE hat geschrieben:Was für ein Betriebssystem wird verwendet?
Unter Linux ist alles eine Datei. Das macht den Vorgang recht einfach.
Du kannst das Blockdevice /dev/sdx als Datei im Schreibmodus öffnen,
musst aber als root angemeldet sein, da sonst die Berechtigung fehlt.

Ich bis jetzt selbst noch nicht auf Blockdevices geschrieben.
Erst hole ich mir die Größe des Blockdevices bzw. der Datei.



Dann eine for-schleife in der ich einfach mehrmals überschreiben kann.
Im while Block schreibe ich dann so lange, bis der rest == 0 ist.
Anstatt einfach \x00 zu schreiben, generiere ich Zufallszahlen.
Den Code konnte ich leider nur mit einer Datei testen.

Bei der Angabe des Devices sollte darauf geachtet werden, dass es das richtige ist.

Code: Alles auswählen

def erase(device, turns):
    if pathlib.Path(device).is_block_device():
        st = os.statvfs(device)
        size = st.f_blocks * st.f_bsize
    else:
        size = os.path.getsize(device)
    blocksize = 4096
    for i in range(turns):
        rest = size
        with open(device, 'wb') as fd:
            while rest != 0:
                chunksize = min(rest, blocksize)
                chunk = os.urandom(chunksize)
                fd.write(chunk)
                rest -= len(chunk)
Leider garantiert das Überschreiben nicht, dass Daten wirklich gelöscht worden sind.
Bei SSD wird es etwas komplexer. Dort können sich z.B. Daten auf den Flash-Chips verstecken, an die der normale User niemals wieder rankommt, auch nicht zum Löschen.

Re: Löschbefehl mit Python?

Verfasst: Dienstag 17. April 2018, 08:49
von DeaD_EyE

Code: Alles auswählen

datei = r"C:\Daten\Beispieldatei"
erase(datei, 3)
Für den Pfad verwende ich einen Regex-String, wodurch verhindert wird, dass \ interpretiert wird.
Ich bin noch nicht wach. Es verhindert, dass die Escape-Sequenzen wie z.B. \n \b \t usw interpretiert werden.
Problematisch wäre z.B. dieser Pfad "C:\Programme\nuke-tools\data.sqlite", dort wird \n als neue Zeile interpretiert.

Re: Löschbefehl mit Python?

Verfasst: Dienstag 17. April 2018, 10:37
von DasIch
Einzelne Dateien lassen sich nicht sicher löschen. Du kannst nur die ganze Festplatte sicher löschen und auch dies nur wenn Firmware und Controller mitspielt.

Re: Löschbefehl mit Python?

Verfasst: Dienstag 17. April 2018, 12:01
von DeaD_EyE
Vielleicht....

Es hängt vom Controller und vom Dateisystem ab. Verlassen würde ich mich auf so etwas nicht!

Einfaches Beispiel:

Das Programm führt den Schreibbefehl auf die Datei aus. Das Dateisystem könnte jetzt z.B. entscheiden ganz woanders hinzuschreiben. Wo, wird letztendlich in einer Tabelle festgehalten. Die Dateisystemschicht sendet dann die Befehle an den Controller, der diese z.B. auch umsortiert und auch ggf. in andere Sektoren schreibt, weil z.B. Sektoren kaputt sind.

Letztendlich ist das Programm die oberste Ebene der Abstraktion. Was in den Ebenen weiter darunter passiert, kann das Programm nicht steuern.
Dein Programm wird niemals wissen, ob die Aktion erfolgreich war oder nicht.

Am besten eignet sich ein dicker Hammer und ein Akkuschrauber mit Spiralbohrer.

Re: Löschbefehl mit Python?

Verfasst: Dienstag 17. April 2018, 13:39
von DasIch
Eben deswegen ist es nicht vielleicht sondern es geht einfach nicht sicher.

Re: Löschbefehl mit Python?

Verfasst: Donnerstag 19. April 2018, 10:00
von Kebap
TanjaLorenz hat geschrieben:Ich möchte .. die Partition F sicher löschen .. z.B. mit drei Durchläufen. Ich weiss, dass es viele Programme gibt, die diese Funktion können
TanjaLorenz hat geschrieben:Nehmen wir an ich möchte die Datei C:\Daten\Beispieldatei sicher löschen.
Was denn nun? :K

Re: Löschbefehl mit Python?

Verfasst: Sonntag 22. April 2018, 08:38
von TanjaLorenz
C:\Daten\Beispieldatei sicher löschen. da eine recht umfangreiche Antwort nicht darauf eingegangen ist.

Re: Löschbefehl mit Python?

Verfasst: Sonntag 22. April 2018, 09:11
von Sirius3
Was gefällt Dir an DeaD_EyEs Antwort nicht?

Re: Löschbefehl mit Python?

Verfasst: Dienstag 24. April 2018, 12:39
von DeaD_EyE
Eine Zwiebel beschreibt das technische Problem ziemlich gut. Dein Programm sieht erstmal nur die Äußere Schicht der Zwiebel und kann Befehle an diese Zwiebel schicken. Die Äußerste Schicht der Zwiebel leitet den Befehl an die inneren Schichten weiter. Von außen ist aber nicht festzustellen, was innen passiert ist.

Hier gibt es ein paar gute Kommentare zu dem Problem: https://askubuntu.com/questions/57572/h ... ure-manner

Eine logischer Schritt wäre es z.B. die Festplatte zu verschlüsseln. Sogar Windows sollte das können.

Code: Alles auswählen

import os


def erase(file, turns):
    size = os.path.getsize(device)
    blocksize = 4096
    for i in range(turns):
        rest = size
        with open(device, 'wb') as fd:
            while rest != 0:
                chunksize = min(rest, blocksize)
                chunk = os.urandom(chunksize)

datei = r'C:\Daten\Beispieldatei'
erase(datei, 10)
Der Code ist nicht getestet und wie bereits ausgiebig diskutiert, ist es absolut nicht zu empfehlen wenn z.B. dein Leben davon abhängt.
Nicht ohne Grund existieren Dienstleister, die Festplatten sicher löschen und dann entsorgen. Verschlüsseln wäre der richtige Weg. Dann sind die Daten zumindest nicht interpretierbar.

Re: Löschbefehl mit Python?

Verfasst: Mittwoch 25. April 2018, 21:28
von de_tom
Eine mechanische Festplatte mit magnetischen Datenträgern (so wie sie seit jeher bis zur Entwicklung von Flashspeicher auch heute noch weltweit millionenfach im Einsatz sind) lässt sich durch mehrfaches Überschreiben sicher löschen. Der VSITR-Standard des BSI (Bundesamt für Sicherheit in der Informationstechnik) schrieb ein 7-maliges Überschreiben vor. Allerdings ist der Standard heute nicht mehr gültig. Heutige Standards empfehlen ein 30-maliges Überschreiben und mehr...

Auch ist es bei Magnetfestplatten möglich, einzelne Dateien zu löschen. Hierzu muss man aber ermitteln, in welchen Sektoren die fragliche Datei tatsächlich gespeichert ist. Hierzu gibt es Tools wie z. B. TSK (The Sleuth Kit), die das problemlos leisten und mit denen man FAT, NTFS und Ext-Dateisysteme bestens 'rauf und runter' analysieren kann.

Bei modernen Betriebssystemen und Anwendungen ist das Löschen allerdings weitaus problematischer. Bei Microsoft Windows wurde z. B. mit Vista der Volume Shadow Copy Service (VSC) eingeführt, der Versionen von Dateien auf der Festplatte erzeugt (ohne dass der Anwender davon etwas mitbekommt). Die Versionen werden jedoch nicht autark einfach als Kopie des Originals gespeichert, sondern in komplexen Verfahren in 64KB großen Blöcken. Nur der VSC "weiss" in welchen Blöcken eine Version verteilt bzw. gespeichert ist. Der Anwender kann nur über den VSC über die Option "Vorherige Version wieder herstellen" auf eine Version zugreifen. Er kann die Dateiversion auf der Festplatte, also die Sektoren, in denen die Dateiversion tatsächlich gespeichert ist, ohne tiefe Kenntnisse jedoch niemals auffinden und daher auch nicht sicher löschen. Wird also eine einzelne Datei durch mehrfaches Überschreiben vermeintlich sicher gelöscht, kann nicht ausgeschlossen werden, ob nicht noch irgendwo auf der Festplatte eine weitere Version davon "rumliegt". Und auch viele Anwendungen speichern Kopien von Dateien, die nicht ohne Weiteres auf der Festplatte zu finden sind (z. B. Thumbnails in Thumbnail-Datenbanken. Viele Webbrowser cachen Dateien in proprietären Datenstrukturen, E-Mail-Anhänge in Mailcontainern, Backups, virtuelle Maschinen u.v.m.).

Und völlig anders ist es bei Flashspeichern, also z. B. bei SSD-Platten oder NVMe-Karten. Hier werden hochkomplexe Verfahren angewendet, um die Schreibzyklen gleichmäßig auf die Speicherzellen zu verteilen. Hierzu verschiebt der Controler unentwegt Daten (DeaD_EyE hat dieses Verfahren (Wear-Leveling) ja bereits weiter oben angedeutet). Darüber hinaus werden defekte Speicherzellen auf 'Reservezellen' gemappt usw. Aus diesen Gründen lassen sich die Speicherzellen, in denen eine Datei tatsächlich gespeichert ist, bei SSD-Platten nicht identifizieren. Dies 'weiß', nur der Controler. Daher ist ein sicheres Löschen hier nicht wirklich möglich.

Falls Datenträger mit sensiblen Daten absolut sicher entsorgt werden müssen, sollten sie physikalisch zerstört werden (Schreddern, Hochofen etc.).

Gruß
Tom