Curso Implementando e Administrando servidor de Diretório OpenLDAP Página 1 Trabalhando com ACLs Objetivos da Aula: Entendendo o funcionamento das ACLs Visualizando ACLs existentes Criando e Testando ACLs Removendo ACLs Página 2 Entendendo o funcionamento das ACLs ACLs são diretivas de controle de acesso que definem o nível de acesso de cada usuário a um tipo de informação disponível na base de dados. No OpenLDAP elas representam um ferramenta muito poderosa e versátil. Utilizando ACLs é possível controlar o acesso à base de dados, granularmente, baseando-se nas informações de autenticação, endereço IP, nome de domínio, dentre outras. As ACLs são poderosas para controlar com mãos de ferro o que os usuários podem ou não fazer dentro de uma infraestrutura OpenLDAP. Apesar de esta ser uma das funções mais importantes, o aspecto mais interessante do uso de ACL em servidores LDAP é outro: a possibilidade de delegar tarefas. Imagine o seguinte caso: como permitir que um usuário altere a sua e apenas a sua senha? Na maioria das vezes uma instrução como essa exige malabarismos enormes do administrador de sistemas, principalmente quando o grau de integração entre os serviços aumenta. Mas o OpenLDAP torna essa tarefa bem simples. dn: olcDatabase={2}hdb,cn=config olcAccess: {0}to dn.base="" by * read olcAccess: {1}to attrs=userpassword,shadowlastchange by anonymous auth by self write by * none olcAccess: {2}to * by self write by * read As regras de acesso têm a seguinte sintaxe: access to < o que > by < quem > < acesso > < controle > o que – Atributo ou entrada para o qual o controle será imposto. quem – Entidade ou DN completo do objeto em que o acesso será aplicado (veja tabela de entidades a seguir). acesso – Define o nível de acesso à entidade, grupo ou usuário. controle – Define a forma do processamento das ACLs. Por padrão, quando uma entrada de ACL é satisfeita, o processamento das ACLs é interrompido. Isto se dá porque o valor de controle padrão é “stop”. Outros valores possíveis são “continue”, que faz com que o processamento continue, e “break”. Página 3 O que O quê Descrição * Tudo dn Entradas especificadas de uma base attrs Lista de atributos. O mesmo que dn, mas podendo especificar dn.escopo escopos filtros avançados Filtra objetos de acordo com a expressão regular ou não. dn<.exact,regex> O escopo pode ser base, one, subtree ou children. Onde base corresponde apenas a entrada do DN, one corresponde às entradas um nível abaixo do DN usado no filtro, subtree corresponde a todas as entradas a partir do DN e children corresponde as entradas da sub-árvore abaixo do DN raiz mas não inclui o DN raiz. Representação da atuação do escopo na árvore LDAP a partir da raiz dc=gnulinux,dc=com: base dc=gnulinux,dc=com one o=matriz ou=usuarios o=filial ou=grupos children cn=suzana cn=rh Página 4 subtree quem quem Descrição * Todos incluindo acesso anônimo anonymous Acesso de usuários anônimos users Usuários autenticados self Usuários associados ao alvo dn<.exact,expand> Filtra objetos aproveitando o resultado de expressões regulares ou não. dn.<escopo> Entradas especificas de uma base podendo usar os escopos base, one, subtree e children. group<exact,expand> Filtra objetos especificando um grupo. No item dn.<escopo> pode-se especificar um escopo como explicado anteriormente. Já no item dn<.exact,expand,regex> pode-se especificar uma expressão regular usando dn.regex, ou usar o resultado de uma expressão regular passada anteriormente com dn.expand ou especificar o caminho exato do objeto com dn.exact. Acesso Acesso Privilégio Descrição none =0 Sem acesso auth =X Necessário autenticação compare =CX Necessário para fazer comparações search =SCX Necessário para utilizar filtros de pesquisa read =RSCX Necessário para ler resultados de pesquisas write =WRSCX Necessário para modificar / renomear manage =MWRSCX Necessário para gerenciar Página 5 Execute os comandos na VM Server OpenLDAP1 Visualizando ACLs existentes Podemos visualizar as ACLs buscando pelo atributo olcAccess da árvore que desejamos consultar. Assim, para vermos as ACLs da árvore dc=gnulinux,dc=com que adicionamos anteriormente devemos fazer o seguinte: # ldapsearch -x -D cn=admin,cn=config -W -b olcDatabase ={2}hdb,cn=config olcAccess -LLL dn: olcDatabase={2}hdb,cn=config olcAccess: {0}to dn.base="" by * read olcAccess: {1}to attrs=userpassword,shadowlastchange by anonymous auth by self write by * none olcAccess: {2}to * by self write by * read O endereço da base que será consultada deve ser sempre o mostrado na base cn=config, no exemplo é olcdatabase={2}hdb,cn=config. Página 6 Execute os comandos na VM Server OpenLDAP1 Criando e Testando ACLs Ao contrário de schemas, podemos remover ACLs sem a necessidade de reiniciar o servidor. Pois elas são apenas atributos de um objeto da árvore e não um objeto à parte. Assim tudo que devemos fazer é criar um arquivo com extensão .ldif com dn da base e o atributo olcaccess e a definição da ACL. Para testar o poder de restrição/controle das ACLs iremos adicionar um usuário chamado linus e um grupo administradores e tentar adicionar mais objetos com esse usuário. # vim /root/aula4/admins.ldif dn: cn=administradores,ou=grupos,o=matriz,dc=gnulinux,dc=com cn: administradores objectclass: top objectclass: : cn=linus,ou=usuarios,o=matriz,dc=gnulinux,dc=com Description: Administradores da base gnulinux.com dn: cn=linus,ou=usuarios,o=matriz,dc=gnulinux,dc=com objectclass: top objectclass: person cn: linus sn: torvalds userpassword: ldap # ldapadd -x -h 10.10.50.7 /root/aula4/admins.ldif -p 389 -D cn=admin,dc=gnulinux,dc=com -W -f Agora vamos tentar adicionar um usuário usando o usuário linus. # ldapadd -x -h 10.10.50.7 -p 389 -D cn=linus,ou=usuarios,o=matriz,dc=gnulinux,dc=com -W -f /root/aula4/add-user.ldif Veja que o usuário linus não tem permissão para adicionar objetos na base, isso se dá pela restrição das acls que só permitem que um usuário sem privilégios só modifique informações de sua própria conta. adding new entry "cn=maicon,ou=usuarios,o=matriz,dc=gnulinux,dc=com" ldap_add: Insufficient access (50) additional info: no write access to parent Página 7 Execute os comandos na VM Server OpenLDAP1 Agora vamos adicionar uma acl que dá permissão aos membros do grupo administradores de administrar a base. # vim /root/aula4/acl-admin.ldif dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcaccess olcAccess: {0}to attrs=userpassword,shadowlastchange by anonymous auth by self write by * none olcAccess: {1}to * by self write by group.exact="cn=administradores,ou=grupos,o=matriz,dc=gnulinux,dc=com" write by * none # ldapmodify -x -h 10.10.50.7 -p 389 -D cn=admin,cn=config -W -f /root/aula4/acl-admin.ldif Agora tente adicionar a conta de usuário na e veja o resultado. # ldapadd -x -h 10.10.50.7 -p 389 -D cn=linus,ou=usuarios,o=matriz,dc=gnulinux,dc=com -W -f /root/aula4/add-user.ldif Veja que agora é possível administrar a base usando contas da propria base, sem necessidade de usar o administrador de base definida na diretiva olcRootDN. adding new entry "cn=maicon,ou=usuarios,o=matriz,dc=gnulinux,dc=com Mais um exemplo Agora vamos simular o acesso a um atributo em especifico que um grupo de usuários podem acessar. Primeiro vamos criar a estrutura. # vim /root/aula4/estrutura.ldif dn: ou=usuarios,o=filial,dc=gnulinux,dc=com ou: usuarios objectclass: top objectclass: organizationalunit dn: ou=grupos,o=filial,dc=gnulinux,dc=com ou: grupos objectclass: top objectclass: organizationalunit Página 8 dn: cn=vendas,ou=grupos,o=filial,dc=gnulinux,dc=com cn: vendas objectclass: top objectclass: posixgroup gidnumber: 5004 dn: cn=juridico,ou=grupos,o=filial,dc=gnulinux,dc=com cn: juridico objectclass: top objectclass: groupofnames member: cn=narciso,ou=usuarios,o=filial,dc=gnulinux,dc=com member: cn=daniele,ou=usuarios,o=filial,dc=gnulinux,dc=com dn: cn='setor pessoal',ou=grupos,o=filial,dc=gnulinux,dc=com cn: setor pessoal objectclass: top objectclass: posixgroup gidnumber: 5006 dn: cn=souza,ou=usuarios,o=filial,dc=gnulinux,dc=com objectclass: top objectclass: person objectclass: posixaccount cn: souza sn: martins uid: souza uidnumber: 5013 gidnumber: 5004 homedirectory: /home/souza loginshell: /bin/bash telephonenumber: '3325-6759' dn: cn=narciso,ou=usuarios,o=filial,dc=gnulinux,dc=com objectclass: top objectclass: person objectclass: posixaccount cn: narciso sn: tony uid: narciso uidnumber: 5012 gidnumber: 5006 homedirectory: /home/narciso loginshell: /bin/bash telephonenumber: '3325-6758' Página 9 dn: cn=daniele,ou=usuarios,o=filial,dc=gnulinux,dc=com objectclass: top objectclass: person objectclass: posixaccount cn: daniele sn: mascarenhas uid: daniele uidnumber: 5012 gidnumber: 5006 homedirectory: /home/daniele loginshell: /bin/bash telephonenumber: '3325-6757' # ldapadd -x -h 10.10.50.7 -p 389 -D cn=linus,ou=usuarios,o=matriz,dc=gnulinux,dc=com -f /root/aula4/estrutura.ldif -W Perceba que cada conta de usuário tem um atributo chamado de telephonenumber que armazena o número de telefone. Agora vamos adicionar uma ACL que permiti que cada usuário pode ver somente seu número de telefone, mas o grupo de usuários juridico podem ver todos os números. # vim /root/aula4/acl-control.ldif dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcaccess olcAccess: {0}to attrs=userpassword,shadowlastchange by self write by anonymous auth by * none olcAccess: {1}to dn.children="o=filial,dc=gnulinux,dc=com" attrs="telephonenumber" by self write by group.exact="cn=juridico,ou=grupos,o=filial,dc=gnulinux,dc=com" read olcAccess: {2}to * by self write by group.exact="cn=administradores,ou=grupos,o=matriz,dc=gnulinux,dc=com" write by users read # ldapmodify -x -h 10.10.50.7 -p 389 -D cn=admin,cn=config -W -f /root/aula4/acl-control.ldif Execute os comandos na VM Server OpenLDAP1 Agora teste o acesso fazendo uma consulta ao atributos telephonenumber com o usuário souza. # ldapsearch -x -h 10.10.50.7 -p 389 -D cn=souza,ou=usuarios,o=filial,dc=gnulinux,dc=com -b ou=usuarios,o=filial,dc=gnulinux,dc=com -W -LLL telephoneNumber Veja no resultado que somente o atributo telephonenumber do usuário souza foi mostrado o Página 10 dos outros usuários não. Agora uma consulta com usuário que pertence ao grupo juridico. # ldapsearch -x -h 10.10.50.7 -p 389 -D cn=daniele,ou=usuarios,o=filial,dc=gnulinux,dc=com -b ou=usuarios,o=filial,dc=gnulinux,dc=com -W -LLL telephoneNumber O resultado mostra que o atributo telephonenumber de todos os usuários neste DN foi mostrado conforme a configuração definida na ACL. Removendo ACLs A remoção de acls é algo simples de fazer, somente sendo necessário um usuário permissão de remover o atributo olcaccess(lembre-se que acls dentro do padrão cn=config é considerado um atributo) da base e um arquivo com extensão .ldif com o conteúdo a ser removido. Lembre-se que sempre temos especificar o DN do objeto no vamos adicionar, alterar ou remover. # vim /root/aula4/acl-delete.ldif dn: olcDatabase={2}hdb,cn=config changetype: modify delete: olcaccess olcAccess: {1}to dn.children="o=filial,dc=gnulinux,dc=com" attrs="telephonenumber" by self write by group.exact="cn=juridico,ou=grupos,o=filial,dc=gnulinux,dc=com" read # ldapmodify -x -h 10.10.50.7 -p 389 -D cn=admin,cn=config -W -f /root/aula4/acl-delete.ldif Página 11