[Debian] Authenticatie van postfix-gebruikers in MySQL

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

Topicstarter
Waerde GOT-ers,

Probleem: Ik wil gebruikers met een username en password authenticeren op een postfix server. Die postfix server moet deze credentials valideren in mysql.

Dit lijkt geen rocket science, maar ik kom er niet uit. De MySQL-database is een reeds bestaande database met een 'username', 'salt' en 'hashed_password' veld. De eerste twee zijn plain-text, de laatste ook maar betreft een SHA2(CONCAT(salt, password), 512) van het wachtwoord.

Google, vele fora en de postfix documentatie zelf gooien mij overal naartoe behalve naar een oplossing die een situatie beschrijft die ik heb.

Vraag 1: Is deze aanpak (van de user-tabel) zo bijzonder? IMHO is dit zoals het zou moeten.

Postfix en (via Google, vele fora en postfix documentatie) ook SASL en PAM laten mij zien dat het mogelijk is om deze username/password authenticatie mogelijk is door een configuratie voor mysql te definieren, die lijkt op onderstaand:

code:
1
2
3
4
5
6
7
8
mysqlhost = localhost
mysqluser = postfix
mysqlpassword = secret
mysqldatabase = productdb
mysqltable = users
mysqlusernamecolumn = username
mysqlpasswordcolumn = hashed_password
mysqlusecrypt = sha2


Bijvoorbeeld PAM configureer je vervolgens zo:
code:
1
auth     required   pam_mysql.so user=postfix passwd=secret db=productdb table=users usercolumn=username passwdcolumn=hashed_password crypt=1


Maar, zoals je ziet negeert deze configuratie de salt!

Ik heb een mysql-function gemaakt die als volgt aangeroepen kan worden:

code:
1
select fn_user_login([USERNAME], [PASSWORD]) as success;


Deze doet onder water de hash met salt op een manier die werkt met de manier waarop de database nu al in elkaar zit. Resultaat is colom met naam 'success' en met 1 record erin: 0 of 1.

Vraag 2: Weet iemand hoe ik Postfix/SASL/PAM zover kan krijgen dat hij de username en password die hij van de gebruiker binnenkrijgt doorpaast naar mysql (bijvoorbeeld door gebruik te maken van de mysql-functie) en het resultaat daarvan gebruikt?

(Het lijkt erop dat alle postfix/mysql combinaties die ik op internet vind ZELF de vergelijking wil doen met de (hashed_)password kolom. En dus zelf een query wil bouwen.)

Mijn dank is groot.

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 01-10 21:30

Hero of Time

Moderator LNX

There is only one Legend

Even vragen naar de bekende weg, maar heb je wel postfix-mysql geïnstalleerd om te verbinding te kunnen leggen? Bepaalde dingen in de logbestanden?

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

Topicstarter
Ja. De opzet werkt zelfs met plain text matching. Het gaat echt om die salt/hashing die niet werkt.

[ Voor 33% gewijzigd door Jurgle op 23-04-2014 21:23 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 01-10 16:13

Kees

Serveradmin / BOFH / DoC
Ik gebruik zelf sha-256 met 10000 rounds als hashing voor de wachtwoorden. Mijn password-kolom in de tabel zien er dus zo uit:
code:
1
$6$rounds=10000$S3qzjs7vAfl6sczx$WcpSQ7zlZH61OGJqFjs8vZsZNtcljiOn9Nktoo/GfZrnKZaTFvNfSxLWZxXHNoA2EL.vb6P1yopNhSEK5Hawr1
(geen echte data, voorbeeld)
En die zijn gesalt.

Ik vraag ze op met (puppet config)
code:
1
2
3
4
5
    file {"/etc/pam.d/smtpd":
        ensure => present,
        content => "auth    required   pam_mysql.so user=postfix passwd=xxxxxxxx host=xxxxxxxxxx db=postfix table=postfix_users usercolumn=id passwdcolumn=password crypt=1 where=smtp=1
account sufficient pam_mysql.so user=postfix passwd=xxxxxxxxx host=xxxxxxx db=postfix table=postfix_users usercolumn=id passwdcolumn=password crypt=1 where=smtp=1",
    }


En de salt negeert hij niet, aan de $6 en $rounds=10000 weet hij hoe het gehashed is en dat er een salt bij zit. Dan hoef je geen eigen functies te schrijven en het lastig te maken ;)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan