Mudança de hábito: autenticando usuários em base de dados MySQL
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.
[ Hits: 21.620 ]
Por: lourival araujo da silva em 03/08/2009
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.
# 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.
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;
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;
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;
# 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.
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
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
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: ******
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
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.
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.
Nenhum comentário:
Postar um comentário