empecher dd d'ecrire sur sda Le sujet est résolu

Demande d'aide : c'est ici.
Répondre
Avatar de l’utilisateur
Grhim
Membre très actif
Membre très actif
Messages : 1389
Inscription : 30 mai 2016, 01:00
Localisation : kekparr'par'là
Status : Hors-ligne

j'aimerais savoir comment , par mesure de prevention, empecher 'dd' d'ecrire sur le disque systeme
peut on ke faire avec bash , python ?
...et que lorsque l'erreur se fait par exemple

Code : Tout sélectionner

 dd if=debian.iso of=/dev/sda bs=512k
qu'il y ai un retour console qui me dise une phrase du genre "impossible d'ecrire sur le disque systeme, manipulation interdite"
Debian Stable + Testing -.- Parrot OS - Kali Exegol -.- Raspberry IPFire
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5930
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

il faudrait que tu arrives à détourner commande dd.
a la bourrin, tu renommes le fichier /usr/bin/dd (ou équivalent, et tu te fais ton scripy que tu apelles dd.
Mais à la première mise à jour, ça saute ....
Avatar de l’utilisateur
Arnaud
Membre
Membre
Messages : 162
Inscription : 23 avr. 2016, 14:31
Localisation : Allemagne
Status : Hors-ligne

Tu peux te faire une fonction dans .bashrc ( ou .zshrc ou peu importe ce que tu utilises comme shell ) qui se nomme dd et qui teste si le second paramètre contient sda. Le cas échéant, tu peux faire un echo de ce que tu veux, sinon tu lances dd normalement.
Avatar de l’utilisateur
Grhim
Membre très actif
Membre très actif
Messages : 1389
Inscription : 30 mai 2016, 01:00
Localisation : kekparr'par'là
Status : Hors-ligne

merci de vos reponses,
en cherchant sur les moteurs de recherches , j'ai appris que ce genre de rajout de script se nomme des wrapper script, cela fixe un niveau de controle sur une commande unix/linux, bref, certains contourne en faisant faire a dd une inspection sur le disque ou la partition de ne rien ecrire tant que rien n'a ete 'demonté'..

un autre suggere d'utiliser l'id du disque au lieu des /sdx

il y a ceci aussi :
In other words, rather than dealing directly with the somewhat daunting command line arguments of dd directly, create a script in bash (or Python, etc) that takes the dd arguments that you're interested in, using an option syntax that you're more comfortable with. The script checks that the arguments are sensible, and prints out the arguments (and possibly the final dd command line) so you can verify that everything is as it should be. And then the script asks you "OK to proceed? [y/N]" so you have to enter y if you want the script to actually run the dd command line it's constructed for you.
http://unix.stackexchange.com/questions ... ctive-disk

donc , comment ecrire en bash :

Code : Tout sélectionner

si [dd= of=/dev/sda]
then
echo "commande rejeter, tu as failli effacer ton disque systeme"
alors [comande qui block la commande]
exit

Debian Stable + Testing -.- Parrot OS - Kali Exegol -.- Raspberry IPFire
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5930
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

pour une action long terme, il vaut mieux utiliser le UUID au lieu du /dev/sdX, sauf si tu as une règle udev qui fixe le lien entre sdx et UUID
Avatar de l’utilisateur
vohu
Membre
Membre
Messages : 455
Inscription : 16 avr. 2016, 12:02
Localisation : Strasbourg
Status : Hors-ligne

avec un truc du genre :

Dans le .bashrc

Code : Tout sélectionner

function mon_dd() {
   echo "$@"
   if echo "$@" | grep "of=/dev/sda"; then
      echo "Arrêt, écriture sur sda !"
      return
   fi
   echo "Execution de dd"
   ...
   ...
}

alias dd=mon_dd

}
Et une petite remarque de plus pour le .bashrc. Si tu utilises dd avec sudo ou en root, il faut modifier le .bashrc de root et pas celui de ton user
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 426
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Ah, du code ! Voici une fonction toute faite qui interdit l'écriture sur /dev/sda et qui demande confirmation avant l'exécution

Code : Tout sélectionner

