[Linux (Unslung)] SFTP en Chroot-en

Pagina: 1
Acties:

  • !null
  • Registratie: Maart 2008
  • Laatst online: 29-01 19:26
Ok, ik heb dus een Linksys NSLU2 met Unslung erop.
Ik draai er gewone FTP deamon op, welke een chroot setting kent, dat werkt.
Daarnaast draai ik er OpenSSH en Dropbear op (alle 2 vanwege testen), om ssh shell maar ook sftp te verzorgen.
Werkt opzich allemaal prima alleen wil ik de binnenkomende sessies (in de praktijk alleen sftp) chrooten, net als bij m'n gewone ftp deamon.

OpenSSH heeft gewoon een setting in z'n config file, ChrootDirectory, waar ik dan de directory (of %h -> homedir) kan invullen. Lijkt heel simpel, maar het werkt dus niet.
Ik krijg de hele tijd:
fatal: bad ownership or modes for chroot directory component "/"


Als ik dat dan onderzoek blijkt dus dat het chrooten heel kritisch is en wil dat de betreffende map als owner root heeft (ook al is het voor een andere user) en rechten mogen niet hoger zijn dan 755. Dat voor de doelmap, maar ook alle bovenliggende mappen, tot aan de root van het systeem. Als ik alle mappen dan laat voldoen aan de strenge voorwaardes wil ie er nog steeds niet aan. Hij blijft me deze fout geven.
In de trunk van openssh heb ik de code opgezocht, hier de functie die de fout geeft:

C++: session.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
 * Chroot into a directory after checking it for safety: all path components
 * must be root-owned directories with strict permissions.
 */
static void
safely_chroot(const char *path, uid_t uid)
{
    const char *cp;
    char component[MAXPATHLEN];
    struct stat st;

    if (*path != '/')
        fatal("chroot path does not begin at root");
    if (strlen(path) >= sizeof(component))
        fatal("chroot path too long");

    /*
     * Descend the path, checking that each component is a
     * root-owned directory with strict permissions.
     */
    for (cp = path; cp != NULL;) {
        if ((cp = strchr(cp, '/')) == NULL)
            strlcpy(component, path, sizeof(component));
        else {
            cp++;
            memcpy(component, path, cp - path);
            component[cp - path] = '\0';
        }
    
        debug3("%s: checking '%s'", __func__, component);

        if (stat(component, &st) != 0)
            fatal("%s: stat(\"%s\"): %s", __func__,
                component, strerror(errno));
        if (st.st_uid != 0 || (st.st_mode & 022) != 0)
            fatal("bad ownership or modes for chroot "
                "directory %s\"%s\"", 
                cp == NULL ? "" : "component ", component);
        if (!S_ISDIR(st.st_mode))
            fatal("chroot path %s\"%s\" is not a directory",
                cp == NULL ? "" : "component ", component);

    }

    if (chdir(path) == -1)
        fatal("Unable to chdir to chroot path \"%s\": "
            "%s", path, strerror(errno));
    if (chroot(path) == -1)
        fatal("chroot(\"%s\"): %s", path, strerror(errno));
    if (chdir("/") == -1)
        fatal("%s: chdir(/) after chroot: %s",
            __func__, strerror(errno));
    verbose("Changed root directory to \"%s\"", path);
}


Hier zie je ook de strengen voorwaardes terugkomen ( if (st.st_uid != 0 || (st.st_mode & 022) != 0) ).
Maar goed, ik voldoe dus aan de voorwaardes en nog wil ie niet.
Verder kan er met dropbear weinig worden ingesteld (voor zover er wat over te vinden valt) op dit gebied.

Ik ben nu wel bezig met rssh, geconfigureerd, maar ik weet niet hoe ik dit koppel aan dropbear of openssh.

Jullie nog ideeën?

Ampera-e (60kWh) -> (66kWh)