bit setuid sur le script python: Linux vs Solaris
Question
Je suis en cours d'exécution ce petit script python sur Linux et Solaris en tant qu'utilisateur privilégié non :
#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()
Avant d'exécuter, le bit setuid est défini sur le script (pas interpréteur Python):
chown root:myusergrp getuid.py
chmod 4750 getuid.py
Sur Solaris, le uid efficace est à cause du bit setuid:
uid,euid = 10002 0
Mais pas sur Linux:
uid,euid = 10002 10002
Notez que la version python est de 2,6 pour les deux Solaris et Linux
Est-il possibe d'avoir Python Linux travailler comme Python Solaris?
La solution
La plupart des distributions Unix normalement ne vous permettent pas d'utiliser setuid sur un fichier qui utilise un #! interprète. Solaris se trouve être celui qui permet en raison de son utilisation d'une mise en œuvre plus sûre que la plupart des autres distributions.
Voir cette FAQ pour plus d'arrière-plan pourquoi le mécanisme est si dangereux: Comment puis-je obtenir des scripts shell setuid au travail?
Voir ce lien pour plus de discussion et comment compiler un exécutable setuid qui exécutera votre script: setuid sur les scripts shell
La partie pertinente:
int main()
{
setuid( 0 );
system( "/path/to/script.sh" );
return 0;
}
Autres conseils
Je viens de mettre deux et deux ensemble aujourd'hui et est venu avec une solution alternative: cython --embed
.
Suivez les exemples au lien ci-dessus et vous obtiendrez de votre exécutables binaires Python que vous serez en mesure de chown
et chmod u+s
, complétant le cercle sans programme d'emballage.
Bien sûr, méfiez-vous des risques (de ce ou toute autre utilisation de setuid
) -bugs dans votre script peut entraîner des privilèges élevés sur le système.
Vous pourrait utiliser sudo pour obtenir ce que vous voulez. Il fonctionne comme des trucs différents utilisateurs:
sudo -u otheruser command
Les autorisations sont définies par l'utilisateur root en utilisant visudo. Les trucs de setuid / SetGuid ne semble pas appliquer aux scripts ou le shell sous Linux, le code compilé uniquement.