SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Kolega bigos zadał bardzo ciekwe pytanie odnośnie bezpiecznego użytkowania polecenia dd. Osoby często nagrywające obrazy systemów na różnych nośnikach są bardziej narażeni na przypadkowe wymazanie zawartości dysku. Przyznam się szczerze, że sam padłem ofiarą własnej nieuwagi podczas "wypalania" obrazu na nośniku SD i to nie raz.

Naturalnie nic nie zastąpi ostrożności, ale to tylko kwestia czasu, kiedy spotka to również Ciebie. Zastanawiając się nad tym problemem, wpadłem na pewne rozwiązanie filtrowania niebezpiecznych parametrów. Założenie jest proste - utworzyć skrypt bash o nazwie dd o odpowiedniej zawartości, a domyślne polecenie dd przemianować na ddunsafe.

  1. ls -o /bin/dd*
  1. -rwxr-xr-x 1 root   284 Jun 29 22:18 /bin/dd
  2. -rwxr-xr-x 1 root 56880 Feb 27  2013 /bin/ddunsafe

Sktypt dd przed wykonaniem polecenia zadba o to, abyśmy nie popełnili drugi raz gafy:

  1. #!/bin/bash
  2.  
  3. dennyArgs=("^of=/dev/sda$" "^of=/dev/sda1$")
  4.  
  5. for ARG in "$@"
  6. do
  7.     for dennyArg in ${dennyArgs[*]}
  8.     do
  9.     if [ "$(echo "$ARG" | egrep ${dennyArg})" ]
  10.     then
  11.         echo "OPS! Parametr ${dennyArg} zablokowany!"
  12.         exit -1
  13.     fi
  14.     done
  15. done
  16.  
  17. ddunsafe "$@"

Do tablicy dennyArgs, możemy dopisać chronione dyski i partycje. Próba dostępu do chronionengo nośnika zakończy się niepowodzeniem i wyświetleniem komunikatu.

  1. dd id=/dev/zero of=/dev/sda1
  1. OPS! Parametr ^of=/dev/sda1$ zablokowany!
Komentarze Komentarze
Avatar 2
PKSobon Windows 7 / Safari 537.36
30 June 2014 - 07:59 Brak informacji

Psujesz... :(

DD ma być niebezpieczny, nie po to nazywany jest Disk Destroyerem, by nagle jego główne zadanie zostało mu odebrane. :)

Kiedy zaczynałem z Linuksami, większość komend bezmyślnie kopiowałem z netu, zakładając, że kiedyś je w ten sposób spamiętam, ze dwa razy zniszczyłem sobie tym sposobem jakąś partycję. Później na wszelki wypadek zacząłem korzystać z maszyny wirtualnej z szybko pobranej płyty CD dowolnej dystrybucji. To jest najbezpieczniejszy sposób. :P

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 30.0
03 July 2014 - 01:11 Bytom

:) psucie to moje drugie imię

Avatar 1
RockFord Linux Ubuntu / Mozilla Firefox 30.0
30 June 2014 - 09:25 Warszawa

Hej,

@PKSobon: dd, jak sama nazwa wskazuje, jest od "Copy and Convert" ale cc było już zajęte ;)

Wydaje mi się żę najlepszym roziązaniem są grupy.
Mozna zrobić sobie grupę typu "ddmasters" poprawić udeva tak żeby dyski wymienne (albo ten jeden konkretny na obrazy) dostawłay 660 "root:ddmasters" na koniec dodać sobie do grupy ddmasters.

i jest bezbiecznie
bo nie trzeba intakntować "sudo ..."

pewnie będzie jakiś problem z automatycznym montowaniem, czy czymś takim, a jak będzie to zawsze można się pobawić ACL\'kami (też z udeva).

Avatar 2
PKSobon Linux x86_64 / Safari 537.36
01 July 2014 - 12:09 Brak informacji

A ja mam inne pytanie, dotyczące kopiowania całej partycji. Co się stanie jeśli weźmiemy wybierzemy do kopiowania całą partycję a plik wyjściowy (w spakowanej formie) też będziemy zapisywać na tej partycji. :D Ciekawe co się stanie, gdy później będziemy próbowali odtworzyć takie cudo. :P

Avatar 1
bigos Linux x86_64 / Mozilla Firefox 30.0
01 July 2014 - 22:34 Brak informacji

Wg. mnie "paker" wywali error/warning, coś w stylu "plik zminieny podczas odczytu" i pominie go lub zakończy działanie.

Avatar 1
bigos Linux x86_64 / Mozilla Firefox 30.0
01 July 2014 - 22:32 Brak informacji

Dzięki za odpowiedź. Dokładnie takiego rozwiązania używam czyli dodatkowego skryptu, ale cały czas interesuje mnie czy można to zabezpieczyć na poziomie systemu. Nie jestem pewien ale chyba w FreeBSD nie da się nadpisać partycji rootfs nawet przez roota. Może i w linuksie jest coś podobnego ale o tym nie wiem.
Odnośnie skryptu to używam jeszcze automatycznego sprawdzania co jest podmontowane jako partycja systemowa (dzięki temu nie musze martwić się na innych systemach czym jest rootfs) oraz jako nazwę skryptu używam dd/dcfldd lokowane w /usr/local/bin dzięki czemu nie muszę pamiętać, że muszę używać innego programu (pod warunkiem prawidłowej kolejności w PATH).

Avatar 2
Domker_ Linux / Opera 9.80
02 July 2014 - 16:05 Jaworzno

"Do tablicy dennyArgs, możemy dopisać chronione dyski i partycje"
Nie lepiej zrobić white-listę i dodawać do tablicy niechronione dyski/partycje.
W powyższym przypadku można również zapomnieć dopisać partycję/dysk do tablicy chronionych :)

Drugi sposób to skrypt który będzie pytał o potwierdzenie wpisując słownie TAK/YES. (można poprzedzić np. poleceniem sudo parted --list lub lsblk -io KNAME,TYPE,SIZE,MODEL)

Trzeci sposób utworzyć czytelne aliasy do "właściwych poleceń dd" np.:
alias wypalsd="dd if=ubuntu.img of=/dev/sdX"

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 30.0
03 July 2014 - 01:10 Bytom

słuszna uwaga - white lista jest bardziej bezpiecznym posunięciem, również drugi pomysł bardzo mi się podoba! aliasy też ciekawe, ale mało wygodne chyba, przy większej ilości partycji

Avatar 2
PKSobon Windows 7 / Safari 537.36
03 July 2014 - 08:08 Brak informacji

Mi się wydaje, że wszystko zależy od tego jak i po co mamy tego dd używać. W robocie jak już mam coś kopiować, to jestem zmuszony używać jakiegoś liveCD i kopiować nie pojedynczą partycję, a cały dysk zazwyczaj. W przypadku gdy mamy kilkadziesiąt komputerów z taką samą konfiguracją oraz aplikacjami jest to najlepsza metoda, później tylko zmienić nazwę komputera, adres IP i kilka innych prostych rzeczy i działa. :) Wtedy nawet nie warto się bawić ze skryptami, a w domu? W domu mam dwa kompy, jak upośledzę jeden, to mam drugi... I trochę pracy nad tym pierwszym. :P