Archive for the Linux Category

Se você precisa balancear a carga em seu webserver e não tem (ou não pode usar) um hardware dedicado para isso, segue alguns exemplos práticos:

Apache httpd:

NameVirtualhost *:80
<VirtualHost *:80>
    ServerName everlinux-homolog.com
    ServerAlias 200.24.12.34 10.10.23.53 10.10.23.56
    ServerAdmin suporte@everlinux.com
    ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log.%Y%m%d 86400 -180"
    CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 -180" combined
 
        <Proxy balancer://everhttp>
          BalancerMember http://10.10.23.53:80/ ping=10
          BalancerMember http://10.10.23.56:80/ ping=10
        </Proxy>
 
ProxyPreserveHost on
ProxyPass / balancer://everhttp/
ProxyPassReverse /oii balancer://everhttp/
 
</VirtualHost>

Nginx

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  50;
 
      upstream everbalance {
         ip_hash;
         server 10.10.23.53 max_fails=3 fail_timeout=30s;
         server 10.10.23.56 max_fails=3 fail_timeout=30s;
         }
 
    server {
         listen  202.34.52.24:80;
         server_name  everlinux-homolog.com;
         location /
           {
            access_log   /var/log/nginx/hdig.log;
            proxy_pass   http://everbalance;
            proxy_set_header Host $host;
           }
         }
}

As linhas “ProxyPreserveHost on” (apache) e “proxy_set_header Host $host;” (nginx) são importantes caso sua aplicação trabalhe com o nome do domínio da URL para montar alguma coisa dinamicamente. Conteúdo estático geralmente não é necessário estas variáveis.

Ouvindo muitos “Jackson Five – Motoboy”, acabei juntando algumas rimas encontradas na InterNet e usadas por ele.
Segue um link do histórias do malandro e sua magrela Lady Laura (motocicleta).

YouTube Preview Image

Suave na nave
De boa na lagoa (canoa)
Tranquilo no quilo (como um grilo)
As pampa na rampa
Firmão no galpão (busao, macarrao)
De leve na neve
Beleza na mesa
Irado no gado
Na moral no matagal
Legal no bananal
Firmose na apoteose
Sem drama na cama
Firmeza na represa
Sossegado no mercado
Tudo em cima na piscina
Tudo certo no deserto
Relax no durex
Joia na Jibóia
Realiza na briza
Sussa na montanha russa
Relaxa na bolaxa (ou graxa)
Se pá no maracujá
Joinha na prainha
Estranho como um ranho
Se orienta na polenta
Light na night
Tudo em cima na piscina
Bem no armazém
Manero no putero
Demoreba na budega
De boresta na palestra
A brisa no para-brisa
Nice on the ice
sussegado no marcado
tranquilo no asilo
ja é no jacaré
firmão no busão
suavão no camburão
seguro no muro
tudo em cima na piscina
conosco não há enrosco
comigo não tem perigo
é quente no dente
legal no pedal
relachado no machado
de onda na Honda
se toca na tapioca
no grau do bacalhau
de bobeira na ladeira
Stayle no baile

Éh nóis queiróiz! 8p

Calma pessoal, hoje ainda não é sexta! Então não se empolgem.
Há uns dias atrás fiz um post falando sobre o GIMP, que é junto com Photoshop um das poderosas ferramentas de editorações e retoques em imagens.
Então clique na imagem abaixo e veja alguns milagres feitos por essas ferramentas.

Retoque Digital

[ 1 ]
[ 2 ]
[ 3 ]
[ 4 ]
[ 5 ]

É um software de distribuição gratuita capaz de realizar composição e criação de imagem, retoques em fotos, entre muitas outras coisas.

Ele é bastante utilizado por profissionais para manipular e melhorar a qualidade fotos e ou para a realização de projetos gráficos. Sendo assim uma alternativa livre ao Photoshop da Adobe.

Nasceu como um projeto universitário em 1995 por Spencer Kimball e Peter Mattis é hoje mantido por um grupo de voluntários.

Site oficial: Gimp

Download [linux]: The Gimp 2.6.7 [15.58MB]

Download [win]: The Gimp 2.6.7 Portable Rev 3 [16.73MB]

Download [win]: The GIMP 2.6.7 [16.08MB]

Download [win]: The GIMP 2.7.0 Beta [15.04MB]

gimps

A Little Linux Story
“free the code”

free the code

Já é a segunda vez que meu Ubuntu 9.04 resolve colocar o MAC “AA:00:04:00:0A:04″ em minha interface de rede. Aconteceu com minha Realtek RTL8101E/RTL8102E (onboard) e agora com a minha Realtek RTL-8139/8139C/8139C+ Offboard, no meu super PC da SpaceBR que já veio com Linux instalado.

Aparentemente não é algo difícil de acontecer no Ubuntu, por isso colocarei aqui o que fiz para parar de vez com esse problema irritante:

Editei o /etc/rc.local e acrescentei essas linhas:

/sbin/ifconfig eth0 hw ether 00:21:97:9E:13:13
/sbin/ifconfig eth1 hw ether 00:E0:4C:56:0E:D8

Logo em seguida, arrumei o /etc/udev/rules.d/70-persistent-net.rules

# PCI device 0x10ec:0x8136 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:21:97:9e:13:13", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
 
# PCI device 0x10ec:0x8139 (8139too)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:4c:56:0e:d8", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

No próximo reboot, o NetworkManager resolveu me obedecer e colocar o IP que eu havia selecionado (na verdade DHCP), sem ficar criando o maldito “Auto eth0″ com dhcp e aquele MAC maluco.

No meu caso, eu configuro meu roteador Netgear WGR614 v7 para colocar um IP de acordo com o MAC da minha placa. Desta forma, meu Wii (rodando o mplayer_ce 0.75) consegue montar meu compartilhamento exportado via SaMBa (veja como no artigo: Assistindo Filmes no Wii usando o Mplayer) e eu posso assistir animês/ filmes e seriados pela TV da sala, deitado no sofá. Bem melhor do que ficar sentado na frente de um monitor :-)

O problema era que o Ubuntu colocava esse MAC maluco, o Wireless mandava um IP diferente do qual eu havia programado (192.168.1.5 ao invés do 192.168.1.2) e aí o Wii se perdia porque não encontrava o compartilhamento :-/

Agora tudo parece estar funcionando como deveria!

Eu havia comentado anteriormente sobre a compra do meu PC novo para 2009, em substituição ao já idoso Athlon XP 1600+ que eu tinha anteriormente.

Na verdade, um dos meus objetivos é possuir uma máquina descente para jogar games novos, por exemplo, o Diablo 3 (quando ele sair…), pois ainda estou muito empolgado jogando Diablo 2 no Linux decentemente :)

Quando comprei a placa Nvidia GeoForce Series 9 – 9500 GT com 1GB DDR2 (DVI/D-SUB/HDMI) – PCI-Express 2.0, eu assim a fiz pensando no ótimo (??) suporte que a mesma possui em Linux. Eu ja tive uma Radeon 9200 da ATi e bem me lembro o sufoco que era fazer a mesma funcionar a aceleração 3D no Linux (se bem que isso não quer dizer muita coisa, hoje em dia as coisas andam muito mais fáceis…rsrsrs)

Para exemplificar isso, resolvi postar os screenshoots da instalação/ configuração desta placa no Ubuntu Linux 9.04. Mais fácil do que isso só roubar doce de criança…

Tudo começa clicando em System -> Administrator -> Hardware Drivers. O restante você confere nos screenshoots (clique para ampliar as imagens) :)

- Na primeira imagem você vê uma saída do ‘lspci’ junto ao ‘Hardware Drivers’
- Na segunda imagem, o /etc/X11/xorg.conf sendo modificado automaticamente
- Na terceira, você pode visualizar o novo NVIDIA X Server Settings, tudo de forma fácil e gráfica!

Eu só não sei se tenho saudades dos velhos tempos em que configurar um X era coisa para macho, hahahahha 8)

Abraços e até mais!

O objetivo deste post é ajudar as pessoas a manter o SELinux habilitado, resolvendo os problemas com o mesmo.

