alexmontoanelli

a little fun!

Resolvendo problemas de charset enconding com LDAP e PHP

Estamos vivos.

Depois de uma breve pausa para a política e outras coisinhas estamos de volta.

Para não perder a viagem aqui vai uma dica para quem tá com problemas de encoding entre ldap e PHP.

Se você tá passando por problemas ao gravar caracteres acentuados em uma base ldap, e ao mostrar eles, você vê um ‘?’ ou outros caracteres estranhos no local do original, basta usar a função utf8_encode antes de gravar os valores no banco, (ldap_add), e quando for recuperar (ldap_search) os valores do banco, utilizar utf8_decode para converte-los novamente e exibir normalmente.

Logo novidades por aqui. Aguardem!

Abraços

October 8th, 2008 by alexm
Posted in php | No Comments »

Setando configurações LDAP no windows (ldap.conf)

Se você precisar setar as configurações do ldap.conf em um Windows, para por exemplo, acessar via php, um base ldap remota sobre ssl, você deve criar os seguintes pastas/arquivos:

C:\openldap\sysconf\ldap.conf

Com o seguinte conteudo:

base dc=meudominio,dc=com,dc=br
uri ldaps://meu.servidor.ldap.com.br/
ldap_version 3
TLS_REQCERT never

É isso, simples assim, mas penei para resolver este problema.

Abraços

September 6th, 2008 by alexm

Autenticação centralizada com Ldap, usando Postfix, Dovecot e Samba: Parte2

Essa é a segunda parte desta série.
A primeira etapa você confere aqui.

Hoje vamos configurar a libnss e o nsswitch.conf, para que o sistema possa ver os usuários cadastrados na base ldap.

Antes vamos criar o seguinte arquivo ldif,  inserindo alguns usuarios e grupos na nossa base:

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

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

dn: ou=machines,ou=usuarios,dc=empresa,dc=com,dc=br
objectClass: organizationalUnit
ou: machines

dn: cn=meugrupo,ou=grupos,dc=empresa,dc=com,dc=br
objectClass: posixGroup
objectClass: top
gidNumber: 10000
cn: meugrupo

dn: uid=meuusuario,ou=usuarios,dc=empresa,dc=com,dc=br
objectClass: shadowAccount
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
homeDirectory: /home/meuusuario
loginShell: /bin/false
uid: meuusuario
cn: meuusuario
uidNumber: 10000
sn: meuusuario
gidNumber: 10000
givenName: Meu Usuario

Após criar os usuários, insira eles na base com o seguinte comanda:

slapadd -l meuarquivo.ldif # para usar com a base em modo off-line, ou
cat meuarquivo.ldif | ldapadd -W -D "cn=Manager,dc=empresa,dc=com,dc=br"

Agora vamos instalar o nss_ldap, no freebsd, execute o seguinte comando:

cd /usr/ports/net/nss_ldap/
make install

Vamos editar o arquivo /usr/local/etc/nss_ldap.conf para que fique da seguinte forma:

host 127.0.0.1
base dc=empresa,dc=com,dc=br
ldap_version 3
rootbinddn cn=Manager,dc=empresa,dc=com,dc=br
port 389
scope sub
timelimit 30
bind_timelimit 30
bind_policy hard
nss_connect_policy persist
nss_paged_results yes
pagesize 1000
pam_login_attribute uid
pam_lookup_policy yes
nss_base_passwd         ou=usuarios,dc=empresa,dc=com,dc=br?sub
nss_base_shadow         ou=usuarios,dc=empresa,dc=com,dc=br?sub
nss_base_group          ou=grupos,dc=empresa,dc=com,dc=br?one

Criamos o arquivo /etc/ldap.secret, contendo a senha do Manager

echo "mInhaSenh@Secr37A" > /etc/ldap.secret
chmod 600 /etc/ldap.secret

Agora modificamos o /etc/nsswitch.conf para que fique assim:

group: files ldap
hosts: files dns
networks: files
passwd: files ldap
shells: files

Para testar se tudo deu certo, digite:

getent passwd # você verá os usuarios do sistema, a ultima linha estara listado o seu usuario
getent groups # você verá os grupos do sistema, a última linha estará listado o grupo criado

Bom é isso, por hoje é só pessoAll, até a próxima parte.

Abraços

August 17th, 2008 by alexm

Autenticação centralizada com Ldap, usando Postfix, Dovecot e Samba

