Puis-je toujours exécuter un script en tant que root?


27

Comment faire exécuter un script en tant que root, peu importe qui l'exécute?

J'ai lu sur setuid mais je ne sais pas comment faire.

J'utilise Linux, Ubuntu 12.04 LTS.


Sur quelle distribution Linux êtes-vous? Ou Unix, même?
slhck

@slhck Linux, Ubuntu 12
HappyDeveloper

3
setuidne fonctionnera pas sur les scripts - il est désactivé pour des raisons de sécurité sur la plupart des distributions * nix de nos jours. Vous pouvez le définir, mais il sera ignoré. Peut-être pouvez-vous expliquer davantage votre problème réel afin que nous puissions vous aider à le résoudre à la place? De quel script s'agit-il? Pourquoi avez-vous besoin qu'il soit exécuté en tant que root? Utilise sudoune alternative?
slhck

As-tu essayé sudo -s?
Nam Phung

Réponses:


29

Soyez très prudent: les scripts combinés avec setuid sont dangereux!

Tout d'abord, veuillez jeter un œil à cette question / réponses , en particulier à cette réponse et à cet avertissement de sécurité .

Si vous voulez toujours exécuter votre script avec setuidset, vous pouvez écrire un court programme C comme wrapper et définir le setuidbit sur le binaire compilé.

Exemple de wrapper:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Une autre solution utilisant sudo(mentionnée ici ):

  1. En tant que root, empêchez l'accès en écriture (et peut-être un autre) à votre script:

    racine chown /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Vérifiez que personne, à l'exception de root, ne peut remplacer le script , par exemple en modifiant les droits d'accès du dossier parent:

    racine chown / absolu / chemin / vers / votre /
    chmod 755 / absolu / chemin / vers / votre /
    
  3. Modifiez les droits d'accès sudo /etc/sudoersavec visudo:

    ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    Vous trouverez plus de détails sur les paramètres (par exemple, restreindre l'accès à des utilisateurs ou des groupes spécifiques) dans la page de manuel sudoers.

Ensuite, tous les utilisateurs peuvent exécuter le script en tant que root sans mot de passe:

sudo /absolute/path/to/your/script.sh

Ceci est similaire à l'utilisation de la solution wrapper / setuid ci-dessus.


3
Les dangers spécifiques ne sont pas très évidents, mais ils tournent fortement autour de l'environnement. Contrairement à la plupart des programmes, le comportement d'un script shell peut être modifié de manière significative par des dizaines de variables d'environnement, suffisamment pour que, sans protections étendues, un tel script puisse facilement être incité à exécuter du code arbitraire.
Stephanie

1
Vous devez ajouter un appel à clearenv () avant l'appel système dans ce wrapper, soufflant complètement l'environnement afin qu'aucun paramètre malveillant ne soit présent pour manipuler le script. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie

@Stephanie Je dois faire quelque chose de mal, car tout cela semble trop fou pour une tâche commune. Voici ce que j'essaie de faire: serverfault.com/questions/401405/…
HappyDeveloper

@HappyDeveloper Pas trop fou pour un script setuid, car un script mal sécurisé est un chemin d'accès root pour quiconque parvient à l'exécuter.
Stephanie

4
sudopeut être utilisé pour donner à tous les utilisateurs l'accès à un programme (ou script) particulier. En ce sens, il agit comme un wrapper setuid fantaisie. Il semble que ce soit généralement un meilleur choix que d'écrire votre propre wrapper setuid.
jjlin

4

Le moyen le plus simple et le plus sûr consiste à utiliser les bits SETUID dans les autorisations de fichier. de cette façon, les autorisations de commande seront élevées en autorisations de propriétaire de fichier.

pour empêcher le script de l'édition, ne définissez pas d'écriture pour tous les bits.


0

Je ne sais pas si cela peut être utile mais, pour que le script ne s'exécute qu'en tant que root, vous pouvez utiliser ce shebang sur la première ligne du script:

#!/bin/su root
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.