segunda-feira, 9 de junho de 2008

Configurando o Squid com o OpenLdap

Olá amiguinhos,

Este tutorial foi feito por mim mesmo e com auxilio ao fórum GDH para tirar dúvidas. Antes de tudo, vou mostrar como se faz no Debian, no CentOS tive muitos problemas, acho que os pacotes do Squid não foram compilados com suporte ao Ldap, e eu fiquei uma semana quebrando a cabeça pra descobrir isso. A solução foi compilar o Squid na mão e assim, funcionou no CentOS. Mas no Debian não tem esse problema, então vamos lá. Primeiro vamos configurar o OpenLdap, instale ele:

# aptitude install ldap-server ldap-client


Após a instalação é preciso ser feito uma configuração básica do openldap:

# cd /etc/ldap
# vim slapd.conf


E altere o arquivo conforme abaixo:

include         /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel 0
modulepath /usr/lib/ldap
moduleload back_bdb
sizelimit 500
tool-threads 1
backend bdb
checkpoint 512 30
database bdb
suffix "dc=teste,dc=com,dc=br"
directory "/var/lib/ldap"
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
index objectClass eq
lastmod on
access to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=teste,dc=com,dc=br" write
by anonymous auth
by self write
by * none
access to dn.base="" by * read
access to *
by dn="cn=admin,dc=teste,dc=com,dc=br" write
by * read


Depois configuramos o ldap.conf conforme abaixo:

BASE dc=teste,dc=com,dc=br
rootbinddn cn=admin,dc=teste,dc=com,dc=br
bindpw {SSHA}7z7N6plyPwijNr2tyhOPpZWc3NMRiKQg
host 127.0.0.1


A senha você pode gerar usando o seguinte comando:

# slappasswd -s teste


Então basta copiar o resultado da senha criptografada e colocar na frente do bindpw.

Feito isso, basta iniciar o serviço do Ldap para começarmos a popular nossa base:

# /etc/init.d/slapd start


Agora vamos criar os arquivos .ldif, que contém os dados para o funcionamento do Squid. É necessário que se siga essa mesma linha lógica da base de dados para não haver erros futuramente. Primeiro, vamos criar o base.ldif, que contém as informações da base principal do ldap. Este é opicional, já que quando você instala pelo aptitude, ele já te pede pra criar a base principal, mas se você quiser excluir ela e começar do zero, fique a vontade. Crie o arquivo base.ldif conforme abaixo:

dn: dc=teste,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
dc: teste
o: Teste Ltda


Feito isso, salve o arquivo para ser adicionado depois. Agora criaremos o arquivo dos grupos, no arquivo grupos.ldif:

dn: ou=usuarios,dc=teste,dc=com,dc=br
ou: usuarios
objectClass: top
objectClass: organizationalUnit
objectClass: dcObject
dc: teste

dn: ou=grupos,dc=teste,dc=com,dc=br
ou: grupos
objectClass: top
objectClass: organizationalUnit
objectClass: dcObject
dc: teste


Agora o arquivo usuarios.ldif:

dn: cn=anderson,ou=usuarios,dc=teste,dc=com,dc=br
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
cn: anderson
sn: Anderson
mail: teste@teste.com.br
telephonenumber: 1234-5678
uid: anderson
userPassword: 123456
homeDirectory: /home/anderson
displayName: anderson
loginShell: /dev/null
uidNumber:1001
gidNumber:2001

dn: cn=clayton,ou=usuarios,dc=teste,dc=com,dc=br
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
cn: clayton
sn: Clayton
mail: teste2@teste.com.br
telephonenumber: 9876-5432
uid: clayton
userPassword: teste
homeDirectory: /home/clayton
displayName: clayton
loginShell: /dev/null
uidNumber:1002
gidNumber:2002


Vamos criar o segredo da coisa, que faz o squid saber qual grupo o usuário pertence. Crie um arquivo chamado usuarios_por_grupo.ldif (Obs. O nome dos arquivos não interfere em nada, crie com o nome que quiser):

dn: cn=AuthLiberado,ou=grupos,dc=teste,dc=com,dc=br
objectClass: posixGroup
objectClass: top
memberUid: anderson
cn: AuthLiberado
gidNumber: 3001

dn: cn=AuthBloqueado,ou=grupos,dc=teste,dc=com,dc=br
objectClass: posixGroup
objectClass: top
memberUid: clayton
cn: AuthBloqueado
gidNumber: 3002


Se tiver mais de um usuário, pode adicionar mais memberUid. Feito isso, vamos popular a base do ldap, com o seguinte comando:

ldapadd -f base.ldif -x -D "cn=admin,dc=teste,dc=com,dc=br" -W
ldapadd -f grupos.ldif -x -D "cn=admin,dc=teste,dc=com,dc=br" -W
ldapadd -f usuarios.ldif -x -D "cn=admin,dc=teste,dc=com,dc=br" -W
ldapadd -f usuarios_por_grupo.ldif -x \
-D "cn=admin,dc=teste,dc=com,dc=br" -W


Pronto!!! Se não deu nenhum erro, o OpenLdap está pronto para ser usado com o Squid. Agora vamos para a parte da configuração do Squid.

Configurando o Squid

Vamos instalar o Squid pelo aptitude. Lembrando que se você estiver usando CentOS ou outra distribuição derivada do RedHat e esse tutorial não funcionar, compile o código-fonte do Squid que vai funcionar. Instale o Squid:

# aptitude install squid


Limpe o arquivo de configuração do Squid para facilitar a sua vida:

# egrep -v "^$|^#" squid.conf > squid.conf.limpo
# mv squid.conf.limpo squid.conf


Se o squid ainda não está startado, start ele:

# /etc/init.d/squid start


Beleza, agora deixe o arquivo do squid.conf conforme abaixo:

http_port 3128
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
access_log /var/log/squid/access.log squid
hosts_file /etc/hosts
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

# Autenticacao
auth_param basic program /usr/lib/squid/ldap_auth -D "cn=admin,dc=teste,dc=com,dc=br" -w SENHA -b "dc=teste,dc=com,dc=br" -f "uid=%s" -h 127.0.0.1 -p 389 -v 3
auth_param basic realm Autorização de Acesso
auth_param basic children 5
auth_param basic credentialsttl 2 hours

# Autenticacao por Grupos
external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -b "ou=grupos,dc=teste,dc=com,dc=br" -B "ou=usuarios,dc=teste,dc=com,dc=br" -f "(&(memberUid=%u)(cn=%g))" -h 127.0.0.1 -p 389 -v 3

# Cria a acl para os grupos do ldap
acl Liberado external ldap_group AuthLiberado
acl Bloqueado external ldap_group AuthBloqueado

# Aqui vamos bloquear o acesso para os usuarios que estao no grupo Bloqueados e liberar somente os do Liberado
http_access allow Liberado

http_access deny all

http_reply_access allow all
icp_access allow all
cache_effective_group proxy
coredump_dir /var/spool/squid
visible_hostname teste.com.br
error_directory /usr/share/squid/errors/Portuguese


Lembrando que essas regras, apenas vão liberar o acesso total para a acl Liberado e bloqueando o resto, então brinque a vontade com as regras. Agora reinicie as configurações do Squid, se não der nenhum erro, parabéns:

# squid -k reconfigure


Agora faça o teste. Abra seu navegador favorito, configure o proxy como localhost, e tente acessar algum site. Primeiro teste com o usuário anderson e depois com o usuário clayton e veja o que acontece.

Enjoy...

0 comentários: