|
Parte 1 de 2 Depois de muito tempo sem contribuir com a comunidade Brasileira de Usuários de FreeBSD (FUG), Danton Dorati escreve mais um artigo que provavelmente será de ótimo proveito para aqueles que precisam de soluções gratuitas às necessidades nos quesitos segurança e praticidade, tanto para restrições/limitações e/ou facilidade de administração/manutenção respectivamentes, no que diz respeito usuários Windows e servidores FreeBSD. Trata-se de um Controlador de Domínio (PDC - Primary Domain Controler) para estações de trabalho Windows XP, com SAMBA e OpenLDAP - protocolos smb e ldap - basicamente fazendo o “papel” do nosso já conhecido AD (Active Directory). E alguns outros aplicativos como, por exemplo, o Ldap Account Manager (LAM) para gerenciamento de “contas de usuários”, grupos, máquinas, “políticas de grupos”, domínio sendo ainda um belo “frontend” para facilitar a vida daqueles que tem menos “contato” com o “mundo shell” e que estejam habituados com gerenciadores que possuam Interface Gráfica.
Além dos benefícios reais que essa união de protocolos permite proporcionar àqueles que precisam e/ou queiram aplicativos Open Source, seria facimo incluir nese conjunto um Servidor Proxy com opção de autenticação de usuários utilizando a mesma conta que faria logon no Windows, assim sincronizando e centralizando tudo em um mesmo banco de dados, recomendo para esse serviço o Squid. Pensando em longo prazo, utilizar o então já instalado LDAP para armazenar as contas de um hipotético Servidor E-mail baseado no Qmail que por acaso, tem um belo artigo aqui mesmo na FUG, mas fazendo referências a nossa conhecida M$. Enfim vamos ao que interessa e chega de “blá blá blá”. Antes de tudo seria interessante que você atualize seu sistema para STABLE e com um KERNEL customizado especificamente ao hardware, e quase que obrigatório (sendo realmente necessário) a atualização do PORTS, ganhando com isso velocidade e segurança contra eventuais “bugs” e incompatibilidades com versões diferentes tanto para o sistema como para os aplicativos usados nesse “howto”. Não vou demonstrar como atualizar ambos, pois seria muito extenso para esse artigo e como poderá ser notado ao longo da leitura do mesmo, então vá por partes. Use esse artigo da FUG bem bolado e bem explicativo (nossa comunidade está de parabéns). E depois sim, com tudo "redondo bote a mão na massa”! Aplicativos usados nesse documento: · FreeBSD 6.2 – STABLE i386 · cyrus-sasl 2.1.22 · openldap-server 2.3.38 · samba 3.0.25a_1,1 · smbldap-tools-0.9.3 · LDAP-Account-Manager-1.0.4 1. Instalando base inicial do PDC 1.1. Vamos começar pelo “port” que irá fazer com que autenticação no SAMBA seja segura # cd /usr/ports/security/cyrus-sasl2 ;; make config ;; make install clean O menu de configuração deverá ficar dessa forma, (des)marque o que for necessário para que fique semelhante e de OK 
Atualizando as novas bibliotecas # ldconfig 1.2. Próximo a ser instalado será o OpenLDAP # cd /usr/ports/net/openldap23-server # make config # make OPENLDAP23-SERVER_CONFIGURE_ARGS="--enable-crypt" # make install clean Faça com que todos “menu config” de cada “port” fique ao menos semelhante com as imagens introduzidas nesse artigo, pois assim não haverá riscos de alguma compilação/instalação ocasione erros. 
1.3. Agora vamos ao SAMBA # cd /usr/ports/net/samba3 # make config # make SAMBA3_CONFIGURE_ARGS="-with-ldapsam" # make install clean 
Desça com a flecha até chegar à última opção do menu e de OK 
1.5. Último que será compilado na base do sistema é o BIND Para todo controlador de domínio é necessário um Servidor DNS, já que estamos usando como, base para reunir todas as contas de nosso PDC, seria interessante fazer com que o BIND fosse "buscar" suas "zones" no OpenLDAP. # cd /usr/ports/dns/bind9-sdb-ldap ;; make install clean E faça o download do arquivo "schema BIND" que irá ser adicionado no "conf" do slapd e mova-o para o diretório padrão de esquemas do Servidor LDAP. # fetch http://bind9-ldap.bayour.com/dnszone-schema.txt ou # fetch http://www.venaas.no/ldap/bind-sdb/dnszone-schema.txt # mv dnszone-schema.txt /usr/local/etc/openldap/schema/bind.schema 2. Configurando o OpenLDAP para que possa interagir com o SAMBA 2.1. Copie o arquivo de esquema do SAMBA para a basta do OpenLDAP #cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema/ Importante: Sempre que for feita alguma atualização nos diretórios que contenham arquivos binários (bin,sbin), ou seja, inclusão e/ou exclusão e se seu “sheel” seja “csh” é necessário que execute o comando “rehash”. # rehash Editando o slapd.conf e o ldap.conf para que fique conforme o desejado para nosso PDC # cd /usr/local/etc/openldap # ldap.conf host 127.0.0.1 base dc= dominio,dc=com,dc=br uri ldap://localhost rootbinddn cn=root,dc=dominio,dc=com,dc=br port 389 SIZELIMIT 12 TIMELIMIT 15 DEREF never #slapd.conf 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/nis.schema include /usr/local/etc/openldap/schema/samba.schema include /usr/local/etc/openldap/schema/bind.schema referral ldap://localhost # Load dynamic backend modules: modulepath /usr/local/libexec/openldap moduleload back_bdb moduleload back_ldap pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args # Banco de dados LDAP database bdb suffix "dc=dominio,dc=com,dc=br" # Definimos a conta administradora como "root" rootdn "cn=root,dc=dominio,dc=com,dc=br" # A senha deve ser gerada com o slappaswd. ##Ex: # slappasswd ## New password: ## Re-enter new password: ## {SSHA}e7C9/YlcGzCsk7gCkzVzhYFNB/4DzcGB rootpw {SSHA}e7C9/YlcGzCsk7gCkzVzhYFNB/4DzcGB # Caminho para a base de dados LDAP directory /var/db/openldap-data password-hash {CRYPT} password-crypt-salt-format "$1$.8s" # índices para otimizar acesso index objectClass,uidNumber,gidNumber eq index cn,sn,uid,displayName pres,sub,eq index memberUid,mail,givenname eq index sambaSID,sambaPrimaryGroupSID,sambaDomainName eq index default sub # ACLs access to attrs=userPassword,sambaLMPassword,sambaNTPassword by self write by anonymous auth by * none access to * by * read Se por acaso existir na base do sistema o OpenLDAP e/ou algum(s) (valido para qualquer outro aplicativo já instalado anterior mente por você mesmo ou sendo alguma dependência) outro(s) arquivo(s) “conf’s” customizado, faça um backup deles e reedite-os para que fiquem semelhantes a este. Realize esse procedimento com todos arquivos de configuração caso exista algum editado anteriormente. Crie um arquivo LDIF que conterá a base de dados inicial do openldap que mais tarde será “populado” de forma completa e necessária para que nossas estações de trabalhem de forma precisa e “pensem” que seu controlador de domínio é um Windows Server 2003. # cd /root # touch base.ldif Substitua domínio pelo nome do Domínio de sua rede. Dica: caso haja algum Servidor DNS atuando na rede interna coloque o mesmo nome da “zona”. Copie fielmente o conteúdo abaixo para o arquivo recém criado dn: dc=dominio,dc=com,dc=br dc: dominio objectClass: top objectClass: domain
dn: ou=People,dc=dominio,dc=com,dc=br ou: People objectClass: top objectClass: organizationalUnit
dn: ou=Group,dc=dominio,dc=com,dc=br ou: Group objectClass: top objectClass: organizationalUnit
dn: ou=Computers,dc=dominio,dc=com,dc=br ou: Computers objectClass: top objectClass: organizationalUnit dn: cn=wheel,ou=Group,dc=dominio,dc=com,dc=br objectClass: posixGroup objectClass: top cn: wheel userPassword: {crypt}* gidNumber: 0 memberUid: root memberUid: NOME-DO-USUÁRIO dn: cn=nogroup,ou=Group,dc=dominio,dc=com,dc=br objectClass: posixGroup objectClass: top cn: nogroup userPassword: {crypt}* gidNumber: 65533 dn: cn=nobody,ou=Group,dc=dominio,dc=com,dc=br objectClass: posixGroup objectClass: top cn: nobody userPassword: {crypt}* gidNumber: 65534 dn: uid=root,ou=People,dc=dominio,dc=com,dc=br uid: root cn: Charlie & objectClass: account objectClass: posixAccount objectClass: top userPassword: {crypt}* loginShell: /bin/csh uidNumber: 0 gidNumber: 0 homeDirectory: /root gecos: Charlie & dn: uid=nobody,ou=People,dc=dominio,dc=com,dc=br uid: nobody cn: Unprivileged user objectClass: account objectClass: posixAccount objectClass: top userPassword: {crypt}* loginShell: /usr/sbin/nologin uidNumber: 65534 gidNumber: 65534 homeDirectory: /nonexistent gecos: Unprivileged user dn: uid=NOME-DO-USUÁRIO,ou=People,dc=dominio,dc=com,dc=br uid: NOME-DO-USUÁRIO cn: Nome do Usuário Completo objectClass: account objectClass: posixAccount objectClass: top userPassword: {crypt}* loginShell: /bin/csh uidNumber: 1001 gidNumber: 0 homeDirectory: /home/NOME-DO-USUÁRIO gecos: Nome do Usuário Completo dn: uid=NOME-DA-MÁQUINA$,ou=Computers,dc=dominio,dc=com,dc=br uid: NOME-DA-MÁQUINA$ cn: Info do PC objectClass: account objectClass: posixAccount objectClass: top userPassword: {crypt}* loginShell: /usr/bin/nologin uidNumber: 200 gidNumber: 200 homeDirectory: noexistent gecos: Info do PC dn: cn=NextFreeUnixId,dc=dominio,dc=com,dc=br objectClass: inetOrgPerson objectClass: sambaUnixIdPool uidNumber: 1000 gidNumber: 1000 cn: NextFreeUnixId sn: NextFreeUnixId dn: zoneName=dominio.com.br,dc=dominio,dc=com,dc=br objectClass: top objectClass: dNSZone relativeDomainName: dominio.com.br zoneName: dominio.com.br dn: relativeDomainName=dominio.com.br,zoneName=dominio.com.br,dc=dominio,dc=com,dc=br objectClass: top objectClass: dNSZone relativeDomainName: dominio.com.br zoneName: dominio.com.br dNSTTL: 3600 dNSClass: IN SOARecord: ns1.dominio.com.br. hostmaster.dominio.com.br. 1 10800 3600 604800 86400 NSRecord: ns1.dominio.com.br. NSRecord: ns2.dominio.com.br. ARecord: IP-DO-SERVIDOR-PDC MXRecord: 10 mail.dominio.com.br. dn: relativeDomainName=@,zoneName=dominio.com.br,dc=dominio,dc=com,dc=br objectClass: top objectClass: dNSZone relativeDomainName: @ zoneName: dominio.com.br dNSTTL: 3600 dNSClass: IN SOARecord: ns1.dominio.com.br. hostmaster.dominio.com.br. 1 10800 3600 604800 86400 NSRecord: ns1.dominio.com.br. NSRecord: ns2.dominio.com.br. ARecord: IP-DO-SERVIDOR-PDC MXRecord: 10 mail.dominio.com.br. dn: relativeDomainName=ns1,zoneName=dominio.com.br,dc=dominio,dc=com,dc=br objectClass: top objectClass: dNSZone relativeDomainName: ns1 zoneName: dominio.com.br dNSTTL: 3600 dNSClass: IN ARecord: IP-DO-SERVIDOR-PDC dn: relativeDomainName=ns2,zoneName=dominio.com.br,dc=dominio,dc=com,dc=br objectClass: top objectClass: dNSZone relativeDomainName: ns2 zoneName: dominio.com.br dNSTTL: 3600 dNSClass: IN ARecord: IP-DO-NS2
dn: relativeDomainName=mail,zoneName=dominio.com.br,dc=dominio,dc=com,dc=br objectClass: top objectClass: dNSZone relativeDomainName: mail zoneName: dominio.com.br dNSTTL: 3600 dNSClass: IN ARecord: IP-DO-MX dn: relativeDomainName=NOME-DA-MÁQUINA,zoneName=dominio.com.br,dc=dominio,dc=com,dc=br objectClass: top objectClass: dNSZone relativeDomainName: NOME-DA-MÁQUINA zoneName: dominio.com.br dNSTTL: 3600 dNSClass: IN ARecord: IP-DA-MÁQUINA Obs.: Você têm duas opções para editar o conteúdo acima de modo que fique a seu gosto, um sendo mais demorado e arriscado ou esquecer algo causando erros na introdução da base de dados do OpenLDAP, e um outro mais simples, fácil e seguro de fazer alterações de forma homogênea. Esse nosso grande aliado é o SED. A sintaxe é a seguinte: # sed -i.bak 's/dominio/SEU-DOMÍNIO/g' base.ldif Troque SEU-DOMÍNIO pelo nome que você pretende que as maquinas façam logon. Será gerado um arquivo backup do editado pelo SED “base.ldif.bak”, caso você tenha feito algo errado é só fazer “um racover”. 2.2. Agora “suba” o daemon do OpenLDAP (slapd) para que possa inserir o DB criado acima , já aproveitando o embalo vamos adicionar no rc.conf a sintaxe para que o slapd “arranque” junto com o boot do sistema e mudar o dono no diretório onde fica o PID do OpenLDAP # /usr/local/libexec/slapd -h ldap:/// -4 # echo 'slapd_enable="YES"' >> /etc/rc.conf # echo 'slapd_flags="-h ldap:/// -4"' >> /etc/rc.conf # chown -R ldap:ldap /var/run/openldap # ldapadd -x -D cn=root,dc=dominio,dc=com,dc=br -W -f /root/base.ldif Digite a mesma senha criada ainda a pouco para ser colocada no atributo “rootpw” do arquivo slapd.conf. Se ocorrer conforme o esperado (der tudo certo) a “saída” do comando acima será algo parecido com o que se segue: adding new entry "dc=dominio,dc=com,dc=br " adding new entry "ou=People,dc=dominio,dc=com,dc=br" adding new entry "ou=Group,dc=dominio,dc=com,dc=br" adding new entry "ou=Computers,dc=dominio,dc=com,dc=br" adding new entry "cn=wheel,ou=Group,dc=dominio,dc=com,dc=br" adding new entry "cn=nogroup,ou=Group,dc=dominio,dc=com,dc=br" adding new entry "cn=nobody,ou=Group,dc=dominio,dc=com,dc=br" adding new entry "uid=root,ou=People,dc=dominio,dc=com,dc=br" adding new entry "uid=nobody,ou=People,dc=dominio,dc=com,dc=br" adding new entry "uid=NOME-DO-USUÁRIO,ou=People,dc=dominio,dc=com,dc=br" adding new entry "uid=NOME-DA-MÁQUINA$,ou=People,dc=dominio,dc=com,dc=br" adding new entry "cn=NextFreeUnixId,dc=dominio,dc=com,dc=br" 2.3. Instalaremos agora o pacote que fará o intermédio entro o sistema e o ldap # cd /usr/ports/net/nss_ldap ;; make install clean Após o termino da compilação/instalação vamos configurar o nss-ldap para que possa fazer pesquisas no DB do OpenLDAP. Edite o arquivo nss_ldap.conf e altere somente as 4 linhas abaixo e o restante mantenha o padrão: # ee /usr/local/etc/nss_ldap.conf host 127.0.0.1 base dc=dominio,dc=com,dc=br binddn cn=root,dc=dominio,dc=com,dc=br bindpw SENHA-NÃO-CRIPTOGRAFADA Faça o backup do arquivo nsswitch.conf e deixe conforme o exemplo. # cp /etc/nsswitch.conf /etc/nsswitch.conf.bak # nsswitch.conf passwd: files ldap compat passwd_compat: nis group: files ldap compat group_compat: nis shadow: files ldap compat hosts: files dns networks: files shells: files Agora vamos fazer um teste para verificar se o sistema está indo buscar informações realmente no banco de dados do OpenLDAP, se as configurações estiverem corretas, provável que o retorno do comando “# id root” seja algo semelhante a isso: # tail -f /var/log/debug Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 fd=12 ACCEPT from IP=127.0.0.1:64093 (IP=0.0.0.0:389) Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 op=0 BIND dn="cn=root,dc=dominio,dc=com,dc=br" method=128 Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 op=0 BIND dn="cn=root,dc=dominio,dc=com,dc=br" mech=SIMPLE ssf=0 Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 op=0 RESULT tag=97 err=0 text= Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 op=1 SRCH base="dc=dominio,dc=com,dc=br" scope=2 deref=0 filter="(&(objectClass=posixGroup))" Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 op=1 SRCH attr=cn userPassword memberUid uniqueMember gidNumber Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 op=1 SEARCH RESULT tag=101 err=0 nentries=6 text= Nov 16 21:46:37 NOME-DO-SERVIDOR slapd[53833]: conn=1225 fd=12 closed (connection lost) 3. Configurando o SAMBA para que atue como PDC e que interaja com OpenLDAP 3.1. Alterando o arquivo de configuração smb.conf # smb.conf [global] dos charset = UTF-8 workgroup = DOMINIO-MAIÚSCULO server string = FreeBSD PDC security = user passdb backend = ldapsam:ldap://127.0.0.1/ passwd program = /usr/bin/passwd %u passwd chat = *New*password* %n\n *Retype*new*password* %n\n*passwd:*all*authentication*tokens*updated*successfully* log file = /var/log/samba/%m.log max log size = 50 socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=8192 SO_SNDBUF=8192 # load printers = yes # printcap name = cups add user script = /usr/local/sbin/smbldap-useradd -m "%u" delete user script = /usr/local/sbin/smbldap-userdel "%u" add group script = /usr/local/sbin/smbldap-groupadd -p "%g" delete group script = /usr/local/sbin/smbldap-groupdel "%g" add user to group script = /usr/local/sbin/smbldap-groupmod -m "%u" "%g" delete user from group script = /usr/local/sbin/smbldap-groupmod -x "%u" "%g" set primary group script = /usr/local/sbin/smbldap-usermod -g "%g" "%u" add machine script = /usr/local/sbin/smbldap-useradd -w "%u" logon script = %U.bat logon path = domain logons = Yes os level = 100 preferred master = Yes domain master = Yes dns proxy = No ldap admin dn = cn=root,dc=dominio,dc=com,dc=br ldap delete dn = Yes ldap group suffix = ou=Group ldap idmap suffix = ou=Idmap ldap machine suffix = ou=Computers ldap passwd sync = Yes ldap suffix = dc=dominio,dc=com,dc=br ldap ssl = no ldap user suffix = ou=People idmap backend = ldap:ldap://127.0.0.1 idmap uid = 10000-15000 idmap gid = 10000-15000 template shell = /usr/bin/nologin admin users = administrator, root hosts allow = 192.168.1., 127.0.0.1 # printing = cups # print command = lpr -P'%p' %s; rm %s queuepause command = disable '%p' queueresume command = enable '%p' delete veto files = Yes veto files = /*.aif/*.avi/*.cpl/*.mid/*.mov/*.mpa/*.mpe/*.mp3/*.mpeg/*.mpg/*.rar/*.scr/*.vbe/*.vbs/*.wav/*.wma/*.wmv/*.pif/*.bat/*.exe/ [homes] comment = Home Directories valid users = %S force user = %U read only = No create mask = 0664 directory mask = 0775 browseable = No [profiles] path = /home/profiles valid users = %U, "@Domain Admins" force user = %U read only = No browseable = No [admin$] comment = Diretorio ROOT path = / valid users = @wheel read only = No create mask = 0664 directory mask = 0775 [cdrom] comment = Drive CD-ROM path = /cdrom read list = nobody, guest, system, @wheel, @nobody read only = No [netlogon] comment = The domain logon service path = /usr/local/etc/samba/netlogon browseable = No share modes = No [publico] comment = Diretorio publico path = /home/Publico read only = No create mask = 0777 directory mask = 0777 guest ok = Yes ## Configuração para o SAMBA ser um servidor de impressão, o cups precisa ## estar instalado e alguns outros módulos para que funcionee corretamente,um artigo ## para ajudar com a configuração você econtrará nesse link. #[print$] # comment = Printer Drivers # path = /usr/local/share/cups/drivers # browseable = yes # guest ok = yes # guest ok = no # read only = yes # write list = root #[printers] # comment = Impressoras # path = /var/spool/samba # browseable = no # public = yes # guest ok = yes # writable = no # printable = yes # #printer admin = root Vamos “startar” os daemons do samba e adicionar no rc.conf a configuração para iniciar no momento do boot e configurar o SAMBA para sincrozinar as contas com o OpenLDAP. # smbd –D -s /usr/local/etc/smb.conf # nmbd –D -s /usr/local/etc/smb.conf # winbindd –D -s /usr/local/etc/smb.conf |