Você está na página 1de 35

Segurança e Permissão de Acesso

Luciano F. de Medeiros
Sistema de Privilégios de Acesso
• Sistema particular do MySQL para controlar o
acesso e a realização das operações solicitadas
ao servidor MySQL pelos usuários
autenticados
• Com este sistema, o MySQL possibilita não
apenas aqueles usuários que tem acesso, mas
também a quais databases e tabelas e quais
operações o usuário pode realizar em cada
uma delas
Autenticação
• A autenticação de usuário considera não só o
nome do usuário sendo processado, mas
também o domínio de onde o usuário faz o
acesso
• Assim, um usuário user@localhost é diferente
do usuário user@dominio.com.
• Mesmo que o usuário digite o seu nome com
a senha, não acontecerá a validação.
Validação de Operações
• São similares ao uso de filtros para se saber
qual operação o usuário pode ou não executar

Usuário ‘A’ com origem no domínio ‘B’ tem acesso?

Usuário possui acesso ao database solicitado?

Usuário possui acesso à tabela solicitada?

Usuário possui acesso à coluna solicitada?

Sucesso.
Syntaxe
CREATE USER user IDENTIFIED BY password;

• user deve estar no formato


‘usuário’@’domínio’
• password é a senha entre aspas
• A senha ficará codificada internamente
• Para excluir um usuário:
DROP USER user;
Exemplos
Comando Descrição
CREATE USER Cria um usuário ‘luciano’ para acessar
pelo domínio ‘localhost’ com a senha
'luciano'@'localhost' ‘1234’
IDENTIFIED BY '1234';

CREATE USER 'dbadmin'@'%' Cria um usuário ‘dbadmin’ para acesso de


qualquer domínio com a senha ‘1234’
IDENTIFIED BY '1234';

CREATE USER Mesmo que o exemplo 1


luciano@localhost IDENTIFIED
BY '1234';
CREATE USER Cria um usuário ‘dummy’ sem senha
'dummy'@'localhost';
Concedendo permissão
GRANT privileges (column_list)
ON [object_type] privilege_level
TO account [IDENTIFIED BY 'password']
[REQUIRE encryption]
WITH with_options

• privileges se refere aos comandos a que o usuário terá


acesso
• column_list é a lista de colunas ao qual o usuário terá
acesso
• object_type é o tipo de objeto (TABLE, FUNCTION ou
PROCEDURE)
• privilege_level é o nivel de acesso
Revogando permissão
• Contrário do comando GRANT
• É necessário que o usuário conectado tenha
poderes de administrador ou para realizar
alterações (CREATE USER ou GRANT OPTION)

REVOKE privileges (column_list)


ON [object_type] privilege_level
FROM account
Níveis de Acesso
Nível do Acesso Descrição
*.* Todos os databases e todas as tabelas

db_name.* Todas as tabelas do database db_name

db_name.tbl_name Apenas a tabela tbl_name do database


db_name
tbl_name Apenas a tabela tbl_name (mesmo que
anterior)
db_name.routine_name Nome da procedure/function do database
db_name
Exemplos
Comando Descrição
GRANT SELECT, INSERT ON sakila.* TO Concede os privilégios para consulta e
user@localhost; inserção para qualquer tabela do
database sakila para o usuário user
para o domínio localhost
GRANT ALL ON sakila TO Concede todos os privilégios para o
luciano@localhost; usuário luciano no domínio localhost
GRANT SELECT Concede privilégio de consulta na
(primeiro_nome,ultimo_nome) ON tabela cliente do database sakila,
sakila.cliente TO luciano@localhost; apenas para os campos primeiro_nome
e ultimo_nome, para o usuário luciano
no domínio localhost
REVOKE ALL ON sakila FROM Revoga todos os privilégios sobre o
luciano@localhost; database sakila para o usuário luciano
no domínio localhost
Opções de Acesso
Privilégio Descrição
ALL / ALL PRIVILEGES Todos os privilégios
ALTER Permite alterar a estrutura de tabelas
ALTER ROUTINE Permite alterar e excluir stored
procedures / functions
CREATE Permite criar bancos de dados e tabelas
CREATE ROUTINE Permite criar stored procedures /
functions
CREATE TEMPORARY TABLES Permite a criação de tabelas temporárias
em expressões SQL que utilizam este
recurso
CREATE USER Permite criar e gerenciar usuários
CREATE VIEW Permite criar visões
DELETE Permite exclusão de registros
DROP Permite exclusão de estruturas (tabelas e
bds)
EVENT Permite criar event schedulers
EXECUTE Permite executar stored procedures
Opções de Acesso
Privilégio Descrição
FILE Permite ler e escrever arquivos no sistema
(p.ex., LOAD DATA)
GRANT Permite cadastrar privilégios para outros
usuários
INDEX Permite gerenciamento de índices
INSERT Permite inserção em tabelas
LOCK TABLES Permite bloquear tabelas para uso
PROCESS Permite visualizar e finalizar processos do
MySQL
RELOAD Permite recarregar bancos de dados
REPLICATION CLIENT Permite solicitar replicação
REPLICATION SLAVE Permite replicar as informações
SELECT Permite realizar consultas SQL
SHOW DATABASES Permite visualizar a estrutura dos bancos
de dados
SHUTDOWN Permite desligar o servidor MySQL
Opções de Acesso
Privilégio Descrição
SUPER Permite configurar os dados do servidor
Master no caso de Replicação, utilizar o
comando KILL para interromper
processos, excluir logs e ultrapassar o
limite de conexões máximas
TRIGGER Permite criar e gerenciar triggers
UPDATE Permite alterar informações em tabelas
USAGE Equivalente a ‘sem privilégios’, permite o
uso de comandos básicos
Acessando a tabela ‘user’
• Pode-se acessar a tabela user do mysql, que
contém o registro de todos os usuários do
sistema ou a um usuário específico:
SELECT * FROM `mysql`.`user` WHERE user = 'luciano';
Mudando a senha

SET PASSWORD FOR ‘usuário’@’domínio’ = PASSWORD(‘senha’)

SET PASSWORD FOR 'luciano'@'localhost' = PASSWORD('4321')


;
Mais comandos
• Para verificar as permissões dadas a um
usuário específico:
SHOW GRANTS FOR luciano@localhost;

• Selecionando o usuário atual:

SELECT CURRENT_USER();
Exemplo
• Crie um usuário ‘user’ para o domínio
‘localhost’
• Coloque uma senha específica
• Dê permissão para acesso às tabelas do
database sakila

DROP USER 'user'@'localhost';


CREATE USER 'user'@'localhost' IDENTIFIED BY '1234';
SET PASSWORD FOR 'user'@'localhost' = PASSWORD('1234');
GRANT SELECT ON sakila.* TO 'user'@'localhost';
Acessando no MySQL Workbench

Insira um nome para a conexão e digite o usuário criado em username.


Faça o teste de conexão.
MySQL Workbench
Verificando a permissão
• Abra o database sakila com o comando
USE sakila;

• Verifique as tabelas que estão acessíveis


SHOW TABLES
Execute uma consulta
Tente fazer uma inserção
INSERT INTO cliente (primeiro_nome, ultimo_nome) VALUES ('teste' ,
'inserção');
Modificando a permissão
• Apenas a permissão para acessar a tabela
cliente

DROP USER 'user'@'localhost';


CREATE USER 'user'@'localhost' IDENTIFIED BY '1234';
SET PASSWORD FOR 'user'@'localhost' = PASSWORD('1234');
GRANT SELECT ON sakila.cliente TO 'user'@'localhost';
SHOW TABLES
Tentando selecionar outra tabela
SELECT * FROM aluguel;
Criando Views
• Views são ‘visões’ de uma tabela específica,
podendo conter todos os apenas
determinados campos e que podem ser
acessados via consulta.
• Úteis para conceder acesso a dados de forma
controlada a usuários
• Sintaxe:
CREATE VIEW <nome_view> AS <comando>;
Exemplo
• Criar uma view que possibilite apenas o
acesso aos campos primeiro_nome e
ultimo_nome da tabela cliente.

CREATE VIEW v_cliente AS


SELECT primeiro_nome, ultimo_nome FROM
cliente;

• Após, pode-se digitar o seguinte comando:

SELECT * FROM v_cliente;


View v_cliente
Modificando o acesso do exemplo
• Permitindo acesso apenas à view que foi
criada:

DROP USER 'user'@'localhost';


CREATE USER 'user'@'localhost' IDENTIFIED BY '1234';
SET PASSWORD FOR 'user'@'localhost' = PASSWORD('1234');
GRANT SELECT ON sakila.v_cliente TO 'user'@'localhost';
SHOW TABLES
Consultado a view
Proteção de campos em formulários
• Deve-se ter cuidado na criação dos comandos
para acesso a formulários, especialmente na
digitação de senhas
• O uso dos recursos de forma básica podem
proporcionar falhas de segurança
• Por exemplo, a digitação de um usuário e senha
para autenticação:

SELECT * FROM usuario WHERE username=‘Nome’ AND password=‘ao23’;


Formulário de autenticação
• Caso um usuário qualquer insira o seguinte
conteúdo no campo relativo à senha:
‘ OR ‘1’ = ‘1

• O comando será interpretado pelo sistema


como
SELECT * FROM usuario
WHERE username=‘Nome’
AND password=‘’ OR ‘1’=‘1’

Este comando é válido !!!


Ajustando o comando...
• Deve-se utilizar a barra invertida (ESCAPE)
SELECT * FROM usuario
WHERE username=‘Nome’
AND password=‘\’ OR \‘1\’=\‘1’

• Assim, o comando não retornará nenhum


registro.

Você também pode gostar