IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Vérifier la possession de droits administrateur sous Linux


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 36
    Par défaut Vérifier la possession de droits administrateur sous Linux
    Salut à tous

    Je voudrais savoir comment faire pour que mon application (sous Linux) vérifie qu'elle a les droits administrateur. J'ai pensé à utiliser la fonction getuid() pour vérifier si l'UID est à 0 mais je pense qu'il y a un moyen plus propre de faire la vérification.

    D'avance merci

  2. #2
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    pourquoi ? c'est propre getuid().

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 530
    Par défaut
    +1 pour Jenna.

    Cela dit, pourquoi as-tu besoin de faire cela ? Il n'y a pas de « droits administrateur » à proprement parler sous Unix. Il y a root qui a tous les pouvoirs sans exception, et les utilisateurs ordinaires. La distribution des droits se fait alors à l'aide des droits sur les fichiers ordinaires ou spéciaux car, sous Unix, « tout est fichier » (enfin, en principe, parce qu'avec le temps et les différents systèmes environnements tel que GNOME qui veulent tous vivre leur vie, le paradigme est de moins en moins suivi).

    Par contre, « root » n'est absolument pas la même chose que le compte « Administrateur » de Windows.

    Enfin, il est très rare que l'application ait à vérifier elle-même si elle a le droit ou pas d'accéder à une ressource. C'est quelque chose qui doit être complètement indépendant et relever de l'administration du système. Heureusement car, dans le cas contraire, cela voudrait dire que la gestion des droits est consultative et qu'il suffirait d'écrire une application C pour les contourner.

    Cela signifie également que tu risques d'empêcher l'utilisateur d'utiliser ton application dans des situations légitimes si tu ne les as pas explicitement prévues à l'avance.

    Si tu veux jouer avec getuid(), alors il faut aussi surveiller geteuid(), car c'est le seul état qui soit modifié lors de l'utilisation du « bit setuid » (chmod u+s) sur un exécutable, alors que c'est la manière la plus propre d'autoriser un utilisateur ordinaire de lancer un programme avec des privilèges.

    Dis-nous exactement ce que tu veux faire, histoire que l'on t'oriente vers la meilleure solution.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    Enfin, il est très rare que l'application ait à vérifier elle-même si elle a le droit ou pas d'accéder à une ressource. C'est quelque chose qui doit être complètement indépendant et relever de l'administration du système. Heureusement car, dans le cas contraire, cela voudrait dire que la gestion des droits est consultative et qu'il suffirait d'écrire une application C pour les contourner.
    Euh? Peux-tu t'expliquer? J'ai du mal à comprendre comment le fait qu'une application puisse vérifier si elle a le droit de faire quelque chose lui permettrait de contourner les restrictions...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 530
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Euh? Peux-tu t'expliquer? J'ai du mal à comprendre comment le fait qu'une application puisse vérifier si elle a le droit de faire quelque chose lui permettrait de contourner les restrictions...
    C'est un raccourci un peu rapide de ma part, désolé : je voulais dire que si l'application DEVAIT faire elle-même ce genre de contrôles, dans le sens où si le manuel du système spécifiait que l'on devait développer ainsi, cela laisserait à penser que ce contrôle n'est pas fait ailleurs, typiquement en amont, ce qui serait un problème… Ça ne veut pas dire qu'une application n'a pas le droit de faire cette vérification.

    Cela dit, cette situation n'est pas si improbable qu'on le pense. L'exemple le plus flagrant concerne les mandatory locks.

    Il en reste que je suis bien curieux de savoir pourquoi user25 a besoin de savoir à l'avance si l'on est root ou pas, surtout qu'il parle de droits « Administrateur ».

  6. #6
    Membre chevronné Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Il en reste que je suis bien curieux de savoir pourquoi user25 a besoin de savoir à l'avance si l'on est root ou pas, surtout qu'il parle de droits « Administrateur ».
    Peut être par exemple pour permettre à une application d'avoir un comportement différent suivant que le setuid bit est positionné ou non.

    S'il est positionné et que j'ai hérité des droits root, j'ai le droit de faire cela, s'il n'est pas positionné et que je ne suis pas root, je ne le fait pas ou j'affiche un message d'erreur ou encore je n'active pas le menu "Administration". C'est un exemple.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 530
    Par défaut
    Citation Envoyé par Jenna Voir le message
    Peut être par exemple pour permettre à une application d'avoir un comportement différent suivant que le setuid bit est positionné ou non.
    Oui, mais ça me paraît douteux quand même. Les applis Unix sont rarement construites autour de ce principe. Il y a des exceptions parfaitement justifiées comme nmap, qui va demander à l'utilisateur d'être privilégié dans la majorité des cas et faire des tests lui-même, mais la man page est claire à ce sujet et l'utilitaire propose de toutes façons l'option « --privilegied » pour contourner le test explicite.

    Dans la plupart des autres situations, je suis plutôt partisan de laisser l'erreur se produire si elle le doit, et de renvoyer le message d'erreur du système. Or, justement, quand on en est à écrire des applications qui ont impérativement besoin de ce genre d'info, on n'en est plus à se demander comment on fait.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 36
    Par défaut
    Bonsoir à tous.

    Bon comme il est tard je pense que j'ai pas tout compris mais en fait quand je parle d'un "moyen plus propre" je veut dire par là si il y a une ou des fonctions spécifiques pour faire la vérification.

    Aussi je parle de droits administrateur parce que j'ai commencé à programmer sous Windows et j'ai fait ça pendant 3/4 ans alors j'ai encore un peu le vocabulaire et les manies du programmeur Windows (du genre mettre des INT, TRUE, DWORD, APIENTRY, etc...).

    J'ai besoin de vérifier si le programme tourne avec les privilèges root pour qu'il puisse indiquer à l'utilisateur de se mettre en root si il ne l'est pas pour qu'il puisse accéder à la configuration avancée de mon programme (serveur FTP) du genre menu de gestion des utilisateurs, gestion des mots de passe, contrôle des connexions établies, etc...

    Sur ce merci de vos réponses. En attente de prochaines...

    Bonne nuit

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 530
    Par défaut
    Bonsoir,

    Citation Envoyé par user25 Voir le message
    Aussi je parle de droits administrateur parce que j'ai commencé à programmer sous Windows et j'ai fait ça pendant 3/4 ans alors j'ai encore un peu le vocabulaire et les manies du programmeur Windows (du genre mettre des INT, TRUE, DWORD, APIENTRY, etc...).
    En fait, ce n'est pas tant le vocabulaire qui me gêne, que l'approche de la conception. Il n'y a pas, à proprement parler, de « grades » chez les utilisateurs UNIX comme il y en a sous Windows. Il y a root et il y a les utilisateurs ordinaires. Tu ne peux pas attribuer les pouvoirs de « root » à n'importe quel utilisateur comme tu le ferais avec le groupe « Administrateur » de Windows. C'est obligatoirement l'utilisateur numéro 0. Lorsque tu vérifies l'UID avec getuid(), c'est l'identité de l'utilisateur que tu vérifies, pas ses « pouvoirs ».

    D'autre part, lorsque tu utilises sudo pour lancer un programme, ou lorsque tu te logues directement en root, getuid() renvoie 0 (normal). Mais si c'est un programme « setuid root » (chmod u+s), alors l'identité de l'utilisateur reste la même mais l'effective UID, renvoyée par geteuid() est celle du propriétaire du fichier exécutable. C'est donc surtout l'effective UID qu'il te faut vérifier.

    J'ai besoin de vérifier si le programme tourne avec les privilèges root pour qu'il puisse indiquer à l'utilisateur de se mettre en root si il ne l'est pas pour qu'il puisse accéder à la configuration avancée de mon programme (serveur FTP) du genre menu de gestion des utilisateurs, gestion des mots de passe, contrôle des connexions établies, etc...
    Ton serveur FTP n'a besoin d'être root que pour une seule chose : se mettre à l'écoute d'un port TCP inférieur à 1024. Et là encore, une fois le socket mis à l'écoute, tu peux abandonner tes privilèges et redescendre vers l'identité d'un pseudo-user dédié à ton serveur.

    En tout état de cause, la console utilisateur doit être complètement indépendante de ton programme serveur, lequel est censé fonctionner en tâche de fond. Si tu veux communiquer avec lui, soit tu le fais par l'intermédiaire d'un fichier de configuration, soit directement à l'aide d'un socket Unix. Cette console envoie des ordres à ton serveur qui accepte de les exécuter ou non. Évidemment, cette console n'a jamais besoin d'être root.

    À noter qu'il ne s'agit pas seulement de mesures de sécurité : si l'administrateur de ta machine veut utiliser ton programme dans une configuration qui lui est propre, mais que celui-ci lui impose de passer root à cause d'une option codée en dur (et donc non modifiable), cela risque de le pousser à porter son choix sur un autre produit.

    En fait, la plupart du temps, les programmes qui vérifient si l'utilisateur est root ne le font que pour une chose : refuser de se lancer. :-)

    Ce qu'il est important de retenir : c'est que root est un utilisateur spécial qui peut contourner absolument toutes les protections du système. Si c'est une personne qui se logue avec, c'est pour faire une opération temporaire qui ne lui est pas accessible en l'état actuel du système. Si cette opération doit se répéter régulièrement, alors le droit doit lui être accordé, en la mettant dans le bon groupe, par exemple. Mais, en tout état de cause, il ne s'agit pas d'un « rôle ».

    Si c'est bien cette notion de « rôle » qui t'intéresse, il faut faire un fichier de configuration, propre à ton serveur, qui contienne la liste des GROUPES utilisateurs autorisés à modifier ton fichier. Tu utilises alors getgroups() pour voir si l'utilisateur se trouve dedans et tu actives alors tes menus supplémentaires comme tu comptes le faire.

Discussions similaires

  1. Les droits sous linux.
    Par fred61 dans le forum Administration système
    Réponses: 6
    Dernier message: 13/06/2008, 18h38
  2. Réponses: 3
    Dernier message: 06/04/2007, 16h34
  3. [Droit sous linux]
    Par Gaaaga dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 18/05/2006, 17h31
  4. change administrateur sous linux
    Par jean christophe dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/04/2004, 11h46
  5. Réponses: 5
    Dernier message: 06/03/2003, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo