Löschbefehl mit Python?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TanjaLorenz
User
Beiträge: 8
Registriert: Sonntag 8. April 2018, 09:28

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?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Was soll das eigentlich bringen mehrmals zu überschreiben?
Reicht dir nicht das Bittenichtentschlüsseln-Säckchen unter der Türschwelle um das zu verhindern?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

@noisefloor: Das mag auf Magnetbänder vielleicht zugetroffen haben auf Festplatten kenne ich keine Bestätigung dass das jemals sinnvoll war.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
TanjaLorenz
User
Beiträge: 8
Registriert: Sonntag 8. April 2018, 09:28

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Eben deswegen ist es nicht vielleicht sondern es geht einfach nicht sicher.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
TanjaLorenz
User
Beiträge: 8
Registriert: Sonntag 8. April 2018, 09:28

C:\Daten\Beispieldatei sicher löschen. da eine recht umfangreiche Antwort nicht darauf eingegangen ist.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was gefällt Dir an DeaD_EyEs Antwort nicht?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
de_tom
User
Beiträge: 15
Registriert: Dienstag 19. Juli 2016, 19:34

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
Antworten