Olá.

Vou postar aqui uma série de 5 artigos mostrando como integrar os serviços de email (Postfix, Dovecot), e o servidor de arquivos Samba, para usarem a mesma base de autenticação, no caso com Openldap.

Toda a brincadeira foi realizada em um FreeBSD 6.3 -p3, mais pode ser implantada em qualquer Linux sem problemas.

Parte 1 : Preparando o Openldap.

No FreeBSD, tento o ports instalado, pasta fazer o seguinte:

cd /usr/ports/net/openldap24-server
make
make install

As seguintes opções foram usadas:

SASL
TCP_WRAPPERS
BDB
ACCESSLOG
LASTMOD
SEQMOD
SYNCPROV
DYNAMIC_BACKENDS

Após isso, iremos instalar o nss_ldap, usado para integrar os usuários que serão cadastrados no openldap, ao sistema.

cd /usr/ports/net/nss_ldap/
make
make install

Agora vamos configurar nosso ldap.conf e slapd.conf para colocar o open-ldap no ar.

Vamos editar o arquivo /usr/local/etc/ldap.conf e adicionar a seguinte no arquivo

BASE    dc=empresa,dc=com,dc=br

Feito isso partimos para a configuração do slapd.conf, esse é o arquivo responsável pelo daemon do openldap.

Seguem as alterações necessárias:

include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/misc.schema
include         /usr/local/etc/openldap/schema/nis.schema

access to dn.exact=""
        by * read

access to attrs=userPassword,sambaLMPassword,sambaNTPassword
        by anonymous auth
        by self write
        by * none

access to attrs=shadowLastChange
        by self write
        by * none

access to *
        by read

loglevel 256

#######################################################################
# BDB database definitions
#######################################################################

database        bdb
suffix          "dc=empresa,dc=com,dc=br"
rootdn          "cn=Manager,dc=empresa,dc=com,dc=br"
rootpw          {SSHA}D9t3cIySlQg2ugQYeSD5bkB+ZqWPaasx
mode    0700
directory       /var/db/openldap-data
# Indices to maintain
index   objectClass     eq
index   cn,uid,sn       eq
index   gidNumber       eq
index   mail,givenName,mailAlternateAddress,displayName eq,pres,sub
index   default eq

A senha no formato SSHA é obtida com o comando

slappasswd  -s mInhaSenh@Secr37A

Feito isso, vamos inserir a base do nosso banco, isso tudo em modo offline ainda.
Crie um arquivo com o seguinte conteúdo:

dn: dc=empresa,dc=com,dc=br
dc: empresa
objectClass: top
objectClass: domain

Agora vamos inserir esse registro na base:

slapadd -l MEU_ARQUIVO_TEMPORARIO -b 'dc=empreasa,dc=com,dc=br'

Feito isso, nosso banco pode ser posto no ar.
Adicione as seguintes flags ao seu arquivo /etc/rc.conf

slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://127.0.0.1/"'
slapd_sockets="/var/run/openldap/ldapi"

Estas flags dizem para ativar o slapd no boot do bsd,  configura ele para ouvir em modo não ssl, em locallhost, e cria um unixsocket em /var. Abordagem com ssl será feita em outra etapa.

Agora vamos startar no OpenLdap

/usr/local/etc/rc.d/slapd start

Se tudo der certo, com um  simples ‘netstat -ln| egrep “\.389″‘ você verá uma saída semelhante a esta, informado que o slapd esta ouvindo na sua porta padrão:

[root@propague /root]# netstat -ln| egrep "\.389"
tcp4       0      0  127.0.0.1.389          127.0.0.1.63586        ESTABLISHED
tcp4       0      0  127.0.0.1.63586        127.0.0.1.389          ESTABLISHED
tcp4       0      0  127.0.0.1.389          127.0.0.1.50995        ESTABLISHED
tcp4       0      0  127.0.0.1.50995        127.0.0.1.389          ESTABLISHED
tcp4       0      0  127.0.0.1.389          127.0.0.1.57821        ESTABLISHED
tcp4       0      0  127.0.0.1.57821        127.0.0.1.389          ESTABLISHED
tcp4       0      0  127.0.0.1.389          127.0.0.1.61773        ESTABLISHED
tcp4       0      0  127.0.0.1.61773        127.0.0.1.389          ESTABLISHED

Para confirmar, execute:

ldapsearch -x

Deverá ser retornado a raiz de seu diretório informando que o mesmo foi criado com sucesso.
Caso você não consiga por seu ldap para rodar, tente rodar ele como root e modo debug.

/usr/local/libexec/slapd -d 256

Na maioria das vezes o erro é causado por permissões inválidas no diretório onde o ldap guarda seus arquivos.
Se for este o seu problema, você pode corrigir com o seguinte comando, e em seguida subir o daemon novamente

chow -R ldap:ldap /var/db/openldap-db
chmod -R 600 /var/db/openldap-db

Por hoje é isso, no próximo capitulo vamos inserir alguns usuários na base, e fazer o sistema enxergar eles, usando o nss, e editando o nsswitch.

Abraços e até mais.

August 7th, 2008 by alexm

Replicando Bases Ldap em 10 minutos

Buenas.

Configurações para replicar bases ldap usando o método syncrpl.

No Servidor ldap Master adicione as seguintes linhas no slapd.conf, nas respectivas sessões:

moduleload      syncprov

index   entryCSN        eq
index   entryUUID       eq

overlay syncprov
syncprov-checkpoint     100     10
syncprov-sessionlog     100

As 3 últimas linhas devem ir no final no arquivo abaixo das especificações dos bancos.

As linha ‘syncprov-checkpoint     100     10′ diz que é para forçar sincronização a cada 100 gravações, ou a cada 10 minutos. E a linha ‘syncprov-sessionlog     100′ mantem um registro das ultimas 100 entradas sincronizadas.

Note que adicionamos duas entradas ‘index’, então devemos parar o slapd, e reindexar a base com um ‘slapindex -vv’. Após um chown -R ldap:ldap /var/db/ldap/*, e subimos o serviço novamente.

Do lado dos ‘slaves’, você deve adicionar o seguinte:

index   entryCSN        eq
index   entryUUID       eq

syncrepl      rid=001
searchbase="dc=dominio,dc=com"
provider="ldaps://endereco.do.servidor.master"
binddn="cn=Manager,dc=dominio,dc=com"
bindmethod=simple
credentials="minhasenha"
filter="(objectClass=*)"
attrs="*,+"
#type="refreshOnly"
type="refreshAndPersist"
interval=00:00:05:00
retry="60 10 300 3"
scope=sub

updateref       "ldaps://endereco.do.servidor.master"

Explicando as linhas:

rid 001: é o identificador interno, você pode ter várias sessões para sincronizar, esse número deve ser único para cada entrada, e não deve ter mais que 3 números;

searchbase: apartir de qual nó, do serivdor ‘master’ deve-se iniciar o sincronismo;
provider: é o endereço do servidor master;

binddn: bindmethod e credentials são os dados referentes a autenticação;
filter, são quais objetos que desejamos sincronizar, objectClass=*, vai sincronizar todos os objetos;

attrs: especifica quais os atributos a serem sincronizados, ‘*,+’ irá sincronizar todos os atributos;

type, pode vir a ser refreshOnly ou refreshAndPersist, no modo refreshAndPersist, é iniciado umaconexão ao servidor master, e a cada nova alteração no ‘master’ a mesma já e atualizada no ‘slave’, no modo refreshOnly, o sincronimo ocorrerá apenas no interfao especificado pela variavel ‘interval;

interval: O tempo em que se deve conectar no master para sincronizar os dados, seu formato é ‘dd:hh:mm:ss’ onde ‘dd’ => dia, ‘hh’ => hora, ‘mm’ => minutos, ‘ss’ => segundos. Um valor como ’00:00:05:00′, representa uma atualização a cada 5 minutos

retry: especifica o tempo entre tentativas caso ocorra uma falha de conexão para a sincronização. O valor ’60 10 300 3′, diz que é para executar 10 tentativas a cada 60 segundos, e caso estas falhem, é para executar mais 3 tentativas a cada 300 segundos.

scope=sub: especifica o nivel de sincronização, pode ser ‘sub,child, one ou  base’

Após tudo configurado basta reiniciar o slave, e partir pro abraço.

Não esqueça de copiar a base atual do master, via ‘slapcat’ para o slave, inportando com um ‘slapadd’.
A base no slave deve estar vazia antes da importação, e após importar, atribua o usuário ldap aos arquivos gerados no diretório onde está o banco.

Abraços

June 25th, 2008 by alexm