Sshd mysql
Sissejuhatus
Näide kuidas saada unix süsteemis autentimine mysql baasi peale. Vahel tekib juhtumeid kui on vaja ,et infosüsteemis mysql baaiss olevad kasutajad saaksid logida shelli või mingite teenuste abil mis vaid pam'i tunnistavad. Näiteks virtuaalsed veebiteenuse kasutajad ssh chrooduga.
Antud näidet on testitud linux serveris kuid sama tarkvara on olemas ka FreeBSD all ning peaks töötama seal samahästi (/etc asendub arvatavasti /usr/loca/etc jms radade muutused)
Üldine skeem on väga sarnane ldap'ile. Vaja on seadistada moodul mis suhtleb baasiga, nsswitch konfile vajalik programm ja pam.conf'i muutmine.
Install ja sedaistus
Süsteemi on vaja paigaldada kaks paketti lisaks mysql kliendile.
- mysql-pam
- libnss-mysql (versiooniks 1.5 näites)
Tekitame enda andmebaasiserverisse uue kasutajanime (kasutaja,parool) Loome enda andmebaasi uue baasi nimega auth ja sinna sisse järgneva struktuuriga tabelid.
CREATE TABLE IF NOT EXISTS `grouplist` ( `rowid` int(11) NOT NULL auto_increment, `gid` int(11) NOT NULL default '0', `username` char(16) NOT NULL default , PRIMARY KEY (`rowid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; CREATE TABLE IF NOT EXISTS `groups` ( `name` varchar(16) NOT NULL default , `password` varchar(34) NOT NULL default 'x', `gid` int(11) NOT NULL auto_increment, PRIMARY KEY (`gid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5001 ; CREATE TABLE IF NOT EXISTS `users` ( `username` varchar(16) NOT NULL default , `uid` int(11) NOT NULL auto_increment, `gid` int(11) NOT NULL default '5000', `gecos` varchar(128) NOT NULL default , `homedir` varchar(255) NOT NULL default , `shell` varchar(64) NOT NULL default '/bin/bash', `password` varchar(34) NOT NULL default 'x', `lstchg` bigint(20) NOT NULL default '1', `min` bigint(20) NOT NULL default '0', `max` bigint(20) NOT NULL default '99999', `warn` bigint(20) NOT NULL default '0', `inact` bigint(20) NOT NULL default '0', `expire` bigint(20) NOT NULL default '-1', `flag` bigint(20) unsigned NOT NULL default '0', PRIMARY KEY (`uid`), UNIQUE KEY `username` (`username`), KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5000 ;
Lisame ka ühe kasutaja ja grupi. Kasutaja nimeks saab kasutaja, parooliks samuti kasutaja
ning kodukataloogiks /home/kasutaja.
INSERT INTO users (username,gecos,homedir,password) VALUES ('kasutaja', 'Eesnimi Perenimi', '/home/kasutaja', ENCRYPT('kasutaja'));
Loome kasutajale grupi nimega kasutaja.
INSERT INTO groups (name) VALUES ('kasutaja');
Seome kasutaja loodud grupiga
INSERT INTO grouplist (gid,username) VALUES (5000,'kasutaja');
/etc/libnss-mysql.cfg
getpwnam SELECT username,'x',uid,gid,gecos,homedir,shell \ FROM users \ WHERE username='%1$s' \ LIMIT 1 getpwuid SELECT username,'x',uid,gid,gecos,homedir,shell \ FROM users \ WHERE uid='%1$u' \ LIMIT 1 getspnam SELECT username,password,lstchg,min,max,warn,inact,expire,flag \ FROM users \ WHERE username='%1$s' \ LIMIT 1 getpwent SELECT username,'x',uid,gid,gecos,homedir,shell \ FROM users getspent SELECT username,password,lstchg,min,max,warn,inact,expire,flag \ FROM users getgrnam SELECT name,password,gid \ FROM groups \ WHERE name='%1$s' \ LIMIT 1x getgrgid SELECT name,password,gid \ FROM groups \ WHERE gid='%1$u' \ LIMIT 1 getgrent SELECT name,password,gid \ FROM groups memsbygid SELECT username \ FROM grouplist \ WHERE gid='%1$u' gidsbymem SELECT gid \ FROM grouplist \ WHERE username='%1$s' host localhost database auth username kasutaja password parool
teine fail mis vaja seadistada /etc/libnss-mysql-root.cfg
sinna piisab kui lisada andmebaasi kasutajanimi ning parool
username kasutaja password parool
Järgnevalt PAM seadistus ssh'ga logimiseks /etc/pam.d/ssh
auth sufficient pam_mysql.so \ verbose=1 \ user=kasutaja \ passwd=parool \ host=localhost \ db=auth \ table=users \ usercolumn=username \ passwdcolumn=password crypt=4 account sufficient pam_mysql.so \ verbose=1 \ user=kasutaja \ passwd=parool \ host=localhost \ db=auth \ table=users \ usercolumn=username \ passwdcolumn=password crypt=4 password sufficient pam_mysql.so \ verbose=1 \ user=kasutaja \ passwd=parool \ host=localhost \ db=auth \ table=users \ usercolumn=username \ passwdcolumn=password crypt=4
lõpuks ka /etc/nsswitch.conf Mille alusel süsteem tunnistab kasutajaid andmebaasist.
passwd: files mysql shadow: files mysql group: files mysql
Ning nii toimib. Võid testida käskude id, finger abil ning proovida ssh'ga üle võrgu logida.
Lihtustamine
Vaikimisi tabel on üsnagi kole mida soovitatakse kasutada. Palju välju võib üsnagi vabalt ärajätta. Näiteks lstchg,min,max,warn,inact,expire,flag
Nende näol on tegemist IMO vähekasutatud UNIXi vahenditega, mida enamusel juhtudel ei rakendata, nagu paroolivahetamise kohustus ja kui kaua saab vana parooliga sisse logida jne.
Kuna need jääks nagunii tabeli definitsioonis määratud defaultideks, siis pole mõtet neid üldse andmebaasi panna (sest siis tekib potentsiaalne võimalus vigadeks - väljad, mida ei kasutata aktiivselt, seega väärtust omavad ja ükshetk võivad (inimfaktori abiga) vale väärtuse omandada ja no debugi siis).
Selle asemel võiks näiteks defineerida:
getspnam SELECT username, passwd, '1' AS 'lstchg', '0' AS 'min', '99999' AS 'max', '0' AS 'warn', '0' AS 'inact', '-1' AS 'expire', '0' AS 'flag' FROM www_users WHERE username='%1$s' LIMIT 1
Samuti võib mõnedel juhtudel kui grupid ei oma nii suurt tähtsust ja oluline ,et kasutajal eksisteeriks vaid tema endanimeline grupp võib tekitada users tabelisse lisavälja ninga GID ja muuta konfis gruppide osa alltoodud kujule. See annab võimaluse hakkama saada vaid ühe tabeli ja seal minimaalsete väljadega.
getgrnam SELECT username,'x' AS 'password',gid \ FROM users \ WHERE username='%1$s' \ LIMIT 1 getgrgid SELECT username,'x' AS 'passwd',gid \ FROM users \ WHERE gid='%1$u' \ LIMIT 1 getgrent SELECT username,'x' AS 'passwd',gid \ FROM users memsbygid SELECT username \ FROM www_users \ WHERE uid='%1$u' gidsbymem SELECT gid \ FROM users \ WHERE username='%1$s'
Lingid
http://libnss-mysql.sourceforge.net/
--Jj 26. oktoober 2007, kell 16:45 (EEST)