web-dev-qa-db-fra.com

Trucs de sécurité de ligne de commande

La ligne de commande et les scripts sont dangereux. Faites une petite faute de frappe avec RM -RF et vous êtes dans un monde de blessures. Confondre Prod avec étage au nom de la base de données lors de l'exécution d'un script d'importation et que vous êtes désossé (s'ils sont sur le même serveur, ce qui n'est pas bon, mais arrive). Même chose pour remarquer trop tard que le nom du serveur où vous êtes ashed n'est pas ce que vous pensiez que c'était après avoir joué des commandes. Vous devez respecter le Hole Hawg .

J'ai quelques petits rituels avant de courir des commandes risquées - comme faire un triple retenue du serveur que je suis sur. Voici un article intéressant sur la sécurité RM .

Quels petits rituels, outils et astuces vous empêchent de sécurité sur la ligne de commande? Et je veux dire des choses objectives, comme "première course LS FOO *, regardez la sortie de cela, puis remplacez LS avec RM -RF pour éviter d'exécuter RM -RF FOO * ou quelque chose comme ça", ne vous assurez pas que vous savez ce que commande fera ".

34
deadprogrammer

L'un qui fonctionne bien consiste à utiliser différentes couleurs d'arrière-plan sur votre coquille pour les serveurs Prod/Staging/Test.

45
andyhky

Avoir un plan de retour à l'esprit avant de commencer.

  • Zip up un fichier/un répertoire au lieu de la supprime tout de suite
  • définissez le routeur (Cisco) pour redémarrer dans "X" Nombre de minutes et ne pas "wr" tout de suite
  • assurez-vous que l'interface que vous modifiez n'est pas celle que vous avez entrée sur le système. Cela pourrait être l'interface de routeur que vous Telnet'd ou le port Ethernet vnc'd à.
  • ne vous connectez jamais comme "racine"
  • faire une sauvegarde. Vérifiez que c'est bon. en faire un autre.
  • demandez à quelqu'un que vous avez confiance 'Suis-je sur le point de faire quelque chose d'idiot ici?
14
Peter

Celui-ci est spécifique à Windows PowerShell.

En tant que politique, nous ajoutons les suivants de la machine Profile.PS1 sur chaque serveur. Cela garantit que ce qui suit est vrai:

  1. Les fenêtres de la console PowerShell admin ont une couleur de fond rouge foncé
  2. Administrateur est ajouté au titre
  3. Le message "AVERTISSEMENT: PowerShell fonctionne comme administrateur." est écrit au démarrage
  4. La barre de titre est préfixée avec "Administrateur:"
  5. Les utilitaires standard (comme les scripts d'entreprise, VIM et INOZIP) sont sur le chemin.
 $ courrielprincipal = nouveau-objet Security.PRINCIPAL.WindowsPRINCIPAL ([Security.Prinipal.WindowSsidentialité] :: GetCurrent ()) [.____] & {
 Si ($ actuel. Security.Prinipal.windowsBuiltInrole] :: Administrateur)) [.____] {[.____] (Get-Host) Write-host "AVERTISSEMENT: PowerShell est en train d'exécuter comme administrateur.`n" [.____]} 
 [.____] $ utilitaires = $ null [. ____ * 8 -eq 64) 
 {[.____] $ host.ui.rawui.windowtitle = "Windows PowerShell (X64)" [.____] Utilitaires $ = "$ {env: programmages }\Utilitaires "[.____]} [.____] [.____] [.____] {[.____] {[.____] $ host.ui.rawui.windowtitle =" Windows PowerShell (X86) "[.____] = "$ {env: programfiles}\utilitaires" [.____]} [.____]} [ "\\"))))) 
 {
 $ env: path = "$ utilitaires; $ {env: chemin} "
} [.____]} [.____] 
 
 Invite de fonction [.____] {[.] Si ($ actuelle .Principal.windowsbuiltInrole] :: Administrateur)) 
 {
 if (! $ Host.ui.rawui.windowtitle.startwith ("____.] {$. Ui.rawui.windowtitle = "Administrateur:" + $ host.ui.rawui.windowtitle} [.____]} 
 'ps' + $ ($) }) + '>' 
} 
10
Brian Reiter

J'ai une solution de faible technologie à certaines d'entre elles.

