[Linux] SSH login m.b.v. PAM & MySQL

Pagina: 1
Acties:

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Ik ben bezig met een site-je voor m'n familie enzo (mensen op IRC hebben em vast wel een keer langs zien vliegen) met daarbij allerlei functionaliteiten.

Zo heb ik reeds:

[list]• $user.$domain.$tld subdomeintje;
• FTP login via FTP-protocol of via een HTTP->FTP-script naar de user's homedir;
• E-Mail m.b.v. MySQL voor de user-gegevens.

Nu wil ik daar nog een eigen MySQL-database per user aan toevoegen (niet zo moeilijk te realiseren) en een SSH (shell) login die chrooted is in de user's homedir.

Het gaat dus om de SSH-login. De chroot-jail werkt prima en heb ik werkend als volgt:

/bin/chrooted-shell
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
if [ "$1" = "-c" ]; then
        i=0;
        PARAMS="";
        for param in $*; do
                if [ $i -gt 0 ]; then
                        PARAMS="$PARAMS $param";
                fi
                let i++;
        done;
        sudo /usr/bin/chroot /home/users/$USER /bin/su - $USER -c "$PARAMS"
else
        sudo /usr/bin/chroot /home/users/$USER /bin/su - $USER
fi;


Deze wordt in /etc/passwd aangeroepen als laatste argument van een line i.p.v. /bin/bash

So far so good.

Maar omdat ik alles graag wil beheren via PHP en niet alleen accounts toevoegen en verwijderen (wat eventueel nog wel via system() met useradd en userdel zou kunnen), maar ook bijv simpel d.m.v. een vinkje in de Admin SSH-login aan en uit zetten.

Dus ik dacht: Mooi, dan gaan we hetzelfde trucje flikken als bij postfix etc en gaan we MySQL weer gebruiken :)

En daar komt mijn probleem: Ik moet hiervoor (denk ik tenminste) PAM gebruiken. Nu heb ik zelf al het een en ander over PAM gezocht en gelezen (http://www.kernel.org/pub...m/Linux-PAM-html/pam.html) en dat is me nog niet helemaal duidelijk. Maar dat is niet eens het grootste probleem. Er moet gebruik gemaakt worden van pam_mysql. En die luitjes hebben geen enkel manual voor hun module :/ (Check site: http://pam-mysql.sourceforge.net/)

Nu is mijn vraag: Heeft iemand hier al eens gebruik gemaakt van pam_mysql en kan mij diegene uitleggen hoe dat precies werkt? Ik weet wel dat je user en passwd en table etc etc. moet gebruiken, maar hoe moet de table zelf er precies uitzien etc?
Verder zijn alle tips welkom. Is het een goed idee om MySQL hiervoor te gebruiken? (niet open op internet, dus geen security-riscs lijkt me?)

Alvast bedankt voor jullie input :)

[ Voor 3% gewijzigd door Osiris op 04-12-2004 09:27 ]


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

--> NOS op verzoek :)

  • PowerSp00n
  • Registratie: Februari 2002
  • Laatst online: 17-11-2025

PowerSp00n

There is no spoon

Is het niet gewoon verstandiger hier wat mee script werk van te maken zodat je zegmaar via PHP iets naar MySQL schopt of gewoon in een filetje wat vervolgens weer door een PHP script die regelmatig d.m.v. cron word gedraait wordt uitgelezen en de regels snapt die erin staan en dit vervolgens uitvoert?

  • Osiris
  • Registratie: Januari 2000
  • Niet online
PowerSp00n schreef op zaterdag 04 december 2004 @ 13:09:
Is het niet gewoon verstandiger hier wat mee script werk van te maken zodat je zegmaar via PHP iets naar MySQL schopt of gewoon in een filetje wat vervolgens weer door een PHP script die regelmatig d.m.v. cron word gedraait wordt uitgelezen en de regels snapt die erin staan en dit vervolgens uitvoert?
Kan wel, maar omdat het hier over meerdere users gaat die niet echt fysiek toegang krijgen tot de server (zoals sysops etc), heb ik liever dat zulk soort info (net als bij de mail) in een handige, overzichtelijke DB komt te staan, ipv in m'n /etc/passwd, /etc/group en /etc/shadow.. Voor 't zelfde geld mol ik wel wat :P (zo'n Linux-guru ben ik nou ook weer niet)

Verwijderd

Ik gebruik pam_mysql for virtual mail

mijn /etc/pam.d/pop3:
code:
1
2
3
4
5
#%PAM-1.0
auth     optional       pam_mysql.so host=localhost db=databasenaam user=databaseuser \
  passwd=databasepass table=databasetable usercolumn=username_veld passwdcolumn=password_veld crypt=1
account  required       pam_mysql.so host=localhost db=databasenaam user=databaseuser \
  passwd=databasepass table=databasetable usercolumn=username_veld passwdcolumn=password_veld crypt=1

jij moet dus /etc/pam.d/sshd hebben
spreekt, op crypt na, allemaal voor zich.

voor crypt:
0 - plaintext password
1 - /etc/passwd en /etc/shadow style passwords
2 - mysql password() functie
3 - md5 hashed password

wel 660 oid chmodden, zodat gewone users je mysql username/wachtwoord niet kunnen zien.

uit pam_mysql.c:
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
    switch (options.crypt) {
        /* PLAIN */
        case 0: strcpy(encryptedPass, passwd);
            break;
        /* ENCRYPT */
        case 1: if (strlen(row[0]) < 12) {
                /* strlen < 12 isn't a valid encrypted password. */
                syslog(LOG_ERR, "%s", "pam_mysql: select returned an invalid encrypted password");
                break;
            }

            salt = malloc(sizeof(char) * strlen(row[0]) + 1);

            if (salt == NULL) {
                syslog(LOG_ERR, "%s", "pam_mysql: Insufficient memory to allocate salt");
                return PAM_BUF_ERR;
            }

            if (strncmp("$1$", row[0], 3) == 0) {
                /* A MD5 salt starts with "$1$" and is 12 bytes long */
                strncpy(salt, row[0], 12);
                salt[12] = '\0';
            } else {
                /* If it's not MD5, assume DES and a 2 byte salt.  */
                strncpy(salt, row[0], 2);
                salt[2] = '\0';
            }

            strcpy(encryptedPass, crypt(passwd, salt));
            free(salt);
            break;

        /* PASSWORD */
        case 2: make_scrambled_password(encryptedPass, passwd);
            break;

#ifdef HAVE_MD5DATA
        /* MD5 hash (not MD5 crypt()) */
        case 3: strcpy(encryptedPass, MD5Data(passwd, strlen(passwd), md5buf));
            if (md5buf != NULL)
                free(md5buf);
            break;
#endif /* HAVE_MD5DATA */
    }

[ Voor 12% gewijzigd door Verwijderd op 07-12-2004 22:28 ]


  • Osiris
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op zaterdag 04 december 2004 @ 15:31:
Ik gebruikt pam_mysql for virtual mail

/me Knip *
Ik ook :P Dat is op zich ook 't probleem niet.

Wat ik me wel afvraag is hoe ik dingen zoals homedir etc "instel". Ik heb namelijk al eens het mail-"schema" gebruikt, alleen dan voor /etc/pam.d/sshd, alleen kreeg ik alsnog login incorrect, omdat ik verder geen hol snap van die meuk zoals homedir en wat normaal in /etc/passwd staat achteraan (/bin/bash)..

Moet ik dan gewoon in de table een kolom aanmaken met die waardes? En zal t dan goed gaan? :?
Pagina: 1