Bonjour à tous,
Je viens d'installer mon petit serveur web et mail et je dois faire quelque chose de similaire à ça. Il faudrait que je puisse rajouter un compte mail depuis une page php sécurisée bien entendu (php -> programme C/C++).
Pour se faire, j'ai besoin d'accéder à MySQL (par l'API C, pas de problème) et faire des commandes comme maildirmake depuis un utilisateur (vmail) normal à qui appartient les dossiers de mails. Apache tournant sur l'utilisateur apache, je pense faire du setuid pour donner les droits temporairement de vmail. Toutes les commandes "natives" au C/C++ se font bien sous l'utilisateur vmail mais dès que je fais un appel avec system() sur une commande comme touch/mkdir/maildirmake c'est l'utilisateur apache qui est utilisé, pourquoi ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <iostream> #include <iomanip> #include <fstream> using namespace std; int main(void) { static uid_t ruid, rgid; ruid = getuid(); rgid = getgid(); setuid(geteuid()); setgid(getegid()); ofstream file("test.txt"); file << "Hello test \n"; file.close(); system("touch test2.txt"); setuid(ruid); setgid(rgid); return EXIT_SUCCESS; }
Je précise que j'ai bien fait :
Code:g++ suid-print.c -o suid-print && chown vmail:vmail suid-print && chmod +s suid-print
Quand j'exécute le programme, le fichier test.txt appartient bien à vmail alors que le fichier test2.txt appartient à celui qui a lancer le programme. Comment ça se fait ? On dirait que system n'affecte pas les programme au setuid donné.
Avez-vous une solution ?