[[oktatas:linux:hogyanok|< Hogyanok]]
====== MySQL azonosítás PAM-on keresztül Linuxon ======
===== LinuxMint rendszeren =====
==== Bevezetés ====
Korábbi LinuxMint, Ubuntu és a Debian verziókon ha MySQL-ből szeretnénk azonosítani a libpam-mysql-re volt szükségünk.
LinuxMint 15, a Debian 7 verziója óta van egy libnss-mysql-bg nevű csomag amit használunk.
Ezzel a csomaggal magába a PAM-ba nem is kell belenyúlnunk. Ennek beállításai nézzük meg.
==== Telepítések ====
Szükség van a mysql-server és a libnss-mysql-bg csomagra.
sudo apt-get install libnss-mysql-bg mysql-server
==== Beállítások ====
Telepítés után kapunk egy libnss-mysql.cfg és egy libnss-mysql-root.cfg állományt az /etc könyvtárban.
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 1
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 nss-user
password userpass
#socket /var/run/mysqld/mysqld.sock
#port 3306
A libnss-mysql.cfg fájlnak csak a végét kell javítani, írjuk be az általunk használt jelszót.
Az adatbázis neve pedig lehet majd auth, a felhasználónév ami eléri pedig nss-user.
A libnss-mysql-root.cfg tartalma:
username nss-root
password rootpass
Itt is a jelszót kell megváltoztatni.
Nyissuk meg az /etc/nsswitch.conf állományt, és keressük meg benne a következő sorokat:
passwd: compat
group: compat
shadow: compat
Javítsuk így:
passwd: compat mysql
group: compat mysql
shadow: compat mysql
A MySQL adatbázisban a következő adatbázist alakítsuk ki:
create database auth;
use auth;
# The tables ...
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)
) AUTO_INCREMENT=6000;
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)
);
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)
) AUTO_INCREMENT=6000;
# The permissions ...
GRANT USAGE ON *.* TO `nss-root`@`localhost` IDENTIFIED BY 'titok';
GRANT USAGE ON *.* TO `nss-user`@`localhost` IDENTIFIED BY 'titok';
GRANT Select (`username`, `uid`, `gid`, `gecos`, `homedir`, `shell`, `password`,
`lstchg`, `min`, `max`, `warn`, `inact`, `expire`, `flag`)
ON `auth`.`users`
TO 'nss-root'@'localhost';
GRANT Select (`name`, `password`, `gid`)
ON `auth`.`groups`
TO 'nss-root'@'localhost';
GRANT Select (`username`, `uid`, `gid`, `gecos`, `homedir`, `shell`)
ON `auth`.`users`
TO 'nss-user'@'localhost';
GRANT Select (`name`, `password`, `gid`)
ON `auth`.`groups`
TO 'nss-user'@'localhost';
GRANT Select (`username`, `gid`)
ON `auth`.`grouplist`
TO 'nss-user'@'localhost';
GRANT Select (`username`, `gid`)
ON `auth`.`grouplist`
TO 'nss-root'@'localhost';
A jelszót változtassuk meg a kívántra. Ne maradjon "titok"!
Ezt kellet beállítani a /etc/libnss-mysql-root.cfg és a /etc/libnss-mysql.cfg fájlokban.
==== Felhasználók felvétele ====
Az alábbi példában felveszünk egy joska nevű felhasználót:
INSERT INTO users (username,gecos,homedir,password)
VALUES ('joska', 'Teszt József', '/home/vusers/joska', ENCRYPT('titok'));
INSERT INTO groups (name)
VALUES ('vuser');
INSERT INTO grouplist (gid,username)
VALUES (6000,'joska');
A példa második utasításában létrehoztam egy vuser csoportot. Természetesen
ezt többször nem kell megtenni.
Az eredeti Debian elv szerint minden felhasználóval azonos nevű csoport is
létrejön egy felhasználó felvételével. Ha most is ezt szeretnénk a csoportot
létre kell hozni.
==== Jelszavak ====
Az így létrehozott felhasználó jelszava csak "crypt" algoritmussal lesz kódolva.
Használható a többi algoritmus is. A Linuxokban manapság (2013) SHA-512 algoritmust
használunk. Az /etc/shadow fájlból a kód egyben kimásolható, például:
$6$AbCdefgh$3GFj/6var2Rjchadbz4r86Hd9ujAY1Z0NaoMExRy1x.MtmJyqg7253pg.9i3YeHm0x8CmBAYWnEcODQ6WkhqD.
De generálhatunk is másikat. A jelszavak titkosításáról több információhoz juthatunk az
[[oktatas:linux:apró_debianos_tippek#jelszavak_titkosítása| Apró debianos tippek]] fejezetből.
Az egyik lehetőséget idemásolom. Szükségünk lesz a whois nevű csomagra.
Eben van egy mkpasswd nevű parancs amely képes legenerálni az általunk kívánt kódot.
Telepítsük:
apt-get install whois
Kérdezzük le a használható kódolásokat:
mkpasswd --method=help
Találjunk ki egy 8 karaktert sót. Pl. AbCdefgh. Legyen az algoritmus: sha512. A jelszó legyen „titok”.
A kódolt jelszó előállítása:
mkpasswd --method=sha-512 --salt=AbCdefgh titok
==== Tesztelés ====
Nyissunk két terminált. Az egyikben figyeljük a naplófájlokat:
tail -f /var/log/auth.log
A másikban probáljunk meg egy bejelentkezést rootként:
login joska
Ha valami nem működik és nincs időnk folytatni akkor az /etc/nsswitch.conf fájlban
vegyük ki a "mysql" szavakat, amit oda írtunk. Máskülönben az is előfordulhat, hogy
újraindítás után nem tudjuk használni a rendszerünket.
A fenti parancsot (login) természetesen lehet a sudo-val is futtatni, de akkor két
jelszót kér, egyet az aktuális felhasználónak. Én root felhasználóvá szoktam váli,
ha rootként akarok dolgozni, a következő paranccsal:
sudo su -
Kilépés a root környezetből:
exit
A felhasználó egyéb tulajdonságainak lekérdezése:
apt-get install finger
finger joska
Login: joska Name: Teszt József
Directory: /home/vusers/joska Shell: /bin/bash
Last login Sat Oct 5 14:27 (CEST) on pts/0
No mail.
No Plan.
A Name tulajdonságnál ellenőrizhetjük az ékezetek helyességét.
===== Linkek =====
* https://gist.github.com/alpacaaa/3196852
* http://www.spencerstirling.com/computergeek/mysqluser.html (libpam-mysql)
* http://www.idimmu.net/2010/08/27/keeping-linux-users-in-a-mysql-database-with-libpam-mysql-on-ubuntu/ (libpam-mysql)
* http://www.aychedee.com/2012/03/14/etc_shadow-password-hash-formats/ (Jelszó generálás és a shadow fájl)
* http://linuxczar.net/code/hashpw.py (Jelszó generálás Python nyelven)
* http://www.akkadia.org/drepper/SHA-crypt.txt (Az SHA algoritmus)