Segurança no MS SQL Server Professor Sérgio Furgeri Segurança de Acesso a Banco de Dados no MS SQL Server Para efetuar com sucesso os exemplos que serão mostrados a seguir é necessário que exista no SQL Server uma pessoa que se conecte como Administrador, e um ou mais usuários que tenham seus devidos logins de acesso a um determinado banco de dados, que nosso exemplo será o banco de dados Locadora. O MS SQL Server já cria durante a instalação uma conta de administrador com o username sa. A seguir serão apresentados os procedimentos para a criação de um login de acesso a um banco de dados. 1. Abra o Enterprise Manager. 2. Ative o Console Root. 3. Na estrutura de árvore, a esquerda do Console Root, acesse a pasta Security. Dentro desta pasta acesse o item Logins. 4. Clique com o botão direito do mouse sobre o item Logins. Selecione a opção New Login ... Surgirá uma caixa de diálogo mostrada pela seguinte figura. Selecionada a guia “General” conforme a figura, segue uma breve descrição de cada um dos campos a serem preenchidos durante a criação do login: Página 1 Segurança no MS SQL Server • • • • Professor Sérgio Furgeri Name - deve conter o nome do login que será criado. Para o nosso exemplo, coloque “usuario”, tudo em letras minúsculas e também sem acento. Authentication - refere-se ao modo como será autenticado este login. Marque a opção SQL Server Authentication e no campo Password coloque “usuario” novamente Database - deve ser colocado o nome do banco de dados que o usuário deseja que apareça como padrão quando se conectar no sistema. Coloque a opção referente à banco de dados Locadora. Language - deve constar o idioma padrão que o login irá utilizar nas suas conexões para o tratamento de determinadas questões como datas e números. Caso não seja selecionado nenhum idioma, o idioma padrão do Servidor SQL entra em vigor. Selecione a opção Portuguese. 5. Clique na guia “Database Access” e marque a opção referente ao banco de dados Locadora na lista dos bancos disponíveis no SQL Server. 6. Clique no botão “OK”. Surgirá no centro da tela uma pequena caixa de diálogo com um campo para confirmação de senha. Confirme a senha digitada e clique novamente no botão “OK”. Agora você já possui um novo login de acesso ao banco de dados Locadora. Só a título de curiosidade, vamos observar as permissões adquiridas pelo seu usuário no banco Locadora. Veja agora: 1. Na árvore à esquerda do Console Root, através do caminho Databases | Locadora | Users. Você poderá ver entre os usuários do banco de dados Locadora, o login usuário recém criado. 2. Clique com o botão direito do mouse sobre o usuário recém criado e selecione a opção Propriedades. 3. Clique no botão “Permissions”. Surgirá a janela apresentada pela figura a seguir: Página 2 Segurança no MS SQL Server Professor Sérgio Furgeri Podemos observar por essa janela, que na lista de tabelas, views e stored procedures não é permitido nada e também não é negado nada. Poderíamos somente marcar nesta lista o que seria permitido ao usuário ou não, porém faremos isto através de linhas de comandos no Query Analyser a seguir. Com o Query Analyser aberto, será necessário que você se conecte com o banco primeiramente com a conta de administrador existente (sa), pois para permitir, revogar e negar alguma ação a um usuário é necessário ter autoridade suficiente ou a altura para fazêlo. Depois iremos acessar o menu File, opção Connect... para fazer uma nova conexão com o mesmo banco de dados Locadora, porém agora usando o login de acesso “usuario” que criamos. Com isso, duas janelas do Query Analyser estarão abertas, uma como administrador para e outra como usuário. Conforme vínhamos dizendo, todo esse controle e segurança no acesso de um determinado usuário a um banco de dados pode-se resumir em apenas três operações básicas: permitir ou conceder, retirar ou revogar, e negar uma ação, respectivamente executados pelas instruções GRANT e REVOKE. Utilizando a conta de Administrador, vamos primeiro conceder ao login usuário o direito de selecionar os dados da tabelas de Clientes do banco Locadora. Execute o comando abaixo: Página 3 Segurança no MS SQL Server Professor Sérgio Furgeri grant select on clientes to usuario Podemos traduzir o comando acima da seguinte maneira: permita selecionar os dados na tabela de clientes ao login “usuario”. O retorno do servidor deve ser “The command(s) completed successfully.”, ou seja, o comando foi executado com sucesso. Vá até a outra janela do Query Analyser onde você se conectou como usuário e tente selecionar os dados da tabela de clientes. Provavelmente você conseguiu selecionar e visualizar os dados da tabelas de clientes com qualquer tipo de comando simples. Todavia, se você tentar selecionar os dados se qualquer outra tabela, por exemplo, como discos, filmes, ou historico não será possível, pois simplesmente o login usuário não tem permissão alguma de acessar os dados destas demais tabelas, mesmo que elas não tenham sido negadas. A mensagem de retorno do servidor para algum acesso não permitido, como selecionar dados da tabelas de filmes, será “SELECT permission denied on object 'FILMES', database 'Locadora', owner 'dbo'.” Ou seja, permissão negada para o objeto que no caso a tabela filmes no banco de dados Locadora do proprietário (como se fosse o dono, aquele que criou), chamado de dbo (Database Owner). Para que seja possível o login usuario acessar as demais tabelas mostradas, execute o seguinte comando conectado como Administrador: grant select on filmes, discos, historico to usuario Até agora só testamos a permissão do login usuario em tabelas diferentes, mas também é claro que dentro da própria tabela de clientes ele tem suas restrições. Lembre-se que pelo comando SQL que definimos, o login só teria acesso a executar a instrução SELECT, impossibilitando qualquer tentativa de utilização das instruções UPDATE, INSERT ou DELETE. Neste próximo exemplo, vamos permitir que o login usuario também possa executar outras instruções citadas acima em diversas tabelas. Como Administrador, digite: grant insert, update, delete on clientes, filmes, discos to usuario Podemos traduzir o comando acima da seguinte maneira: ao login “usuario” inserir, atualizar e deletar os dados nas tabelas de clientes, filmes e discos. Se recordarmos a lista de permissões da janela Database User Properties do login usuario, era possível notar que não havia qualquer marcação na lista indicando a permissão para coisa alguma. Porém se considerarmos somente os objetos tabelas desta lista e também as Página 4 Segurança no MS SQL Server Professor Sérgio Furgeri instruções que mencionamos nos comandos, agora esta lista terá as marcações semelhantes à tabela seguinte. Objeto Clientes Filmes Discos Games Historico SELECT √ √ √ INSERT √ √ √ UPDATE √ √ √ DELETE √ √ √ √ Outro ponto a ser observado, é que até o presente momento estamos trabalhando apenas com tabelas, mas as permissões para acesso também se estendem para a criação de procedimentos ou funções, como views e stored procedures mostrados pelo exemplo a seguir: grant create view, create procedure to usuario Interpretando o comando acima: permita ao login “usuario” a criação de visões (views) e a criação de procedimentos (stored procedures). Além de permitir o acesso a um objeto para um usuário também é possível dar a esse usuário o direito de passar o privilégio concedido a ele para os seus predecessores, ou seja, para outros usuários adiante. Este efeito é conseguido acrescentando with grant option no final de um comando com uma instrução grant qualquer. Veja exemplo seguinte: grant select on filmes to usuario with grant option Com o comando mostrado acima, o login “usuario” pode agora permitir a outros usuários o direito de selecionar os dados da tabela de filmes, do mesmo modo que lhe foi concedido. Da mesma maneira que o Administrador pôde conceder ao login “usuario” o acesso aos objetos do banco de dados Locadora, ele também pode revogar todos esses direitos. Os direitos de acesso podem ser revogados no SQL Server através dos comandos que possuírem a instrução revoke. Observe o exemplo a seguir: revoke select, usuario update, insert, delete on clientes from Este comando revoga todo e qualquer direito que o login “usuario” tinha sobre a tabela de clientes, ou seja, o direito de selecionar os dados, de atualizá-los, inseri-los e excluí-los. Para revogar todos os direitos de uma determinada tabela, causando o mesmo efeito do comando anterior, poderíamos somente ter executado o seguinte código: revoke all on clientes from usuario Página 5 Segurança no MS SQL Server Professor Sérgio Furgeri Onde a instrução all pode ser usada para representar todos de um determinado grupo, sejam eles os privilégios a serem concedidos conforme fizemos, sejam os objetos onde os direitos serão aplicados, como as tabelas, ou sejam vários usuários onde queremos aplicar os mesmos privilégios. Para revogar um privilégio grant option no qual o usuário pode conceder os seus direitos aos outros usuários, utilizamos a sintaxe semelhante ao exemplo a seguir: revoke grant option for select on filmes from usuario Neste exemplo é importante notarmos o seguinte: o comando com a instrução revoke que acabamos de usar apenas revogou o direito do usuário de passar seus privilégios adiante, de forma que ele ainda continua a acessar os dados da tabela de filmes livremente. Para remover todos os direitos de usuario perante a tabela de filmes então é executado o seguinte comando: revoke select on filmes from usuario Outro ponto importante a ser observado é que o login usuario passou os seus direitos adiante para outros usuários, muito provavelmente os dois últimos comandos acima de acabamos de ver não serão executados pelo servidor ocasionando a seguinte mensagem de erro “To revoke grantable privileges, specify the CASCADE option with REVOKE.” Este problema ocorre porque estamos tentando revogar o direito de acesso de um usuário que já concedeu o mesmo direito para outros usuários, causando assim uma espécie de quebra na cadeia de concessões. A mensagem que o servidor envia quando tentamos executar o comando é que para revogar os privilégios concedidos com o grant option, é necessário acrescentar a opção cascade no comando da instrução revoke. O seguinte comando permite que o direito de acesso do usuário na tabela de filmes seja revogado com sucesso, mesmo tendo-o repassado para outros usuários que também terão seus acessos revogados devido à utilização da instrução cascade. Veja: revoke select on filmes from usuario cascade Página 6 Segurança no MS SQL Server Professor Sérgio Furgeri Exercícios Crie no MS SQL Server um banco de dados chamado Empresa. Neste banco devem existir as tabelas de Clientes e de Produtos. Insira um considerável número de dados em ambas as tabelas. Agora, crie os seguintes usuários: • marcos • fernanda • joaquim Usando comandos SQL, fixe as seguintes regras de privilégio para os usuários: − Marcos deve ter acesso as duas tabelas podendo alterar, inserir e excluir dados. Porém ele terá acesso somente às tabelas, e a nenhum outro objeto existente. − Fernanda deve ter acesso somente à tabela de Clientes. Ela poderá alterar e inserir dados na tabela, mas não excluí-los. − Joaquim poderá apenas visualizar os dados da tabela de Produtos e Clientes. − Marcos concede a Joaquim os direitos de alterar, inserir e excluir dados da tabela de Produtos. − Joaquim e Fernanda perdem o direito de acessar e de visualizar os dados a tabela de Clientes. − Marcos perde o direito de acessar a tabela de Produtos. Com isso Joaquim também deve perder os mesmos direitos concedidos por Marcos. Página 7