function safe_dd {
    OPTIND=1
    if=""
    of=""

    # Parse if= and of=
    for i in "$@"
    do
        case $i in
            if=*)
                IF_opt="${i#*=}"
                ;;
            of=*)
                OF_opt="${i#*=}"
                ;;
            *)
                echo "Unknown option: " $i
                ;;
        esac
    done

    # Check of= is not /dev/sda then run dd
    if [[ $OF_opt == "/dev/sda"* ]]
    then
        echo "Something nasty is about to happen. Abort!"
    else
        echo "Command to run: dd if="$IF_opt" of="$OF_opt
        echo "Write from" $IF_opt "to" $OF_opt
        read -r -p "Confirm? [y/n]" answer
        case $answer in
            [yY][eE][sS]|[yYoO])
                dd if=$IF_opt of=$OF_opt
                ;;
            *)
                echo "Abort!"
                ;;
        esac
    fi
}
Il n'y plus qu'à mettre ça dans un fichier, à le sourcer, et à créer un alias. (Et éventuellement à ajouter le support d'autres arguments.)
Avatar de l’utilisateur
Grhim
Membre très actif
Membre très actif
Messages : 1389
Inscription : 30 mai 2016, 01:00
Localisation : kekparr'par'là
Status : Hors-ligne

merci a vous tous

les deux script sont super interressant , je vais les tester !!

pour celui de vohu c'est donc une fonction bash, ok
vohu a écrit : ... Si tu utilises dd avec sudo ou en root, il faut modifier le .bashrc de root et pas celui de ton user
pour le coup ca, je le savais :icon_biggrin:
Dunatotatos a écrit :Ah, du code ! Voici une fonction toute faite qui interdit l'écriture sur /dev/sda et qui demande confirmation avant l'exécution
meeerciii , c'est ce qu j'avais en tete , je modifierais juste la fonction echo a ma sauce :)
c'est bien du bash aussi ??
Dunatotatos a écrit : Il n'y plus qu'à mettre ça dans un fichier, à le sourcer, et à créer un alias. (Et éventuellement à ajouter le support d'autres arguments.)
...le sourcer, c'est bien la meme chose que compiler ?!! on est d'accord ?! :017:
Debian Stable + Testing -.- Parrot OS - Kali Exegol -.- Raspberry IPFire
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 426
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Oui, c'est bien du Bash. D'ailleurs pas POSIX, ni portable, à cause de la manipulation des chaîne de caractères.

Et non, sourcer n'est pas compiler. Ce que j'ai écrit est une simple définition de fonction. Si tu copies cette définition dans ton terminal, la fonction est définie et devient utilisable.
Si tu mets cette fonction dans un fichier et que tu exécutes le fichier via

Code : Tout sélectionner

./define_func.sh, ou sh define_func.sh
la fonction ne sera pas définie dans ton terminal (parce-que ton terminal va créer un nouveau environnement vierge, définir la fonction dans cet environnement, puis détruire le nouvel environnement). Pour éviter ce problème, tu "sources" le fichier :

Code : Tout sélectionner

source define_func.sh
La commande source (ou . en sh) ne crée pas de nouveau processus, mais charge le contenu du fichier dans l'environnement courant. Du coup, la fonction devient définie dans ton terminal.
Avatar de l’utilisateur
Grhim
Membre très actif
Membre très actif
Messages : 1389
Inscription : 30 mai 2016, 01:00
Localisation : kekparr'par'là
Status : Hors-ligne

Dunatotatos a écrit :Oui, c'est bien du Bash. D'ailleurs pas POSIX, ni portable, à cause de la manipulation des chaîne de caractères.
.
ok , merci pour la confirme :023:
Dunatotatos a écrit :
Et non, sourcer n'est pas compiler. Ce que j'ai écrit est une simple définition de fonction. Si tu copies cette définition dans ton terminal, la fonction est définie et devient utilisable.
et donc si je recopie cette definition dans le terminal , au prochain reboot, elle ne seras plus presente, mais justement en faisant le fichier et que je le source

Code : Tout sélectionner

source define_func.sh
, elle seras bien en fonction au prochain reboot , j'ai tout bien compris ?!

ps: je met ce fichier dans mon /home ?

pss: je peux donc le

Code : Tout sélectionner

$ chmod +x define_func.sh
?
Debian Stable + Testing -.- Parrot OS - Kali Exegol -.- Raspberry IPFire
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 426
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Sourcer reviens à faire un copier-coller du contenu du fichier dans ton terminal. Donc même si tu le sources, au prochain reboot, la fonction ne sera plus définie. Ni même si tu ouvres un nouveau terminal, d'ailleurs.
Pour faire ça proprement, tu as deux possibilités :
* tu copies la définition de la fonction dans /etc/bashrc ;
* tu mets la définition de la fonction dans un autre fichier et tu sources ce fichier dans ton /etc/bashrc (source /path/to/fichier)
La différence entre les deux est minimes. Dans un cas, à l'ouverture du terminal, le fichier bashrc est interprété, et donc définie la fonction. Dans l'autre cas, le fichier bashrc est interprété, et lors de l'interprétation, le fichier /path/to/fichier est lu pour être lui aussi interprété.
Avatar de l’utilisateur
Grhim
Membre très actif
Membre très actif
Messages : 1389
Inscription : 30 mai 2016, 01:00
Localisation : kekparr'par'là
Status : Hors-ligne

oooOOOoook, moi j'etais carrement parti sur un fichier sh a chmoder et tout le tralala :005:
Dunatotatos a écrit : * tu copies la définition de la fonction dans /etc/bashrc ;
* tu mets la définition de la fonction dans un autre fichier et tu sources ce fichier dans ton /etc/bashrc (source /path/to/fichier)
La différence entre les deux est minimes. Dans un cas, à l'ouverture du terminal, le fichier bashrc est interprété, et donc définie la fonction. Dans l'autre cas, le fichier bashrc est interprété, et lors de l'interprétation, le fichier /path/to/fichier est lu pour être lui aussi interprété.
oui c'est ce qu'il y a de marquer dans le bashrc , il faut creer un .bash.aliases

Code : Tout sélectionner

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

ce que j'ai fait pour le test du code donner par vohu

je vais donc pouvoir enfin tester le tiens Duna* desolé de mon erreur :042:
Debian Stable + Testing -.- Parrot OS - Kali Exegol -.- Raspberry IPFire
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 426
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Grhim a écrit :desolé de mon erreur :042:
Pas de souci, j'ai aussi galéré sur la notion de sourcing quand j'ai découvert ça.
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

Je vais mentionner une approche totalement différente des bidouilles à base de wrapper qui ont l'inconvénient de ne marcher que sur une commande particulière (on peut utiliser cp au lieu de dd), une syntaxe particulière (on peut utiliser "> fichier" au lieu de "of=fichier") et sur un nom de périphérique et pas les liens symboliques qui pointent vers lui (à moins d'utiliser readlink pour obtenir le nom de périphérique canonique), et supposent la prise en compte d'un fichier bashrc, ce qui n'est pas toujours le cas selon la façon dont le shell est invoqué.

Il est possible de mettre un périphérique bloc en lecture seule avec

Code : Tout sélectionner

blockdev --setro /dev/sda
Détail rigolo et important, cela ne s'applique qu'à l'écriture dans le périphérique entier et non dans ses partitions. Cela s'applique même à root car il ne s'agit pas d'une permission Unix mais d'une propriété du périphérique.
Avatar de l’utilisateur
vohu
Membre
Membre
Messages : 455
Inscription : 16 avr. 2016, 12:02
Localisation : Strasbourg
Status : Hors-ligne

PascalHambourg » Je viens de tester, et je peux toujours écrire sur sda :/

Code : Tout sélectionner

# blockdev --setro /dev/sda
# echo "ok" > test
# sync
# cat /test 
ok 
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

Relis le dernier paragraphe de mon message précédent.

D'autre part, un test rapide semble indiquer que l'écriture via un système de fichiers déjà monté ne soit pas affectée par le passage en read-only du périphérique qui le contient, contrairement à l'écriture directe dans le périphérique. En revanche si le système de fichiers est monté après le passage en read-only, il sera monté en lecture seule.
Avatar de l’utilisateur
sv0t
Membre actif
Membre actif
Messages : 534
Inscription : 30 avr. 2016, 12:06
Localisation : Charente-Maritime
Status : Hors-ligne

PascalHambourg a écrit : Il est possible de mettre un périphérique bloc en lecture seule avec

Code : Tout sélectionner

blockdev --setro /dev/sda
Détail rigolo et important,
PascalHambourg se met à l'humour... :biggrin:
Répondre