Giter Club home page Giter Club logo

web-ldap-admin's Introduction

web-ldap-admin

Sistema escrito em laravel que permite gerenciar usuários da sua unidade na Universidade de São Paulo em uma base local do tipo domain controller implementada em samba-ad-dc ou Active Directory. Para tal, dois serviços são necessários para rodar esse sistema: banco de dados corporativa replicada (sybase ou mssql) e tokens do OAuth 1 para senha única.

Esse sistema permite:

  • Sincronizar base de dados ldap local com pessoas importadas do replicado USP
  • O próprio usuário pode trocar a senha ldap pela web
  • Gerenciar usuários locais no ldap que não estejam no replicado

Quando o usuário fizer login no sistema usando senha única, uma array $vinculo é retornado com a seguinte estrutura:

0 => array:9 [
  "tipoVinculo" => "ALUNOCEU"
  "codigoSetor" => 0
  "nomeAbreviadoSetor" => null
  "nomeSetor" => null
  "codigoUnidade" => 8
  "siglaUnidade" => "FFLCH"
  "nomeUnidade" => "Faculdade de Filosofia, Letras e Ciências Humanas"
  "nomeVinculo" => "Aluno de Cultura Extensão Universitária"
  "nomeAbreviadoFuncao" => null
]
1 => array:9 [
  "tipoVinculo" => "ALUNOGR"
  "codigoSetor" => 0
  "nomeAbreviadoSetor" => null
  "nomeSetor" => null
  "codigoUnidade" => 8
  "siglaUnidade" => "FFLCH"
  "nomeUnidade" => "Faculdade de Filosofia, Letras e Ciências Humanas"
  "nomeVinculo" => "Aluno de Graduação"
  "nomeAbreviadoFuncao" => null
]
2 => array:9 [
  "tipoVinculo" => "ESTAGIARIORH"
  "codigoSetor" => 606
  "nomeAbreviadoSetor" => "SCINFOR-08"
  "nomeSetor" => "Seção Técnica de Informática"
  "codigoUnidade" => 8
  "siglaUnidade" => "FFLCH"
  "nomeUnidade" => "Faculdade de Filosofia, Letras e Ciências Humanas"
  "nomeVinculo" => "Estagiário"
  "nomeAbreviadoFuncao" => "Estagiário"
]

Se a pessoa tiver algum vínculo (codigoUnidade) com a unidade o usuário é inserido no domain controller. Os campos tipoVinculo e nomeAbreviadoSetor serão mapeados com grupos.

Caso não queira inserir automaticamente a pessoa, esse recurso pode ser desabilitado no .env.

Dependências php

version='7.3'
apt-get install php$version-ldap

Instalação

git clone [email protected]/uspdev/php-ldap-admin
composer install --no-dev (ambiente de produção)

Configurações no .env

Copie o arquivo .env.example para .env e faça os ajustes necessários.

cp .env.example .env
php artisan key:generate
# Configure o banco de dados local
php artisan migrate

Configurações da aplicação

Servidor domain controller

LDAP_HOSTS=dc.xurepinha.br
LDAP_PORT=636
LDAP_BASE_DN='DC=pandora,DC=fflch,DC=usp,DC=br'
LDAP_USERNAME='CN=Administrator,CN=Users,DC=xurepinha,DC=br'
LDAP_PASSWORD='sua-senha'
LDAP_USE_SSL=true
LDAP_USE_TLS=false

O LDAP_USERNAME pode ter variações. Na biblioteca adldap2 indica o uso de [email protected]. Também pode ser usado a sintaxe de domínio anterior ao AD xurepinha\\usuario.

Sincronização automática do LDAP

Configuração referente ao processo de sincronização de dados do usuário durante o login no sistema.

  • 0 - não cria pessoa ldap automaticamente no login;
  • 1 (default) - cria pessoa ldap automaticamente no login e sincroniza dados com replicado. O valos existente nesses campos serão sobrescritos:
    • nome
    • sobrenome
    • email
    • employeeNumber: preenche com nro USP ser estiver configurado no env
    • departamento

Além disso, cria e coloca a pessoa nos grupos "vinculo estendido (tipvinext)", "setor" e "vinculo estendido setor". OBS.: Preserva os demais grupos já existentes.

SINC_LDAP_LOGIN=1

Desativar desligados

No processo de sincronização o sistema pode desativar os usuários que não tem mais vínculos ativos com a unidade, a não ser que estejam listados nos Números USP permitidos sem vínculo. false (default) - não desativa desligados; true - desativa desligados

DESATIVAR_DESLIGADOS=false

Organizational unit (OU) padrão

Define onde os usuários e grupos serão inseridos. É conveniente setar um valor aqui. Se vazio (default) vai criar na raiz do CN (conteiner).

OBS.: Aparentemente estando nesta OU ou no conteiner Users padrão, o usuário consegue fazer login normalmente. Mas acho que é importante no uso de diretivas de grupos.

LDAP_OU_DEFAULT=

Expiração da senha

Ao criar conta nova ou trocar a senha, pode-se definir um prazo para expiração de conta padrão. Se 0 (default), a conta não vai expirar. O valor é em dias.

EXPIRAR_EM=0

Campo associado ao codpes

Configura qual campo vai estar associado ao codpes da pessoa. Por padrão é no campo username mas pode ser atribuído ao campo employeeNumber. No segundo caso, na criação de novo usuário automático, o username vai ser o email sem caracteres especiais (somente letras e números), sem o domínio, limitado a 15 caracteres. Se o usuário já existir o username pode ser qualquer.

CAMPO_CODPES=username

Padrão de criação de senhas

Configura como será criado a senha padrão para os novos usuários ldap. Pode ser a data de nascimento (default) ou random. O random é compatível com a diretiva de senha forte do AD.

SENHA_PADRAO=data_nascimento

OBS.: Quando a pessoa não tem vínculo (dados replicados), pode logar e sincroniza/cria conta no login, a conta é criada com senha random, pois não está disponível a data de nascimento.

Permite assumir conta de admin

Permite que a pessoa obtenha acesso privilegiado a determinado computador por tempo limitado. 0 (default) - ninguém pode solicitar; 1 - todos; 2 - somente servidores (docentes e não docentes).

SOLICITA_CONTA_ADMIN = 0

Mostrar foto

Permite buscar foto e exibir nas informações da pessoa. 0 (default) - não mostrar (nem foto fake); 1 - mostrar foto.

MOSTRAR_FOTO=0

Trocar senha na criação de contas novas

Ao criar uma nova conta no ldap, ele força o usuário a trocar a senha no próximo logon do windows. Se o login com AD é usado em outros sistemas, como aplicações web ou em terminais com linux deixar essa opção como 0 (falsa).

OBRIGA_TROCAR_SENHA_NO_WINDOWS=1

Dicas

Nessa aplicação, SENHAUNICA_ADMINS pode gerenciar usuários, SENHAUNICA_GERENTES pode realizar as operações em geral e usuários comuns podem alterar suas respectivas senhas.

No ambiente de desenvolvimento, às vezes é necessário desativar a verificação dos certificado SSL/TLS, para isso, em /etc/ldap/ldap.conf manter apenas TLS_REQCERT ALLOW:

echo 'TLS_REQCERT ALLOW' | sudo tee /etc/ldap/ldap.conf

Como rodar filas sem limite de tempo:

php artisan queue:listen --timeout=0

Códigos Úteis

Ativar toda base de usuários:

php artisan tinker

$users = \Adldap\Laravel\Facades\Adldap::search()->users()->get();

foreach($users as $user) {
    $user->setUserAccountControl(AccountControl::NORMAL_ACCOUNT);
    $user->save();
}

Rodar um job pelo tinker:

php artisan tinker
App\Jobs\RevokeLocalAdminGroupJob::dispatch();

Funcionamento dos Grupos

O sistema vai adicionar o usuário ao grupo com o mesmo nome do vínculo. Ex.: ALUNOGR, SERVIDOR, etc. Os grupos são criados automaticamente.

  • Se o grupo foi criado pelo web-ldap-admin ele seta o atributo managedBy=web-ldap-admin

Grupos criados:

  • SETOR (codset)
  • Vinculo-estendido (tipvinext)
  • Vinculo-estendido + SETOR

O departamento (department) corresponde ao setor, se tiver.

web-ldap-admin's People

Contributors

alecostaweb avatar masakik avatar ricardfo avatar sybgroff avatar thiagogomesverissimo avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

web-ldap-admin's Issues

task para criar users

https://github.com/Adldap2/Adldap2/blob/master/docs/models/model.md
https://github.com/Adldap2/Adldap2/blob/master/docs/models/user.md
https://github.com/Adldap2/Adldap2/blob/master/docs/models/computer.md
https://github.com/Adldap2/Adldap2/blob/master/docs/models/group.md
https://github.com/Adldap2/Adldap2/blob/master/docs/models/printer.md

$user = $this->provider->make()->user();

$user->setCommonName('Daisy Duck');
$user->setDisplayName('Daisy Duck');
$user->setFirstName('Daisy');
$user->setLastName('Duck');
$user->setTitle('Girlfriend of Donald Duck');
$user->setDepartment('Andeby');
$user->setInfo('Daisy was introduced in the short film Mr. Duck Steps Out (1940)');
$user->setInitials('DD');
$user->setPhysicalDeliveryOfficeName('Clubhouse office');
$user->setTelephoneNumber('12345678');
$user->setCompany('Mickey Mouse Clubhouse');
$user->setPassword('Monday123');
$user->setStreetAddress('Duckburg 123');
$user->setPostalCode('1234');

$dn = $user->getDnBuilder();

$dn->addCn($user->getCommonName());
$dn->addOu('Testusers');
$dn->addDc('login');
$dn->addDc('domain');
$dn->addDc('local');

// Returns 'cn=John Doe,ou=Accounting,dc=corp,dc=acme,dc=org'
echo $dn->get();

// You already saved the user here:
$user->save();

if ($user->create()) { // Now you're creating the user
    echo "User was created";
} else {
    echo "Issue creating user";
}
$user->setAccountName('jdoe');

$ac= new \Adldap\Objects\AccountControl();

$ac->accountIsNormal();

$user->setUserAccountControl($ac);

Criar grupos com nomes baseados no tipvinext

Se possível já criar grupos como por exemplo:
Servidores do CAC (Departamento de Artes Cênicas), onde CAC é nomabvset do setor
Docentes do CAC
Alunos de Graduação do CAC
e assim por diante

Criar grupo comunidadeusp

No caso de usuários externos à unidade, criar esse grupo comunidadeusp e colocar data de expiração, por exemplo, 6 meses.

Atríbutos ldap para servidor de arquivo

    // atributos para servidor de arquivos 
    //$fileserver = env('LDAP_SERVERFILE');
    //$user->setHomeDrive($fileserver . ':');
    //$user->setHomeDirectory('\\\\'. $fileserver. '\\' . $username);

     // filerserver
        //$attr['quota'] = round($user->quota[0]/1024,2);
        //$attr['drive'] = $user->getHomeDrive();
        //$attr['dir'] = $user->getHomeDirectory();

Sincronizar também outros tipos de vínculo

  • Alunos de Pós-Graduação
  • Alunos de Graduação
  • Alunos da Escola de Arte Dramática
  • Alunos de Cultura e Extensão
  • Alunos de Pós-doutorando

Ao lado do grupo a ser sincronizado, trazer entre parênteses a quantidade de contas a se criar

MS AD

Para rodar com o MS AD
Acrescentei isso no config/adldap.php
'custom_options' => [
// See: http://php.net/ldap_set_option
LDAP_OPT_X_TLS_REQUIRE_CERT => LDAP_OPT_X_TLS_NEVER
]

validar complexidade da senha no controller conforme regras do windows

https://technet.microsoft.com/pt-br/library/mt634221(v=vs.85).aspx

s senhas não podem conter o valor samAccountName (Nome da Conta) do usuário ou o valor displayName (valor Nome Completo) inteiro. Ambas as verificações não diferenciam maiúsculas de minúsculas.

O samAccountName é verificado em sua totalidade apenas para determinar se ele é parte da senha. Se o samAccountName tiver menos de três caracteres, essa verificação será omitida.

Os delimitadores de DisplayName são analisados: vírgulas, pontos, traços ou hífens, sublinhados, espaços, sinais de libra e tabulações. Se qualquer um desses delimitadores forem encontrados, displayName será dividido e será confirmado se todas as seções analisadas (tokens) não estão incluídas na senha. Tokens com menos de três caracteres são ignorados e as subcadeia de caracteres dos tokens não são verificadas. Por exemplo, o nome "Matheus C. Silva" é dividida em três tokens: "Matheus", "C" e "Silva". Como o segundo token tem apenas um caractere, ele é ignorado. Portanto, esse usuário não poderia ter uma senha que incluísse "Matheus" ou "Silva" como uma subcadeia de caracteres em qualquer lugar na senha.

A senha contém caracteres de três das categorias a seguir:

Letras maiúsculas de idiomas europeus (A a Z, com marcas diacríticas, caracteres gregos e cirílicos)

Letras minúsculas de idiomas europeus (a a z, sharp-s, com marcas diacríticas, caracteres gregos e cirílicos)

Dígitos de base 10 (0 a 9)

Caracteres não alfanuméricos (caracteres especiais) (por exemplo, !, $, #, %)

Qualquer caractere Unicode que esteja categorizado como um caractere alfabético, mas não é minúsculo nem maiúsculo. Isso inclui os caracteres Unicode de idiomas asiáticos.

Corrigir na sincronização para quando for Docente e Servidor, fiquem nos dois grupos

Por exemplo:

  1. Um Docente também pode ser Servidor
  2. Um Estagiário também pode ser Aluno de Graduação
  3. Um Servidor também pode ser Aluno de Graduação, de Pós-Graduação ou de
    Cultura e Extensão

Isso só impacta no momento da sincronização, por exemplo:
Ao sincronizar Docente, se no AD o Docente também for Servidor, ele
será removido do grupo Servidor e constará no grupo Docente

  • Corrigir: para a conta conste em todos os grupos em que a pessoa
    pertence *

Utilizar o convert no módulo Pessoa

Verificamos que no caso de sybase é preciso usar o convert para converter para int o código da unidade, exemplo:

$query .= " AND LOCALIZAPESSOA.codundclg = convert(int,:codundclgi) AND LOCALIZAPESSOA.sitatl = 'A') ";

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.