• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

autenticando usuários em base de dados MySQL

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
O cadastro de novos usuários ocupa uma parte importante do tempo do administrador. Mas nem sempre é possível manter atualizada a lista de usuários cadastrados para acesso aos servidores da organização. O módulo pam_mysql permite autenticar usuários com o uso de uma base local centralizada, facilitando a gestão de pessoal.

Por: lourival araujo da silva

Limpando o terreno
Precisamos instalar o sistema de gerenciamento de banco de dados e o módulo de autenticação, o qual faz a integração entre a autenticação no banco a ser criado e o PAM-Linux. A instalação fará ajustes no sistema, que correspondem aos acréscimos de bibliotecas, arquivos de configuração, e do serviço do MySQL, no diretório de configuração do pam (/etc/pam.d):

# apt-get install mysql-server-5.0 mysql-client-5.0
# apt-get install libpam-mysql

# ls /lib/security
pam_access.so
pam_issue.so
pam_permit.so
pam_umask.so
pam_blue.so
pam_keyinit.so
pam_rhosts_auth.so
pam_unix_acct.so
pam_lastlog.so
pam_unix_auth.so
pam_time.so
pam_nologin.so
pam_debug.so
pam_limits.so
pam_rootok.so
pam_unix_passwd.so
pam_deny.so
pam_listfile.so
pam_rsa.so
pam_unix_session.so
pam_securetty.so
pam_unix.so
pam_warn.so
pam_motd.so
pam_encfs.so
pam_selinux.so
pam_usb.so
pam_xauh.so
pam_env.so
pam_mail.so
pam_namespace.so
pam_tally.so
pam_exec.so
pam_mkhomedir.so
pam_shells.so
pam_utoken.so
pam_ssh.so
pam_mount.so
pam_stress.so
pam_wheel.so
pam_filter.so
pam_mysql.so
pam_succeed_if.so
pam_winbind.so
pam_ftp.so
pam_group.so
pam_gnome_keyring.so

# ls /etc/pam.d
apache2
atd
cron
cups
common-auth
common-account
common-password
common-pammount
common-session
gdm
gdm-autologin
gnome-screensaver
login
mysql
other
samba
squid
sudo
sshd
su

# apropos mysql
mysql (1) - the MySQL command-line tool
mysql_fix_privilege_tables (1) - upgrade MySQL system tables
mysql_install_db (1) - initialize MySQL data directory
mysqlaccess (1) - client for checking access privileges
mysqladmin (1) - client for administering a MySQL server
mysqlbinlog (1) - utility for processing binary log files
mysqlbug (1) - generate bug report
mysqlcheck (1) - a table maintenance and repair program
mysqld (8) - the MySQL server
mysqld_safe (1) - MySQL server startup script
mysqldump (1) - a database backup program
mysqldumpslow (1) - Parse and summarize the MySQL slow query log.
mysqlhotcopy (1) - a database backup program
mysqlimport (1) - a data import program
mysqlmanager (8) - the MySQL Instance Manager
mysqlshow (1) - display database, table, and column information
mysqltest (1) - program to run test cases
safe_mysqld (1) [mysqld_safe] - MySQL server startup script

As ferramentas necessárias ao gerenciamento do banco de dados de autenticação foram instaladas. Temos agora a possibilidade de criar, modificar ou remover bancos de dados. O que faremos em conjunto com a autenticação dos usuários.

 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Fixando as bases
Criaremos uma senha para o administrador do banco de dados e o próprio banco de autenticação. Complementaremos o procedimento com a criação de uma tabela para inclusão dos usuários temporários.

# mysqladmin -u root -p password 'm0d3rn0'
Enter password: *******

# mysql -u root -p

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.0.67-0ubuntu6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> quit;

# mysqladmin create cadastro -p
Enter password: *******

# mysql -p
Enter password: *******

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.0.67-0ubuntu6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------------+
| Database |
+--------------------------+
| information_schema |
| cadastro |
| mysql |
+--------------------------+
3 rows in set (0.05 sec)

mysql> use cadastro;

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> create table estagio (usuario varchar(30), email varchar(30),senha varchar(45), depart varchar (20));
mysql> show tables;
+---------------------------+
| Tables_in_cadastro |
+---------------------------+
| estagio |
+---------------------------+
1 row in set (0.00 sec)

mysql> desc estagio;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| usuario | varchar(30) | YES | | NULL | |
| email | varchar(30) | YES | | NULL | |
| senha | varchar(45) | YES | | NULL | |
| depart | varchar(20) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

Podemos iniciar a inclusão de usuários:

mysql> insert into estagio values('estagiario2','estagiario2@gmail.com',password('1234'),'contab');
mysql> insert into estagio values('estagiario3','estagiario3@bol.com.br',password('1234'),'juridico');

mysql> select * from estagio;
+-------------+--------------------+----------------+----------+
| usuario | email | senha | depart |
+-------------+--------------------+----------------+----------+
| estagiario2 | estagio2@gmail.com | *A4B61...0BFCF | contab |
| estagiario3 | estagio3@bol.com.br| *A4B61...EBFCF | juridico |
+-------------+--------------------+----------------+----------+
2 rows in set (0.02 sec)

Teremos os usuários habilitados para autenticar através do banco instalado.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Montando o circo
Podemos criar novos usuários ou modificar os usuários cadastrados. Trata-se de uma forma de autenticação desejável para clientes ou usuários em organizações que mantenham quadros transitórios e os gerentes de rede não desejem cadastrar de forma avulsa esses usuários temporários.

Após o cadastro dos usuários devemos testar o processo de autenticação através da base MySQL. Mudaremos a configuração do serviço login para que suporte autenticação através da base MySQL:

# vi /etc/pam.d/login


auth required pam_mysql.so user=root password=m0d3rn0 host=localhost db=cadastro table=estagio usercolumn=usuario passwdcolumn=senha crypt=2

account required pam_mysql.so user=root password=m0d3rn0 host=localhost db=cadastro table=estagio usercolumn=usuario passwdcolumn=senha crypt=2

Somente o gerenciamento de autenticação (auth) e o gerenciamento de contas (account) necessitam ser direcionados para autenticação na base mysql, e é possível utilizá-los com a prioridade 'sufficient'. Contudo, essa prioridade não é recomendável, pois se somente a base MySQL for usada para autenticar e esse usuário não tiver senha no sistema, a prioridade 'sufficient' não o impedirá de acessar o sistema sem uma senha definida. Por esse motivo é recomendável configurar a prioridade 'required'.

Apresentamos, a seguir, as variáveis necessárias à conexão ao banco MySQL, utilizadas pelo módulo:
usuário = 'root';
senha = 'm0d3rn0';
servidor de autenticação = 'localhost';
banco de autenticação = 'cadastro';
tabela de autenticação ='estagio';
colunas da tabela = 'usuario' e 'senha';
tipo de senha = '0=texto;1=md5;2=password'.

Os campos são requeridos e é possível verificar que a ausência de qualquer um deles pode impedir o uso do banco de autenticação. Em versões mais modernas do módulo pam-myslq, os campos relacionados com tabela e coluna não necessitam de definição explícita.

O campo senha pode guardar hash com texto em claro, hash md5 ou hash criptográfico gerado pelo mysql. É interessante, para fins de segurança e sem prejuízo do desempenho, configurar um usuário, diferente do root, para acesso ao banco de autenticação , e com permissões somente sobre esse banco (ou somente sobre a tabela estagio):

# mysql -u root -p
Enter password: ******

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 5.0.67-0ubuntu6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use cadastro;
Database changed

mysql> create user estagiario2@'localhost' identified by 'm0d3rn0';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on cadastro.* to estagiario2@'localhost' identified by 'm0d3rn0';
Query OK, 0 rows affected (0.00 sec)

mysql> quit;
Bye

Podemos, em seguida, acessar o banco de autenticação com o usuário administrativo criado para este fim:

# mysql -u estagiario2 -p
Enter password: ******

mysql> use mysql;
ERROR 1044 (42000): Access denied for user 'estagiario2'@'localhost' to database 'mysql'

mysql> use cadastro;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> quit;
Bye

# mysql -u estagiario2 cadastro -p
Enter password: ******
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Devemos acessar a base de autenticação através do usuário administrador sem fazer uso da conta root do MySQL. Para isso alteraremos a configuração do serviço login do PAM (/etc/pam.d/login):

# vi /etc/pam.d/login


auth requisite pam_securetty.so
auth requisite pam_nologin.so
auth required pam_mysql.so user=estagiario2 password=m0d3rn0 host=localhost db=cadastro table=estagio usercolumn=usuario passwdcolumn=senha crypt=2
auth sufficient pam_unix.so use_first_pass

account required pam_mysql.so user=estagiario2 password=m0d3rn0 host=localhost db=cadastro table=estagio usercolumn=usuario passwdcolumn=senha crypt=2

session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
session required pam_limits.so
session optional pam_lastlog.so

Pode-se agora autenticar os usuários cadastrados no banco MySQL.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Entrando em cena
Para não haver falhas na autenticação dos usuários: todos precisam possuir um shell válido, mas não devem ter senha definida no sistema.

# less /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
syslog:x:101:102::/home/syslog:/bin/false
klog:x:102:103::/home/klog:/bin/false
hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false
avahi-autoipd:x:104:112:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
gdm:x:105:113:Gnome Display Manager:/var/lib/gdm:/bin/false
avahi:x:110:121:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
haldaemon:x:111:122:Hardware abstraction layer,,,:/var/run/hald:/bin/false
prometeu:x:1000:1000:prometeu,,,:/home/prometeu:/bin/bash
mysql:x:112:125:MySQL Server,,,:/var/lib/mysql:/bin/false
estagiario1:x:1021:1010:,,,:/home/estagiario1:/bin/bash
estagiario2:x:1022:1011:,,,:/home/estagiario2:/bin/bash

Podemos testar a autenticação dos usuários cadastrados no banco de autenticação:

Ubuntu 8.10 prometeu-laptop tty2
prometeu-laptop login: estagiario2
Password: ******

Login incorrect

$ sudo tail /var/log/auth.log
Jul 17 10:21:15 ctadebian login[4475]: (pam_unix) authentication failure; logname= uid=0 euid=0 tty=tty2 ruser= rhost= user=estagiario2
Jul 17 10:21:17 ctadebian login[4475]: FAILED LOGIN (1) on 'tty2' FOR `estagiario2', Authentication failure
Jul 17 10:22:01 ctadebian CRON[5426]: (pam_unix) session opened for user root by (uid=0)
Jul 17 10:22:01 ctadebian CRON[5426]: (pam_unix) session closed for user root

Ubuntu 8.10 prometeu-laptop tty2
prometeu-laptop login: estagiario2
Password: ******

estagiario2@prometeu-laptop :~ $

Essa configuração pode ser utilizada para qualquer serviço com suporte ao uso do PAM: login, Squid, sudo, su, Apache2 etc, devendo ser ajustado o módulo libpam-* que corresponda ao serviço que desejarmos autenticar através da base MySQL.

Abraços a todos.
 
Topo