script shell: utiliser sudo dedans vs l'exécuter avec sudo?

13

Lors de l'écriture d'un script shell, dans lequel certaines commandes, mais pas toutes, nécessitent des privilèges de superutilisateur, dois-je

  • ajoutez sudo aux commandes qui nécessitent des privilèges de superutilisateur et exécutez le script shell sans sudo, ou

  • n'ajoutez pas sudo aux commandes qui nécessitent des privilèges de superutilisateur, mais exécutez le script shell avec sudo?

Dans le deuxième cas, je n'aurai besoin de fournir mon mot de passe qu'une seule fois, mais toutes les commandes du script seront exécutées avec des privilèges de superutilisateur, y compris les commandes qui n'en ont pas besoin.

Dans le premier cas, il se peut que je doive fournir mon mot de passe plusieurs fois pour différentes commandes sudo, tandis que les privilèges de superutilisateur ne sont accordés qu'aux commandes qui en ont besoin.

Pour des raisons de sécurité, la première solution est meilleure. Pour plus de commodité, la deuxième façon est meilleure.

  1. J'ai pensé à adopter la première voie. Je dois donc faire face à l'inconvénient de fournir mes mots de passe à plusieurs commandes sudo dans le script shell.

  2. Stephen Harris a écrit :

    Un script bien écrit détecterait s'il s'exécutait avec les bonnes autorisations et n'appelait pas du tout sudo, mais il y a beaucoup de mauvais scripts

    Dois-je donc utiliser la deuxième façon? Si c'est le cas,

    • comment puis-je écrire "le script détecterait s'il s'exécutait avec les bonnes autorisations et n'appellerait pas du tout sudo"?

    • comment puis-je améliorer sa sécurité pour éviter le problème d'accorder des privilèges de superutilisateur à des commandes qui n'en ont pas besoin lors de l'exécution du script avec sudo?

  3. Cette approche simple aurait-elle le meilleur des deux: ajouter sudo aux commandes qui en ont seulement besoin, et exécuter le script avec ou sans sudo selon que je veux la commodité ou la sécurité? Cette approche a-t-elle un problème?

Merci.

Tim
la source
Je pensais sudoavoir un cache d'informations d'identification par défaut. Est-ce désactivé sur votre plateforme?
pipe
@pipe Son script peut être en sommeil pendant un certain nombre de fois par exemple, et ainsi le cache pourrait ne pas fonctionner.
LinuxSecurityFreak

Réponses:

15

Pour résoudre votre premier problème:

comment puis-je écrire "le script détecterait s'il s'exécutait avec les bonnes autorisations et n'appellerait pas du tout sudo"?

Il y a une vérification simple et POSIX pour root:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

Alternativement, dans Bash, plus de codeurs axés sur les performances pourraient vouloir utiliser:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

Notez que j'ai intentionnellement enveloppé le code dans des fonctions à réutiliser.

Pour résoudre votre deuxième problème:

comment puis-je améliorer sa sécurité pour éviter le problème d'accorder des privilèges de superutilisateur à des commandes qui n'en ont pas besoin lors de l'exécution du script avec sudo?

Vous ne pouvez pas faire grand-chose à ce sujet. Au moins, rien ne me vient à l'esprit. Si j'ai vu le script, je pourrais avoir des suggestions. Mais puisque vous ne l'avez pas inclus dans votre question ... Si vous exécutez le script entier avec sudoou comme root, je ne vois aucun moyen de contrôler cela.

Pour répondre au commentaire:

Que pensez-vous de "utiliser sudo dedans vs l'exécuter avec sudo"

Dans mes scripts, je procède généralement avec cette dernière approche, mais cela ne signifie pas nécessairement que je vous la recommande. Parce que cela dépend de qui le script est destiné - pour rootseulement; pour l'utilisateur principalement à l'exception d'avoir certains utilisateurs ayant des sudodroits; vous devrez littéralement inclure votre script dans la question pour que je puisse répondre avec n'importe quelle valeur.

LinuxSecurityFreak
la source
sudo -u "$SUDO_USER" command...?
Michael Homer
Merci. Que pensez-vous de "utiliser sudo dedans vs l'exécuter avec sudo"?
Tim
Merci. Cette approche simple aurait-elle le meilleur des deux approches: ajouter sudo aux commandes qui en ont seulement besoin, et exécuter le script avec ou sans sudo selon que je veux la commodité ou la sécurité? Cette approche a-t-elle un problème?
Tim
@MichaelHomer Je me demandais ce qui sudo -u "$SUDO_USER" commandest censé signifier ici?
Tim
@Tim Bien que je ne trouve aucun problème avec cette approche, quelqu'un pourrait objecter avec des arguments raisonnables. Cela sort vraiment du cadre de votre question initiale. Je dois faire ma sauvegarde mensuelle du M-Disc maintenant, donc je ne pense pas être encore disponible aujourd'hui, désolé pour cela. J'espère avoir répondu au moins au point principal. Rendez-vous demain.
LinuxSecurityFreak
-4

Je pense que je peux répondre à cela.

Dois-je donc utiliser la deuxième façon?

Il n'y a aucune raison pour que vous ayez un problème ici, c'est pourquoi:

S'il n'y a qu'une seule commande qui doit être exécutée en tant que root, alors runvotre programme en tant que rootou sudoparce que sudodans votre script est la route la plus longue. Avez-vous oublié que les programmeurs sont paresseux?

Si vous avez besoin de nombreuses commandes runas, rootexécutez-la comme rootou sudo.

comment puis-je améliorer sa sécurité pour éviter le problème d'accorder des privilèges de superutilisateur à des commandes qui n'en ont pas besoin lors de l'exécution du script avec sudo?

Si d'autres utilisateurs ont besoin de runvotre programme, configurez sudo-les car ils sudosont très personnalisables et répondront à vos besoins.

Voici un exemple avec sudo:

Toujours utiliser visudolors de l'édition du fichier sudoers .....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo est également idéal pour changer d'utilisateurs dans votre programme / script, voici une ligne d'un de mes scripts:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

comment puis-je écrire "le script détecterait s'il s'exécutait avec les bonnes autorisations et n'appellerait pas du tout sudo"?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
how-do-i-determine-if-a-shell-script-is-running-with-root-permissions

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

MODIFIER à la demande du gentleman @terdon:

Pensez à votre script de cette façon ....

Est-ce un script public (d'autres personnes que vous l'utiliserez) Que fait le script? Cela vous indique-t-il l'heure? Ou met-il à jour iptables sur 200 systèmes? Si seulement vous l'utilisez, est-ce lié au travail / professionnel ou est-ce pour un usage personnel?

Il vous suffit de savoir à l'avance en quoi consiste votre groupe d'utilisateurs, c'est tout.

Si c'est writtenpour donner ou vendre aux administrateurs, même alors, pourquoi ne devrait-on pas le scriptlaisser fonctionner comme root?? Quel mal cela peut-il faire?

Les vrais scripts / programmes s'exécutent souvent en tant qu'utilisateur privilégié et personne ne mentionne que ce n'est pas un problème, mais lorsque les programmeurs, principalement des novices comme moi, parlent de ces choses, alors c'est une véritable menace pour la sécurité ..... ce que le gars de votre message vous se référer à essaie de dire, mais non avec élégance, c'est que certaines personnes regardent le contrôle que vous avez sur le systemet votre code .... définissez-vous les fichiers avec plus d'autorisations que vous n'utiliserez, avez-vous toutes les vérifications dans votre logique ou un programmeur talentueux va-t-il voir des dangers dans votre code en y regardant simplement?

Si vous l' code needs rootutilisez sudo, et s'il y en a beaucoup, lancez-le comme root....... ma réponse se termine ici ouf

quelque chose quelque chose
la source
2
@somethingSomething pourriez-vous expliquer pourquoi vous recommandez de toujours exécuter le script en tant que root, même s'il n'y a qu'une seule commande qui nécessite des privilèges root? Vous donnez deux possibilités dans votre réponse (une commande nécessitant des privilèges root ou plusieurs) mais vous proposez la même chose pour les deux.
terdon
2
J'ai réfléchi à cette question et lu d'autres discussions similaires. Cette réponse me confond juste. (Mais, vous avez déjà suffisamment de votes négatifs.)
Joe