J'ai développé une habitude inate de faire ce qui suit (lors de la planification de travail en tant que root):

  • Tout d'abord, connectez-vous en tant qu'utilisateur normal, puis en utilisant Sudo su - root Pour passer à la racine. Je fais cela comme une préparation mentale, un rappel pour moi que je suis mentalement entré dans une zone très dangereuse et que je devrais être alerte et sur ma garde à tout moment. Drôle comme ça sonne, ce petit rituel seul me sauve une tonne de chagrin en renforçant simplement que Je ne peux pas être négligée.
  • Chaque commande est typée mais la touche [renvoie] est jamais pressé. jamais.
  • aucune commande est jamais exécuté sans compréhension Exactement Qu'est-ce que ça fait. Si vous Faites cela sans savoir ce que cela fait, vous jouez roulette russe avec votre système.
  • Avant Appuyez sur la touche [RETURN], la commande qui a été frappée sur la CLI est soigneusement examinée par l'œil. S'il y a une hésitation, tout indice de problème potentiel, il est à nouveau réexaminé. Si cette hésitation persiste, la commande est laissée sur la ligne et I Alt-F2 à une autre console pour consulter les pages de l'homme, etc. Si lors d'une session graphique, je lance un navigateur et faites des recherches.
  • Aucun utilisateur commun n'est jamais remis Sudo sur mes systèmes, non Parce que je suis un bofh , mais parce que, sans préparation et entraînement, c'est comme si donner un pistolet chargé à un singe. C'est amusant et amusant au début, jusqu'à ce que le singe regarde le tonneau et les serre ...

Lorsque vous utilisez RM, j'ai toujours cd au répertoire en premier, puis utilisez un préfixe de ./ Pour vous assurer que le répertoire est correct, c'est-à-dire.

cd /usr/some/directory ; rm ./targetfile

ou je spécifie tout le chemin du fichier

rm /usr/some/directory/targetfile

qui est un pita mais ... meilleur sûr que désolé.

10
Avery Payne

Je peux être d'accord avec toutes les réponses ci-dessus, mais je dois souligner cette astuce très importante:

Sachez quand éviter le multitâche.

6
ojblass

Je m'assure que le nom d'hôte du système que je suis sur est dans l'invite Bash (ou autre Shell). Si je suis chrooté, je m'assure que cela en fait d'une manière ou d'une autre.

J'étais autrefois installé un système gentoo à partir d'une autre distribution en direct Linux et j'allais accidentellement une commande plutôt destructive (je ne peux pas me rappeler ce qu'il était guichet automatique - une variante de rm) dans la mauvaise coquille, causant une bouquet de choses Sur le système en direct pour être supprimé, plutôt que des trucs de la chroot. À partir de là, j'ai toujours fait

export PS1="(chroot) $PS1"

chaque fois que je travaillais dans un chroot.

5
Tim

Règle 1 - Faire des sauvegardes

Règle 2 - JAMAIS Ajouter des emballages "Molly Guard" aux commandes standard, faites votre propre version, sûre, mais ne prenez pas le nom, ça va Il suffit de vous mordre lorsque vous êtes sur un système que vous n'avez pas installé.

Des astuces d'invite comme une couleur différente pour les arbres de répertoire racine et (partielle) sont de grands aides, mais encore une fois, assurez-vous que vous pouvez travailler sans eux.

4
LapTop006

Si vous ne l'avez pas fait déjà alias rm à rm -i

4
trent

Cela peut sembler contre-intuitif et moins "Ardkore, mais le meilleur conseil de sécurité de la ligne de commande que j'ai est: Si une alternative en mode GUI est disponible et pratique, puis utilisez-la.

Pourquoi? Assez facile. Le mode interface graphique dispose généralement d'un filet de sécurité intégré, sous forme d'avertissement - vous êtes sur le point de rattraper la Freeblefrop, êtes-vous sûr de vouloir faire cela? " Même si non, cela vous ralentit, donnant plus de place pour le temps de réflexion. Cela vous permet de vérifier plus facilement les options avant de vous engager, vous pouvez la capture d'écran avant et après les États, cela vous protège des fautes de frappe; Toutes les bonnes choses utiles et utiles.

Dans le cas classique du redouté "RM -RF", pensez-vous qu'il est plus facile de le délivrer accidentellement d'une interface graphique ou d'une CLI?

En fin de compte, il n'y a aucune honte dans le recours à l'interface graphique. Cela n'empêchera pas d'infaillibilité les catastrophes majeures; Il est tout aussi possible d'être heureux-heureux dans une interface graphique comme dans une CLI; Mais si cela vous fait économiser une fois, il s'est avéré lui-même.

4
Maximus Minimus

Au lieu d'aliaser RM à RM -i, cela ne serait-il pas préférable d'alias de dire enlever ou de Saferemove (et utilisez-les comme votre outil de suppression préféré). Ensuite, lorsque vous utilisez une boîte qui n'a pas été configurée, aucun dommage n'est fait.

3
DBMarcos99

Utilisez le bon sens et ne gérez pas les commandes que vous ne comprenez pas. C'est tout bon conseil. Si vous avez envie de vous alourdir d'écrire le chemin absolu de tout ce que vous passez à la RM, ou de courir quoi que ce soit via sudo, n'hésitez pas. Je préférerais Su -c alors. Au moins, cela ne cache pas le mot de passe. Je ne me sentirais pas à l'aise avec un utilisateur régulier autorisé à exécuter des objets avec des privilèges root sans vérification de mot de passe.

Il y a quelques choses que vous pouvez mettre dans votre ~/.CASHRC pour rendre les choses un peu plus sûres, telles que:

alias srm='rm -i'

Vous permettant d'avoir une alternative sûre de RM, ...

Mais à la fin, vous pouvez et va toujours bousiller. L'autre jour, j'ai eu un script de configuration de défunt chât mon dossier complet/usr/bin, rompant plusieurs choses. Oui, une simple "installation" de tout type de logiciel avec un bogue, peut casser votre système. Vous n'êtes jamais en sécurité, tout ce que vous faites. Ce que je reçois, c'est la chose la plus importante:

Gardez des sauvegardes régulières.

3
jns

Assurez-vous de ne jamais exécuter la commande que vous trouvez en ligne à moins que vous ne comprenez pleinement ce qu'ils font.

Votre système peut être différent de celui de l'affiche et cela pourrait causer un monde de blessures.

2
jjnguy

Une perspective de la ligne de commande d'un point de vue UNIX/Linux est une utilisation appropriée du compte root.
Un RM -RF en tant que root est généralement plus dangereux que comme utilisateur, et en utilisant des objets intégrés tels que sudo plutôt que de se connecter en tant que root est vital. Un bel whoami simple aidera généralement à la schizophrénie ou à plusieurs personnalités.

Cela et de l'écho à la préparation des commandes en filechangeing, surtout si vous souhaitez vous assurer que vous avez une correspondance GLOB ou REGEX.

