J'ai écrit un script CGI Python qui appelle des bash
commandes, et il doit tester une connexion réussie sur l'hôte.
Comment puis-je écrire un test pour cela?
Par exemple, pourrais-je créer un bash
script qui teste une combinaison de nom d'utilisateur et de mot de passe donnée contre l'utilisateur enregistré sur l'hôte?
login
programme.Réponses:
L'utilisation de PAM est la meilleure solution. Vous pouvez écrire un petit code C, ou installer un package python-pam et utiliser un script python fourni avec le package python-pam. Voir
/usr/share/doc/python-pam/examples/pamtest.py
la source
/usr/share/doc/packages/python-pam/examples/pamtest.py
Le script pamtest.py peut être utilisé pour tester les informations d'identification sur les systèmes utilisant PAM pour l'authentification, est inclus dans le paquet python-pam (qui nécessite python), et dans certaines distributions le chemin complet est/usr/share/doc/python-pam/examples/pamtest.py
.La bonne approche pour tester si un utilisateur peut se connecter consiste à se connecter en tant que cet utilisateur.
Donc, ce que je recommande, c'est d'utiliser le script CGI
expect
pour exécutersu
, de passer un mot de passe et d'exécuter la commande qui doit être exécutée. Voici un brouillon d'un script expect qui fait exactement cela (avertissement: absolument non testé, et je ne parle pas couramment expect). Remplacer par le nom d'utilisateur, le mot de passe et la commande (là où j'ai écritbob
,swordfish
etsomecommand
); assurez-vous de citer correctement.Si vous ne voulez vraiment pas exécuter la commande via une couche de
su
(par exemple parce que ce que vous faites doit être effectué par le processus CGI lui-même), utilisez expect pour exécuter la commandetrue
et vérifiez que l'état de retour est 0.Une autre approche consisterait à utiliser PAM directement dans votre application, via la liaison PAM de Python .
la source
su -c true bob && echo success
dommage que su n'accepte pas le mot de passe comme argumentsu
partir du script CGI et il a besoin d'un terminal pour que cela fonctionne./bin/true
serait suffisant.Pour répondre plus spécifiquement: "Est-il possible de créer un script bash qui testera une combinaison de nom d'utilisateur et de mot de passe donnée contre l'utilisateur inscrit sur l'hôte?"
Oui.
la source
shadow
groupe, ce qui est très fortement déconseillé pour un CGI: vous auriez besoin d'une autre couche d'escalade de privilèges. Et vous supposez un algorithme de hachage de mot de passe particulier (pris en charge par openssl) et un emplacement de stockage de mot de passe (/etc/shadow
par exemple NIS ou LDAP) qui peuvent ou non être ceux réellement utilisés pour cet utilisateur particulier.Il y a une solution PAM 'C', 'Python' citée ici, permettez-moi de mettre celle en perl aussi :-)
Source: http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively ?
la source
Si vous avez un accès root, et que vous utilisez des mots de passe md5, et que vous avez juste besoin de comparer les mots de passe, vous pouvez utiliser le module perl Crypt :: PasswdMD5 . Prenez le MD5 Hash de / etc / shadow, supprimez le $ 1 $, puis divisez le reste. Champ 1 = sel, champ 2 = texte crypté. Puis hachez la saisie de texte dans votre CGI, comparez-la au texte crypté, et Bob est votre oncle.
la source
shadow
groupe, ce qui est très fortement déconseillé pour un CGI: vous auriez besoin d'une autre couche d'escalade de privilèges. Et vous supposez un algorithme de hachage de mot de passe particulier (MD5 et non bcrypt ou un autre algorithme recommandé) et un emplacement de stockage de mot de passe (/etc/shadow
par exemple NIS ou LDAP) qui peut ou non être celui réellement utilisé pour cet utilisateur particulier.Après quelques recherches, j'ai écrit ce programme C qui peut être utilisé à partir du script
Vous le compilez avec:
Vous pouvez l'utiliser comme
la source
shadow
groupe, ce qui est très fortement déconseillé pour un CGI: vous auriez besoin d'une autre couche d'escalade de privilèges. Et vous supposez un algorithme de hachage de mot de passe particulier (pris en charge par openssl) et un emplacement de stockage de mot de passe (/etc/shadow
par exemple NIS ou LDAP) qui peuvent ou non être ceux réellement utilisés pour cet utilisateur particulier. Utilisez PAM, il connaît son métier.Puisque vous avez mentionné que vous utilisez CGI en python, il est probablement approprié de supposer que vous utilisez Apache comme serveur httpd. Si c'est le cas, laissez le processus d'authentification de votre programme à Apache et laissez uniquement les personnes authentifiées exécuter vos scripts / programmes cgi.
Il existe de nombreux modules qui peuvent faire l'authentification pour vous sur Apache, cela dépend vraiment du type de mécanisme d'authentification que vous recherchez. La façon dont vous avez cité la question semble être liée à l'authentification du compte hôte local basée sur / etc / passwd, les fichiers shadow. Le module qui vient à ma recherche rapide à ce sujet est
mod_auth_shadow
. L'avantage est que vous autorisez une personne faisant autorité (exécutée sur le port de privilège 80) à authentifier l'utilisateur / mot de passe pour vous et que vous pouvez compter sur des informations authentifiées de l'utilisateur pour exécuter les commandes au nom de l'utilisateur, si nécessaire.De bons liens pour commencer:
http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2
http://mod-auth-shadow.sourceforge.net/
http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu
Une autre approche consiste à utiliser le module SuEXEc d'Apache, qui exécute des processus (programmes cgi) au nom de l'utilisateur authentifié.
la source
Ce code utilisant PAM a fonctionné pour moi:
la source
La meilleure chose que vous puissiez faire, si vous avez besoin d'un script pour vous connecter à un hôte, est de configurer une clé ssh entre les hôtes.
Lien: http://pkeck.myweb.uga.edu/ssh/
J'ai quasiment retiré cela de la page
Tout d'abord, installez OpenSSH sur deux machines UNIX, rapidement et massivement. Cela fonctionne mieux en utilisant les clés DSA et SSH2 par défaut pour autant que je sache. Tous les autres HOWTO que j'ai vus semblent traiter des clés RSA et SSH1, et les instructions ne fonctionnent pas, sans surprise, avec SSH2. Sur chaque machine, tapez ssh somemachine.example.com et établissez une connexion avec votre mot de passe habituel. Cela va créer un répertoire .ssh dans votre répertoire personnel avec les perms appropriés. Sur votre machine principale où vous voulez que vos clés secrètes vivent (disons rapidement), tapez
Cela vous demandera une phrase secrète. S'il s'agit de votre clé d'identité principale, assurez-vous d'utiliser une bonne phrase secrète. Si cela fonctionne correctement, vous obtiendrez deux fichiers appelés id_dsa et id_dsa.pub dans votre répertoire .ssh. Remarque: il est possible d'appuyer simplement sur la touche Entrée lorsque vous êtes invité à saisir une phrase secrète, ce qui créera une clé sans phrase secrète. Ceci est une mauvaise idée ™ pour une clé d'identité, alors ne le faites pas! Voir ci-dessous pour l'utilisation des clés sans mots de passe.
Copiez le fichier id_dsa.pub dans le répertoire .ssh de l'autre hôte avec le nom authorized_keys2. Burly est maintenant prêt à accepter votre clé ssh. Comment lui dire quelles touches utiliser? La commande ssh-add le fera. Pour un test, tapez
Cela démarrera l'agent ssh, ajoutera votre identité par défaut (vous demandant votre phrase secrète) et générera un shell bash. À partir de ce nouveau shell, vous devriez pouvoir:
Vous devriez pouvoir vous connecter
la source