Segurança de Sistemas: Controle de acesso e níveis de usuários
Neste artigo veremos como definir de forma segura controles de acessos diferenciados para usuários de sistemas desenvolvidos em Delphi para a plataforma Win32.
Falar em segurança de sistemas, logo faz lembrar vários itens, que precisamos tomar os mais minuciosos cuidados, para que o sistema seja realmente seguro. Neste artigo veremos como definir de forma segura controles de acessos diferenciados para usuários de sistemas desenvolvidos em Delphi para a plataforma Win32.
Faremos uso do User Control Package , um pacote open source de componentes, que podem ser facilmente instalados nas versões posteriores ao Delphi 5, permitindo conexão aos principais padrões de acessos a dados e servidores de banco de dados compatíveis com Delphi. O acesso pode ser definido individualmente por Usuário e por Perfil de usuários, dando a opção de acompanhar uma lista de todos os usuários logados no sistema.
Iniciaremos com a instalação do componente, passando então à criação de uma aplicação Delphi com acesso a um banco de dados Firebird, onde aplicaremos o uso dos componentes do pacote.
Ao final do artigo, também veremos como gerar eventos no programa (log), podendo filtrar a consulta de log por usuário, data e nível.
O componente
Faremos o download do componente.
Faça o download do pacote através da seção destinada no site. Para este artigo, faremos o download da versão User Control 2.20 RC2. Fique à vontade para fazer o download das outras versões disponíveis. Salve o arquivo compactado dentro da pasta Lib do seu Delphi (ou escolha outra pasta).
Após o download, descompacte o arquivo zipado, deixando os fontes na pasta UserControl.
Instalando o componente
Usaremos neste artigo para fazer a instalação, configuração e uso do componente, o Delphi 2006, mas você poderá usar livremente qualquer outra versão superior ao Delphi 5. A instalação do User Control é simples, no menu File > Open do Delphi, localize dentro da pasta UserControl/Packages, o arquivo pckMD5.dpk.
Abra o mesmo e no Project Manager clique sobre a BPL dando um Build (Figura 1).
Repita o processo com os pacotes pckUCDataConnector.dpk, pckUserControl_RT.dpk e depois pckUserControl_DT.dpk. Apenas no último, pckUserControl_DT.dpk, após o Build , com o botão direito sobre o pacote escolha a opção Install.
Uma mensagem de confirmação de sucesso de instalação do componente será apresentada. Na mensagem também serão exibidos os componentes que você acabou de instalar (Figura 2).
Depois de instalado o componente, confirme a mensagem e use o menu File > Save All para concretizar a instalação.
Instalando os conectores
Para que possamos realizar os controles de usuários e níveis de permissões, precisamos instalar os componentes responsáveis pela comunicação do User Control com os componentes de acesso a dados. Juntamente com os arquivos de instalação, dentro da pasta Packages, encontraremos uma pasta Connectors.
Para cada um dos principais tipos suportado pelo Delphi, teremos um conector a ser instalado. Tomaremos neste artigo como exemplo o acesso ao banco de dados Firebird, onde faremos a instalação do pacote UCDBXConn.
Se preferir, você poderá instalar todos os demais conectores, assim, estará habilitado para qualquer tipo de conexão. Para fazer a instalação é muito simples, semelhante a instalação do componente, basta abrir o pacote que será encontrada na pasta do pacote, Build e após Install. Novamente, você será notificado do sucesso da instalação do conector e poderá salvar a instalação.
Iniciando uma aplicação
Criaremos agora uma aplicação no Delphi, onde utilizaremos um formulário principal e um Data Module para configuração do componente de acesso a dados. Iniciando uma nova aplicação VCL Forms Application (File > New > VCL Forms Application), criaremos uma pasta chamada “UCApp” onde salvaremos os arquivos da aplicação.
Salve o projeto com o nome de “UserControlApp.dpr” e o formulário como “UntUCApp.pas”. Altere o Caption do formulário para “User Control” o nome para “frmPrincipal”. Através do menu File > New > Other > Delphi Files, selecione Data Module e confirme (Figura 3). Altere o nome do mesmo para "DMConexao” e salve como “UntDMConexao.pas”.
Configurando a conexão
Adicione ao DMconexao um SQLConnection, altere seu nome para “Conexao” e com um duplo clique do mouse sobre o componente, abra o assistente para configuração do acesso ao banco de dados. Crie uma nova conexão, selecione o driver Interbase e em Connection Name dê o nome de “EMPLOYEE". Confirme e proceda com as configurações do acesso.
Utilizaremos o banco EMPLOYEE.fdb que acompanha a instalação do Firebird, e configuramos o User_Name, Password e ServerCharSet (Figura 4). Altere a propriedade LoginPrompt para False e ative a conexão.
Utilizando o User Control
Arraste para o Data Module o UCDBXConn da paleta UC Connectors que acabamos de instalar. Faça a configuração da sua propriedade Connection ligando-a ao SQLConnection.
Volte para o frmPrincipal e solte os componentes mostrados na Tabela 1, da paleta UC Main.
Componente | Utilização do componente |
Principal componente do pacote. Todas as funções de controle serão centralizadas no mesmo. Ligue a propriedade Data Connector ao UCDBXConn que está no DMConexao. Veremos mais adiante as configurações mais detalhadas desse componente. | |
Permite a customização do UserControl. Podemos alterar textos e mensagens de telas de formulários do componente. | |
Envia e-mails ao usuário, como por exemplo, para a opção Esqueci a senha. Ligue a propriedade MailUserControl do UserControl para esse componente. | |
Controla a inatividade do usuário. Poderá ser configurado um TimeOut para que o próprio sistema efetue logoff. Ligue a propriedade UserControl ao UserControl1. |
Em Project > Options arraste o Data Module para que fique posicionado acima ao frmPrincipal, isso garante que a conexão com o banco de dados já estará aberta quando o componente realizar uma consulta de usuário e senha na base.
Saiba mais Curso Criando minha primeira aplicação em DelphiAntes de executar a aplicação, precisamos definir os menus de acesso às funcionalidades do componente. Adicione ao frmPrincipal um MainMenu, e com um duplo clique crie uma estrutura semelhante à Tabela 2 (os valores entre parênteses representam os nomes dos itens de menu).
Arquivo | Usuários | Log |
Logoff (MLogoff) Sair (MSair) | Alterar Senha (MSenha) Cadastrar Usuários (MUser) Perfis de Usuários (MPerfil) Usuários Logados (MLogados) | Log do Sistema (MLog) |
No UserControl, definiremos as ligações das propriedades com cada um dos menus correspondentes. Configure cada uma das propriedades de acordo com a Tabela 3.
Propriedade | Menu da aplicação |
User > MenuItem | MUser: Acessado pelo menu Cadastro de Usuários |
UserPasswordChange > MenuItem | MSenha: Acessado pelo menu Alterar Senha |
UserProfile > MenuItem | MPerfil: Acessado pelo menu Perfis de Usuários |
UsersLogged > MenuItem | MLogados: Acessado pelo menu Usuários Logados |
LogControl > MenuItem | MLog: Acessado pelo menu Log do Sistema |
ApplicationID | UserControl: Nome da Aplicação |
Para configurar o menu de efetuar logoff, adicione ao evento OnClick do Logoff o código a seguir:
procedure TfrmPrincipal.MLogoffClick(Sender: TObject);
begin
UserControl1.Logoff;
end
Antes de compilarmos a aplicação, habilite a propriedade AutoStart do UserControl para True. Algumas configurações podem ser feitas em um editor, acessado ao dar um duplo clique no UserControl.
Testando a aplicação
Vamos executar a aplicação pela primeira vez, onde o componente criará automaticamente as tabelas por ele requeridas no banco de dados e mostrará uma tela com um usuário e senha padrão para proceder ao primeiro acesso (Figura 5).
Realizado o primeiro acesso ao sistema, acesse o menu Usuários e cadastre um novo usuário. No formulário de cadastro, criado automaticamente pelo componente (Figura 6), clique em Adicionar e faça o cadastro de seu próprio usuário.
Forneça todas as informações, exceto a opção Perfil que ainda está em branco e clique em Gravar, será habilitada uma opção onde deverá ser informada a senha para o novo usuário (essa é criptografada). Realizando um teste com o usuário criado, através do menu Arquivo > Logoff, acesse novamente o formulário de login e informe usuário e senha que acabou de cadastrar.
Certamente você já notou que está com acesso a todos os menus do sistema e pensou em uma forma de como bloquear o acesso a determinado menu de acordo com cada usuário. Lembrando que durante as configurações criamos um menu chamado de Perfis de Usuários, vamos acessar o mesmo e criar um novo perfil, ou melhor, passaremos a criar dois perfis, um “ADMINISTRADOR” e outro chamado “USUARIOS”.
Criados então os perfis, selecione o perfil USUARIOS e clique sobre o botão acessos. Apareceu um novo formulário, mas com nenhuma informação para definições de acesso. Não se preocupe você não cometeu nenhum erro, apenas não foi informado ao componente o que queremos controlar, nesse caso, serão os menus do sistema.
Feche a aplicação e voltando ao Delphi, no UserControl em sua propriedade ControlRight > MainMenu selecione o componente com a estrutura de menus (MainMenu1).
Compile e execute sua aplicação novamente, utilize para login o usuário ADMIN, certamente seu usuário não terá privilégios de acessos aos menus, e volte a acessar o menu Perfis de Usuários, selecione o perfil USUÁRIO e clique novamente em acessos.
Agora aparecendo todos os menus que configuramos anteriormente no componente, marque os mesmos de forma semelhante à Figura 7 e confirme.
Após, selecione o perfil ADMINISTRADOR, defina acesso a todos os itens do menu e confirme. Acesse o menu Cadastro de Usuário, selecione o usuário ADM, e clique em Alterar. Defina-o como membro do perfil ADMINISTRADOR.
Repita o processo com o usuário que você cadastrou, determinando que o mesmo será membro do perfil USUARIOS. Efetue logoff e dessa vez utilize seu usuário para conectar ao sistema. Perceba que seus privilégios de acesso foram limitados, onde os menus continuam aparecendo, porém foram desabilitados.
Acabamos de ver uma forma de controlar quem terá ou não acesso ao sistema, e aos menus que cada usuário terá acesso. Você poderá criar inúmeros perfis diferentes, e ainda, além de atribuir um usuário a um perfil, poderá definir acessos individuais a ele, na tela de cadastros.
Clique em Acessos, onde surgirá uma lista de definições individuais de acessos ao mesmo.
Funções de e-mail
Tendo adicionado o MailUserControl e configurado o mesmo ao UserControl, você possivelmente já deve ter notado a presença de um link Esqueci a Senha no formulário de login, também nas ações de cadastros e alterações de usuários, onde ao confirmar surgiu rapidamente uma tela de Envio de E-mail.
Todas essas opções são possíveis e já estão automaticamente habilitadas nas funcionalidades do componente, porém ainda não estão funcionando por não estarem devidamente configuradas. Então, mãos à obra.
Acessando as propriedades do MailUserControl, perceba que temos de informar ao mesmo os dados de uma conta de e-mail que serão utilizados para autenticação e o envio das informações. Precisamos informar ao componente o e-mail do remetente, o nome do mesmo e as informações do servidor de saída de e-mail (SMTP).
Informe o endereço do servidor, como por exemplo: “smtp.terra.com.br” ou simplesmente o número IP do mesmo. Informe também um usuário válido e a senha correspondente.
Simularemos o funcionamento do serviço de "Esqueci a Senha", e definir a mensagem que será enviada para o e-mail do solicitante, juntamente com usuário e senha. Acessando a propriedade EsqueceuSenha > Mensagem e digite o seguinte texto:
Solicitação de Senha
Seu usuário é: :login
Sua Senha é: :senha
O texto digitado possui dois parâmetros, ou seja, login e senha que na hora da solicitação pelo usuário serão substituídos pelas devidas informações. Para testar, execute o programa, digite seu usuário e clique sobre o link Esqueci a Senha.
Você receberá em seu e-mail a senha cadastrada para seu usuário. Você poderá também alterar a mensagem que será enviada para o e-mail, bem como as informações que o e-mail carregará.
Configure da mesma maneira o texto para as demais opções disponíveis no componente.
Timeout do sistema e lista de usuários logados
Muitos sistemas disponibilizam de recursos que controlam o tempo de inatividade dos usuários no sistema. No User Control, basta realizar uma configuração no UCIdle, alterando sua propriedade Timeout para o tempo que exista a seção para aquele usuário, sem o mesmo estar trabalhando no sistema (valor em milissegundos).
Em um exemplo de querermos atribuir um timeout de 20 minutos, bastaria atribuir à propriedade o valor “1200000”, onde esgotado esse tempo, automaticamente o componente mostra a tela de login para que o usuário possa voltar a utilizar o sistema.
Se seu sistema está instalado em uma rede e você permitir acesso simultâneo de vários usuários, o User Control oferece uma funcionalidade para acompanhar todos os usuários conectados.
Já configurado anteriormente, basta você executar o sistema, e através do menu Usuários Logados obter a listagem dos mesmos que estão ativos (Figura 8).
Salvando os Logs das ações do usuário
Já que o assunto é segurança, porque não falar sobre log. É através do log de um sistema que o administrador poderá acompanhar todas as ações dos usuários no sistema. No log de um sistema podem ficar armazenadas informações muitos importantes em casos de bugs ou falhas de informações.
No log, qualquer ação do usuário poderá ser armazenada, juntamente com a data/hora e nome do usuário logado no momento da gravação do log, além é claro da ação que o mesmo executou.
Adicione o seguinte código ao evento OnLoginSuccess do UserControl. Após, adicionado o código, execute o sistema e acesse o menu Log:
UserControl1.Log('Efetuou login no sistema', 0);
Acessando o log gerado pelo sistema, você já deve ter notado a presença de um registro que você fez login. Em qualquer formulário da aplicação você poderia acessar o componente e registrar o log, como por exemplo, em um formulário de cadastro, poderíamos criar um log quando o usuário insere um novo registro, altera, exclui, entre outras várias opções.
Um log pode ser armazenado com níveis diferentes de importância para o sistema, poderá ser armazenado como nível Baixo, de pouca importância para o administrador, como por exemplo, login e logoff.
Também como Normal, a exemplo de um usuário ter consultado algum relatório. Nível Alto, que geralmente é utilizado em alterações de registros e por final, um Crítico, correspondente a uma ação que o usuário fez e que poderá estar comprometendo informações do sistema, como por exemplo, a exclusão de um registro de estoque ou movimentações de caixa.
Esses níveis são definidos no momento da gravação do log, exemplo do código a seguir, onde informamos a ação que desejamos gravar e o nível da mesma:
UserControl1.Log('Efetuou login no sistema', 0);
{ Nível Baixo (0); Nível Normal (1); Nível Alto (2);
Nível Crítico (3) }
A tela de log permite ao usuário realizar várias opções de filtro, como por exemplo, consultar o log de um usuário específico, em uma determinada data, ou mesmo, pelo nível do log (Figura 9).
Outras configurações
No UCSettings, estão disponíveis inúmeras configurações para customização do User Control. Através desse componente é possível alterar todos os Captions, mensagens etc. Acessando as propriedades mudaremos a posição de todos os formulários do componente e também o Caption do login.
Alterando a propriedade WindowsPosition para poScreenCenter definimos que todos os formulários aparecerão ao centro da tela do computador. Para alterar o Caption do login, acessaremos a propriedade Login > WindowsCaption alterando-a para “User Control - Tela de Login”. Execute novamente sua aplicação, veja a mudança (Figura 10).
Conclusão
Conforme comentado no início do artigo, vimos uma forma de evitar que pessoas indesejadas tenham acesso aos seus sistemas, limitando também as prioridades de acesso aos usuários, lembrando que as senhas ficam criptografadas no banco de dados.
Vimos também uma maneira fácil e segura de monitorar através do log tudo que acontece no sistema, tudo isso através de um processo de desenvolvimento muito ágil, seguro e com a utilização de poucas linhas de código.
Saiu na DevMedia!
- Que JavaScript é esse?:
Apresentamos aqui o JavaScript na sua versão mais moderna. Ao acompanhar os cursos dessa série você se sentirá à vontade para programar em Angular, React ou Vue. - API REST + Cliente web React + Mobile:
É hora de por em prática o que você sabe criando um projeto completo! Na série de hoje vamos analisar requisitos, codificar uma API RESTful, um cliente mobile multiplataforma, um site e uma aplicação web de moderação.
Saiba mais sobre Segurança da Informação ;)
- Implementando segurança na programação Web:
Esse artigo traz uma série de boas práticas em relação à prevenção de ataques de hackers às nossas aplicações web, com exemplos de como se prevenir e a seus sites. - Segurança em sistemas corporativos:
Este artigo apresenta mecanismos de segurança para o desenvolvimento de sistemas corporativos, incluindo a criação de usuários e grupos no servidor de aplicação, desenvolvimento de login, configuração de roles e a manipulação de EJBs.
Revista Clube Delphi Edição 87
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo