Escolar Documentos
Profissional Documentos
Cultura Documentos
TCC LuisFernandoCordeiro Final
TCC LuisFernandoCordeiro Final
heterogênea
Florianópolis – SC
2012/2
UNIVERSIDADE FEDERAL DE SANTA CATARINA
heterogênea
07238071
Florianópolis – SC
2012/2
Luís Fernando Cordeiro
heterogênea
__________________________________________________
Orientadora
__________________________________________________
__________________________________________________
1. Introdução ................................................................................................. 7
1.1 Objetivo .............................................................................................................. 9
1.1.1 Objetivo Geral .............................................................................................. 9
1.1.2 Objetivos Específicos ................................................................................... 9
1.2 Justificativa ..................................................................................................... 10
1.3 Organização do Trabalho ............................................................................... 10
2. Conceitos Básicos.................................................................................... 11
2.1 Autenticação, Autorização e Contabilização (AAA) .................................... 12
2.1.1 Autenticação .............................................................................................. 13
2.1.2 Autorização ................................................................................................ 15
2.1.3 Contabilização............................................................................................ 16
2.2 Protocolos de Autenticação para equipamentos ........................................ 17
2.2.1 RADIUS...................................................................................................... 17
2.2.2 TACACS+ .................................................................................................. 18
2.2.3 Diferenças entre RADIUS e TACACS+ ..................................................... 20
3. Tecnologias ............................................................................................... 22
3.1 openLDAP ........................................................................................................ 23
3.2 TAC_PLUS ....................................................................................................... 27
3.3 MAVIS ............................................................................................................... 27
4. Estudo de Caso – Rede UFSC ................................................................. 29
4.1 Projeto .............................................................................................................. 29
4.1.1 Cenário Atual ............................................................................................. 29
4.1.2 Cenário Proposto ....................................................................................... 31
4.2. Desenvolvimento ........................................................................................... 36
4.2.1 Cisco ACS .................................................................................................. 37
4.2.2 TAC_PLUS................................................................................................. 39
4.3. Implantação .................................................................................................... 48
4.3.1 Estrutura Física .......................................................................................... 48
4.3.2 Implantação em Números .......................................................................... 51
4.3.3 Gerência do Ambiente ............................................................................... 52
4.3.4 Adequação com normas de segurança ..................................................... 60
5. Considerações Finais............................................................................... 62
5.1 Trabalhos Futuros .......................................................................................... 63
Referências ................................................................................................... 65
Apêndices...................................................................................................... 68
1. Introdução
rede estão em constante mudança, seja por melhoria da infraestrutura, seja pelas
novos protocolos, dentre os quais estão alguns que são usados para a gerência de
2000).
oferecidas, bem como permitir uma gerência mais segura dos ativos de rede.
usuários e serviços, é preciso ter o maior controle possível do que é feito e por quem
é feito.
gerenciamento das identidades dos usuários, para garantir que cada pessoa com
acesso ao equipamento faça apenas o que lhe é permitido e não tenha acesso total,
Tendo por base situações como esta, foi proposto um framework estrutural
definir quem terá acesso (Autenticação), quais as ações que poderão ser feitas
depois de sua autenticação (Autorização), o horário que estas ações podem ser
feitas, bem como a geração de todos os logs das ações efetuadas para fins de uma
usado nos roteadores, a fim de propor uma solução que poderá ser aproveitada para
carência de redundância dos serviços, para que, caso aconteça algum problema
com um servidor, ter um outro no mesmo estado para assumir os serviços, e à falta
Este trabalho tem por objeto realizar o estudo das principais tecnologias de
proativa);
Além disso, a universidade cada vez mais é cobrada pela Controladoria Geral
2. Conceitos Básicos
Um ativo de informação é uma parte atômica que tem significado para o indivíduo ou
autorizados;
ativos;
de computadores e rede
NAKHJIRI (2005) entende que o AAA são três blocos importantes usados na
se preocupar do que somente garantir o acesso à rede aos seus clientes. É preciso
nada mais é do que um framework estrutural para coordenar todas essa áreas sob
• Escalabilidade;
Kerberos.
2.1.1 Autenticação
isso é verdade. Para ter certeza que o usuário é quem ele diz ser, o
1:
considerado um cliente;
cliente ao sistema.
Figura 1 - Modo de Autenticação de Três Partes. Fonte: Todorov (2007)
2.1.2 Autorização
2005, p.7).
envio de informações sobre as ações do usuário, sendo esses dados utilizados para
usuário devem ser registradas em caso de sucesso ou falha, bem como suas
planejamento de capacidade.
2.2 Protocolos de Autenticação para equipamentos
2.2.1 RADIUS
acesso não autorizado (CISCO, 2006). Foi desenvolvido em meados de 1990 pela
em:
protocolo.
2.2.2 TACACS+
1993), foi reestruturado ao longo dos anos pela CISCO e é suportado por vários
novo protocolo que provê funcionalidades similares. Por ser um protocolo totalmente
Para CISCO ... (2006), TACACS+ é uma aplicação de segurança que provê a
e o daemon é cifrado.
existe e retorna o resultado. Com isso é enviado também uma requisição para início
contabilização, para gravar as ações do usuário. Ao fim desse fluxo é feita uma
De uma forma resumida, para CISCO ... (2008), as principais diferenças entre
Protocolo de Transporte:
O RADIUS utiliza UDP, ao passo que o TACACS+ usa TCP. TCP oferece
bastante congestionadas;
• Usando TCP é possível indicar se o servidor está com problemas ou
TACACS+, por sua vez, permite que todo o corpo do pacote seja criptografado,
sendo excluído apenas um cabeçalho, o qual possui um campo que indica se o resto
Autenticação e Autorização
Suporte a Multiprotocolos
• X.25 Pad
Gerência de Equipamentos
comando ou não. Por padrão, os níveis de privilégio vão de 0 a 15, no qual zero
significa nenhum privilégio e quinze significa privilégio total. O outro método destina-
3. Tecnologias
AJAX, JSON, HTML, PHP e no servidor onde são armazenados todos os logs, foi
usado o MySQL como sistema gerenciador de banco de dados, mas como não
1997), que define a versão três do protocolo, o LDAP segue o modelo de serviços de
atributos com seus respectivos valores. O modelo X.500 era muito complexo para
ser suportado em desktops e através da Internet, então o LDAP foi criado para
para terem mais operações de leitura do que escrita, já bancos de dados assumem
dados.
com o X.500 pois utiliza mensagens com baixa sobrecarga, mapeadas diretamente
pilhas.
informações do diretório. A árvore é feita de várias entradas, estas, por sua vez,
servidor. O cliente faz uma requisição de uma operação sobre o diretório, o servidor
não ambígua e única em um serviço de diretórios. Esse atributo é composto por uma
ramo na árvore do diretório, desde a raiz até a entrada à qual o DN faz referência.
schemas, que são arquivos onde são definidos as diferentes classes dos objetos e
seus atributos que o openLDAP deve suportar, entre outras coisas. Usando estes, o
Uma outra possibilidade é a criação de schemas para uma maior customização dos
Depois dessa visão geral sobre o openLDAP e seu funcionamento, que para
este projeto será usado como backend do ambiente, entraremos em detalhes das
incluem:
3.3 MAVIS
usado pelo daemon tac_plus. Esta biblioteca contem vários módulos para o uso de
schema no servidor LDAP e em cada objeto que poderá fazer uso das
respectivos atributos.
4. Estudo de Caso – Rede UFSC
desenvolvimento.
4.1 Projeto
ambiente proposto.
autenticação ser feita dessa forma, vários problemas são gerados, dentre eles:
• Se não for criada uma credencial para cada usuário, todas as pessoas
mudança;
• Caso seja preciso retirar o acesso de um usuário de um equipamento,
não existir a política de cada usuário ter uma credencial, todo mundo
mesma conta.
estrutura AAA
usuários, já que para fazer qualquer alteração, tanto para mudança de senha,
equipamento para fazer essas alterações. Por outro lado este ambiente tem um
da Figura 8.
equipamentos de rede;
interfaces administrativas;
• Apache – servidor web para hospedar a aplicação de administração e
monitoramento do ambiente.
for configurado para utilizar o servidor master, e outro equipamento for configurado
para o slave, ambos devem ter os mesmos resultados. Isso é possível pois todos os
arquivos e diretórios usando diferentes tipos de ferramentas como por exemplo CVS,
Coda e Rsync.
Para acesso às máquinas, foi definido que cada servidor teria configurada
servidor. Além da interface roteada, vão ser configuradas interfaces em cada rede
configuradas:
comunicação pela interface 10.0.1.1. O mesmo ocorre para equipamentos com IPs
sistema, toda a comunicação acontecerá pela interface 10.0.5.1 pois o servidor não
tem nenhuma interface configurada para a rede 10.0.6.0/24, sendo necessário o uso
de roteamento.
Além disso, será usado um outro daemon, o UCARP, que servirá para fazer
Address Redundancy Protocol). Com ele é possível, por exemplo, configurar uma
virtual que responda no endereço 10.0.5.3. O próprio daemon, quando recebe uma
pacotes para o servidor que estiver com o melhor tempo de resposta. Isto é muito
útil, pois caso aconteça algum problema com um servidor de exemplo 192.168.1.2, e
ele estiver configurado como master, o daemon encaminha todo o tráfego para o
diz respeito ao fluxo dos dados no ambiente, após o usuário informar suas
credenciais. Diferente do que era, onde para a grande maioria dos equipamentos
requisições são recebidas por um servidor, que faz todo o processamento e retorna
10.
Figura 10 - Fluxo dos dados no ambiente proposto
gerar logs de tudo que é feito nesse processo de interação do usuário com o
equipamento.
trabalho ou servidores. Isso possibilita que com apenas uma credencial o usuário
4.2. Desenvolvimento
gerenciamento de identidade.
Cisco ou não.
• LDAP
• Active Directory
específico da Cisco. Caso seja instalado o ACS no formato de uma máquina virtual,
citados, seria necessária a aquisição de duas licenças do ACS 5.1 e pelo menos 2
TB de capacidade de armazenamento, que é o recomendado pela Cisco para o uso
em ambiente de produção.
Outra limitação que acabou deixando muito a desejar diz respeito ao suporte
rede, da mesma forma que é feito atualmente. Para os demais equipamentos, o ACS
4.2.2 TAC_PLUS
• Compilação padrão
é reiniciado, o comando será negado, por exemplo. Caso o usuário não esteja
exemplo dessa configuração pode ser visto na Figura 11, onde o usuário luís é
simples:
1. Quando o usuário está configurado para autenticar via PAM, o daemon
busca seja feita na base local, e caso não seja encontrado o usuário, a
acesso. Dessa forma o usuário terá o mesmo nível de privilégio para todos os
equipamentos que ele tiver acesso. Caso o usuário em questão seja um estagiário,
ou qualquer outro que deve ter níveis de acesso distintos, e precise de acesso total
a algum tipo de equipamento, seja ele de borda ou core, existem duas opções:
externos como:
• Active Directory;
• LDAP;
• RADIUS.
LDAP, a solução torna-se ainda mais completa, pois permite que sejam definidos
tacacsClient
150.162.248.43/32.
tacacsMember
• nível de privilégio;
• nível de privilégio@grupo de equipamentos.
uma lista de comandos possíveis de serem executados para aquele nível. A Figura
deny) o comando, exceto para os casos de comandos listados pelos campos cmd,
autorização do ambiente:
Interfaces e VLAN;
address, que são os endereços IP dos equipamentos deste grupo e uma key, que é
pertencente ao grupo.
tacacsProfile
Usado para definir mais algumas variáveis ao registro. Utilizando este atributo
acesso por um tempo determinado, fazer restrições de acesso por horário e também
e simples, pois não será mais necessário fazer acesso ao servidor e editar o arquivo
forma foi criada uma nova necessidade, o desenvolvimento de uma aplicação para
infraestrutura:
• Servidores;
• Comutadores de rede.
servidor tem associado a ele cinco interfaces de rede, para possibilitar o uso dos
servidores.
interfaces 1Gb e 10Gb via fibra óptica para fazer a conexão tanto ao PoP-SC,
contabilização.
contabilização.
quatro ultimas podem ser optado pelo uso de fibra óptica. São utilizados modelos de
Uso: Faz o controle centralizado dos pontos de acesso sem fio Cisco.
contabilização.
operando com pelo menos a autenticação pelo ambiente. Estes equipamentos são:
• Edge-Core ES3526XA
A SeTIC controla por volta de 850 equipamentos de rede, dos quais, cerca de
fabricantes como SMC, Dell, Enterasys e HP, onde ainda não foram feitos os testes
de suporte.
De todos esses comutadores suportados pelo sistema, dois são usados como
roteadores principais, quatro são controladores da rede sem fio, cinco são switchs
sistema.
programação perl, para analisar e inserir os logs gerados pelo TAC_PLUS MAVIS
Imagens da interface de logs podem ser vistas nas Figuras 20, 21 e 22.
Figura 20 - Interface de Logs - logs de comandos
Informações importantes podem ser visualizadas como a hora que o comando foi
autenticação.
Figura 22 - Interface de Logs - logs de acessos 2
aplicado um filtro para mostrar apenas registros onde o status é “Usuário não
encontrado”. Percebe-se que na maior parte dos casos, o acesso é feito por usuário
externos à rede UFSC, indicados pelo endereço IP não pertencentes a faixa utilizada
nome de usuário como admin e root é um comportamento que pode sugerir algum
servidor. É importante salientar que para todos esses casos, tanto dos processos,
possível que os usuários possam ter um histórico dos comandos que eles próprios
selecionada nas “Opções da Conta” é exibido três novos atributos: Rede de Acesso,
pessoais, como senha, e-mail e telefone, como também visualizar seu histórico de
comandos.
Órgãos públicos estão sendo cada vez mais cobrados sobre questões de
melhores práticas de gestão dos recursos de TI e com a UFSC isso não é diferente.
diferentes, sendo que cada domínio tem objetivos de controle e estes, por sua vez,
possuem controles.
o A.10.10 Monitoramento
Não é garantido que todos os controles citados são realmente utilizados, mas
cenário heterogêneo.
realização do desenvolvimento.
proprietário da Cisco (ACS 5.1) que por mais robusto que seja, não supriu as
medida que ainda não foram realizados testes com todas as marcas e modelos de
que pode passar a exigir que tenham suporte completo ao protocolo TACACS+,
comandos feitos pelos usuário nos equipamentos. Esse acompanhamento pode ser
utilizado para auditoria do processo de gestão de ativos de rede, ou até mesmo para
com uma implementação parecida. Além disso, nem mesmo empresas como a RNP
cada equipamento.
estipulados, tanto gerais quanto específicos, foram alcançados. Por fim, registra-se
não tendo registrado nenhum momento de inoperância nesses mais de seis meses
de uso.
servidores Linux.
Outra necessidade verificada é a melhoria da interface de gerência para
CISCO SYSTEMS, INC. Cisco IOS Security Configuration Guide. Cisco Press,
2006. 586p.
CISCO SYSTEMS, INC. Installation and Upgrade Guide for the Cisco Secure
http://www.cisco.com/en/US/docs/net_mgmt/cisco_secure_access_control_system/5.
Disponível em:
http://www.cisco.com/en/US/tech/tk59/technologies_tech_note09186a0080094e99.s
CISCO SYSTEMS, INC. User Guide for the Cisco Secure Access Control
http://www.cisco.com/en/US/docs/net_mgmt/cisco_secure_access_control_system/5.
1993.
HARRIS, SHON. CISSP All-in-One Exam Guide. 4. ed. Editora McGraw-Hill, 2007.
1145p.
Florianópolis, 1999.
NAKHJIRI, MADJID; NAKHJIRI, MAHSA. AAA and Network Security for Mobile
Access: Radius, Diameter, EAP, PKI and IP Mobility. Editora Wiley, 2005. 295p.
www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html.
Dezembro 1997.
Apêndices
Abstract. This paper has as its theme the study, development and implementation of
a centralized authentication system for network equipment using standardized and
free technologies as base. Throughout the work, analysis on the main protocols that
involve areas of Authentication, Authorization and Accounting (AAA) [METZ 1999]
are presented, such as RADIUS [IETF 2865 2000] and TACACS + [METZ 1999].
Besides the theoretical part, two applications were developed, one for support and
the other to the management of the environment. Tests were also performed with an
application already consolidated in the market, which was very complete but
somewhat adaptable to heterogeneous network environments.
Resumo. O presente artigo possui como tema o estudo, o desenvolvimento e a
implantação de um sistema de autenticação centralizado para equipamentos de
rede, utilizando como base tecnologias padronizadas e livres. Ao longo do trabalho,
são apresentadas as análises realizadas sobre os principais protocolos que
envolvem as áreas de Autenticação, Autorização e Contabilização (AAA) [METZ
1999], como RADIUS [IETF 2865 2000] e TACACS+ [METZ 1999]. Além da parte
teórica, foram desenvolvidas duas aplicações, uma para suporte e outra para a
gerência do ambiente. Foram realizados ainda testes com uma aplicação já
consolidada no mercado, a qual se mostrou muito completa mas pouco adaptável a
ambientes de rede heterogêneas.
1. Introdução
Com o crescente número de usuários da rede UFSC, os equipamentos de rede estão em
constante mudança, seja por melhoria da infraestrutura, seja pelas novas configurações que
lhes são aplicadas.
Com esse quadro de modernização, esses equipamentos ganharam suporte a novos
protocolos, dentre os quais estão alguns que são usados para a gerência de identidades de
usuários, como o TACACS+ [METZ 1999] e o RADIUS [IETF 2865 2000]. Assim, é
importante a utilização mais adequada das ferramentas baseadas nos nesses protocolos, a fim
de aproveitar todas as vantagens oferecidas, bem como permitir uma gerência mais segura dos
ativos de rede.
Em um ambiente tão crítico e complexo como o de gerência da rede UFSC, onde um
comando errado pode acarretar em problemas de conectividade para usuários e serviços, é
preciso ter o maior controle possível do que é feito e por quem é feito.
Para tanto, verifica-se a necessidade do uso de uma aplicação que realize o
gerenciamento das identidades dos usuários, para garantir que cada pessoa com acesso ao
equipamento faça apenas o que lhe é permitido e não tenha acesso total, como acontece
normalmente.
Tendo por base situações como esta, foi proposto um framework estrutural que provê
um conjunto de três funções de segurança, o AAA (Authentication, Authorization e
Accounting) [METZ 1999]. Baseado nesse framework, é possível definir quem terá acesso
(Autenticação), quais as ações que poderão ser feitas depois de sua autenticação
(Autorização), o horário que estas ações podem ser feitas, bem como a geração de todos os
logs das ações efetuadas para fins de uma possível auditoria (Contabilização).
O presente trabalho é fundamentado nesse framework e no problema da ausência de
controle no atual ambiente de gerência da rede UFSC, que é apenas usado nos roteadores, a
fim de propor uma solução que poderá ser aproveitada para uma variedade maior de
equipamentos, desde que tenham suporte ao protocolo TACACS+, possibilitando, assim, que
o AAA seja utilizado, quando possível.
O restante do artigo está organizado da seguinte forma: a seção 2 se refere as
fundamentações teóricas sobre os conceitos básicos de AAA, RADIUS e TACACS+; Na
seção 3 serão descritas as principais tecnologias utilizadas durante o estudo e implementação
do novo ambiente. A seção 4 confronta o cenário atual com o proposto, justificando a
implementação do novo sistema. Apresenta os resultados obtidos com o novo ambiente, bem
como as principais configurações necessárias para o seu funcionamento; Por fim, na seção 5,
serão apresentadas as considerações finais e sugestões para trabalhos futuros.
2. Conceitos Básicos
2.1. Autenticação, Autorização e Contabilização (AAA)
O AAA [METZ 1999], é um framework estrutural para coordenar as áreas de autenticação,
autorização e contabilização sob várias tecnologias de redes e plataformas.
Alguns dos benefícios de usar o AAA em equipamentos de rede são:
• Aumento da flexibilidade e controle do acesso a configuração;
• Escalabilidade;
• Métodos de autenticação padronizados como RADIUS, TACACS+ e Kerberos.
2.2.1. Radius
RADIUS é um sistema distribuído cliente/servidor que previne as redes contra acesso não
autorizado [CISCO 2006]. Foi desenvolvido em meados de 1990 pela Levingston Enterprise,
com o fim de prover autenticação e auditoria para os equipamentos de rede da organização
[METZ 1999].
Segundo o RFC 2865 [IETF 2000], os seus atributos funcionais consistem em:
• Modelo Cliente/Servidor – o equipamento de acesso à rede (NAS) opera como um
cliente do RADIUS. O cliente é o responsável por passar as informações do usuário ao
servidor RADIUS e depois agir de acordo com a resposta retornada. O servidor
RADIUS é o responsável por receber o pedido de conexão do usuário, fazer a
autenticação e retornar todas as configurações necessárias ao cliente, para que este
consiga fornecer o serviço ao usuário;
• Segurança de Rede – Transações entre o servidor RADIUS e o NAS são autenticadas
por uma chave compartilhada, que nunca é enviada pela rede. As senhas dos usuários
são enviadas cifradas entre o cliente e o servidor para evitar o roubo em redes
inseguras;
• Mecanismo de Autenticação Flexível – Um servidor RADIUS pode suportar vários
mecanismos de autenticação como PAP e CHAP;
• Protocolo Extensível – Novos valores de atributos podem ser adicionados sem
prejudicar as implementações existentes do protocolo.
3.2.2 Tacacs +
Outro protocolo que provê os serviços de AAA é o Terminal Access Controller Access
Control Protocol (TACACS). Originalmente descrito na RFC 1492 [IETF 1993], foi
reestruturado ao longo dos anos pela CISCO e é suportado por vários servidores, roteadores e
outros dispositivos encontrados nas redes empresarias de hoje. A versão atual é chamada de
TACACS+, que reflete as melhorias feitas no protocolo original [METZ 1999].
De acordo com HARRIS (2007) o TACACS tem três gerações: TACACS;
XTACACS; TACACS+. Na verdade, o TACACS+ não é uma nova geração, é um novo
protocolo que provê funcionalidades similares. Por ser um protocolo totalmente diferente, não
é compatível com o TACACS ou XTACACS.
Para CISCO ... (2006), TACACS+ é uma aplicação de segurança que provê a
validação centralizada dos usuários que estão tentando acessar equipamentos de rede ou
servidores de acesso à rede. O Protocolo possibilita a instalação separada e modular dos
serviços de autenticação, autorização e contabilização. Outro ponto muito importante, é que
toda a troca de informações entre o equipamento de acesso e o daemon é cifrado.
2.3. Tecnologias
2.3.1. openLDAP
O Lightweight Directory Access Protocol (LDAP) de uma forma simplificada, é um protocolo
para pesquisar e atualizar diretórios. Segundo a RFC 2251 [IETF 1997], que define a versão
três do protocolo, o LDAP segue o modelo de serviços de diretório X.500, que é uma árvore
de nós, cada um consistindo de um conjunto de atributos com seus respectivos valores. O
modelo X.500 era muito complexo para ser suportado em desktops e através da Internet,
então o LDAP foi criado para prover este serviço.
Para CARTER (2003), serviços de diretórios podem assumir muitas formas, mas cinco
características, pelo menos, são verdadeiras:
• Otimizadas para leitura;
• Implementam modelos distribuídos de armazenamento de informações;
• Pode estender os tipos de informação que armazena;
• Recursos avançados de pesquisa;
• Replicação consistente entre servidores de diretórios.
O serviço de diretório X.500 ganhou o título de “pesado”. Nele, toda a comunicação
entre cliente e servidor é feita usando o a pilha do protocolo Open System Interface (OSI), e
como trabalha na camada de aplicação, o cabeçalho de rede fica muito pesado.
Já o LDAP é considerado leve, como o próprio nome sugere, em comparação com o
X.500 pois utiliza mensagens com baixa sobrecarga, mapeadas diretamente na camada TCP
da pilha do protocolo TCP/IP.
2.3.2. TAC_PLUS
De acordo com HUBBER (2011), principal desenvolvedor do projeto, o tac_plus é um
daemon dirigido a eventos do TACACS+, ou seja, seu funcionamento esta extremamente
relacionado ao envio e recebimento de eventos. Provê os serviços de autenticação, autorização
e contabilização para roteadores Cisco e outros equipamentos de rede, desde que suportem o
protocolo. É uma reformulação do código-fonte original do TACACS da Cisco. Alguns dos
principais recursos incluem:
• Flexibilidade de backends externos para perfis de usuários (LDAP, Active Directory e
RADIUS);
• Multiplexação das conexões – múltiplos clientes por processo;
• Escalabilidade – sem limite de usuários, servidores ou clientes;
• Suporte aos protocolos IPv4 e IPv6;
• Compilado com a especificação mais recente do protocolo TACACS+;
Para poder oferecer a já falada flexibilidade de backend, o tac_plus usa um outro
módulo chamado MAVIS e que será explicado a seguir.
2.3.3. MAVIS
O Modular Attribute-Value Interchange System (MAVIS) é uma biblioteca que provê um
protocolo extensível e modular para as tarefas de autenticação e autorização. Também
funciona como um subsistema de autenticação modular, usado pelo daemon tac_plus. Esta
biblioteca contem vários módulos para o uso de diversos backends e um deles é para serviço
de diretório, seja o openLDAP ou o Active Directory da Microsoft.
Para poder usar todas suas vantagens é só adicionar um novo arquivo de schema no
servidor LDAP e em cada objeto que poderá fazer uso das funcionalidades do tac_plus,
adicionar o objectClass “tacacsAccount“ e seus respectivos atributos.
4. Estudo de Caso
4.1. Projeto
4.2. Desenvolvimento
Apresentados o funcionamento do ambiente, bem como o propósito que se pretende alcançar
com o presente trabalho, neste momento, passa-se a discorrer sobre duas ferramentas que
possuem mecanismos capazes de solucionar as necessidades verificadas anteriormente. Foram
analisadas duas ferramentas para desenvolver o projeto proposto:
• Cisco Secure Access Control Server 5.1 (ACS) [CISCO 2012];
• TAC_PLUS [HUBBER 2011].
Como a ferramenta desenvolvida pela Cisco possui algumas limitações, que serão
explicadas no texto, foi escolhida a solução utilizando o TAC_PLUS MAVIS para uso no
projeto.
4.2.2. TAC_PLUS
Considerando que já foi exposto o conceito do daemon TAC_PLUS na seção 3.2, foram feitos
dois testes distintos:
• Compilação padrão
• Compilação TAC_PLUS MAVIS
Da forma padrão o TAC_PLUS é limitado. Uma das principais limitações é que todos
os usuários, dispositivos e demais diretivas precisam estar cadastrados no arquivo de
configurações do daemon. Isso é um grande problema já que para adicionar cada novo usuário
ao sistema é necessário que um administrador edite o arquivo de configurações e depois
reinicie o daemon. Se por acaso alguém estiver executando algum comando no equipamento
exatamente na hora em que o daemon é reiniciado, o comando será negado, por exemplo.
Caso o usuário não esteja cadastrado no arquivo de configurações, é possível fazer login
utilizando o PAM (Pluggable Authentication Modules) do servidor linux. Desta maneira
também é necessário ter um registro no arquivo de configurações mostrando que, para aquele
usuário específico, as informações serão fornecidas pelo sistema operacional.
Utilizando a compilação padrão, o PAM é uma peça fundamental ao sistema pois é
através dele que o TAC_PLUS tem a possibilidade do uso de recursos externos para a
autenticação, como por exemplo o LDAP. O funcionamento é bem simples:
1. Quando o usuário está configurado para autenticar via PAM, o daemon busca as
credenciais do usuário da base local do sistema operacional.
2. É instalada uma biblioteca ao PAM que permite que ele verifique as credenciais de um
usuário em um diretório LDAP.
3. Essa biblioteca é configurada para que sempre a primeira opção de busca seja feita na
base local, e caso não seja encontrado o usuário, a busca é feita no diretório LDAP.
Essa obrigatoriedade do uso do PAM deixa todo o sistema um tanto quanto inflexível, pois
centraliza tudo no arquivo de configurações, ao invés de ter uma forma simples de possibilitar
a gerência de todo o daemon.
Outra limitação é não possibilitar que um usuário tenha várias políticas de acesso.
Dessa forma o usuário terá o mesmo nível de privilégio para todos os equipamentos que ele
tiver acesso.
Usando o TAC_PLUS MAVIS (explicado na seção 3.3) algumas dessas limitações são
atendidas. Primeiramente, o daemon tem suporte nativo a agentes externos como:
• Active Directory;
• LDAP;
• RADIUS.
Caso a autenticação esteja configurada para acontecer via Active Directory ou LDAP,
a solução torna-se ainda mais completa, pois permite que sejam definidos atributos
específicos nos registros do diretório e não somente no arquivo de configurações. São
adicionados três novos atributos - tacacsClient, tacacsMember e tacacsProfile – que são
responsáveis por possibilitar a flexibilidade necessária com o seu uso.
tacacsClient
Define o endereço IP ou segmento de rede de onde o daemon pode aceitar a conexão
do usuário. Funciona de forma semelhante a um firewall, analisando a origem da requisição e
permitindo, ou não, o acesso ao equipamento.
tacacsMember
Atributo responsável pela definição das políticas de acesso.
tacacsProfile
Usado para definir mais algumas variáveis ao registro. Utilizando este atributo é
possível definir tempo de validade do registro, caso seja necessário liberar o acesso por um
tempo determinado, fazer restrições de acesso por horário e também fazer o uso de ACLs para
restringir ou permitir o acesso a outros equipamentos.
4.3. Implantação
Já na Figura 6 é mostrada a mesma interface da Figura 5, só que foi aplicado um filtro para
mostrar apenas registros onde o status é “Usuário não encontrado”. Percebe-se que na maior
parte dos casos, o acesso é feito por usuário externos à rede UFSC, indicados pelo endereço
IP não pertencentes a faixa utilizada pela universidade. Este indicador, associado com a
tentativa de login utilizando o nome de usuário como admin e root é um comportamento que
pode sugerir algum ataque de invasão por força bruta ao equipamento, por exemplo.
Além de acompanhar os logs é possível aplicar filtros para refinar os resultados das buscas e a
atualização dos dados é feita em tempo real.
No caso da interface de gerência das identidades foi usado principalmente PHP como
linguagem de programação, interagindo com o diretório LDAP, onde ficam armazenadas as
credenciais dos usuários.
As Figuras 7, 8 e 9 mostram alguns dos módulos do sistema.
Figura 33 - Interface de gerência - visão inicial
A Figura 7 mostra a visão geral do sistema, após o usuário fazer o login na interface WEB. É
possível saber se todos os processos essenciais ao ambiente estão sendo executados, como
também um monitoramento das partições do servidor. É importante salientar que para todos
esses casos, tanto dos processos, quanto das partições, caso aconteça algum incidente, é
enviado um e-mail automaticamente aos administradores do sistema para informar do
ocorrido.
Figura 34 - Interface de gerência - acompanhamento de comandos
5. Considerações Finais
O presente trabalho de conclusão de curso teve como propósito demonstrar todo o processo de
desenvolvimento e implantação de um ambiente de autenticação, autorização e contabilização
para equipamentos de rede em um cenário heterogêneo.
Para tanto, buscou-se estudar os principais conceitos relacionados ao assunto, bem
como as tecnologias mais utilizadas e de fácil acesso para a realização do desenvolvimento.
Foram realizados dois ambientes de teste. No primeiro foi utilizado o software
proprietário da Cisco (ACS 5.1) que por mais robusto que seja, não supriu as necessidades,
principalmente por ser muito voltado a equipamentos e serviços da própria CISCO. Já no
outro teste, empregou-se apenas tecnologias livres como os daemons TAC_PLUS MAVIS e
openLDAP, que implementam os protocolos TACACS+ e LDAP, respectivamente, os quais
juntos possibilitaram a flexibilidade de uso exigida para um ambiente com as características
do encontrado na rede UFSC.
Depois da implantação de forma definitiva do ambiente, foi atingida a marca de cerca
de 70% dos equipamentos configurados para autenticar utilizando o ambiente proposto, o que
é um número bastante significativo até o momento, à medida que ainda não foram realizados
testes com todas as marcas e modelos de equipamentos encontradas na rede. Registra-se,
ainda, que o uso do ambiente pode influenciar também nos processos de licitação para compra
de novos equipamentos, que pode passar a exigir que tenham suporte completo ao protocolo
TACACS+, filtrando equipamentos sem muitos recursos, e aumentando o uso do ambiente.
O desenvolvimento das interfaces também trouxe um ganho significativo, tanto por
possibilitar a gerência das credenciais do ambiente, interagindo com o diretório LDAP, como
viabilizar o acompanhamento, em tempo real, das ações e comandos feitos pelos usuário nos
equipamentos. Esse acompanhamento pode ser utilizado para auditoria do processo de gestão
de ativos de rede, ou até mesmo para a identificação de tentativas de acesso não autorizado
aos equipamentos.
Nas pesquisas realizadas, não foi encontrado nenhum trabalho acadêmico com uma
implementação parecida. Além disso, nem mesmo empresas como a RNP e os seus principais
Pontos de Presença da RNP (PoPs), geralmente, fazem o uso de soluções semelhantes,
deixando todas as credenciais usadas na base local de cada equipamento.
Pode-se dizer que toda a implantação foi bem sucedida e os objetivos estipulados,
tanto gerais quanto específicos, foram alcançados. Por fim, registra-se que ainda existem
correções a serem feitas, principalmente na interface de gerenciamento desenvolvida, mas o
ambiente tem se mostrado bastante estável, não tendo registrado nenhum momento de
inoperância nesses mais de seis meses de uso.
Referência Bibliográficas
Associação Brasileira de Normas Técnicas. Tecnologia da Informação – Técnicas de
segurança – Sistemas de gestão de segurança da informação – Requisitos: NBR 27001. Rio
de Janeiro, 2006.
CARTER, GERALD. LDAP System Administration. Primeira Edição. Editora O’Reilly,
2003. 294p.
METZ, Christopher. AAA Protocols: Authentication, Authorization and Accounting for the
Internet. IEEE, p.75-79. Dezembro 1999.
RIGNEY, C; WILLENS, S; RUBENS, A; SIMPSON, W. Remote Authentication Dial In
User Service (RADIUS), IETF, RFC 2865. [Online]. Disponível em:
http://www.ietf.org/rfc/rfc2865.txt, Junho 2000.
CISCO SYSTEMS, INC. Cisco IOS Security Configuration Guide. Cisco Press, 2006. 586p.
CISCO SYSTEMS, INC. Installation and Upgrade Guide for the Cisco Secure Access Control
System 5.1. junho de 2011. Disponível em:
http://www.cisco.com/en/US/docs/net_mgmt/cisco_secure_access_control_system/5.1/inst
allation/guide/acs5_1_install_guide.html . Acesso em: 20 de outubro de 2012.
CISCO SYSTEMS, INC. User Guide for the Cisco Secure Access Control System 5.1.
Outubro de 2012. Disponível em:
http://www.cisco.com/en/US/docs/net_mgmt/cisco_secure_access_control_system/5.1/user
/guide/introd.html . Acesso em: 20 de outubro de 2012.
FINSETH, C. An Access Control Protocol, Sometimes Called TACACS, IETF, RFC 1492.
[Online]. Disponível em : http://www.rfc-editor.org/rfc/rfc1492.txt, Julho 1993.
HUBBER, MARC. MAVIS. Novembro de 2011. Disponível em: http://www.pro-bono-
publico.de/projects/mavis.html. Acesso em: 26 de junho de 2012.
HUBBER, MARC. TAC_PLUS. Dezembro de 2011. Disponível em: http://www.pro-bono-
publico.de/projects/tac_plus.html. Acesso em: 26 de junho de 2012.
HARRIS, SHON. CISSP All-in-One Exam Guide. 4. ed. Editora McGraw-Hill, 2007. 1145p.
OLIVEIRA, Rômulo Silva de; CARISSIMI, Alexandre da Silva; TOSCANI, Simão Sirineo.
Sistemas Operacionais. Revista de Informática Teórica e Aplicada – RITA, v. 8, n. 3, p. 1-
33, dez. 2001.
WAHL, M; HOWES, T; KILLE, S. Lightweight Directory Access Protocol (v3), IETF, RFC
2251. [Online]. Disponível em: http://www.ietf.org/rfc/rfc2251.txt, Dezembro 1997.
Código fonte da aplicação desenvolvida
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_INCLUDES . 'LDAP.php';
require_once PATH_INCLUDES . 'config.php';
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of LDAPController
*
* @author luis
*/
class LDAPController {
protected $ldap;
protected static $instance;
/*
* getValidUsers : função que retorna todos os usuários válidos da base
LDAP. Verifica no arquivo de configuração se
* existe algum usuário que não deve ser mostrado e retorna o array com
os usuários válidos
*
* @return array usuários válidos
*/
global $Config;
$users = array();
for ($i = 0; $i < $result["count"]; $i++) {
if (isset($Config['user_filter']) &&
!empty($Config['user_filter'])) {
if (!in_array($result[$i]["uid"][0],
$Config['user_filter'])) {
$users[] = array(
'uid' => $result[$i]["uid"][0],
'nome' => $result[$i]['givenname'][0]
);
}
} else {
$users[] = array(
'uid' => $result[$i]["uid"][0],
'nome' => $result[$i]['givenname'][0]
);
}
}
$this->ldap->unbind();
return $users;
} catch (Exception $e) {
//echo $e->getMessage();
return false;
}
}
/*
* getValidGroups : retorna todos os grupos válidos, verificando se
existe alguma restrição no arquivo de configuração
* fazendo o filtro quando necessário
*
* @return array grupos válidos
*/
$this->ldap->unbind();
return $groups;
} catch (Exception $e) {
//echo $e->getMessage();
return false;
}
}
/*
* createSHA : função para cria a senha do usuário de acordo com o
padrão usado pelo LDAP
*
* @param string $senha string que será criptografada
* @return string senha criptografada em SHA1
*/
/*
* autentica : função que verifica os dados fornecidos pelo usuário com
os da base LDAP, liberando acesso caso os
* dados são iguais
*
* @param string $usuario usuário que esta tentando se autenticar
* @param string $senha senha não criptografada do usuário
*
* @return caso as informações fornecidas são compatíveis com as da
base retorna o usuário LDAP, caso contrário FALSE
*/
if ($temp['count'] == 1) {
if ($senha == $temp[0]["userpassword"][0]) {
$permissao = $this->ldap->isGroupMember("(&(cn=web-
admin)(memberuid=$usuario))");
if ($permissao['count'] != 0) {
$temp['admin'] = true;
}
return $temp;
} else {
return null;
}
} else {
return null;
}
}
/*
* modificarDN : função para modificar os atributos de alguma entrada
da base LDAP, pode ser grupo ou usuário
*
* @param string $dn deve ser a DN da entrada ldap. EXEMPLO:
'uid=teste,dc=dominio,dc=br'
* @param array $novo array com os atributos a serem alterados
*
* @return boolean
*/
/*
* modificarDN : função para deletar os atributos de alguma entrada da
base LDAP, pode ser grupo ou usuário
*
* @param string $dn deve ser a DN da entrada ldap. EXEMPLO:
'uid=teste,dc=dominio,dc=br'
* @param array $var array com os atributos a serem deletados
*
* @return boolean
*/
/*
* deleteDN : Função para deletar uma entrada da base LDAP
*
* @param string $dn deve ser a DN da entrada ldap. EXEMPLO:
'uid=teste,dc=dominio,dc=br'
* @param string $flag idica qual o tipo de entrada que será deletada:
usuário ou grupo
*
* @return boolean
*/
$usuario = $temp[0]['uid'][0];
$grupos = $this->verificaGruposUsuario($usuario);
if ($grupos) {
for ($i = 0; $i < sizeof($grupos); $i++) {
$this->atualizaUsuariosGrupo('del', $grupos[$i],
$usuario);
}
}
} elseif ($flag == 'grupo') {
$temp = $this->ldap->ldapGetGroup($dn);
}
if ($this->ldap->deleteDN($temp[0]['dn'])) {
return true;
}
return false;
} catch (Exception $e) {
//echo $e->getMessage();
return false;
}
}
/*
* getDN : Função que retorna uma entrada da base LDAP
*
* @param string $filter UID do usuário ou CN do grupo
* @param string $flag idica qual o tipo de entrada que será retornada:
usuário ou grupo
*
* @return entrada LDAP
*/
/*
* addDN : Função para adicionar uma entrada na base LDAP
*
* @param string $var array com os atributos do usuário
* @param string $flag idica qual o tipo de entrada que será
adicionada: usuário ou grupo
*
* @return boolean
*/
/*
* atualizaGrupo: Função para adicionar ou deletar do grupo um usuário
no atributo memberUid
*
* @param string $action valor que indica se é para adicionar ao grupo
ou deletar
* @param string $filter pode ser o gidNumber ou o CN do grupo
* @param string $uid nome do usuário a ser adicionado no grupo
*
* @return boolean
*/
$var['memberUid'] = $grupo[0]['memberuid'];
array_shift($var['memberUid']);
if ($action == 'add') {
if (!in_array($uid, $var['memberUid'])) {
$var['memberUid'][] = $uid;
}
} elseif ($action == 'del') {
$key = array_search($uid, $var['memberUid']);
if ($key !== false) {
unset($var['memberUid'][$key]);
}
}
if ($this->ldap->modifyDN($grupo[0]['dn'], $var)) {
return true;
}
return false;
} catch (Exception $e) {
//echo $e->getMessage();
return false;
}
}
/*
* verificaGruposUsuario : verifica dos grupos de um usuário dado o
nome de usuário
*
* @param string $uid Usuário que será feita a busca
* @return array array com os nomes dos grupos do usuário
*/
if ($grupos['count'] != 0) {
for ($i = 0; $i < $grupos['count']; $i++) {
$member[] = $grupos[$i]['cn'][0];
}
return $member;
} else {
return false;
}
} catch (Exception $e) {
//echo $e->getMessage();
return false;
}
}
/*
* isMember : verifica dos grupos de um usuário dado o nome de usuário
*
* @param string $grupo nome do grupo que pretende verificar se é
membro
* @param string $uid Usuário que será feita a busca
* @return boolean
*/
if ($grupos['count'] != 0) {
return true;
} else {
return false;
}
} catch (Exception $e) {
//echo $e->getMessage();
return false;
}
}
/*
* getValidID : retorna um valor válido de id para grupo ou usuário
* @param string $filter variavel pode ter 2 valores: usuario e grupo
* @return int
*/
public function getValidID($filter) {
try {
global $Config;
$ids = array();
$min = 0;
if ($filter == 'usuario') {
$min = $Config['uidnumber_start'];
$retorno = $this->ldap->getAllUsers();
for ($i = 0; $i < $retorno['count']; $i++) {
$ids[] = $retorno[$i]['uidnumber'][0];
}
} elseif ($filter == 'grupo') {
$min = $Config['gidnumber_start'];
$retorno = $this->ldap->getAllGroups();
for ($i = 0; $i < $retorno['count']; $i++) {
$ids[] = $retorno[$i]['gidnumber'][0];
}
}
for ($i = $min; $i <= max($ids); $i++) {
if (!in_array($i, $ids)) {
$id = intval($i);
break;
}
}
if (!isset($id)) {
$id = intval(max($ids)) + 1;
}
return $id;
} catch (Exception $e) {
//echo $e->getMessage();
return false;
}
}
?>
<?php
/**
* Description of LogController
*
*/
class LogController {
protected $db;
protected static $instance;
function __construct() {
$this->db = DB::getInstance();
}
function consulta($query) {
if ($query) {
try {
$result = $this->db->query($query);
$this->db->disconnect();
return $result;
} catch (Exception $e) {
echo($e->getMessage());
}
}
}
function insert($query) {
if ($query) {
try {
if (!$this->db->query($query)) {
return false;
}
$this->db->disconnect();
return true;
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
function registraLogout($usuario) {
$user = anti_injection($usuario);
$query = "INSERT INTO logs (usuario_logado,acao,descricao) VALUES
('$user','logout','Logout efetuado com sucesso')";
try {
$this->insert($query);
} catch (Exception $e) {
echo $e->getMessage();
}
}
/*
* registra todos os tipos de ação com feitas em um usuário
*
* @param string $usuarioLogado usuário que esta logado no sistema e
fez a ação
* @param string $acao ações suportadas: add, del, edit
* @param string $flag pode ser sucesso e erro
* @param string $usuario usuário que sofreu a ação
*/
if ($acao == 'add') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','adicionar','Usuário $usuario adicionado com
sucesso')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','adicionar','Falha ao adicionar o usuário
$usuario')";
}
} elseif ($acao == 'del') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','deletar','Usuário $usuario deletado com
sucesso')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','deletar','Falha ao deletar o usuário $usuario')";
}
} elseif ($acao == 'edit') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','editar','Usuário $usuario editado com sucesso')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','editar','Falha ao editar o usuário $usuario')";
}
}
try {
$this->insert(utf8_decode($query));
} catch (Exception $e) {
echo $e->getMessage();
}
}
if ($acao == 'add') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','adicionar','Grupo $grupo adicionado com
sucesso')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','adicionar','Falha ao adicionar o grupo $grupo')";
}
} elseif ($acao == 'del') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','deletar','Grupo $grupo deletado com sucesso')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','deletar','Falha ao deletar o grupo $grupo')";
}
} elseif ($acao == 'edit') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','editar','Grupo $grupo editado com sucesso')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','editar','Falha ao editar o grupo $grupo')";
}
}
try {
$this->insert(utf8_decode($query));
} catch (Exception $e) {
echo $e->getMessage();
}
}
function registraEventoTacacs($usuarioLogado, $acao, $flag,
$ip=null,$msg=null) {
$usuarioLogado = anti_injection($usuarioLogado);
$acao = anti_injection($acao);
$ip = isset($ip)?anti_injection($ip):null;
$msg = isset($msg)?anti_injection($msg):null;
if ($acao == 'add') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','tacacs_adicionar','Equipamento com o ip $ip
adicionado ao arquivo temporario')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','tacacs_adicionar','Falha ao adicionar o ip $ip
adicionado ao arquivo temporario')";
}
} elseif ($acao == 'del') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','tacacs_deletar','Equipamento com o ip $ip
deletado do arquivo temporario')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','tacacs_deletar','Falha ao deletar o ip $ip
adicionado ao arquivo temporario')";
}
} elseif ($acao == 'aplicar') {
if ($flag == 'ok') {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','tacacs_aplicar','$msg')";
} else {
$query = "INSERT INTO logs (usuario_logado,acao,descricao)
VALUES ('$usuarioLogado','tacacs_aplicar','$msg')";
}
}
try {
$this->insert(utf8_decode($query));
} catch (Exception $e) {
echo $e->getMessage();
}
}
function consultaLogs($query) {
$db_log = new DB('logs');
try {
$result = $db_log->query($query);
$db_log->disconnect();
return $result;
} catch (Exception $e) {
return $e->getMessage();
}
}
}
?>
<?php
$Config['mysql_ip'] = "localhost";
$Config['mysql_usuario'] = "xxx";
$Config['mysql_senha'] = "######";
$Config['mysql_base'] = "xxx";
$Config['mysql_base_logs'] = "xxx";
$Config['ldap_ip'] = 'ldaps://localhost';
$Config['ldap_basedn'] = 'dc=xxx,dc=xxx,dc=xx';
$Config['ldap_binddn'] = 'cn=admin,dc=xxx,dc=xxx,dc=xx';
$Config['ldap_usersdn'] = 'ou=usuarios,dc=xxx,dc=xxx,dc=xx';
$Config['ldap_groupsdn'] = 'ou=grupos,dc=xxx,dc=xxx,dc=xx';
$Config['ldap_bindpass'] = '#########';
$Config['ldap_port'] = '636';
$Config['particoes'] = array ('/','ldap','mysql','log','www');
$Config['processos'] =
array('ucarp','logs_auth.pl','logs_access.pl','mavis_tacplus_ldap.pl','apa
che2','slapd','mysqld','tacacs');
//$Config['particoes'] = array ('/','home','lock');
$Config['user_filter'] = array('acl-ufsc','acl-ufsc-virus','rancid');
//DESCOMENTE PARA ATIVAR A VARIAVEL PARA PODER FILTRAR OS GRUPOS QUE SERAO
MOSTRADOS
$Config['group_filter'] = array('web-admin');
$Config['uidnumber_start'] = 1200;
$Config['gidnumber_start'] = 500;
$Config['daemon'] = array(
'tacacs' => '/etc/init.d/tac_plus'
);
?>
<?php
define('URL_RAIZ', 'https://' . $_SERVER['SERVER_NAME'].'/ldap/');
define('URL_PUBLICO', URL_RAIZ);
define('URL_ADMIN', URL_PUBLICO.'admin/');
define('RAIZ_CSS', URL_PUBLICO.'css/');
define('RAIZ_JS', URL_PUBLICO.'js/');
define('RAIZ_FORMS', URL_PUBLICO.'forms/');
define('VERSAO','Beta');
require_once(dirname(__FILE__) . '/config.php');
class DB {
private $connection;
private $host;
private $user;
private $password;
private $database;
private static $instance;
?>
<?php
function dataValida($data) {
if (preg_match("/^(\d{2})\/(\d{2})\/(\d{4})$/", $data, $matches)) {
if (checkdate($matches[2], $matches[1], $matches[3])) {
return true;
}
}
return false;
}
function IPValido($ip) {
if (preg_match('/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-
5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}(\/[0-3][0-
9])?$/', $ip)) {
return true;
}
return false;
}
function anti_injection($dado) {
//Remove palavras que contenham sintaxe SQL:
$dado =
preg_replace("/(from|select|update|insert|delete|where|union|drop
table|show tables|--|\\\\)/i", "", $dado);
$dado = trim($dado); //Limpa espaços vazio no início e fim da string
$dado = strip_tags($dado); //Remove tags HTML e PHP
$dado = addslashes($dado); //Adiciona barras invertidas a uma string
return $dado;
}
function array_membro() {
global $Config;
$temp = array();
for ($i = 0; $i < sizeof($matches[1]); $i++) {
$temp[$matches[1][$i]][] = $matches[2][$i];
}
$array = array();
for ($i = 0; $i < sizeof($temp['group']); $i++) {
for ($j = 0; $j < sizeof($temp['host']); $j++) {
if (!isset($array[$temp['group'][$i]])) {
$array[$temp['group'][$i]][] = $temp['group'][$i];
}
$array[$temp['group'][$i]][] = $temp['group'][$i] . '@' .
$temp['host'][$j];
}
}
return $array;
}
function array_equipamentos() {
global $Config;
return shell_exec($sed);
}
function get_equipamento($ip) {
global $Config;
$address = preg_replace(array('/\//', '/\./'), array('\/', '\.'),
$ip);
$comando = "/bin/egrep 'address\s*=\s*$address.*'
$Config[path_tacacs_temp] 2>&1";
return shell_exec($comando);
}
function delete_equipamento($ip) {
global $Config;
$address = preg_replace(array('/\//', '/\./'), array('\/', '\.'),
$ip);
$comando = "/bin/sed -i '/address\s*=\s*$address.*/d'
$Config[path_tacacs_temp] 2>&1";
return shell_exec($comando);
}
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_INCLUDES . 'config.php';
/**
* Description of LDAP
*
* Classe responsável por fazer toda a interação com o LDAP
*
* @author luis
*/
class LDAP {
/*
* @var string base da árvore LDAP
*/
private $baseDN;
/*
* @var string base de usuários da árvore LDAP
*/
private $usersDN;
/*
* @var string base de grupos da árvore LDAP
*/
private $groupsDN;
/*
* @var string usuário que fará a conexão com o servidor LDAP
*/
private $bindDN;
/*
* @var string senha do usuário da conexão
*/
private $bindPW;
/*
* @var string ip/nome do servidor LDAP
*/
private $host;
/*
* @var int porta de conexão com o servidor LDAP
*/
private $port;
/*
* @var ldap-link variável com as propriedades da conexão com o
servidor LDAP
*/
private $connection;
/*
* @var LDAP instância da classe
*/
private static $instance;
/*
* getInstance(): função que substitui a instanciação de um novo
objeto.
* verifica se já foi instanciado, se sim retorna o objeto, caso
contrário, cria um novo objeto
*
* @return LDAP objeto LDAP
*/
/*
* __construct(): função de instanciação do objeto. Apenas carrega os
valores do arquivo de configurações
*/
/*
* getUserDN: função que retorna o atributo usersDN, que é a base da
árvore de usuários do LDAP
*
* @return string base de usuários da árvore LDAP
*/
/*
* getGroupDN: função que retorna o atributo groupsDN, que é a base da
árvode de grupos do LDAP
*
* @return string base de grupos da árvore LDAP
*/
/*
* connect: função para fazer a conexão com o LDAP.
*
*/
$this->connection = $ldapConn;
}
/*
* unbind: fecha a conexão com o servidor LDAP
*/
/*
* getAllUsers: função que busca na árvore LDAP todos os usuários
*
* @return array array com os usuários da base LDAP
*/
if(!$filter){
$filter = "(uid=*)";
}
$this->unbind();
return true;
}
$this->unbind();
return $temp;
}
?>
<script type="text/javascript">
$('#ajuda').click(function(e){
e.preventDefault();
window.open($('#ajuda').attr('href'),"ajuda","location=1,status=1,scrollbar
s=1, width=500,height=400");
});
$('.aplicar_tacacs').click(function(e){
$.getJSON('../forms/aplicar?d=tac', function(response) {
if(response.status == 'ok'){
$('.aplicar_tacacs').removeClass('warning');
var msg = $('#msg');
msg.removeClass('hidden');
msg.removeClass('warning');
msg.addClass('success_box');
msg.html(response.msg).fadeOut(5000,function(){
$(this).html('');
$(this).removeClass('success_box');
});
}else{
var msg = $('#msg');
msg.removeClass('hidden');
msg.removeClass('warning_box');
msg.addClass('error_box');
msg.html(response.msg);
}
});
e.preventDefault();
});
</script>
<?php endif; ?>
<div id="footer">
<div id="logos">
<img src="<?php echo RAIZ_CSS;?>imgs/setic.png" align="middle"
alt="SeTIC"/>
<img src="<?php echo RAIZ_CSS;?>imgs/ufsc.png" align="middle"
alt="UFSC" style="margin-left: 30px;"/>
<img src="<?php echo RAIZ_CSS;?>imgs/pop.png" align="middle"
alt="PoP-SC" style="margin-left: 30px"/>
</div>
</div>
</body>
</html>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'functions.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if (!isset($ip) || empty($ip)) {
$resposta['error']['ip'] = "IP é OBRIGATÓRIO";
} else {
if (!preg_match('/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-
5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}(\/[0-3][0-
9])?$/', $ip)) {
$resposta['error']['ip'] = "IP é INVÁLIDO";
}
}
if (!isset($desc) || empty($desc)) {
$resposta['error']['descricao'] = "Descrição é OBRIGATÓRIA";
}
if (!isset($resposta)) {
if (!get_equipamento($ip)) {
$temp = add_equipamento($grupo, $ip, $desc);
$db = LogController::getInstance();
if (is_null($temp)) {
$resposta['status'] = "ok";
$resposta['msg'] = "IP cadastrado com Sucesso";
$_SESSION['tacacs']['modificado'] = true;
$_SESSION['tacacs']['msg'] = 'Configurações foram
modificadas, mas ainda não foram aplicadas. Clique em <strong>Aplicar
Configurações</strong> para não perder suas modificações.';
$db->registraEventoTacacs($_SESSION['user']['uid'], 'add',
'ok', $ip);
} else {
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO: $temp";
$db->registraEventoTacacs($_SESSION['user']['uid'], 'add',
'erro', $ip);
}
} else {
$resposta['error']['ip'] = "IP já CADASTRADO";
}
}
exit(json_encode($resposta));
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'functions.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if (isset($_POST['usuarios'])){
for($i=0;$i<sizeof($_POST['usuarios']);$i++){
$var['memberUid'][$i] = $_POST['usuarios'][$i];
}
}
if(!$resposta){
$ldap = LDAPController::getInstance();
$var['objectclass'][0]= 'top';
$var['objectclass'][1]= 'posixGroup';
$var['gidnumber'] = $ldap->getValidID('grupo');
$resposta['status'] = "ok";
$resposta['msg'] = "Grupo Cadastrado com Sucesso";
}else{
$db-
>registraEventoGrupo($_SESSION['user']['uid'],'add','erro',$var['cn']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
}
exit(json_encode($resposta));
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'functions.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$var['objectClass'][] = 'top';
$var['objectClass'][] = 'person';
$var['objectClass'][] = 'inetOrgPerson';
$var['objectClass'][] = 'posixAccount';
if (isset($_POST['expira'])) {
if (isset($_POST['data_expira']) &&
!empty($_POST['data_expira'])) {
if (dataValida($_POST['data_expira'])) {
$dataAtual = date('d-m-Y');
$var['objectClass'][] = "shadowAccount";
$data = str_replace('/', '-', $_POST['data_expira']);
$var['shadowMax'] = (strtotime($data) -
strtotime($dataAtual)) / 86400;
$var['shadowMin'] = 0;
$var['shadowInactive'] = 0;
$var['shadowExpire'] = 0;
$var['shadowWarning'] = 1;
$var['shadowLastChange'] = intval(strtotime($dataAtual) /
(86400));
} else {
$resposta['error']['data_expira'] = "DATA em formato
inválido";
}
} else {
$resposta['error']['data_expira'] = "DATA não pode ser vazia";
}
}
$ldap = LDAPController::getInstance();
if (isset($_POST['senha']) && !empty($_POST['senha'])) {
if (sizeof($_POST['senha']) < 6) {
if (!preg_match('/^[a-z0-9]+$/i', $_POST['senha'])) {
if (isset($_POST['confirma']) &&
!empty($_POST['confirma'])) {
if ($_POST['senha'] === $_POST['confirma']) {
$var['userPassword'] = $ldap-
>createSHA($_POST['senha']);
} else {
$resposta['error']['confirma'] = "Senhas digitadas
são diferentes";
}
} else {
$resposta['error']['confirma'] = "Senha de confirmação
é OBRIGATÓRIA";
}
} else {
$resposta['error']['senha'] = "Senha deve ter no mínimo 1
(um) caracter especial";
}
} else {
$resposta['error']['senha'] = "Senha deve ter no minimo 6
caracteres";
}
} else {
$resposta['error']['senha'] = "Senha é OBRIGATÓRIA";
}
$var['gidNumber'] = $_POST['grupo'];
$ldap->atualizaUsuariosGrupo('add', $var['gidNumber'],
strtolower($_POST['uid']));
$var['uidNumber'] = $ldap->getValidID('usuario');
if (isset($_POST['kvm'])) {
$var['objectClass'][] = 'kn4140User';
$var['iKVM4140-userProfile'] = 'su/administrator';
}
if (isset($_POST['tacacs'])) {
$var['objectClass'][] = 'tacacsAccount';
if (isset($_POST['rede']) && !empty($_POST['rede'][0])) {
$var['tacacsClient'] = $_POST['rede'];
} else {
$var['tacacsClient'] = '150.162.248.0/24';
}
$var['loginShell'] = '/bin/bash';
$var['homeDirectory'] = '/home/' . strtolower($_POST['uid']);
$db = LogController::getInstance();
if (!$resposta) {
$add = $ldap->addDN($var, 'usuario');
if ($add) {
if (isset($_POST['servidores'])) {
//$ldap->atualizaUsuariosGrupo('add','NOME DO GRUPO OU
gid',$var['uid']);
}
if (isset($_POST['web_admin'])) {
$ldap->atualizaUsuariosGrupo('add', 'web-admin',
strtolower($_POST['uid']));
}
$db->registraEventoUsuario($_SESSION['user']['uid'], 'add',
'ok', $var['uid']);
$resposta['status'] = "ok";
$resposta['msg'] = "Usuário Cadastrado com Sucesso";
} else {
$db->registraEventoUsuario($_SESSION['user']['uid'], 'add',
'erro', $var['uid']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
}
echo json_encode($resposta);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'functions.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if ($daemon == 'tac') {
$db = LogController::getInstance();
if (altera_arquivo('backup', 'tacacs')) {
if (altera_arquivo('copiar', 'tacacs')) {
$reinicia = reinicia_daemon('tacacs');
if (preg_match('/(initiated)/i',$reinicia)) {
$resposta['status'] = "ok";
$resposta['msg'] = "Configurações aplicadas com
sucesso!";
$_SESSION['tacacs']['modificado'] = null;
$_SESSION['tacacs']['msg'] = null;
$db->registraEventoTacacs($_SESSION['user']['uid'],
'aplicar', 'ok', null,$resposta['msg']);
} else {
$resposta['status'] = "error";
$resposta['msg'] = "Falha ao reiniciar o serviço!";
$db->registraEventoTacacs($_SESSION['user']['uid'],
'aplicar', 'erro', null,$resposta['msg']);
}
} else {
$resposta['status'] = "error";
$resposta['msg'] = "Erro ao copiar o arquivo!";
$db->registraEventoTacacs($_SESSION['user']['uid'],
'aplicar', 'erro', null,$resposta['msg']);
}
} else {
$resposta['status'] = "error";
$resposta['msg'] = "Erro ao fazer o backup do arquivo!";
$db->registraEventoTacacs($_SESSION['user']['uid'], 'aplicar',
'erro', null,$resposta['msg']);
}
}
exit(json_encode($resposta));
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'functions.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$db->registraEventoTacacs($_SESSION['user']['uid'],
'del', 'ok', $ip);
}
} else {
$resposta = array('error' => 'erro', 'msg' => 'IP não
cadastrado!');
$db->registraEventoTacacs($_SESSION['user']['uid'], 'del',
'erro', $ip);
}
} else {
$resposta = array('error' => 'erro', 'msg' => 'Ocorreu algum
problema ao tentar deletar o IP!');
$db->registraEventoTacacs($_SESSION['user']['uid'], 'del',
'erro', $ip);
}
echo json_encode($resposta);
exit();
}
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if($ldap->deleteDN($_GET['g'],'grupo')){
$db-
>registraEventoGrupo($_SESSION['user']['uid'],'del','ok',$_GET['g']);
$resposta = array('error' => null,'msg'=>'Usuário deletado com
sucesso!');
}else{
$db-
>registraEventoGrupo($_SESSION['user']['uid'],'del','ok',$_GET['g']);
$resposta = array('error' => 'erro','msg'=>'Ocorreu algum
problema ao tentar deletar o usuário!');
}
echo json_encode($resposta);
exit();
}
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if($ldap->deleteDN($_GET['u'],'usuario')){
$db-
>registraEventoUsuario($_SESSION['user']['uid'],'del','ok',$_GET['u']);
$resposta = array('error' => null,'msg'=>'Usuário deletado com
sucesso!');
}else{
$db-
>registraEventoUsuario($_SESSION['user']['uid'],'del','erro',$_GET['u']);
$resposta = array('error' => 'erro','msg'=>'Ocorreu algum
problema ao tentar deletar o usuário!');
}
echo json_encode($resposta);
exit();
}
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
session_start();
if ($_SESSION['logado']) {
if (isset($_POST['nome']) && !empty($_POST['nome'])) {
$var['givenName'] = $_POST['nome'];
} else {
$resposta['error']['nome'] = "Nome é OBRIGATÓRIO";
}
$ldap = LDAPController::getInstance();
if (isset($_POST['mudar_senha'])) {
if (isset($_POST['senha']) && !empty($_POST['senha'])) {
if (sizeof($_POST['senha']) < 6) {
if (!preg_match('/^[a-z0-9]+$/i', $_POST['senha'])) {
if (isset($_POST['confirma']) &&
!empty($_POST['confirma'])) {
if ($_POST['senha'] === $_POST['confirma']) {
$var['userPassword'] = $ldap-
>createSHA($_POST['senha']);
} else {
$resposta['error']['confirma'] = "Senhas
digitadas são diferentes";
}
} else {
$resposta['error']['confirma'] = "Senha de
confirmação é OBRIGATÓRIA";
}
} else {
$resposta['error']['senha'] = "Senha deve ter no mínimo
1 (um) caracter especial";
}
} else {
$resposta['error']['senha'] = "Senha deve ter no minimo 6
caracteres";
}
} else {
$resposta['error']['senha'] = "Senha é OBRIGATÓRIA";
}
}
if (!isset($resposta)) {
$temp = $ldap->modificarDN($_SESSION['user']['dn'], $var);
//die(var_dump($temp));
$resposta = array("status" => "indefinido");
if ($temp) {
$_SESSION['user']['nome'] = $var['givenName'];
$_SESSION['user']['mail'] = $var['mail'];
$resposta['status'] = "ok";
$resposta['msg'] = "Dados Atualizados com Sucesso";
} else {
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
}
echo json_encode($resposta);
} else {
header('Location:' . URL_PUBLICO);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'functions.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if (!$_SESSION['logado'] && !$_SESSION['user']['admin']) {
header('Location:' . URL_PUBLICO);
exit();
} else {
$ldap = LDAPController::getInstance();
if ($antigo) {
if (isset($_POST['usuarios'])) {
for ($i = 0; $i < sizeof($_POST['usuarios']); $i++) {
$var['memberUid'][$i] = $_POST['usuarios'][$i];
}
} else {
$var['memberUid'][0] = '';
}
if (!$resposta) {
if ($mudou_dn) {
array_shift($antigo[0]['objectclass']);
$var['objectClass'] = $antigo[0]['objectclass'];
$var['gidNumber'] = $antigo[0]['gidnumber'][0];
$db = LogController::getInstance();
if ($ldap->deleteDN($antigo[0]['cn'][0], 'grupo')) {
if ($ldap->addDN($var, 'grupo')) {
$db->registraEventoGrupo($_SESSION['user']['uid'],
'edit', 'ok', $var['cn']);
$resposta['status'] = "ok";
$resposta['msg'] = "Grupo alterado com Sucesso";
} else {
$db->registraEventoGrupo($_SESSION['user']['uid'],
'edit', 'erro', $var['cn']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
} else {
$db->registraEventoGrupo($_SESSION['user']['uid'],
'edit', 'erro', $var['cn']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
} else {
$db = LogController::getInstance();
if ($ldap->modificarDN($antigo[0]['dn'], $var)) {
$db->registraEventoGrupo($_SESSION['user']['uid'],
'edit', 'ok', $var['cn']);
$resposta['status'] = "ok";
$resposta['msg'] = "Grupo alterado com Sucesso";
} else {
$db->registraEventoGrupo($_SESSION['user']['uid'],
'edit', 'erro', $var['cn']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
}
}
echo json_encode($resposta);
} else {
exit(json_encode(array('status' => 'error', 'msg' => 'Ocorreu
algum ERRO')));
}
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'functions.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$usuario = $_POST;
unset($_POST);
if ($antigo) {
/*
* VERIFICACAO DE USUARIO
*/
if (isset($usuario['uid']) && !empty($usuario['uid'])) {
if ($usuario['uid'] != $antigo[0]['uid'][0]) {
$alterado = true;
$var['uid'] = $usuario['uid'];
$var['cn'] = $usuario['uid'];
$var['sn'] = $usuario['uid'];
$var['uidNumber'] = $antigo[0]['uidnumber'][0];
$var['loginShell'] = $antigo[0]['loginshell'][0];
$var['homeDirectory'] = '/home/' . $usuario['uid'];
} else {
$var['uid'] = $antigo[0]['uid'][0];
$var['cn'] = $antigo[0]['cn'][0];
$var['sn'] = $antigo[0]['sn'][0];
$var['uidNumber'] = $antigo[0]['uidnumber'][0];
$var['loginShell'] = $antigo[0]['loginshell'][0];
$var['homeDirectory'] = $antigo[0]['homedirectory'][0];
}
} else {
$resposta['error']['uid'] = "Usuário é OBRIGATÓRIO";
}
/*
* VERIFICACAO DO NOME DO USUARIO
*/
if (isset($usuario['nome']) && !empty($usuario['nome'])) {
if ($usuario['nome'] != $antigo[0]['givenname'][0]) {
$var['givenName'] = $usuario['nome'];
} else {
$var['givenName'] = $antigo[0]['givenname'][0];
}
} else {
$resposta['error']['nome'] = "Usuário é OBRIGATÓRIO";
}
/*
* VERIFICACAO DE EMAIL DO USUARIO
*/
if (isset($usuario['email']) && !empty($usuario['email'])) {
$pattern = '/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-
9])' . '(([a-z0-9-])*([a-z0-9]))+' . '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-
9])+)+$/i';
if (preg_match($pattern, $usuario['email'])) {
if ($usuario['email'] != $antigo[0]['mail'][0]) {
$var['mail'] = $usuario['email'];
} else {
$var['mail'] = $antigo[0]['mail'][0];
}
} else {
$resposta['error']['email'] = "E-mail Inválido";
}
} else {
$resposta['error']['email'] = "E-mail é OBRIGATÓRIO";
}
/*
* VERIFICACAO DE EXPIRACAO DA CONTA
*/
if (isset($usuario['expira'])) {
if (isset($usuario['data_expira']) &&
!empty($usuario['data_expira'])) {
if (dataValida($usuario['data_expira'])) {
if ($antigo_shadow) {
$validade_antiga =
($antigo[0]['shadowlastchange'][0] * 86400) + ($antigo[0]['shadowmax'][0] *
86400);
/*
* verificar se a data nova e a antiga são
diferentes caso positivo, atualizar o registro
*
* FEITO
*/
if (date('d/m/Y', $validade_antiga) !=
$usuario['data_expira']) {
$dataAtual = date('d-m-Y');
$data = str_replace('/', '-',
$usuario['data_expira']);
$var['shadowMax'] = (strtotime($data) -
strtotime($dataAtual)) / 86400;
$var['shadowMin'] = 0;
$var['shadowInactive'] = 0;
$var['shadowExpire'] = 0;
$var['shadowWarning'] = 1;
$var['shadowLastChange'] =
intval(strtotime($dataAtual) / (86400));
} else {
$var['shadowMax'] = $antigo[0]['shadowmax'][0];
$var['shadowMin'] = $antigo[0]['shadowmin'][0];
$var['shadowInactive'] =
$antigo[0]['shadowinactive'][0];
$var['shadowExpire'] =
$antigo[0]['shadowexpire'][0];
$var['shadowWarning'] =
$antigo[0]['shadowwarning'][0];
$var['shadowLastChange'] =
$antigo[0]['shadowlastchange'][0];
}
} else {
$alterado = true;
/*
* CRIAR O OBJECTCLASS E OS RESPECTIVOS ATRIBUTOS
*
* FEITO!!
*/
$var['objectClass'][] = "shadowAccount";
$dataAtual = date('d-m-Y');
$data = str_replace('/', '-',
$usuario['data_expira']);
$var['shadowMax'] = (strtotime($data) -
strtotime($dataAtual)) / 86400;
$var['shadowMin'] = 0;
$var['shadowInactive'] = 0;
$var['shadowExpire'] = 0;
$var['shadowWarning'] = 1;
$var['shadowLastChange'] =
intval(strtotime($dataAtual) / (86400));
}
} else {
$resposta['error']['data_expira'] = "DATA em formato
inválido";
}
} else {
$resposta['error']['data_expira'] = "DATA não pode ser
vazia";
}
} else {
if ($antigo_shadow) {
$alterado = true;
$remove[] = 'shadowAccount';
/*
$delete['shadowMax'] = $antigo[0]['shadowmax'][0];
$delete['shadowMin'] = $antigo[0]['shadowmin'][0];
$delete['shadowInactive'] =
$antigo[0]['shadowinactive'][0];
$delete['shadowExpire'] = $antigo[0]['shadowexpire'][0];
$delete['shadowWarning'] =
$antigo[0]['shadowwarning'][0];
$delete['shadowLastChange'] =
$antigo[0]['shadowlastchange'][0];
$delete['objectClass'] = 'shadowAccount';
/*
* VALIDACAO PARA SABER SE O USUARIO TEM ACESSO AO KVM-IP
*/
if (isset($usuario['kvm'])) {
if (!$antigo_kvm) {
$alterado = true;
$var['objectClass'][] = 'kn4140User';
$var['iKVM4140-userProfile'] = 'su/administrator';
} else {
$var['iKVM4140-userProfile'] = 'su/administrator';
}
} elseif (!isset($usuario['kvm']) && $antigo_kvm) {
$alterado = true;
$remove[] = 'kn4140User';
/*
$delete['ikvm4140-userprofile'] = 'su/administrator';
$delete['objectclass'] = 'kn4140User';
/*
* VERIFICACAO DE TACACS
*/
if (isset($usuario['tacacs'])) {
if ($antigo_tacacs) {
if (isset($usuario['rede']) &&
!empty($usuario['rede'][0])) {
$var['tacacsClient'] = $usuario['rede'];
} else {
$var['tacacsClient'] = '150.162.248.0/24';
}
if (isset($usuario['perfil']) &&
!empty($usuario['perfil'][0])) {
if (preg_match('/^\{.*\}$/', $usuario['perfil'][0])) {
$var['tacacsProfile'] = $usuario['perfil'][0];
} else {
$resposta['error']['perfil'] = "Perfil inválido";
}
} else {
$var['tacacsProfile'] = '{ }';
}
if (isset($usuario['membro']) &&
!empty($usuario['membro'][0])) {
for ($i = 0; $i < sizeof($usuario['membro']); $i++) {
if ($usuario['membro'][$i]) {
$var['tacacsMember'][] =
$usuario['membro'][$i];
} else {
$resposta['error']['membro'] = "Membro com
algum valor INVÁLIDO";
}
}
} else {
$resposta['error']['membro'] = "OBRIGATÓRIO pelo menos
um grupo";
}
} else {
$alterado = true;
$var['objectClass'][] = 'tacacsAccount';
if (isset($usuario['rede']) &&
!empty($usuario['rede'][0])) {
$var['tacacsClient'] = $usuario['rede'];
} else {
$var['tacacsClient'] = '150.162.248.0/24';
}
if (isset($usuario['perfil']) &&
!empty($usuario['perfil'][0])) {
if (preg_match('/^\{.*\}$/', $usuario['perfil'][0])) {
$var['tacacsProfile'] = $usuario['perfil'][0];
} else {
$resposta['error']['perfil'] = "Perfil inválido";
}
} else {
$var['tacacsProfile'] = '{ }';
}
if (isset($usuario['membro']) &&
!empty($usuario['membro'][0])) {
for ($i = 0; $i < sizeof($usuario['membro']); $i++) {
if ($usuario['membro'][$i]) {
$var['tacacsMember'][] =
$usuario['membro'][$i];
} else {
$resposta['error']['membro'] = "Membro com
algum valor INVÁLIDO";
}
}
} else {
$resposta['error']['membro'] = "OBRIGATÓRIO pelo menos
um grupo";
}
}
} else {
if ($antigo_tacacs) {
$alterado = true;
$remove[] = 'tacacsAccount';
/*
$rede = $antigo[0]['tacacsclient'];
array_shift($rede);
$membro = $antigo[0]['tacacsmember'];
array_shift($membro);
$delete['tacacsClient'] = $rede;
$delete['tacacsMember'] = $membro;
$delete['tacacsProfile'] =
$antigo[0]['tacacsprofile'][0];
$delete['objectclass'] = 'tacacsAccount';
*/
}
}
if (!isset($resposta)) {
if ($usuario['grupo'] != $antigo[0]['gidnumber'][0]) {
$var['gidNumber'] = $usuario['grupo'];
$ldap->atualizaUsuariosGrupo('add', $var['gidNumber'],
$usuario['uid']);
$ldap->atualizaUsuariosGrupo('del',
$antigo[0]['gidnumber'][0], $usuario['uid']);
} else {
$var['gidNumber'] = $antigo[0]['gidnumber'][0];
}
/*
* ATUALIZACAO DO GRUPO DE ACESSO AOS SERVIDORES
*/
if (isset($usuario['servidores'])) {
//PENDENTE!!!!
//
//CRIAR O GRUPO QUE VAI PERMITIR O ACESSO NOS SERVIDORES E
ATUALIZAR O memberUid DO GRUPO
//COM O NOME DO USUARIO QUE ESTA SENDO ADICIONADO
}
if (isset($usuario['web_admin'])) {
if (!$antigo_web) {
$ldap->atualizaUsuariosGrupo('add', 'web-admin',
$var['uid']);
}
} else {
if ($antigo_web) {
$ldap->atualizaUsuariosGrupo('del', 'web-admin',
$antigo[0]['uid'][0]);
}
}
if (isset($alterado)) {
for ($i = 0; $i < sizeof($var['objectClass']); $i++) {
if (in_array($var['objectClass'][$i], $remove)) {
unset($var['objectClass'][$i]);
}
}
$var['objectClass'] = array_values($var['objectClass']);
$db = LogController::getInstance();
if ($ldap->deleteDN($antigo[0]['cn'][0], 'usuario')) {
if ($ldap->addDN($var, 'usuario')) {
$db-
>registraEventoUsuario($_SESSION['user']['uid'], 'edit', 'ok',
$var['uid']);
$resposta['status'] = "ok";
$resposta['msg'] = "Usuário alterado com Sucesso";
} else {
$db-
>registraEventoUsuario($_SESSION['user']['uid'], 'edit', 'erro',
$var['uid']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
} else {
$db->registraEventoUsuario($_SESSION['user']['uid'],
'edit', 'erro', $var['uid']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
} else {
$db = LogController::getInstance();
if ($ldap->modificarDN($antigo[0]['dn'], $var)) {
$db->registraEventoUsuario($_SESSION['user']['uid'],
'edit', 'ok', $var['uid']);
$resposta['status'] = "ok";
$resposta['msg'] = "Usuário alterado com Sucesso";
} else {
$db->registraEventoUsuario($_SESSION['user']['uid'],
'edit', 'erro', $var['uid']);
$resposta['status'] = "error";
$resposta['msg'] = "Ocorreu algum ERRO";
}
}
}
echo json_encode($resposta);
} else {
exit(json_encode(array('status' => 'error', 'msg' => 'Não foi
possível se conectar com o servidor')));
}
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
$erro = false;
if (!empty($_REQUEST['usuario'])) {
$usuario = $_REQUEST['usuario'];
} else {
$erro = true;
$resposta['error']['usuario'] = "Usuário é OBRIGATÓRIO";
}
if (empty($_POST['senha'])) {
$erro = true;
$resposta['error']['senha'] = "Senha é OBRIGATÓRIO";
}
if (!$erro) {
$ldap = LDAPController::getInstance();
$retorno = $ldap->autentica($usuario, $_POST['senha']);
$resposta['status'] = "indefinido";
$db = LogController::getInstance();
if ($retorno) {
$resposta['status'] = 'ok';
session_start();
$_SESSION['logado'] = true;
$_SESSION['user']['uid'] = $retorno[0]['uid'][0];
$_SESSION['user']['nome'] = $retorno[0]['givenname'][0];
$_SESSION['user']['mail'] = $retorno[0]['mail'][0];
//$_SESSION['user']['pass'] = $retorno[0]['userpassword'][0];
$_SESSION['user']['dn'] = $retorno[0]['dn'];
$_SESSION['user']['admin'] = isset($retorno['admin']) ? true :
false;
if ($_SESSION['user']['admin'] == true) {
$resposta['url'] = "sistema/visao/";
} else {
$resposta['url'] = "usuario/" . $retorno[0]['uid'][0] .
"/editar";
}
for ($i = 0; $i < $retorno[0]['objectclass']['count']; $i++) {
if ($retorno[0]['objectclass'][$i] == 'tacacsAccount') {
$_SESSION['user']['tacacs']['profile'] =
$retorno[0]['tacacsprofile'][0];
$db->registraLogin($_SESSION['user']['uid'], 'ok');
} else {
$_SESSION['logado'] = false;
$resposta['status'] = "error";
$resposta['msg'] = "Usuario ou Senha Inválido";
$db->registraLogin($_SESSION['user']['uid'], 'erro');
}
}
echo json_encode($resposta);
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
$erro = false;
if (!empty($_REQUEST['usuario'])) {
$usuario = $_REQUEST['usuario'];
} else {
$erro = true;
$resposta['error']['usuario'] = "Usuário é OBRIGATÓRIO";
}
if (empty($_POST['senha'])) {
$erro = true;
$resposta['error']['senha'] = "Senha é OBRIGATÓRIO";
}
if (!$erro) {
$ldap = LDAPController::getInstance();
$retorno = $ldap->autentica($usuario, $_POST['senha']);
$resposta['status'] = "indefinido";
$db = LogController::getInstance();
if ($retorno) {
$resposta['status'] = 'ok';
session_start();
$_SESSION['logado'] = true;
$_SESSION['user']['uid'] = $retorno[0]['uid'][0];
$_SESSION['user']['nome'] = $retorno[0]['givenname'][0];
$_SESSION['user']['mail'] = $retorno[0]['mail'][0];
//$_SESSION['user']['pass'] = $retorno[0]['userpassword'][0];
$_SESSION['user']['dn'] = $retorno[0]['dn'];
$_SESSION['user']['admin'] = isset($retorno['admin']) ? true :
false;
if ($_SESSION['user']['admin'] == true) {
$resposta['url'] = "sistema/visao/";
} else {
$resposta['url'] = "usuario/" . $retorno[0]['uid'][0] .
"/editar";
}
$_SESSION['user']['tacacs']['profile'] =
$retorno[0]['tacacsprofile'][0];
$db->registraLogin($_SESSION['user']['uid'], 'ok');
} else {
$_SESSION['logado'] = false;
$resposta['status'] = "error";
$resposta['msg'] = "Usuario ou Senha Inválido";
$db->registraLogin($_SESSION['user']['uid'], 'erro');
}
}
echo json_encode($resposta);
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_CONTROLLERS . 'LogController.php';
$erro = false;
if (!empty($_REQUEST['usuario'])) {
$usuario = $_REQUEST['usuario'];
} else {
$erro = true;
$resposta['error']['usuario'] = "Usuário é OBRIGATÓRIO";
}
if (empty($_POST['senha'])) {
$erro = true;
$resposta['error']['senha'] = "Senha é OBRIGATÓRIO";
}
if (!$erro) {
$ldap = LDAPController::getInstance();
$retorno = $ldap->autentica($usuario, $_POST['senha']);
$resposta['status'] = "indefinido";
$db = LogController::getInstance();
if ($retorno) {
$resposta['status'] = 'ok';
session_start();
$_SESSION['logado'] = true;
$_SESSION['user']['uid'] = $retorno[0]['uid'][0];
$_SESSION['user']['nome'] = $retorno[0]['givenname'][0];
$_SESSION['user']['mail'] = $retorno[0]['mail'][0];
//$_SESSION['user']['pass'] = $retorno[0]['userpassword'][0];
$_SESSION['user']['dn'] = $retorno[0]['dn'];
$_SESSION['user']['admin'] = isset($retorno['admin']) ? true :
false;
if ($_SESSION['user']['admin'] == true) {
$resposta['url'] = "sistema/visao/";
} else {
$resposta['url'] = "usuario/" . $retorno[0]['uid'][0] .
"/editar";
}
$_SESSION['user']['tacacs']['profile'] =
$retorno[0]['tacacsprofile'][0];
$db->registraLogin($_SESSION['user']['uid'], 'ok');
} else {
$_SESSION['logado'] = false;
$resposta['status'] = "error";
$resposta['msg'] = "Usuario ou Senha Inválido";
$db->registraLogin($_SESSION['user']['uid'], 'erro');
}
}
echo json_encode($resposta);
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$ldap = LDAPController::getInstance();
$grupos = $ldap->getValidGroups();
$count = sizeof($grupos);
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
echo json_encode($response);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$ldap = LDAPController::getInstance();
$grupos = $ldap->getValidGroups();
$count = sizeof($grupos);
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
echo json_encode($response);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$ldap = LDAPController::getInstance();
$grupos = $ldap->getValidGroups();
$count = sizeof($grupos);
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
echo json_encode($response);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$ldap = LDAPController::getInstance();
$grupos = $ldap->getValidGroups();
$count = sizeof($grupos);
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
require_once realpath(dirname(__FILE__) .
'/../../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_INCLUDES . 'firephp/fb.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$ldap = LDAPController::getInstance();
if ($filtro) {
$filtro =
"(|(uid=*$filtro*)(mail=*$filtro*)(givenName=*$filtro*))";
}
$users = $ldap->getValidUsers($filtro);
$count = sizeof($users);
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
$response->page = $page;
$response->total = $total_pages;
$response->records = $count;
echo json_encode($response);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LDAPController.php';
require_once PATH_INCLUDES . 'firephp/fb.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$ldap = LDAPController::getInstance();
if ($filtro) {
$filtro =
"(|(uid=*$filtro*)(mail=*$filtro*)(givenName=*$filtro*))";
}
$users = $ldap->getValidUsers($filtro);
$count = sizeof($users);
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
$response->page = $page;
$response->total = $total_pages;
$response->records = $count;
echo json_encode($response);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_INCLUDES . 'config.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
$particoes = array();
$resposta['status'] = 'ok';
$resposta['particoes'] = $particoes;
$processos = array();
foreach ($Config['processos'] as $processo) {
if ($processo == 'tacacs') {
$pid = shell_exec('cat /var/run/tac_plus.pid');
$retorno = shell_exec('ps ax | grep -v grep | grep ' . $pid);
} else {
$retorno = shell_exec('ps ax | grep -v grep | grep ' .
$processo);
}
if ($retorno) {
$processos[] = array('processo' => $processo, 'status' =>
'ok');
} else {
$processos[] = array('processo' => $processo, 'status' =>
'erro');
}
}
$resposta['processos'] = $processos;
$resposta['replicacao'] = $replicacao;
echo json_encode($resposta);
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
$page = 'visao-geral';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
</fieldset>
</div>
<div class="clear"></div>
</div>
<div class="clear"></div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
url:'../getData',
type: 'GET',
dataType: 'json',
beforeSend: function() {
$('#particoes').addClass("loading_buttom");
$('#processos').addClass("loading_buttom");
$('#replicacao').addClass("loading_buttom");
},
success: function(data){
$('#particoes').removeClass('loading_buttom');
$('#processos').removeClass('loading_buttom');
$('#replicacao').removeClass('loading_buttom');
if(data.status=='ok'){
$.each(data.particoes,function(i,val){
$('#particoes').append('<div class="wrapper"><div
class="label">'+val.particao+'</div><div id="'+val.nome+'"
class="progressbar"><span>'+val.usado+'</span></div><div
class="clear"></div>');
var valor = parseInt(val.usado.replace('\%',''));
if(valor >= 60){
$('#'+val.nome+' span').addClass('font');
}
$('#'+val.nome).progressbar({value:valor});
});
$.each(data.processos,function(i,val){
if(val.status == 'ok'){
$('#processos').append('<div
class="wrapper"><div class="label" style="width:70px;"><img alt="OK"
src="../../css/imgs/success.png" align="center"/></div><div
class="processo">'+val.processo+'</div><div class="clear"></div></div>');
}else{
$('#processos').append('<div
class="wrapper"><div class="label" style="width:70px;"><img alt="Falha"
src="../../css/imgs/error.png" align="center"/></div><div
class="processo">'+val.processo+'</div><div class="clear"></div></div>');
}
});
if(data.replicacao.status == 'ok'){
$('#replicacao').append('<div class="wrapper"><div
class="label" style="width:70px;"><img alt="OK"
src="../../css/imgs/success.png" align="center"/></div><div
class="processo">Status da Replicação</div><div
class="clear"></div></div>');
}else{
$('#replicacao').append('<div class="wrapper"><div
class="label" style="width:70px;"><img alt="OK"
src="../../css/imgs/error.png" align="center"/></div><div
class="processo">Status da Replicação</div><div
class="clear"></div></div>');
}
}
}
});
})
</script>
<?php include PATH_TEMPLATE . 'footer.php'; ?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
$page = 'adicionar-equipamento';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
},success: function(data){
if(!data.error){
var options = '';
for(var i=0;i<data.length;i++){
options += '<option
value="'+data[i]+'">'+data[i]+'</option>';
}
$('select#grupo').html(options);
}
}
});
$('#ip').focusout(function(){
var pattern = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-
5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}(\/[0-3][0-
9])?$/;
if(pattern.test($(this).val())){
if($(this).next().hasClass('error_box')){
$(this).next().remove();
}
}else{
if(!$(this).next().hasClass('error_box')){
$(this).after('<div class="error_box">IP inválido</div>');
}
}
});
$('#descricao').focusout(function(){
var pattern = /^.{4,}$/;
if(pattern.test($(this).val())){
if($(this).next().hasClass('error_box')){
$(this).next().remove();
}
}else{
if(!$(this).next().hasClass('error_box')){
$(this).after('<div class="error_box">Descrição mínima de 4
letras</div>');
}
}
});
var options = {
dataType: 'json',
beforeSubmit: function() {
$('.error_box').css('visibility', 'hidden');
$('#resposta').removeClass();
$('#resposta').removeAttr("style");
$('#resposta').html("");
$('#botao_add').val("");
//$('#botao_add').attr('disabled','disabled');
$('#botao_add').addClass("loading_buttom");
},
success: function(response) {
$('#botao_add').val("Adicionar");
$('#botao_add').removeClass("loading_buttom");
//$('#botao_add').removeAttr('disabled');
$('.error_box').remove();
if (response.error == null) {
if(response.status == 'ok') {
$('#resposta').addClass("success_box");
$('#resposta').html(response.msg);
$('#resposta').delay(5000).fadeOut();
$('.aplicar_tacacs').addClass('warning');
}else{
$('#resposta').addClass("errors");
$('#resposta').html(response.msg);
}
}else{
if (typeof(response.error.length) == 'undefined') {
$('#resposta').addClass("errors");
$('#resposta').html('<span class="error">Verifique
o(s) campo(s) com problema(s)</span>');
$.each(response.error, function(i, val) {
if(i == 'membro'){
$('#' + i).next().after('<div
class="error_box" style="width: 240px;">'+val+'</div>');
}else{
$('#' + i).after('<div
class="error_box">'+val+'</div>');
}
});
} else {
$('#resposta').html('<span
class="error">'+response.error+'</span>');
}
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$('#botao_add').val("Adicionar");
$('#botao_add').removeClass("loading_buttom");
$('#resposta').addClass("errors");
//Print the error message if the request fails (possible
reasons: "timeout", "error", "notmodified" and "parsererror")
$('#resposta').html('<span
class="error">'+XMLHttpRequest.responseText+'</span>');
}
};
$("#adicionar").ajaxForm(options);
</script>
<?php include PATH_TEMPLATE . 'footer.php'; ?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_INCLUDES . 'functions.php';
require_once PATH_INCLUDES . 'firephp/fb.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if ($action == 'combo') {
$temp = array_equipamentos();
if ($temp) {
foreach ($temp as $key => $value) {
$var[] = $key;
}
} else {
$var['error'] = true;
}
exit(json_encode($var));
} elseif ($action == 'lista') {
$page = isset($_GET['page']) ? $_GET['page'] : null;
$limit = isset($_GET['rows']) ? $_GET['rows'] : null;
$temp = array_equipamentos();
if ($temp) {
$var = new stdClass();
$i=0;
foreach ($temp as $key => $value) {
for ($j = 0; $j < sizeof($value); $j++) {
if ($i >= $start && $i < ($page * $limit)) {
$explode = explode('#', $value[$j]);
$var->rows[]['cell'] = array(
$key,
$explode[0],
isset($explode[1]) ? $explode[1] : "",
'<a class="imagem excluir_generico" href="' .
RAIZ_FORMS . 'delete_equipamento?e=' . $explode[0] . '"></a>');
}
$i++;
if(!isset($value[$j])){
break;
}
}
}
$var->page = $page;
$var->total = $total_pages;
$var->records = $count;
exit(json_encode($var));
}
}
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_INCLUDES . 'functions.php';
require_once PATH_INCLUDES . 'firephp/fb.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if ($action == 'combo') {
$temp = array_equipamentos();
if ($temp) {
foreach ($temp as $key => $value) {
$var[] = $key;
}
} else {
$var['error'] = true;
}
exit(json_encode($var));
} elseif ($action == 'lista') {
$page = isset($_GET['page']) ? $_GET['page'] : null;
$limit = isset($_GET['rows']) ? $_GET['rows'] : null;
$temp = array_equipamentos();
if ($temp) {
$var = new stdClass();
if(!isset($value[$j])){
break;
}
}
}
$var->page = $page;
$var->total = $total_pages;
$var->records = $count;
exit(json_encode($var));
}
}
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'firephp/fb.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if (!$_SESSION['logado']) {
header('Location:' . URL_PUBLICO);
exit();
} elseif ($_SESSION['user']['uid'] != $_GET['u']) {
$response = new stdClass();
$response->error = 'Dados inválidos';
exit(json_encode($response));
} else {
$filtro = isset($_GET['search']) ? $_GET['search'] : null;
$nas = isset($_GET['nas']) ? $_GET['nas'] : null;
//usuário vem do campo hidden
$usuario = isset($_GET['u']) ? $_GET['u'] : null;
$data_inicio = isset($_REQUEST['data_inicio']) ?
$_REQUEST['data_inicio'] : null;
$whereclause = "";
if ($data_inicio) {
if (dataValida($data_inicio)) {
$temp = explode("/", $data_inicio);
$data_inicio = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data >= '%s'", $data_inicio);
} else {
$whereclause.=sprintf(" AND data >= '%s'", $data_inicio);
}
} else {
$fields["data_inicio"] = "Início inválido";
}
}
if ($data_fim) {
if (dataValida($data_fim)) {
$temp = explode("/", $data_fim);
$data_fim = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data <= '%s'", $data_fim);
} else {
$whereclause.=sprintf(" AND data <= '%s 23:59:59'",
$data_fim);
}
} else {
$fields["data_fim"] = "Final inválido";
}
}
if ($nas) {
if (preg_match('/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-
5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/', $nas)) {
if (strlen($whereclause) == 0) {
$whereclause.= " NAS = '$nas'";
} else {
$whereclause.=" AND NAS = '$nas'";
}
} else {
$fields["nas"] = "IP inválido";
}
}
if ($usuario) {
if (strlen($whereclause) == 0) {
$whereclause.= " user = '$usuario'";
} else {
$whereclause.=" AND user = '$usuario'";
}
}
$db = LogController::getInstance();
$result = $db->consultaLogs($query);
unset($query);
$row = $result->fetch_array(MYSQLI_ASSOC);
$count = $row['count'];
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
$result = $db->consultaLogs($query);
$dado = trim($row['command']);
if (preg_match('/^permit/i', $dado)) {
$dado = preg_replace('/^permit/i', '<strong><span
style="color:green">permit</span></strong>', $dado);
} else {
$dado = preg_replace('/^deny/i', '<strong><span
style="color:red">deny</span></strong>', $dado);
}
if (preg_match('/Group-Async/', $dado)) {
$dado = preg_replace('/Group-Async /', '', $dado);
}
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
require_once PATH_CONTROLLERS . 'LogController.php';
require_once PATH_INCLUDES . 'firephp/fb.php';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if (!$_SESSION['logado']) {
header('Location:' . URL_PUBLICO);
exit();
} elseif ($_SESSION['user']['uid'] != $_GET['u']) {
$response = new stdClass();
$response->error = 'Dados inválidos';
exit(json_encode($response));
} else {
$filtro = isset($_GET['search']) ? $_GET['search'] : null;
$nas = isset($_GET['nas']) ? $_GET['nas'] : null;
//usuário vem do campo hidden
$usuario = isset($_GET['u']) ? $_GET['u'] : null;
$data_inicio = isset($_REQUEST['data_inicio']) ?
$_REQUEST['data_inicio'] : null;
$data_fim = isset($_REQUEST['data_fim']) ? $_REQUEST['data_fim'] :
null;
$whereclause = "";
if ($data_inicio) {
if (dataValida($data_inicio)) {
$temp = explode("/", $data_inicio);
$data_inicio = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data >= '%s'", $data_inicio);
} else {
$whereclause.=sprintf(" AND data >= '%s'", $data_inicio);
}
} else {
$fields["data_inicio"] = "Início inválido";
}
}
if ($data_fim) {
if (dataValida($data_fim)) {
$temp = explode("/", $data_fim);
$data_fim = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data <= '%s'", $data_fim);
} else {
$whereclause.=sprintf(" AND data <= '%s 23:59:59'",
$data_fim);
}
} else {
$fields["data_fim"] = "Final inválido";
}
}
if ($nas) {
if (preg_match('/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-
5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/', $nas)) {
if (strlen($whereclause) == 0) {
$whereclause.= " NAS = '$nas'";
} else {
$whereclause.=" AND NAS = '$nas'";
}
} else {
$fields["nas"] = "IP inválido";
}
}
if ($usuario) {
if (strlen($whereclause) == 0) {
$whereclause.= " user = '$usuario'";
} else {
$whereclause.=" AND user = '$usuario'";
}
}
$db = LogController::getInstance();
$result = $db->consultaLogs($query);
unset($query);
$row = $result->fetch_array(MYSQLI_ASSOC);
$count = $row['count'];
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
$result = $db->consultaLogs($query);
$dado = trim($row['command']);
if (preg_match('/^permit/i', $dado)) {
$dado = preg_replace('/^permit/i', '<strong><span
style="color:green">permit</span></strong>', $dado);
} else {
$dado = preg_replace('/^deny/i', '<strong><span
style="color:red">deny</span></strong>', $dado);
}
if (preg_match('/Group-Async/', $dado)) {
$dado = preg_replace('/Group-Async /', '', $dado);
}
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
$page = 'permissoes';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if (!$_SESSION['logado']) {
header('Location:' . URL_PUBLICO);
exit();
}
//else {
//die(var_dump($_SESSION['user']['tacacs']));
//}
include PATH_TEMPLATE . 'header.php';
?>
<div id="content">
<div id="main">
<div id="main-left">
<?php include PATH_TEMPLATE . 'menu.php'; ?>
</div>
<div id="main-right">
<?php
if (isset($_SESSION['user']['tacacs'])):
?>
<fieldset id="permissoes" class="rounded">
<legend>Tacacs +</legend>
<?php if
(isset($_SESSION['user']['tacacs']['client'])): ?>
<p>
<label for="acesso">Rede de acesso:
</label><br/>
<?php for ($i = 0; $i <
sizeof($_SESSION['user']['tacacs']['client']); $i++): ?>
<span><?php echo
$_SESSION['user']['tacacs']['client'][$i] ?></span><br/>
<?php endfor; ?>
</p><br/>
<?php endif;
if (isset($_SESSION['user']['tacacs']['profile']) &&
!preg_match("/^\{ *\}/", $_SESSION['user']['tacacs']['profile'])): ?>
<p>
<label for="perfil">Perfil: </label><br/>
<span id="perfil" name="perl"><?php echo
$_SESSION['user']['tacacs']['profile']; ?></span>
</p><br/>
<?php
endif;
if (isset($_SESSION['user']['tacacs']['member'])):
?>
<p>
<label>Membro: </label><br/>
<?php for ($i = 0; $i <
sizeof($_SESSION['user']['tacacs']['member']); $i++): ?>
<span><?php echo
$_SESSION['user']['tacacs']['member'][$i] ?></span><br/>
<?php endfor; ?>
</p>
<?php endif; ?>
</fieldset>
<?php endif; ?>
</div>
<div class="clear"></div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
})
</script>
<?php include PATH_TEMPLATE . 'footer.php'; ?>
<?php
require_once realpath(dirname(__FILE__) .
'/../../application/includes/constants.php');
$page = 'permissoes';
session_start();
setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], time() + 300);
if (!$_SESSION['logado']) {
header('Location:' . URL_PUBLICO);
exit();
}
//else {
//die(var_dump($_SESSION['user']['tacacs']));
//}
include PATH_TEMPLATE . 'header.php';
?>
<div id="content">
<div id="main">
<div id="main-left">
<?php include PATH_TEMPLATE . 'menu.php'; ?>
</div>
<div id="main-right">
<?php
if (isset($_SESSION['user']['tacacs'])):
?>
<fieldset id="permissoes" class="rounded">
<legend>Tacacs +</legend>
<?php if
(isset($_SESSION['user']['tacacs']['client'])): ?>
<p>
<label for="acesso">Rede de acesso:
</label><br/>
<?php for ($i = 0; $i <
sizeof($_SESSION['user']['tacacs']['client']); $i++): ?>
<span><?php echo
$_SESSION['user']['tacacs']['client'][$i] ?></span><br/>
<?php endfor; ?>
</p><br/>
<?php endif;
if (isset($_SESSION['user']['tacacs']['profile']) &&
!preg_match("/^\{ *\}/", $_SESSION['user']['tacacs']['profile'])): ?>
<p>
<label for="perfil">Perfil: </label><br/>
<span id="perfil" name="perl"><?php echo
$_SESSION['user']['tacacs']['profile']; ?></span>
</p><br/>
<?php
endif;
if (isset($_SESSION['user']['tacacs']['member'])):
?>
<p>
<label>Membro: </label><br/>
<?php for ($i = 0; $i <
sizeof($_SESSION['user']['tacacs']['member']); $i++): ?>
<span><?php echo
$_SESSION['user']['tacacs']['member'][$i] ?></span><br/>
<?php endfor; ?>
</p>
<?php endif; ?>
</fieldset>
<?php endif; ?>
</div>
<div class="clear"></div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
})
</script>
<?php include PATH_TEMPLATE . 'footer.php'; ?>
<?php
require_once realpath(dirname(__FILE__) .
'/../application/includes/constants.php');
include PATH_TEMPLATE . 'header.php';
?>
<div id="content">
<div id="main">
<div id="login-wrapper">
<form id="login" action="forms/login" method="POST">
<p>
<label for="usuario">Usuário</label>
<input id="usuario" name="usuario" type="text"/>
</p>
<p>
<label for="senha">Senha</label>
<input type="password" id="senha" name="senha"/>
</p>
<p>
<input type="submit" id="login-submit" value="Login"/>
<input type="reset" value="Limpar" id="login-limpar"/>
</p>
</form>
</div>
<div id="resposta"></div>
</div>
</div>
<script type="text/javascript" src="js/jquery.form.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var options = {
dataType: 'json',
beforeSubmit: function() {
$('.error_box').css('visibility', 'hidden');
$('#resposta').removeClass();
$('#resposta').html("");
$('#login-submit').val(" ");
$('#login-submit').addClass("loading_buttom");
},
success: function(response) {
$('#login-submit').val("Login");
$('#login-submit').removeClass("loading_buttom");
$('.error_box').remove();
if (response.error == null) {
if(response.status == 'ok') {
window.location=response.url;
}else{
$('#resposta').addClass("errors");
$('#resposta').html(response.msg);
}
}else{
if (typeof(response.error.length) == 'undefined') {
$('#resposta').addClass("errors");
$('#resposta').html('<span class="error">Verifique
o(s) campo(s) com problema(s)</span>');
$.each(response.error, function(i, val) {
$('#' + i).after('<div class="error_box
login">'+val+'</div>');
});
}
else {
$('#resposta').html('<span
class="error">'+response.error+'</span>');
}
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$('#login-submit').val("Login");
$('#login-submit').removeClass("loading_buttom");
$('#resposta').addClass("errors");
//Print the error message if the request fails (possible
reasons: "timeout", "error", "notmodified" and "parsererror")
if(textStatus == 'error'){
$('#resposta').html('<span
class="error">'+errorThrown+'</span>');
}else if(textStatus == 'parsererror'){
$('#resposta').html('<span
class="error">'+XMLHttpRequest.responseText+'</span>');
}
}
};
$("#login").ajaxForm(options);
});
</script>
<?php include PATH_TEMPLATE . 'footer.php'; ?>
<?php
require_once realpath(dirname(__FILE__) .
'/../application/includes/constants.php');
require_once PATH_CONTROLLERS.'LogController.php';
session_start();
if (!$_SESSION['logado']) {
header('Location:' . URL_PUBLICO);
exit();
} else {
$db = LogController::getInstance();
$db->registraLogout($_SESSION['user']['uid']);
unset($_SESSION);
session_unset();
session_destroy();
header('Location: ' . URL_PUBLICO);
}
?>
<?php
/**
* Description of LogController
*
* @author luis
*/
class LogController {
protected $db;
protected static $instance;
function __construct() {
$this->db = DB::getInstance();
}
function consulta($query) {
if ($query) {
try {
$result = $this->db->query($query);
$this->db->disconnect();
return $result;
} catch (Exception $e) {
echo($e->getMessage());
}
}
}
function getUsers() {
$query = "SELECT DISTINCT user FROM authorization ORDER BY user";
try {
$result = $this->db->query($query);
$this->db->disconnect();
return $result;
} catch (Exception $e) {
echo $e->getMessage();
}
}
function getAllNAS() {
$query = "SELECT DISTINCT NAS FROM authorization ORDER BY NAS";
try {
$result = $this->db->query($query);
$this->db->disconnect();
return $result;
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
?>
<?php
$Config['mysql_ip'] = "localhost";
$Config['mysql_usuario'] = "xxx";
$Config['mysql_senha'] = "xxx";
$Config['mysql_base'] = "xxxx";
?>
<?php
define('APP_PATH', realpath(dirname(__FILE__) . '/../'));
define('RAIZ_INCLUDES', APP_PATH.'/includes/');
?>
<?php
require_once(dirname(__FILE__) . '/config.php');
class DB {
private $connection;
private $host;
private $user;
private $password;
private $database;
private static $instance;
if (!$result = $this->connection->query($query)) {
throw new Exception("MySQL Query: " . mysqli_error());
}
return $result;
}
?>
<?php
function dataValida($data) {
if (preg_match("/^(\d{2})\/(\d{2})\/(\d{4})$/", $data, $matches)) {
if (checkdate($matches[2], $matches[1], $matches[3])) {
return true;
}
}
return false;
}
function anti_injection($dado) {
//Remove palavras que contenham sintaxe SQL:
$dado =
preg_replace("/(from|select|update|insert|delete|where|union|drop
table|show tables|--|\\\\)/i","",$dado);
$dado = trim($dado); //Limpa espaços vazio no início e fim da string
$dado = strip_tags($dado); //Remove tags HTML e PHP
$dado = addslashes($dado); //Adiciona barras invertidas a uma string
return $dado;
}
?>
<?php
require_once realpath(dirname(__FILE__) .
'/../application/includes/constants.php');
require_once APP_PATH . '/controllers/LogController.php';
//require_once APP_PATH . '/controllers/LDAPController.php';
require_once APP_PATH . '/includes/functions.php';
$whereclause = "";
if ($userFilter != "todos" && $userFilter) {
$whereclause.=sprintf("user = '%s'", $userFilter);
}
if ($nasFilter != "todos" && $nasFilter) {
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" nas = '%s' ", $nasFilter);
} else {
$whereclause.=sprintf(" AND nas = '%s' ", $nasFilter);
}
}
$data_inicio = str_replace("__/__/____", "", $data_inicio);
if ($data_inicio) {
if (dataValida($data_inicio)) {
$temp = explode("/", $data_inicio);
$data_inicio = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data >= '%s'", $data_inicio);
} else {
$whereclause.=sprintf(" AND data >= '%s'", $data_inicio);
}
} else {
$fields["data_inicio"] = "Início inválido";
}
}
$data_fim = str_replace("__/__/____", "", $data_fim);
if ($data_fim) {
if (dataValida($data_fim)) {
$temp = explode("/", $data_fim);
$data_fim = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data <= '%s'", $data_fim);
} else {
$whereclause.=sprintf(" AND data <= '%s 23:59:59'",
$data_fim);
}
} else {
$fields["data_fim"] = "Final inválido";
}
}
if (!isset($fields)) {
$query = "";
if ($tipo == 'auth') {
if ($comando) {
if (strlen($whereclause) == 0) {
$whereclause.= " command LIKE '%$comando%'";
} else {
$whereclause.=" AND command LIKE '%$comando%'";
}
}
$query = "SELECT COUNT(id) AS count FROM authorization " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause . ";";
} elseif ($tipo == 'access') {
if ($status && $status != 'todos') {
if (strlen($whereclause) == 0) {
$whereclause.= " status LIKE '%$status%'";
} else {
$whereclause.=" AND status LIKE '%$status%'";
}
}
$query = "SELECT COUNT(id) AS count FROM access " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause . ";";
}
$result = $log->consulta($query);
unset($query);
$row = $result->fetch_array(MYSQLI_ASSOC);
$count = $row['count'];
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
$query = "";
if ($tipo == 'auth') {
$query = "SELECT data, NAS, user,user_ip,command FROM
authorization " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause .
" ORDER BY data " . $ordenacao . " LIMIT " . $start .
", " . $limit;
} elseif ($tipo == 'access') {
$query = "SELECT data, NAS, user,user_ip,status FROM access " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause .
" ORDER BY data " . $ordenacao . " LIMIT " . $start .
", " . $limit;
} else {
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
header('Location: errors/404.html');
die("Ação não suportada !");
}
//die(var_dump($query));
$result = $log->consulta($query);
$response = new stdClass();
$response->page = $page;
$response->total = $total_pages;
$response->records = $count;
$i = 0;
if (isset($row['command'])) {
$dado = trim($row['command']);
if (preg_match('/^permit/i', $dado)) {
$dado = preg_replace('/^permit/i', '<strong><span
style="color:green">permit</span></strong>', $dado);
} else {
//$comando = '<strong><span style="color:red">' .
$comando . '</span></strong>';
$dado = preg_replace('/^deny/i', '<strong><span
style="color:red">deny</span></strong>', $dado);
}
if (preg_match('/Group-Async/', $dado)) {
$dado = preg_replace('/Group-Async /', '', $dado);
}
} elseif (isset($row['status'])) {
$dado = trim($row['status']);
if (preg_match('/^succeeded/i', $dado)) {
$dado = '<span style="color:green">Logado com
sucesso</span>';
} elseif (preg_match('/^failed/i', $dado)) {
if (preg_match('/user/i', $dado)) {
$dado = '<span style="color:red">Usuário não
encontrado</span>';
} else {
$dado = '<span style="color:red">Credenciais
inválidas (Usuário e/ou senha incorretos)</span>';
}
} elseif (preg_match('/^denied/i', $dado)) {
if (preg_match('/acl/i', $dado)) {
$dado = '<span style="color:red">Acesso negado por
ACL</span>';
}
} elseif (preg_match('/^HTTP/', $dado)) {
if (preg_match('/succeeded/', $dado)) {
$dado = '<span style="color:green">Logado com
sucesso (WEB)</span>';
} else if (preg_match('/failed/', $dado)) {
$dado = '<span style="color:red">Login falhou
(WEB)</span>';
}
}
}
<?php
require_once realpath(dirname(__FILE__) .
'/../application/includes/constants.php');
require_once APP_PATH . '/controllers/LogController.php';
//require_once APP_PATH . '/controllers/LDAPController.php';
require_once APP_PATH . '/includes/functions.php';
$whereclause = "";
if ($userFilter != "todos" && $userFilter) {
$whereclause.=sprintf("user = '%s'", $userFilter);
}
if ($nasFilter != "todos" && $nasFilter) {
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" nas = '%s' ", $nasFilter);
} else {
$whereclause.=sprintf(" AND nas = '%s' ", $nasFilter);
}
}
$data_inicio = str_replace("__/__/____", "", $data_inicio);
if ($data_inicio) {
if (dataValida($data_inicio)) {
$temp = explode("/", $data_inicio);
$data_inicio = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data >= '%s'", $data_inicio);
} else {
$whereclause.=sprintf(" AND data >= '%s'", $data_inicio);
}
} else {
$fields["data_inicio"] = "Início inválido";
}
}
$data_fim = str_replace("__/__/____", "", $data_fim);
if ($data_fim) {
if (dataValida($data_fim)) {
$temp = explode("/", $data_fim);
$data_fim = $temp[2] . "-" . $temp[1] . "-" . $temp[0];
if (strlen($whereclause) == 0) {
$whereclause.=sprintf(" data <= '%s'", $data_fim);
} else {
$whereclause.=sprintf(" AND data <= '%s 23:59:59'",
$data_fim);
}
} else {
$fields["data_fim"] = "Final inválido";
}
}
if (!isset($fields)) {
$query = "";
if ($tipo == 'auth') {
if ($comando) {
if (strlen($whereclause) == 0) {
$whereclause.= " command LIKE '%$comando%'";
} else {
$whereclause.=" AND command LIKE '%$comando%'";
}
}
$query = "SELECT COUNT(id) AS count FROM authorization " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause . ";";
} elseif ($tipo == 'access') {
if ($status && $status != 'todos') {
if (strlen($whereclause) == 0) {
$whereclause.= " status LIKE '%$status%'";
} else {
$whereclause.=" AND status LIKE '%$status%'";
}
}
$query = "SELECT COUNT(id) AS count FROM access " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause . ";";
}
$result = $log->consulta($query);
unset($query);
$row = $result->fetch_array(MYSQLI_ASSOC);
$count = $row['count'];
if ($count > 0) {
$total_pages = ceil($count / $limit);
} else {
$total_pages = 0;
}
$query = "";
if ($tipo == 'auth') {
$query = "SELECT data, NAS, user,user_ip,command FROM
authorization " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause .
" ORDER BY data " . $ordenacao . " LIMIT " . $start .
", " . $limit;
} elseif ($tipo == 'access') {
$query = "SELECT data, NAS, user,user_ip,status FROM access " .
((strlen($whereclause) == 0) ? "" : "WHERE ") .
$whereclause .
" ORDER BY data " . $ordenacao . " LIMIT " . $start .
", " . $limit;
} else {
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
header('Location: errors/404.html');
die("Ação não suportada !");
}
//die(var_dump($query));
$result = $log->consulta($query);
$response = new stdClass();
$response->page = $page;
$response->total = $total_pages;
$response->records = $count;
$i = 0;
if (isset($row['command'])) {
$dado = trim($row['command']);
if (preg_match('/^permit/i', $dado)) {
$dado = preg_replace('/^permit/i', '<strong><span
style="color:green">permit</span></strong>', $dado);
} else {
//$comando = '<strong><span style="color:red">' .
$comando . '</span></strong>';
$dado = preg_replace('/^deny/i', '<strong><span
style="color:red">deny</span></strong>', $dado);
}
if (preg_match('/Group-Async/', $dado)) {
$dado = preg_replace('/Group-Async /', '', $dado);
}
} elseif (isset($row['status'])) {
$dado = trim($row['status']);
if (preg_match('/^succeeded/i', $dado)) {
$dado = '<span style="color:green">Logado com
sucesso</span>';
} elseif (preg_match('/^failed/i', $dado)) {
if (preg_match('/user/i', $dado)) {
$dado = '<span style="color:red">Usuário não
encontrado</span>';
} else {
$dado = '<span style="color:red">Credenciais
inválidas (Usuário e/ou senha incorretos)</span>';
}
} elseif (preg_match('/^denied/i', $dado)) {
if (preg_match('/acl/i', $dado)) {
$dado = '<span style="color:red">Acesso negado por
ACL</span>';
}
} elseif (preg_match('/^HTTP/', $dado)) {
if (preg_match('/succeeded/', $dado)) {
$dado = '<span style="color:green">Logado com
sucesso (WEB)</span>';
} else if (preg_match('/failed/', $dado)) {
$dado = '<span style="color:red">Login falhou
(WEB)</span>';
}
}
}
#!/bin/bash
CONF=/usr/local/etc/tac_plus.cfg
CONF_NEW=/etc/tacacs/tac_plus.cfg.compare
if [ ! -f $CONF_NEW ]
then
touch $CONF_NEW
fi
#!/usr/bin/perl -w
use DBI;
use File::Tail;
use Data::Dumper;
$file=File::Tail->new(name=>"/var/log/tac_plus/access.log",
maxinterval=>10,interval=>5);
my $dbip="localhost";
my $dbname="xxx";
my $user="xxx";
my $pass="xxx";
while (defined($line=$file->read)) {
if($line){
#quebrar a string pelos tabs(\t) e colocar em um array
my @array = split("\t",$line);
#quebra a posicao 0 do array para tirar o timezone. Entrada:
04/08/2011 14:35:31 -0300 | Saida: 04/08/2011 14:35:31
my @data = split(" ",$array[0]);
$data = $data[0]." ".$data[1];
my $status = "";
my $aux = 7;
my $vty = "vty0";
if(defined($temp[7]) && $temp[7] !~ m/(succeeded|failed)/i){
$aux = 9;
$vty = $temp[8];
}
for($i=$aux; $i < @temp ;$i++){
$status .= $temp[$i]." ";
}
#!/usr/bin/perl -w
use DBI;
use File::Tail;
$file=File::Tail->new(name=>"/var/log/tac_plus/authorization.log",
maxinterval=>10,interval=>5);
my $dbip="localhost";
my $dbname="xxx";
my $user="xxx";
my $pass="xxx ";
while (defined($line=$file->read)) {
if($line){
#quebrar a string pelos tabs(\t) e colocar em um array
my @array = split("\t",$line);
my $dbh = DBI-
>connect("dbi:mysql:$dbname:$dbip;mysql_connect_timeout=86400",$user,$pass)
;
$dbh->do($sql_insert);
$dbh->disconnect;
}
}
#!/bin/sh
# Script para verificar se o MySQL está rodando corretamente.
DB_USER=xxx
DB_PASS=xxxx
hostname=`/bin/hostname`
alert_to="pescador@pop-sc.rnp.br luis@pop-sc.rnp.br fabio.santos@ufsc.br
rodrigo.g@ufsc.br flavio.meurer@ufsc.br"
alert_cc=""
alert_subject_down="[SAA UFSC - Alerta MySQL] Problema replicando MySQL em
$hostname"
alert_subject_up="[SAA UFSC - Alerta MySQL] MySQL replicando novamente em
$hostname"
alert_message_down="A replicação do servidor SLAVE em $hostname FALHOU!";
alert_message_up="A replicação do servidor SLAVE em $hostname voltou a
FUNCIONAR!";
if [ ! -f /tmp/check.pin ]
then
touch /tmp/check.pin
echo 0 > /tmp/check.pin
fi
check_value=$(cat /tmp/check.pin)
status=$(mktemp)
$(cat $status)
EOF
echo 1 > /tmp/check.pin
fi
-------------------------------------------
$(cat $status)
EOF
echo 0 > /tmp/check.pin
fi
rm $status
#!/bin/bash
######
# MONITORA ESPACO UTILIZADO NAS PARTICOES E ENVIA ALERTA CASO ESTEJA
CHEGANDO AO LIMITE ESTABELECIDO
#
####
# EMAILS PARA ONDE SERAO ENVIADOS OS EMAILS DE ALERTA
MAIL="pescador@pop-sc.rnp.br luis@pop-sc.rnp.br fabio.santos@ufsc.br
rodrigo.g@ufsc.br flavio.meurer@ufsc.br"
#
####
# PEGA IP DA MAQUINA
IP=`ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk
'{ print $1}' | head -n 1`
#
# LIMITE MAXIMO (%) DE USO DO DISCO ATE ENVIAR O ALERTA
ALERT=90
#
####
# VERIFICA A SITUACAO DAS TABELAS DE PARTICAO DO SISTEMA
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | df -h | awk '{if ($5 ~
/^\/.*/) print $4" "$5; else if($4 ~ /./) print $5" "$6;}' |
grep -v "Mounted" | while read output;
#
####
# VERIFICA SE O TAMANHO DA PARTICAO PASSOU DO LIMITE ESTABELECIDO
#
do
#echo $output
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
echo -e "Particao \"$partition ($usep%)\" chegando ao limite em
$(hostname) em $(date)\n\nIP do Servidor: $IP" |
mail -s "[SAA UFSC - Alerta Disco] Particao atingindo limite em
$(hostname)" $MAIL
fi
done
#!/bin/bash
###########
## SCRIPT PARA MONITORAR OS PROCESSOS ESSENCIAIS DO SISTEMA
###########
####
# PEGA PID DO TACACS
#TAC_PID=`cat /var/run/tac_plus.pid`
if [ ! -f /var/run/tac_plus.pid ]
then
touch /var/run/tac_plus.pid
echo tacacs+ > /var/run/tac_plus.pid
fi
TAC_PID=`cat /var/run/tac_plus.pid`
####
# LISTA DE PROCESSOS A SEREM MONITORADOS
PROCESSOS="$TAC_PID ucarp logs_auth.pl logs_access.pl mavis_tacplus_ldap.pl
apache2 slapd mysqld"
####
# VARIAVEIS
MAIL=/tmp/mail_processos.txt
HOSTNAME=`/bin/hostname`
IP=`ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk
'{ print $1}' | head -n 1`
####
# CONFIGURACOES DE ENVIO DE EMAIL
ALERT_TO="pescador@pop-sc.rnp.br luis@pop-sc.rnp.br fabio.santos@ufsc.br
rodrigo.g@ufsc.br flavio.meurer@ufsc.br"
ALERT_SUBJECT="[SAA UFSC - Alerta Processos] Problema em processos em
$HOSTNAME"
####
# MONTA EMAIL
echo "" >> $MAIL
echo "MAQUINA: $HOSTNAME" >> $MAIL
echo "IP: $IP" >> $MAIL
echo "" >> $MAIL
echo "" >> $MAIL
echo "---- LISTA DE PROCESSO(S) PARADO(S) ----" >> $MAIL
####
# VERIFICA PROCESSOS QUE ESTAO RODANDO E ENVIA EMAIL EM CASO DE QUEDA DE
DETERMINADO SERVICO
I=0
for PROC in ${PROCESSOS}
do
if ps ax | grep -v grep | grep $PROC > /dev/null
then
echo "$PROC OK, processo rodando..." > /dev/null
else
echo "$PROC NAO esta rodando..." > /dev/null
echo $PROC >> $MAIL
I=$(( $I + 1 ))
fi
done
####
# ENVIA EMAIL COM PROCESSOS QUE ESTAO PARADOS
if [ $I -gt 0 ]
then
cat <<EOF | mail -a "Content-Type: text/plain; charset='ISO-8859-1'" -s
"$ALERT_SUBJECT" $ALERT_TO
$(cat $MAIL)
EOF
fi
####
# APAGA ARQUIVO TEMPORARIO QUE GERA CORPO DO EMAIL
rm $MAIL
exit 0
#!/bin/bash
#echo $count