Arquivo

Archive for junho \12\UTC 2013

Instalando Fail2ban no Debian Wheezy!

12 de junho de 2013 Deixe um comentário
Fail2Ban

Fail2Ban

Evitando ataques bruteforce de SSH utilizando o Fail2ban

Atualmente ataques bruteforce (força bruta, aquele em que o atacante tenta n possibilidades de usuário/senha por segundo até conseguir quebrar a senha e entrar no sistema) estão muito mais frequentes do que nós imaginamos, basta uma leitura rápida (like debian) no arquivo auth.log para visualizarmos a quantidade de tentativas com milhares de usuários e senhas por dia.

O que cabe a um administrador de redes é prevenir o sistema contra estas ações maliciosas que muitos robôs e máquinas zumbis são programadas para fazer. Para evitar ataques deste tipo, eu utilizo algumas acl’s na borda e o Fail2Ban no firewall que analisa o tráfego e dependendo da análise ele bloqueia o IP ou range de ip por tempo determinado inserindo regras no firewall. O bom é que não é apenas no protocolo SSH, você pode configurar para conexões SMTP, TELNET, FTP e etc…

O Fail2Ban na verdade é uma estrutura de prevenção de intrusão, escrito na linguagem de programação Python que filtra os logs de entrada de logins no sistema e a partir desta análise insere regras no firewall para bloqueio destes acessos.

Em distribuições Linux Debian e like Debian você pode instalar via apt-get com o comando:

# apt-get install fail2ban

Ele irá instalar automaticamente. Após instalar você deve configurar o fail2ban editando o arquivo:

# vim /etc/fail2ban/jail.conf

Algumas variáveis importantes deste arquivo são estas:

  • “ignoreip” se encontram os endereços de IPs que não vão ser bloqueados pelo programa.
  • “bantime” se encontra o tempo em que o IP ficará banido/bloqueado pelo programa (o tempo é contado em segundos).
  • “maxretry” temos o número máximo em que o IP pode tentar logar-se no seu servidor até ser bloqueado (recomendo que ponha no máximo 3).
  • “logpath” refere-se ao arquivo de log onde são checadas as tentativas frustradas de login.

Recomendo que antes de editar o mesmo, você faça um backup do arquivo evitando que seja feita qualquer equívoco no fileconf do fail2ban:

# cp -ar /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.ori

Feito o backup, vamos implementar algumas configurações básicas editando o arquivo

# vim /etc/fail2ban/jail.conf

Importante inserir alguns hosts ou range de hosts que não serão bloqueados, afinal ninguém bloqueia a si mesmo. Então na linha ignoreip coloque o ip de localhost e o range da sua rede a qual você não gostaria de bloquear, deixe separados por um espaço:

ignoreip = 127.0.0.1/8 192.168.0.0/16

Após isso, sete a variável bantime para o tempo que você deseja que o ip fique bloqueado no firewall. Este tempo é em segundo, eu geralmente configuro um ban para 10 minutos. Se você quiser banir o IP ou range permanentemente, basta atribuir a esta variável um valor negativo.

bantime  = 600

Configure o tempo de varredura em segundos passados em que o Fail2Ban procura por IP’s abusivos ao sistema.

findtime = 600

E por final configure o número máximo de entradas frustradas que o atacante tentou acessar seu sistema errando login e senha.

maxretry = 3

Pronto, salve o arquivo e reinicie o Fail2ban:

# /etc/init.d/fail2ban restart

O programa está configurado e poderá ver ver os IPs bloqueados em /var/log/fail2ban.log.

Quando um atacante for bloqueado, ao tentar acessar seu servidor ele irá exibir a mensagem de conexão recusada para o atacante, algo similar a mensagem abaixo:

ssh: connect to host 10.10.58.5 port 22: Connection refused

No iptables, você visualiza as regras inseridas através da sintaxe:

iptables -nL fail2ban-ssh

Que deverá listar algo assim:

root@takakaos:/etc/fail2ban# iptables -nL fail2ban-ssh

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
REJECT     all  --  10.10.58.5        0.0.0.0/0            reject-with icmp-port-unreachable
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Para remover basta inserir o comando abaixo com o numero da regra (chain number) que você deseja remover. No meu caso seria remover o bloqueio para a primeira regra, que contém o IP 10.10.58.5

iptables -D fail2ban-ssh 1

Ou através da remoção do ip bloqueado (notar se na exibição do bloqueio através do iptables, a chain está dropando -j DROP ou está rejeitando -j REJECT)

iptables -D fail2ban-ssh -s 10.10.58.5 -j REJECT

Qualquer dúvida você pode acessar o manual (in english) na url abaixo.

http://www.fail2ban.org/wiki/index.php/MANUAL_0_8

Nota: Versão utilizada: 0.8.9-1

Anúncios

Conectando remotamente no MYSQL usando o Shell!

7 de junho de 2013 Deixe um comentário

Conectando remotamente no MYSQL usando o Shell!

Quando precisar acessar um Banco Mysql remotamente via shell, utilizar a sintaxe abaixo:

mysql -u username -p -P n_port -h ip_host database_name

Exemplo:

mysql -u jacques.beijer -p -P 73307 -h 201.201.201.745 cafeina_database

Lembrando que você precisa definir permissão de acesso (grant) para o host que irá acessar, essa permissão tem que ser feita no host que hospeda o banco de dados. Esta permissão (tem um post meu só sobre permissões) pode ser definida com o comando abaixo:

root@takakaos:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

mysql> grant all privileges on *.* to usuario@ip_host_remoto 
IDENTIFIED BY 'senha_xpto';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
root@takakaos:~#

Para conectar usando tunel, usar a sequência abaixo:

ssh -L 73307:mysql.host.com:3306 user@host.com
mysql -u user -p -P 73307 -h 127.0.0.1 database

Conectar remotamente no Mysql do Zimbra!

5 de junho de 2013 5 comentários
Zimbra

Zimbra

Conectando remotamente no Mysql do Zimbra!

Hoje ao tentar conectar no banco Mysql do Zimbra usando o Mysql Query Browser a partir da minha máquina, vi que não estava conseguindo por estar com acesso negado e ao ir fazer a liberação notei que as configurações do mysql não estavam como default.

Para resolver este problema podemos agir da seguinte forma.

Logar na conta do zimbra:

su zimbra

Em seguida conectar no banco com usuário padrão do zimbra:

mysql -u zimbra

Ele irá logar normalmente. Após isto, vamos conceder a permisssão no Mysql:

grant all privileges on *.* to `usuario`@`ip_remoto` IDENTIFIED 
BY "senha_desejada" WITH GRANT OPTION;
flush privileges;
exit

Substitua o termo usuario para o login que você deseja utilizar, bem como senha_desejada para a senha que você irá utilizar e o ip_remoto para o ip do computador a qual você pretende utilizar para acessar o banco.
Pronto, agora temos um usuários para acessar o banco do Zimbra, lembrando que você pode inserir ‘root’@’%’ para dar acesso root a partir de qualquer host da rede. Lembrando que o Mysql do Zimbra Utiliza a porta 7306.

Agora precisamos abrir o Mysql para aceitar conexões não apenas localmente, mas de outros hosts também. Para fazer esta alteração, temos que editar o arquivo /opt/zimbra/conf/my.cnf e comentar a opção bind-address = localhost e salvar o arquivo:

vim /opt/zimbra/conf/my.cnf
#bind-address = localhost

Após esta alteração, reinicie o mta com os comandos abaixo e seu acesso estará permitido.

zmcontrol stop
zmcontrol start

Pronto.

[]’s

Unix 32 ou 64 bits?

5 de junho de 2013 Deixe um comentário
AIX

AIX

Verificando se o Unix é 32 ou 64 bits!!!

 

Recentemente fiz um post sobre como checar se o Linux é 32 ou 64 bits. E logo em seguida veio um comentário sobre como verificar se o Unix é 32 ou 64 bits…

Bom, a informação para o Linux, não funciona para o Unix, essas pequenas diferenças dos primos BaSH e SH são complicadas algumas vezes mas vamos lá.

No AIX podemos executar o comando abaixo:

bootinfo -y

No HP-UX é:

getconf KERNEL_BITS

Ambos os comandos acima apenas consultam variáveis, logo podem ser usados sem problemas de alteração no sistema.

 

Teclas de Atalho – Shell Bash (Bourne Again Shell)

5 de junho de 2013 Deixe um comentário
Shell_Bash

Shell_Bash

Aumentando a produtividade utilizando teclas de atalho no Shell Bash!!!

No cotidiano de um administrador de Sistemas Linux via Shell Bash a ausência do mouse nunca me incomodou, exceto quando estou escrevendo uma linha de script razoavelmente grande e desejo ir para o meio desse script em pleno bash, sem estar em um arquivo com algum editor. Putz. Isso realmente é algo que o Linux peca um pouco… Mas comparado com tudo que ele faz, esse problema passa até despercebido.

Mas estamos falando de Linux, um sistema que foi projetado pensando em cada pequeno detalhe. Por esta razão, as teclas de atalho do shell bash resolvem vários problemas, sem falar que linhas de código maiores que duas linhas, devem ser escritas em um editor VIM.

Por esta razão, estou colocando aqui algumas das principais teclas de atalho do Bash.

Teclas de atalho: Descrição
As teclas de atalho abaixo funcionam quando as teclas default são utilizadas.

Tab ⇆ : Autocompleta o comando a partir da posição do cursor.
Ctrl+a : Move o cursor para o inicio da linha, equivalente a tecla Home.
Ctrl+b : Move o cursor um caractere atrás.
Ctrl+c : Envia o sinal SIGINT para tarefa atual, então esta é cancelada e fechada.
Ctrl+d : Envia o marcador EOF, este fecha a sessão atual do shell, igual ao exit.
Ctrl+d : Deleta o caracter corrente, se existirem caracteres digitados.
Ctrl+e : Move o cursor para o final da linha, equivalente a tecla End.
Ctrl+f : Move o cursos para o caracter seguinte.
Ctrl+g : Aborta a pesquisa e restaura a linha original.
Ctrl+h : Deleta o caractere anterior, equivalente a tecla Backspace.
Ctrl+i : Equivalente a tecla Tab.
Ctrl+j : Equivalente a tecla Enter.
Ctrl+k : Limpa o conteúdo da linha que está após o cursor e copia 
         este conteúdo para área de memoria.
Ctrl+l : Limpa o conteudo da tela, equivalente ao comando clear.
Ctrl+n : Recupera o próximo comando (equivalente a tecla ↓).
Ctrl+o : Executa o comando encontrato do histórico.
Ctrl+p : Recupera o comando anterior (equivalente a tecla ↑).
Ctrl+q : Adiciona o próximo caractere digitado à linha textualmente.
Ctrl+r : Executa o ultimo comando digitado.
Ctrl+s : Volta ao próximo comando digitado recentemente.
Ctrl+t : Avançar os dois últimos caracteres.
Ctrl+u : Limpa o conteúdo da linha anterior ao cursor e copia o conteúdo para 
         área de memoria.
Ctrl+v : Adiciona o próximo carácter à linha textualmente.
Ctrl+w : Apaga a palavra depois do cursor e copia para área de memória.
Ctrl+y : Comando colar.
Ctrl+x Ctrl+e : Edita a linha atual no programa $EDITOR, ou vi.
Ctrl+x Ctrl+r : Ler o conteúdo do arquivo inputrc, e incorporar todas as 
                ligações ou atribuições de variáveis ​​encontradas lá.
Ctrl+x Ctrl+u : Desfazer, separado por linha.
Ctrl+x Ctrl+v : Exibe informações sobre a versão da instancia corrente do bash.
Ctrl+x Ctrl+x : Alterar a posição do cursor para sua antiga posição. 
                (C-x, porque x tem uma forma de passagem).
Ctrl+z : Envia o sinal para SIGTSTP a tarefa atual, para suspende-lo. Para 
         executá-lo em segundo plano pode-se entrar no bg. Para trazer de 
         volta através de fundo ou suspensão fg ['nome do processo ou 
         identificação de trabalho "] (primeiro plano) pode ser emitido.
Ctrl+_ : Desfazer, separado por linha.
Alt+b : move o cursor para palavra anterior.
Alt+c : Capitaliza o caracter sob o cursor e move para o final da palavra.
Alt+d : Corta a palavra depois do cursor.
Alt+f : move o cursor para próxima palavra.
Alt+l : Transforma para caixa baixa todo caractere a partir do cursor 
        em toda palavra.
Alt+r : Cancela as alterações e colocar de volta a linha de como era na história.
Alt+u : Transforma para caixa alta todo caractere a partir do cursor em toda 
        palavra.
Alt+. : Insira o último argumento para o comando anterior (a última palavra da 
        entrada história anterior).

 

[]’s

Entenda o dpkg list!!!

2 de junho de 2013 Deixe um comentário
DPKG - Debian Package

DPKG – Debian Package

Como interpretar o status do dpkg –list?

O DPKG (Debian package) é um gerenciador de pacotes para o Debian.  Com o dpkg, você pode instalar, remover e gerenciar pacotes no seu sistema entre outras coisas. Também é possível ver o status de vários pacotes, como:

  • De pacotes que estão instalados
  • De pacotes que foram removidos
  • Se arquivos de configuração estão presentes
  • Se está marcado para remoção

Exemplo:

root@takakaos:~# dpkg --list openvpn
||Desired=Unknown/Install/Remove/Purge/Hold
| |Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|| Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
|| Nome                              Versão                           Descrição
============================================================
ii  openvpn                           2.1.3-2+squeeze1                  virtual private network daemon

Status de cada pacote é pode ser representado por três caracteres xxx, sendo que geralmente é representado por apenas dois caracteres, a ausência de um terceiro caractere significa que não há erro com o pacote.

O primeiro caractere significa o estado desejado, como nós (ou algum usuário) desejamos que o pacote esteja.

u: Desconhecido (um estado desconhecido)
i: Install (marcado para instalação)
r: Remove (marcado para remoção)
p: Purge (marcado para purgar)
h: Segure (Hold)

Segundo caractere: O segundo caractere significa o estado atual, se ele está instalado ou não. Os valores são possíveis

n: Not – O pacote não está instalado
i: Install – O pacote está instalado com êxito
C: CFG-Files – Os arquivos de configuração estão presentes
u: Unpacked – O pacote é descompactado
f: Failed-cfg – Falha ao remover arquivos de configuração
h: Half-install – O pacote está parcialmente instalado
W: trig-Await
t: Trig-pend

Terceiro caractere: Isto corresponde ao estado de erro. Só pode ter um valor possível:

R: reinst-required – O pacote deve ser instalado.

Agora você pode facilmente interpretar o que ii , pn e rc correspondem.

No nosso caso o Openvpn está marcado como ‘ii’, o que significa dizer que ele está instalado com êxito.

Os pacotes com o estado rc não são completamente removidos do sistema, os arquivos de configuração ainda estão presentes.

Se você tem um monte de pacotes de rc que você precisa para limpar, como root, digite:

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --purge

Mas só faça isso se você tiver certeza e realmente for necessário.

Segue abaixo um quadro comparativo resumido entre o dpkg e o rpm.

Dpkg-vs-Rpm

Dpkg-vs-Rpm

Categorias:Bash, Linux, Shell Tags:, ,

Permitir conexão remota ao Banco Mysql

2 de junho de 2013 2 comentários
MySQL

MySQL

Permitir conexão remota ao Banco Mysql

 

Faço parte de várias listas de discussões Linux e vejo que é recorrente o assunto de permitir conexão remota no banco de dados MySQL. Este problema ocorre basicamente por dois motivos, o MySQL nativamente vem configurado para apenas ser acessado localmente e também para acessar a base você precisa de permissão para o que vai acessar, de onde vai acessar e o como irá acessar.

O MySQL utiliza por default a porta 3306 via protocolo TCP. Com essa informação podemos perguntar ao servidor se esta porta esta aberta e qual o estado dela. Podemos dar um “netstat -ln | grep 3306” que irá nos retornar a saída abaixo:

tcp        0      0 127.0.0.1:3306            0.0.0.0:*               OUÇA

Bingo. O MySQL está ouvindo normalmente na porta 3306, só que apenas está definido como 127.0.0.1:3306, ou seja, só permite conexões do próprio servidor (comunicação loopback). Precisamos mudar essa opção, permitindo assim que outros hosts possam se conectar no MySQL. Para Sistemas como Slackware e Debian (E derivados deles) você tem o arquivo de configuração do MySQL em /etc/my.cnf dentro deste arquivo temos uma variável chamada bind-address que deve estar definida com 127.0.0.1, ou seja, localhost. Sugiro que você comente esta variável e/ou coloque ‘bind-address = 0.0.0.0′ e caso tenha uma variável chamada skip-networking, comente ela também.

Antes de tudo, vamos fazer um backup do arquivo de configuração do MySQL para evitar maiores dores de cabeça.

cp -ar /etc/my.cnf /etc/my.cnf.ori

Abra o arquivo.

vim /etc/my.cnf

Localize e comente as linhas abaixo (a bind-address poderá aparecer com 127.0.0.1 ou com 0.0.0.0):

#skip-networking
#bind-address=0.0.0.0 ou #bind-address=127.0.0.1

Após isso, salve o arquivo my.cnf e reinicie o MySQL.

/etc/init.d/mysql restart;

Pronto, agora o banco de dados está aceitando conexões em todas as interfaces e de todos os hosts, o que nos leva ao segundo ponto, a permissão para este acesso.

Para dar permissão de acesso, basta acessar o mysql:

mysql -u root -p

E digitar estes comandos:

grant all privileges on *.* to root@192.168.254.254 IDENTIFIED BY 'lisarB';
flush privileges;
exit

O primeiro comando concede todos os privilégios a todas as bases para o usuário root, que poderá se conectar a partir do host 192.168.254.254 com a senha lisarB. Pronto, o host 192.168.254.254 conseguirá conectar no banco agora como usuário root. O segundo comando atualiza os privilégios, o terceiro, sai do mysql.

Caso você queira liberar o acesso root proveniente de qualquer host, basta executar o comando abaixo:

grant all privileges on *.* to root@% IDENTIFIED BY 'lisarB';
flush privileges;
exit

Quando usado ‘root@%’ significa dizer que o usuário root pode se conectar de qualquer host.

Lembrando que não é recomendável dar acesso root, use-o apenas para dar manutenção e administrar o banco. Crie usuários específicos com permissões específicas para trabalhar no banco de dados. Este tipo de liberação deve ser feita em conjunto com medidas de segurança, lembre-se que você está abrindo brechas…

Definição do desenvolver do MySQL para as duas variáveis alteradas:

bind-address: The MySQL server listens on a single network socket for TCP/IP connections. This socket is bound to a single address, but it is possible for an address to map onto multiple network interfaces. The default address is 0.0.0.0. To specify an address explicitly, use the --bind-address=addr option at server startup, where addr is an IPv4 address or a host name. If addr is a host name, the server resolves the name to an IPv4 address and binds to that address.

skip-networking: Don’t listen for TCP/IP connections at all. All interaction with mysqld must be made via Unix sockets. This option is highly recommended for systems where only local requests are allowed. Since you need to allow remote connection this line should be removed from my.cnf or put it in comment state.