O exemplo é um LAMP com Red Hat EL 5.3 com tudo funcionando, porém um daemon vsftpd que não quer subir quando o SELinux está rodando.

Para verificar se o problema é de fato o SELinux, basta desabilita-lo temporariamente:

[root@selinux tmp]# setenforce Permissive
 
[root@selinux tmp]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd:                                             [  OK  ]

Sem o SELinux, o VSFTP funciona normalmente, porém basta ativa-lo que mensagens estranhas começam a aparecer:

[root@selinux tmp]# setenforce enforcing
 
[root@selinux tmp]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: /usr/sbin/vsftpd: error while loading shared libraries: libssl.so.6: failed to map segment from shared object: Permission denied
                                                          [FAILED]
[root@selinux ~] # tail /var/log/messages
Jul 27 15:01:44 selinux kernel: type=1107 audit(1248717704.011:1569): user pid=25449 uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  denied  { shmempwd } for  scontext=system_u:system_r:initrc_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=nscd
Jul 27 15:01:44 selinux kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'
Jul 27 15:01:44 selinux kernel: type=1107 audit(1248717704.012:1570): user pid=25449 uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  denied  { getpwd } for  scontext=system_u:system_r:initrc_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=nscd
Jul 27 15:01:44 selinux kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'
Jul 27 15:01:44 selinux kernel: type=1107 audit(1248717704.012:1571): user pid=25449 uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  denied  { shmemgrp } for  scontext=system_u:system_r:initrc_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=nscd
Jul 27 15:01:44 selinux kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'
Jul 27 15:01:44 selinux kernel: type=1107 audit(1248717704.012:1572): user pid=25449 uid=28 auid=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  denied  { getgrp } for  scontext=system_u:system_r:initrc_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=nscd
Jul 27 15:01:44 selinux kernel: : exe="?" (sauid=28, hostname=?, addr=?, terminal=?)'
Jul 27 15:01:44 selinux kernel: type=1400 audit(1248717704.028:1573): avc:  denied  { execute } for  pid=25644 comm="vsftpd" path="/lib64/libssl.so.0.9.8e" dev=sda3 ino=1488241 scontext=system_u:system_r:ftpd_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=file

Você pode observar que vários destes erros são referentes ao cache NSCD, e somente a última é de fato referente ao VSFTPd e suas bibiotecas compartilhadas.

Para ficar mais visível, vamos parar o o nscd e tratar como dois problemas distintos:

[root@selinux selinux]# /etc/init.d/nscd stop
Stopping nscd:                                             [  OK  ]
 
[root@selinux selinux]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: /usr/sbin/vsftpd: error while loading shared libraries: libssl.so.6: failed to map segment from shared object: Permission denied
                                                          [FAILED]
[root@selinux selinux]# tail /var/log/messages
Jul 27 15:01:52 selinux kernel: type=1400 audit(1248717712.742:1574): avc:  denied  { execute } for  pid=25662 comm="vsftpd" path="/lib64/libssl.so.0.9.8e" dev=sda3 ino=1488241 scontext=system_u:system_r:ftpd_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=file

Uma das coisas mais legais que foram adicionados ao RHEL5, é o daemon setroubleshoot que ajuda a traduzir esses erros monstros do selinux para algo que um humano consiga entender.

A ferramenta audit2allow permite pegar trechos de logs monstros que estão barrando em algo e converter para o mundo do Selinux, eliminando assim o problema em que você está preso:

[root@selinux tcruz]# grep vsftpd /var/log/messages | audit2allow -M vsftpd

Será gerado dois arquivos:
vsftpd.te = texto
vsftpd.pp = binário

O vsftpd.te conterá algo como:

module vsftp 1.0;
 
require {
	type ftpd_t;
	type file_t;
	class dir search;
	class file execute;
}
 
#============= ftpd_t ==============
allow ftpd_t file_t:dir search;
allow ftpd_t file_t:file execute;

Enquanto o nscd.te mostraria algo assim:

module nscd 1.0;
 
require {
	type init_t;
	type initrc_t;
	class nscd { shmemhost shmempwd getpwd shmemgrp gethost getgrp };
}
 
#============= initrc_t ==============
allow initrc_t init_t:nscd { shmemgrp getgrp shmempwd getpwd gethost shmemhost };

Se você estiver satisfeito com o resultado, poderá simplesmente importar o arquivo binário para junto das regras atuais do seu sistema:

[root@selinux tcruz]# semodule -i vsftpd.pp

Você pode fazer isso com o vsftpd e com nscd, até que seu problema seja de fato resolvido!

Pronto! Simples assim :)

Um outro comando interessante, é o getsebool que pode alterar várias variáveis boolean (on ou off, 0 ou 1, ligado ou desligado) pré-definidas como:

[root@selinux log]# setsebool -P ftp_home_dir 1
[root@selinux log]# setsebool -P allow_ftpd_full_access=1
 
[root@selinux log]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> on
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
allow_tftp_anon_write --> off
ftp_home_dir --> on
ftpd_disable_trans --> off
ftpd_is_daemon --> on
httpd_enable_ftp_server --> off
tftpd_disable_trans --> off

Links Úteis para saber mais sobre o SELinux:

http://jczucco.blogspot.com/2009/07/apresentacao-sobre-selinux-no-fisl-10.html
http://magazine.redhat.com/2007/05/04/whats-new-in-selinux-for-red-hat-enterprise-linux-5/
http://fedoraproject.org/wiki/SELinux
http://docs.fedoraproject.org/selinux-faq-fc5/
http://fedoraproject.org/wiki/SELinux/Understanding

Um tempo atrás escrevi um artigo sobre VPNs que abordava as vantagens e desvantagens do PPTP, e também um passo-a-passo para subir um OpenVPN autenticando com certificados e etc.

O artigo ainda está disponível na Web, e chama-se Implementando soluções de VPN. O que eu não sabia era que, embora o artigo seja meio antigo (Março de 2006) ele ainda continua funcional! Eu fui seguindo-o passo-a-passo, copiando e colando os comandos e em 15 minutos eu estava conectado à uma VPN usando roteamento com o device “tun”!

O modo de como esta VPN funciona é bem bacana, pois separa a sua rede “servidora” (ex: 192.168.0.x) da rede do cliente conectado via OpenVPN, criando uma rede como inválida qualquer como 10.8.0.x. O acesso de uma rede para a outra é feita via roteamento, descantando toda aquela nhaca de broadcast, netbios e etc.

Porém, desta vez a necessidade era diferente. Eu precisava realmente estar dentro da rede servidora, pois de dentro da rede era possível o acesso à uma outra rede, no caso uma LP com o México. A lambança era mais ou menos assim:

Rede_Mexico = 10.95.0.0/16
Rede_Servidor = 10.10.10.0/24
Rede_VPN = 10.8.0.0/24

Utilizando o device “tun” a rede VPN até chegava na rede do Servidor, porém, não chegava até a rede do México. Não duvido que seja possível de ser feito usando alguns roteamentos malucos, porém consegui resolver o problema apelando para bridges no Linux, usando o device “tap”.

O Carlos Morimoto havia postado um artigo chamado Criando bridges no OpenVPN do qual me foi muito útil, pois assim o OpenVPN conectava diretamente na rede 10.10.10.0/24 me enviando um IP que eu mesmo posso escolher via DHCP:

server-bridge 10.10.10.200 255.255.255.0 10.10.10.210 10.10.10.220

No exemplo acima, 10.10.10.200/24 será o IP do servidor, e 10.10.10.210 até 10.10.10.220 será o range oferecido aos clientes remotos que conectarem usando o OpenVPN.

Porém, para que tudo funcione a contento é necessário criar uma Bridge entre as interfaces eth0 e tap0, para que todo mundo se converse e se enxergue:

# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.00188be16805	no		eth0
							tap0

Neste caso, o IP não ficará nem na eth0 e nem na tap0, mas sim na br0:

# ifconfig 
br0       Link encap:Ethernet  HWaddr 00:28:0b:ef:58:75  
          inet addr:10.10.10.2  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: fe80::218:8bff:fee1:6805/64 Scope:Link

Bom, chega de teoria. Os links acima possuem todo o background necessário para que você entenda a coisa passo-a-passo. Vamos logo para o que interessa: Os arquivos de configuração:

Arquivo openvpn.conf no servidor?

# /etc/openvpn/openvpn.conf
# Objetivo: Clientes remotos conectarem no mesmo range da LAN local sem roteamento
proto udp
port 1194
 
# bridge utiliza a interface "tap" em vez da "tun"
# (o tap transmite pacotes de broadcast e o tun não)
dev tap0
 
# Faixa de IPs para os clientes
server-bridge 10.10.10.200 255.255.255.0 10.10.10.210 10.10.10.220
 
# No cliente eh necessário um
# route add -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 tap0
# para acessar a LP no Mexico 10.95.x.x
push "route 10.95.0.0 255.255.0.0 10.10.10.1"
 
# Compressão e persistência
comp-lzo
keepalive 10 120
ifconfig-pool-persist /etc/openvpn/ipp.txt
 
# Certificados
tls-server
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
 
# Logs e etc
status      /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 3
 
# Bridges para simular um mesmo switch entre a tap0 e a eth0
up /etc/openvpn/bridge-start
down /etc/openvpn/bridge-stop

Arquivo bridge-start:

#!/bin/bash
# /etc/openvpn/bridge-start
 
br="br0"
tap="tap0"
eth="eth0"
eth_ip="10.10.10.2"
eth_gw="10.10.10.1"
eth_netmask="255.255.255.0"
eth_broadcast="10.10.10.255"
 
for t in $tap; do
openvpn --mktun --dev $t
done
 
brctl addbr $br
brctl addif $br $eth
 
for t in $tap; do
brctl addif $br $t
done
 
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
 
ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
#route add default gw $eth_gw dev $br
route add -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 br0
 
iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT

Arquivo bridge-stop:

#!/bin/bash
# /etc/openvpn/bridge-stop
 
br="br0"
tap="tap0"
ifconfig $br down
brctl delbr $br
 
for t in $tap; do
openvpn --rmtun --dev $t
done 
 
route del -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 br0
ifdown eth0
ifup eth0
route add -net 10.95.0.0 netmask 255.255.0.0 gw 10.10.10.1 eth0

Arquivo no cliente:

# Cliente pode ser Linux ou Windows
remote 200.200.200.100
proto udp
port 1194
client
pull
dev tap
comp-lzo
keepalive 10 120
tls-client
ca ca.crt
cert tiagocruz.crt
key tiagocruz.key
ns-cert-type server 
verb 3

O resultado pode ser visto nos screnshoots abaixo:

openvpn

Como você deve ter percebido, apenas alguns ajustes foram necessários nos scripts que iniciam e derrubam as bridges. A parte mais chata foi automatizar a criação de rotas estáticas nos clientes, para que não fosse necessário usar o “route add” em toda a conexão. A linha do “push” resolveu este problema, inclusive apontando a rota para um host que diferente do servidor de VPN, que é o padrão.

Segue uma screnshoot mostrando o antes, o durante e o depois do super device tap :)

openvpn-rotas

Nos testes foram utilizadas as versões OpenVPN 2.1_rc7 x86_64-pc-linux-gnu no servidor rodando Ubuntu 8.04.3 LTS e o cliente OpenVPN 2.1_rc11 i486-pc-linux-gnu em um Ubuntu 9.04.

Também foi possível conectar usando a GUI do OpenVPN para Windows.

Abraços e até o próximo post! 8)

Segue uma apresentação que fizemos em este semestre na Pós-Graduação em Segurança da Informação, contendo temas como:

- Sniffer de senhas em plain text;
- Ataque de brute-force no SSH;
- Proteção: Firewall, IPS e/ou TCP Wrappers;
- Segurança básica no sshd_config;
- Chaves RSA/DSA para acesso remoto;
- SSH buscando chaves no LDAP;
- Porque prevenir o acesso: Fork Bomb

Download do arquivo: seguranca_acesso_remoto_ssh.pdf
Ou no Slide Share: ssh-seguranca-no-acesso-remoto