2
Andy
# Allow only UPDATE and DELETE statements that specify key values
alias mysql="mysql --safe-updates"`

Un alias fortement recommandé d'avoir autour si vous utilisez jamais le CLI MySQL.

2
jldugger

Avoir une connexion secondaire dans la machine que vous travaillez peut être pratique au cas où vous tueriez votre session principale ou faire quelque chose de stupide qui le verrouille ... Traitement lourd, etc.

De cette façon, vous avez toujours accès à la machine et vous pouvez tuer votre session principale.

La plupart des commentaires ci-dessus font référence à la RM, mais j'ai aussi fait des choses stupides avec d'autres commandes ...

ifconfig à descendre le réseau - Ouch, qui nécessite une présence physique pour réparer.

En ce qui concerne les scripts, je travaille généralement dans deux fenêtres. Le premier que j'utilise pour écrire le script, la seconde pour tester chaque ligne lorsque je l'écris. Aller lentement et avec précaution, je peux m'assurer que chaque ligne fonctionne comme je m'attends à l'écriture du code, en prenant soin de maintenir les mêmes variables, etc.

Personnellement, je ne trouve pas les invites supplémentaires pour des choses comme RM -i Aide vraiment. Je fais la plupart de mes erreurs quand v. Fatigué, stressé, etc., qui sont les moments où je vais simplement frapper Y et ignorer l'invite de toute façon. Mauvaise pratique peut-être.

2
Alex

Si vous utilisez plusieurs variantes d'un système d'exploitation, soyez très au courant des différences de syntaxe; Ce qui est raisonnablement sûr sur une variante Unix est extrêmement dangereux dans un autre.

Exemple: killall

Linux/FreeBSD/OSX - Tue tous les processus correspondant au paramètre passé. Par exemple: "Killall Apache" tue toutes les aplaches, laissant tous les autres processus seulement.

Solaris - Kills Tous processus. Pas vraiment. De la page Man : Killall est utilisé par l'arrêt (1M) pour tuer tous les processus actifs non directement liés à la procédure d'arrêt.

1
Greg Work

Au lieu de ls, j'utilise Echo pour que je puisse voir la commande complète après que la coquille ait tout étendu. En outre, toujours deux variables de devis qui représentent des fichiers afin que votre substance fonctionne avec des noms de fichiers pouvant avoir des onglets ou des espaces.

1
Kyle Brandt

Une excellente façon de vous faire penser à ce que vous faites est d'ajouter quelque chose comme ça à la racine de la racine (CSHRC, quoi que ce soit):

unset PATH

De cette façon, vous devez faire/bin/rm au lieu de "RM". Ces caractères supplémentaires pourraient vous faire penser.

1
Bill Weiss

Pour une regex complexe, surtout les commandes "Trouver" mettez-en écho devant et les capturer à un fichier. Ensuite, vous pouvez vérifier que vous supprimez/déménage/etc exactement ce que vous pensez être avant d'exécuter le fichier avec "source".

Il est également pratique d'ajouter manuellement ces cas de bord que la regex n'a pas ramassé.

1
Martin Beckett

utilisateur racine:
Ne soyez pas root à moins que vous ne l'iez.
[.____] Si le fournisseur dit qu'il doit fonctionner en tant que root, dites-leur que vous êtes le client et que vous souhaitez l'exécuter sous forme de root.
[.____] Combien de paquets logiciels sur l'étagère veut une racine 'juste parce que c'est plus facile?

habitude:
[.____] N'utilisez jamais '*' avec Supprimer sans le regarder trois fois il est préférable de construire l'habitude d'utiliser LS -L TargetPattern , puis utilisez-le! $ '. La plus grande menace n'est pas d'où vous pensez être. I presque Tapez "nom d'hôte" aussi souvent que "LS"!

béquilles:
[.____] Une invite standard aide beaucoup, de même que les alias comme "alias rm =" rm -i "", mais je n'ai souvent pas de contrôle total sur les machines que je suis alors que j'utilise un Attendez-vous à Script Wrapper simplement pour définir votre chemin, votre invite et votre alias avec '-i'

trouver des problèmes:
[ endommager, etc:
exemple: cd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
[.____] L'utilisation de '&&' peut empêcher un fichier de goudron d'être extraite sur lui-même dans ce cas (si dans ce cas, "rsync" serait mieux)

supprime:
[.____] Ne supprimez jamais de manière récursive si vous pouvez l'aider, surtout dans un script. Trouvez et supprimez avec -Type F et -Name 'Motif' Je vis toujours dans la peur de nourrir "Rien" à Xargs ... goudron et endommager pour déplacer des trucs autour (utilisez RSYNC à la place)

1
ericslaw

J'évite le * Glob comme son propre argument chaque fois que possible. Même si je veux vraiment dire "supprimer tout dans ce répertoire", j'essaie d'être plus précis, c'est-à-dire. rm *.php. C'est un contrôle préemptif des dommages au cas où j'exécuterai accidentellement la même commande de l'histoire dans un autre répertoire.

1
Annika Backstrom

Dans le cas de quelque chose comme:

ls * .php
[.____] echo rm * .php
[.____] RM * .php

Vous pouvez utiliser l'opérateur de substitution, comme celui-ci:
[.____] $ ls * .php
[.____] <DIR LISTE>

$ ^ LS ^ ECHO RM (ceci remplace LS dans la commande précédente avec ECHO RM, en gardant le reste de la ligne de commande identique)

$ ^ ECHO RM ^ RM (remplacez Echo RM avec juste RM, vous n'avez donc pas à retaper * .php et à lancer dans un espace au mauvais moment)

^ = Maj-6, pour ceux qui ne sont pas familiers avec elle.

0
Red Five

Exécution de la commande avec ECHO est une bonne idée, mais il est toujours sujet à des fautes de frappe.

Essayez d'utiliser avec une expansion telle que! $.

echo foo*
rm -rf !$

Le! $ Se développe au dernier mot de la dernière commande, donc c'est équivalent à

echo foo*
rm -rf foo*

Il y a aussi! *, Qui se développe à tous les arguments à la dernière commande.

En effet, vous pouvez le faire de cette façon si vous préférez

echo rm -rf foo*
!*

(Si vous utilisez KSH, ne pas bash, vous pouvez taper la période ESC + pour insérer le dernier mot à la place.)

0
Mikel

À la place de

rm foo*

utilisation

rm -i foo*

Ceci est pratique avec une poignée de fichiers, mais pas avec, disons, une tagère entière. C'est pourquoi l'aliasing rm ira sur votre chemin.

0
gbarry

Utilisez Bash et Set PS1 = '\ U\H:\w>'. Cela se développe au nom d'utilisateur @ hostname:/complet/travail/chemin/chemin> Comme mentionné dans d'autres réponses, vous pouvez utiliser pour configurer l'environnement chaque fois que vous vous connectez si vous ne pouvez pas mettre à jour les fichiers .profile ou .bash_profile. Changer les couleurs de fond est facilement la meilleure réponse cependant :-)

0
dr-jan