Sshd mysql

Allikas: Kuutõrvaja

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 seadistus

Süsteemi on vaja paigaldada kaks paketti lisaks mysql kliendile.

  1. mysql-pam
  2. 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 groups (
  name varchar(16) NOT NULL default ,
  password varchar(34) NOT NULL default 'x',
  gid int(11) NOT NULL auto_increment,
  PRIMARY KEY  (gid)
) TYPE=MyISAM AUTO_INCREMENT=5000;

CREATE TABLE grouplist (
  rowid int(11) NOT NULL auto_increment,
  gid int(11) NOT NULL default '0',
  username char(16) NOT NULL default ,
  PRIMARY KEY  (rowid)
) TYPE=MyISAM;

CREATE TABLE 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)
) TYPE=MyISAM 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.

Optimiseerimine

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/

http://pam-mysql.sourceforge.net/

--Jj 26. oktoober 2007, kell 16:45 (EEST)