apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Apache, Lighttpd, nginx, Cherokee
fabfour
Posts: 3
Joined: 2009-11-04 16:59

apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Post by fabfour » 2009-11-04 17:08

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

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Post by daemotron » 2009-11-04 19:57

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:

  • 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)

Meine Hoffnung ist jetzt, dass es zu einem Fehler kommt und Dir die Diagnosemeldung weiterhilft.

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

fabfour
Posts: 3
Joined: 2009-11-04 16:59

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Post by fabfour » 2009-11-05 00:05

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:

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);
   }
}


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!
Last edited by fabfour on 2009-11-05 00:08, edited 1 time in total.

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Post by Roger Wilco » 2009-11-05 00:20

fabfour wrote:Laut dem Kollegen manual hier müsste das eigentlich /etc/passwd sein und die gibts definitiv in der chroot Umgebung.

Ist die passwd wirklich an der richtigen Stelle und haben alle beteiligten Benutzer Zugriff darauf und auf das etc-Verzeichnis?

fabfour
Posts: 3
Joined: 2009-11-04 16:59

Re: apache2 + suexec + mod_chroot + fcgid - invalid uid: (33)

Post by fabfour » 2009-11-05 00:51

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ß!