Hi,
ich komme hier grad nicht weiter und wollt fragen ob einer ne Idee hat.
Folgendes Problem: Mein Apache soll in ner chroot umgebung laufen. Startet auch soweit und statische Seiten sind kein Problem.
Wenn ich versuche über Suexec meinen fcgi-wrapper zu starten quittiert der den Dienst mit crit: invalid uid: (33) - er behauptet also er kann den User www-data nicht finden.
Das liegt daran, dass die funktion getpwuid() NULL liefert. Ich weiss aber nicht wie ich das weiter handlen soll. Eine /etc/passwd in der Chroot umgebung mit dem User gibt es aber das scheint ihn nicht zu interessieren.
Manuelles su www-data in der chrootumgebung wenn ich per busybox reingehe geht auch.
Hat einer nen Tipp wo ich da ansetzen kann?
Ich hab keine Lust die ganze suexec.c umzupatchen...
Viele Grüße
apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)
-
- Posts: 3
- Joined: 2009-11-04 16:59
-
- Administrator
- Posts: 2641
- Joined: 2004-01-21 17:44
Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)
Moin,
ich hab Dir mal ein kleines Diagnose-Programm für getpwuid() zusammengehackt. Einfach kompilieren und in der Chroot-Umgebung ausführen (braucht nur die libc); als Argument die numerische UID angeben. Das Programm hat drei mögliche Ausgänge:
ich hab Dir mal ein kleines Diagnose-Programm für getpwuid() zusammengehackt. Einfach kompilieren und in der Chroot-Umgebung ausführen (braucht nur die libc); als Argument die numerische UID angeben. Das Programm hat drei mögliche Ausgänge:
- User-Eintrag wird gefunden (und der zugehörige Name ausgegeben)
- Es wird kein Eintrag gefunden, es tritt aber ansonsten kein Fehler auf
- Es tritt bei getpwuid() ein Fehler auf, dann bekommst Du die Diagnosemeldung ausgegeben (z. B. "Permission denied" wenn /etc/passwd nicht zugreifbar ist)
Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <pwd.h>
int main(int argc, char **argv)
{
struct passwd *pw = NULL;
if (argc != 2)
{
fprintf(stderr, "Usage: pwtest UIDnn UID: numeric user IDn");
return(EXIT_FAILURE);
}
errno = 0;
pw = getpwuid((uid_t)atoi(argv[1]));
if (pw)
{
printf("User zu UID %d gefunden: %sn", (int)pw->pw_uid, pw->pw_name);
return(EXIT_SUCCESS);
}
else
{
if (errno)
printf("Fehler: %sn", strerror(errno));
else
printf("Kein User-Eintrag gefunden.n");
return(EXIT_FAILURE);
}
}
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time
-
- Posts: 3
- Joined: 2009-11-04 16:59
Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)
hi jfreund,
vielen Dank für deine Antwort und dein kleines Tool.
Ich musste es etwas modifizieren, da ich es um die Testumgebung nachzubauen anstatt suexec laufen lassen musste und stderr in keinem der logs auftaucht (zumindest hab ichs nicht gefunden)
Das sieht jetzt wie folgt aus:
Mit der Ergebnis:
Fehler: No such file or directory
Ich werd mich dann wohl mal auf die Suche nach dem Quelltext von getpwuid machen... und mir anschauen was da passiert und wo genau das problem liegt. Genau das wollte ich eigentlich vermeiden...
http://www.kernel.org/doc/man-pages/onl ... uid.3.html
Laut dem Kollegen manual hier müsste das eigentlich /etc/passwd sein und die gibts definitiv in der chroot Umgebung.
Vielen Dank nochmal!
vielen Dank für deine Antwort und dein kleines Tool.
Ich musste es etwas modifizieren, da ich es um die Testumgebung nachzubauen anstatt suexec laufen lassen musste und stderr in keinem der logs auftaucht (zumindest hab ichs nicht gefunden)
Das sieht jetzt wie folgt aus:
Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <pwd.h>
static FILE *log = NULL;
int main(int argc, char **argv)
{
struct passwd *pw = NULL;
if ((log = fopen("/tmp/suexec.log", "a")) == NULL) {
fprintf(stderr, "suexec failure: could not open log filen");
perror("fopen");
exit(1);
}
if (argc != 4)
{
fprintf(log, "Usage: pwtest UIDnn UID: numeric user IDn");
return(EXIT_FAILURE);
}
errno = 0;
pw = getpwuid((uid_t)atoi(argv[2]));
if (pw)
{
fprintf(log, "User zu UID %d gefunden: %sn", (int)pw->pw_uid, pw->pw_name);
return(EXIT_SUCCESS);
}
else
{
if (errno)
fprintf(log, "Fehler: %sn", strerror(errno));
else
fprintf(log, "Kein User-Eintrag gefunden.n");
return(EXIT_FAILURE);
}
}
Fehler: No such file or directory
Ich werd mich dann wohl mal auf die Suche nach dem Quelltext von getpwuid machen... und mir anschauen was da passiert und wo genau das problem liegt. Genau das wollte ich eigentlich vermeiden...
http://www.kernel.org/doc/man-pages/onl ... uid.3.html
Laut dem Kollegen manual hier müsste das eigentlich /etc/passwd sein und die gibts definitiv in der chroot Umgebung.
Vielen Dank nochmal!
Last edited by fabfour on 2009-11-05 00:08, edited 1 time in total.
-
- Posts: 5923
- Joined: 2004-05-23 12:53
Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)
Ist die passwd wirklich an der richtigen Stelle und haben alle beteiligten Benutzer Zugriff darauf und auf das etc-Verzeichnis?fabfour wrote:Laut dem Kollegen manual hier müsste das eigentlich /etc/passwd sein und die gibts definitiv in der chroot Umgebung.
-
- Posts: 3
- Joined: 2009-11-04 16:59
Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)
okay bin dem ganzen inzwischen mit strace auf die schliche gekommen... irgendwo in der libc6.so wird ein fopen auf libnss_files.so.2 gemacht und die hat er nicht gefunden. daher der not found error. das hatte überhaupt nix mit der /etc/passwd zu tun.
wenn man am falschen ende sucht...
Vielen Dank für den Denkanstoß!
wenn man am falschen ende sucht...
Vielen Dank für den Denkanstoß!