Archive for the ‘Linux’ Category

RAID: leitura interessante

segunda-feira, novembro 12th, 2007

“Vetor Redundante de Discos Independente é simplesmente um meio de se criar disco virtual que atuará como um ponteiro para um conjunto de unidades de armazenamento que ficam alocadas em posições diferentes de um vetor. Em outras palavras, é como se colocássemos vários discos rígidos em uma fila e possuíssemos um apelido para todos os disco rígidos da fila, independentemente da posição que ocupam. Desta forma, se tivermos 4 discos rígidos na fila e atribuíssemos…”Leia mais em: http://gelsol.lia.ufc.br/wiki/Artigos/RAID

Fonte: BR-linux

Posts em sites externos

segunda-feira, novembro 5th, 2007

http://br-linux.org/linux/apache-usando-modsecurity-com-o-wordpress
http://br-linux.org/linux/comparando-servicos-de-banda-larga-alternativa-movel-ou-localidade-remota
http://br-linux.org/linux/como-fazer-um-benchmark-de-aplicacoes-http
http://www.dicas-l.com.br/dicas-l/20071024.php
http://www.dicas-l.com.br/dicas-l/20071025.php

Guia rápido sobre Usabilidade

terça-feira, outubro 16th, 2007

Este é um Guia prático de consulta rápida para a criação de interfaces Web com usabilidade.

http://www.unifebe.edu.br/~andreza/index.htm
Por Andreza Sartori

Servidor para Ruby on Rails

terça-feira, outubro 9th, 2007

Qual servidor devo usar para rodar o RoR?

Estou fazendo testes baseados no artigo abaixo… comento depois as minhas impressões.

WEBrick, Apache, lighttpd ou Mongrel?
http://www.infoblogs.com.br/view.action?contentId=19796

Entrevista com Augusto Campos - O Guru da Efetividade

terça-feira, outubro 2nd, 2007

Augusto Campos é um dos principais blogueiros do Brasil e um dos únicos a ter dois sites na lista dos blogs mais acessados do país, o BR-linux.org e o Efetividade.net. Como gosto muito de entender o que se encontra por trás de tudo que conheço troquei alguns emails com o Augusto e solicitei um entrevista, que ele prontamente aceitou. A conversa abaixo transcorreu em um final de semana de rápidas trocas de email e pequenas mensagens para clarificar algumas partes do texto. Realmente Mr. Augusto é um primor de Efetividade!

Espero que esta entrevista lhe auxilie trazendo dicas e conselhos de um profissional que está no topo da Blogosfera brasileira!

Rodrigo Stulzer - Você criou o BR-linux em 1996, começando com tutoriais, etc. Quando ele adquiriu o formato básico de blogs, desde o seu início ou logo depois? E você sabia que estava criando um blog? Ou esta consciência só despertou depois?

Augusto Campos - Recentemente andei pesquisando os (incompletos) arquivos antigos do site…

Leia mais sobre a entrevista no site do Stulzer

HyperTerminal no Linux

quinta-feira, setembro 20th, 2007

Desde 1999 que eu mexo diariamente com o Linux, mas para mim sempre foi um sistema operacional pra servidor… nunca tinha usado ele de verdade como desktop, e a um tempinho comecei a usar o Ubuntu para começar a me desvincular no Weca. Esses dias precisei configurar um roteador e me deparei com um problema… Cadê o HyperTerminal nesta naba?

Vai a dica: GtkTerm muito bom, boa sorte!

SEO: URL Amigável

sábado, setembro 15th, 2007

Uma boa técnica de SEO(Search Engine Optiomation) é a utilização de URLs amigáveis, além de otimizar sua posição em mecanismos de busca ele fica muito mais agradável para o usuário, é mais fácil entender onde você está identificando a URL: www.seusite.com.br/secao/nome_da_secao do que acessando o site www.seusite.com.br?mod=section&section_id=129805 , não acha?

Para gerar regras é preciso conhecer expressões regulares, caso você não seja um expert no assunto, existe um gerador de regras para URL amigáveis no apache pode ser localizado em:
http://www.webmaster-toolkit.com/mod_rewrite-rewriterule-generator.shtml

Coloque estas regras no .htaccess de seu diretório.

No código-fonte da sua aplicação você precisará só mudar os links que apontavam para a URL mais confusa para este novo formado de url amigável e Bingo!
Agora você tem URL amigáveis sem mexer quase nenhuma linha em seu código-fonte.

Abraços,
FernandoCosta

Desenvolvendo Aplicações para celular com J2ME

sábado, setembro 15th, 2007

Um cliente me pediu um desenvolvimento de aplicações para SmartPhones e me deu como opção um BlackBerry e o Nokia E61, dois excelentes aparelhos, os dois são práticos e como o público alvo da aplicação é eram pessoa com mais de 40 anos, e por isso eu não estava certo se eles iriam utilizar, mas aparentemente esta sendo muito bom…

Algumas características dos aparelhos:

BlackBerry:
- o gateway de conexão com a internet é a própria RIM (não me agradou saber disso);
- o “mouse” é um botão de rolagem, a princípio é a coisa mais estranha do mundo parece que você não vai se acostumar, mas com pouco tempo de uso(pouco mesmo), você acaba se adaptando e ele se torna muito prático e você consegue usar quase tudo com uma única mão sem dificuldade;
- o navegador eu achei muito ruim, ele não trabalhava direito com JavaScript, não aceitava iframe, etc. parece ser bem limitado;

Nokia E61:
- Sistema operacional: Symbian (é um linux);
- Navegador é o opera (é fantástico, aceita tudo, e a tela útil parece maior que o blackberry);
- Possui suporte a um telefone IP via protocolo SIP, este eu não consegui testar até hoje;
- Suporta Conexão Wifi e Bluetooth;
- Cartão Mini SD hotswap;
- Roda aplicações J2ME;

Para este cliente acabei reaproveitando um código e o sistema adaptado foi todo via WEB (PHP), mas com o incentivo de um professor (Jordan - www.webpack.com.br ) acabei fazendo alguma brincadeira com o J2ME.

Primeiro quero deixar bem claro que eu tenho aversão a JAVA, para mim não existe nada tão ruim… para o desenvolvedor pode ser a melhor coisa do mundo, mas para o usuário final é uma naba, trava mais que windows, é mais lento que 286, etc… não vem ao caso, mas tenho que concordar que se ele roda bem nos celulares podemos e devemos usar esta linguagem.

Para quem quer desenvolver aconselho utilizar o ECLIPSE com o Wireless Toolkit, partindo do ponto que você já instalaou estas ferramentas, siga os passos abaixo:

1- Abra o Eclipse;
2- Clique em “New”, “Other”, e selecione o item “JAVA MIDLET SUITE”;

3- Avance no wizard do novo projeto até o fim;
4- Com um clique no o botão direito sobre o novo projeto, clique em “New”, “Other”, e selecione o item “JAVA MIDLET” - Não é o midlet suite!!;
5- Avance no wizard do novo midlet até o fim;
6- Cole o teste abaixo, se for preciso mude o nome da classe “teste” para o nome da sua classe java midlet:

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;public class teste extends MIDlet implements CommandListener {

private Display theDisplay;
private TextBox txbMensagem;
private Ticker tick;
private Form form1;
private TextField texto1, texto2;
private Command autenticar;
private Alert alert;

public void teste() {
theDisplay = Display.getDisplay(this);
texto1 = new TextField(”Nome:”,””,20,TextField.ANY);
texto2 = new TextField(”Senha:”,””,15,TextField.PASSWORD);

form1 = new Form(”Autenticação”);
form1.append(texto1);
form1.append(texto2);

tick = new Ticker(”Mensagem rolando”);
form1.setTicker(tick);
autenticar = new Command(”OK”,Command.OK,0);
form1.addCommand(autenticar);
form1.setCommandListener(this);
theDisplay.setCurrent(form1);
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub
}

protected void pauseApp() { // TODO Auto-generated method stub
}

protected void startApp() throws MIDletStateChangeException {
this.teste();
}

public void commandAction(Command cmd, Displayable arg1) {

// TODO Auto-generated method stub

  if (cmd == autenticar){
if(texto1.getString().equalsIgnoreCase(”aaa”)){
txbMensagem = new TextBox(”autenticado”,”",15,0);
theDisplay.setCurrent(txbMensagem);
}else{
alert=new Alert(”Atenção”,”nome inválido”,null,null);
alert.setTimeout(5000);
tick=new Ticker(”bé! senha errada”);
alert.setTicker(tick);
theDisplay.setCurrent(alert);
}
}
}
}

Agora para rodar este código no emulador é só clicar com o botão direito em cima da classe e logo em seguida nos botões RUN AS e EMULATED J2ME MIDLET ….

Legal né? fácil? também achei… Para publicar o código em seu celular é simples siga os passos:

1- Botão direito em cima do projeto;
2- Clique em J2ME e “CREATE PACKAGE”;
3- Agora é só copiar o .JAD e o .JAR que estão dentro da pasta deployed, dentro da pasta do projeto no workspace do eclipse para dentro do celular e instalar :)

Abraços,
Fernando Costa

Como fazer um Benchmark de aplicações HTTP

sábado, setembro 15th, 2007

Trabalho a 7 anos para um cliente com um banco de dados já bem ultrapassado, poucas pessoas conhecem ele, é o ZIM, e por ser bem antigo ele não possui nenhuma feature nativa para conexão com linguagens WEB, sendo assim, eu com mais um colega de trabalho que é desenvolvedor ZIM desenvolvemos conector PHP 2 ZIM para poder trabalhar, mas este conector trabalha com algumas limitações que ocasionalmente demandam um pouco mais de tempo de desenvolvimento, mas em momento nenhum impedem o desenvolvimento….

Tentando melhorar esta plataforma desenvolvi um “driver ODBC para ZIM” que tirou todas as limitações de comando no banco (ele não tirou a limitação de telas, mas nem é preciso, afinal de contas quem vai trabalhar com as telas é o HTML com PHP), ficou a coisa mais linda do mundo mas antes de sair implementando com esta nova ferramenta resolvi fazer um benchmark de um algoritmo rodando no sistema antigo e no sistema novo para ajudar na escolha de implementação.

Legal… mas como fazer um benchmark de aplicações HTTP?

Pesquisando encontrei três ferramentas:

  • httperf
    Ferramenta capas de fazer tudo a partir de simples requisições para simular clientes, disponível em: http://www.hpl.hp.com/personal/David_Mosberger/httperf.html
  • Apache Bench
    Ferramente simples de benchmarking, distribuida com o servidor web Apache.
  • Autobench
    É um script Perl script para automatizar uma série de testes no httperf em todo o servidor (um uma parte do servidor). Ele faz um “parse” na saída do httperf conseguindo exportas os dados para documentos CSV ou até mesmo gráficos. Disponível em: http://www.xenoclast.org/autobench/

A ferramenta chamada “ab” ou Apache HTTP server benchmarking tool, é uma simples e excelente ferramenta, consultando o manual(”man ab”) dá para incrementar o benchmark, mas basicamente dá para fazer assim:

ab -n [número de requisições] -c [número de conexões concorrentes] [http://site]

Exemplo:

[root@server ~]#  ab -n 100 -c 5 http://www.google.com.br/This is ApacheBench,
Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0

Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Copyright (c) 1998-2002 The Apache Software Foundation,
http://www.apache.org/Benchmarking www.google.com.br (be patient)…..done

Server Software:        gws

Server Hostname:        www.google.com.br

Server Port:            80

Document Path:          /

Document Length:        2976 bytes

Concurrency Level:      5

Time taken for tests:   8.54946 seconds

Complete requests:      100

Failed requests:        16

(Connect: 0, Length: 16, Exceptions: 0)

Write errors:           0

Total transferred:      328742 bytes

HTML transferred:       297542 bytes

Requests per second:    12.41 [#/sec] (mean)

Time per request:       402.747 [ms] (mean)

Time per request:       80.549 [ms] (mean, across all concurrent requests)

Transfer rate:          39.85 [Kbytes/sec] received

Connection Times (ms)

              min  mean[+/-sd] median   max

Connect:      161  170   7.3    172     196

Processing:   190  224  59.2    207     613

Waiting:      166  199  58.9    183     589

Total:        352  394  59.7    380     774

Percentage of the requests served within a certain time (ms)

50%    380

66%    384

75%    395

80%    400

90%    417

95%    532

98%    680

99%    774

100%    774 (longest request)

[root@server ~]#

HTTPERF

       httperf  [--burst-length  N] [--client I/N] [--close-with-
       reset] [-d|--debug  N]  [--failure-status  N]  [-h|--help]
       [--hog] [--http-version S] [--num-calls N] [--num-conns N]
       [--port N] [--rate X] [--recv-buffer N] [--send-buffer  N]
       [--server  S]  [--think-timeout X] [--timeout X] [--uri S]
       [-v|--verbose]  [-V|--version]  [--wlog  y|n,F]   [--wsess
       N,N,X] [--wset N,X]

Manual: http://www.hpl.hp.com/research/linux/httperf/httperf-man.txt

AUTOBENCH

O autobench pode ser executado desta forma:

autobench --single_host --host1 www.test.com --uri1 /10K --quiet
          --low_rate 20 --high_rate 200 --rate_step 20 --num_call 10
          --num_conn 5000 --timeout 5 --file resultado.tsv

O resultado deste comuando vai ser o arquivo resultado.tsv:

----------------------
dem_req_rate	req_rate_testhost	con_rate_testhost
min_rep_rate_testhost	avg_rep_rate_testhost	max_rep_rate_testhost
stddev_rep_rate_testhost	resp_time_testhost	net_io_testhost	errors_testhost
200	199.3	19.9	182.0	199.7	200.6	2.6	90.0	243.7	0
300	298.4	29.8	273.8	299.2	300.6	4.6	90.0	364.9	0
400	397.2	39.7	364.7	398.6	401.8	7.1	90.1	485.7	0
500	495.7	49.6	454.9	497.8	501.8	10.1	90.1	606.0	0
600	593.7	59.4	546.0	596.7	601.8	13.6	90.1	725.9	0
700	691.5	69.1	637.6	695.6	700.2	16.7	90.1	845.5	0
800	788.8	78.9	728.6	794.1	802.8	20.7	90.1	964.4	0
900	885.9	88.6	819.5	892.8	900.4	24.3	90.2	1083.2	0
1000	982.5	98.3	910.6	991.1	1008.2	28.8	90.2	1201.3	0
1100	1078.8	107.9	1001.7	1089.1	1101.2	32.8	90.2	1319.0	0
1200	1175.0	117.5	1092.6	1186.5	1200.4	38.0	90.5	1436.6	0
1300	1270.4	127.0	1182.5	1283.1	1312.3	44.9	90.6	1553.3	0
1400	1365.8	136.6	1273.3	1381.7	1401.1	47.8	91.4	1669.9	0
1500	1459.3	145.9	1341.9	1474.6	1505.1	65.1	100.8	1784.2	0
1600	1549.5	155.0	1414.9	1561.9	1607.7	72.6	124.2	1894.5	0
1700	1619.9	162.0	1443.8	1628.7	1726.8	96.6	212.4	1980.6	0
1800	1580.3	158.3	1478.3	1656.2	1757.1	100.2	282.6	1932.2	0.016025641025641
1900	1636.8	165.6	1481.0	1646.9	1759.6	118.4	300.1	2001.2	0.115314586283633
----------------------
2000	1641.5	173.0	1502.6	1659.1	1741.4	94.3	312.5	2006.9	0.53740779768177

Um exemplo de gráfico gerado pelo autobench:

Agora com o tempo de execução eu cheguei a conclusão que a nova versão precisa de melhorias na performance, pois a antiga ainda está ganhando :(

Abraços,
Fernando Costa

Fontes:
http://www.xenoclast.org/autobench/
http://www.hpl.hp.com/research/linux/httperf/
http://www.apache.org/

Apache - ModSecurity e Wordpress

sábado, setembro 8th, 2007

IntroduçãoPra não reinventar a roda, e desenvolver um sistema de blog que eu confiasse (bom-prático-seguro), eu decidi utilizar o WordPress depois de pouca pesquisa na internet, confesso que fiquei em dúvida entre o WordPress e o Drupal, mas por “sorteio” acabei escolhendo o Wordpress mesmo sem conhecê-lo a fundo.

E agora, confiar ou não confiar no código?

Depois de algumas experiências frustantes com alguns pseudo-CMS (não vou falar nomes para não ofender ninguém), decidi por não confiar em código nenhum, sendo assim tive que estudar alguma técnica de segurança externa ao código do WordPress, pois por ele a única coisa que quero fazer eu mantê-lo sempre atualizado no meu servidor.

A melhor prática de segurança para mim é o BACKUP, e como esta prática já esta sendo feita parti para outra técnica pró-ativa e não reativa.

O apache possui diversos módulos, confesso que entendo um pouco sobre cada um deles, sabia que existia formas de filtros com expressões regulares no apache, mas confesso que não conhecia o suficiente para me sentir seguro com meia dúzia de regras. O tal módulo de segurança é o ModSecurity.

Visão Geral

O ModSecurity funciona como um FIREWALL para aplicativos WEB, que foi desenvolvido exatamente com este princípio de dar segurança a aplicações web pois, segundo a documentação do ModSecurity, 70% de todos os ataques estão no nível de aplicações WEB tornando assim estes sistemas online seguros.

O ModSecurity é um WAF(Web Application Firewall) que funciona em tempo real, sendo assim ele tem o poder de detectar, e impedir um ataque antes de chegar a aplicação web. Uma grande vantagem de utilizá-lo e por ele prover a segurança independente de alterações no código da aplicação, sem alterações na rede, e diferentemente de outros IDS (Intrusion detection system), ele trabalha com dados Criptografados ou Compactados sem problema algum pois no momento que ele aplica suas regras, estes dados não estão compactados ou criptografados.

É possíve implementar o ModSecurity usando o ProxyPassReverse também, isso significar que é possível fazer um proxy/firewall HTTP que protege todos os servidores que ficam “abaixo” dele.

Lógica de Funcionamento

O ModSec. funciona da seguinte forma:
- Baseado em regras ele detecta tentativas de ataques;
- As regras seguintes determinam as ações a serem tomadas caso seja detectada a tentativa de ataque;

Utilização

Agora que já sabemos quem é, e como funciona o modsecurity, e como eu não tenho pretensão em fazer um Manual dele neste post e sim somente mostrar um técnica de como proteger um sistema intrinsicamente vamos para as regras:

É possível utilizar o ModSecurity em vários directivas dos Apache como VirtualHost, Location, LocationMatch, Directory, etc.

Abaixo um exemplo de utilização:

MANUAL ONLINE: http://www.modsecurity.org/documentation/modsecurity-apache/2.1.2/

<VirtualHost www.dominio_protegido.com.br>

# Definição do domínio deste VirtualHost
ServerName www.dominio_protegido.com.br

# Diretório raiz do site
DocumentRoot /home/www.dominio_protegido.com.br

# Sim, para habilitar o motor de filtros
SecFilterEngine On

# Habilita o filtro em requisições HTTP do tipo POST
SecFilterScanPOST On

# Habilita o filtro nas respostas das requisições HTTP
SecFilterScanOutput On

# Check URL encoding
SecFilterCheckURLEncoding On

# This setting should be set to On only if the Web site is
# using the Unicode encoding. Otherwise it may interfere with
# the normal Web site operation.
SecFilterCheckUnicodeEncoding Off

# Only allow certain byte values to be a part of the request.
# This is pretty relaxed, most applications where only English
# is used will happily work with a range 32 - 126.
SecFilterForceByteRange 1 255

# Audit log logs complete requests. Configured as below it
# will only log invalid requests for further analysis.
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log

# Command execution attacks
SecFilter /etc/password
SecFilter /bin/ls
SecFilter /bin/lynx
SecFilter /bin/wget
SecFilter /bin/curl
SecFilter /bin/links

# Directory traversal attacks
SecFilter “\.\./”

# XSS attacks
SecFilter “<(.|\n)+>”
SecFilter “<[[:space:]]*script”

# SQL injection attacks
SecFilter “delete[[:space:]]+from”
SecFilter “insert[[:space:]]+into”
SecFilter “select.+from”

# MS SQL specific SQL injection attacks
SecFilter xp_enumdsn
SecFilter xp_filelist
SecFilter xp_availablemedia
SecFilter xp_cmdshell
SecFilter xp_regread
SecFilter xp_regwrite
SecFilter xp_regdeletekey

# Protecting a vulnerable script
# Some PHP applications are vulnerable when a register_globals configuration option is turned on,
# allowing attackers to set an internal variable to a value of their choice. This usually leads to
# attacker executing some code on the server. Here is an example from the real world (Cafelog
# b2, http://www.securityfocus.com/bid/7786):

SecFilterSelective ARG_b2inc “!^$”

# Protecting from XSS attacks through the PHP session cookie
# PHP versions prior to 4.3.2 are vulnerable to XSS attacks carried out through the session
# identifier (http://www.securityfocus.com/bid/7761). If you can’t upgrade your PHP version to
# the latest version you can still protect yourself:

SecFilterSelective ARG_PHPSESSID “!^[0-9a-z]*$”
SecFilterSelective COOKIE_PHPSESSID “!^[0-9a-z]*$”

# Stop FormMail from being used to send spam
# Some versions of FormMail can be used to send email to arbitrary email addresses. The
# following rule demonstrates how you can have a filter applied only to certain locations, in this
# case just the FormMail script. The request will be rejected if the email is intended to any address
# except the one ending in “@modsecurity.org”:

<Location /cgi-bin/FormMail>
SecFilterSelective “ARG_recipient” “!@modsecurity\.org$”
</Location>

# Restrict administrative login to an IP address
# Here is a nice one. I have this application where the administrator logs in through the same log
# in panel as other users, but I still wanted to restrict administration login to certain IP addresses.
# So I used two chained rules. The second rule will apply only if the first rule matches; in this case
# - if the incoming username is “admin”.

SecFilterSelective ARG_username admin chain
SecFilterSelective REMOTE_ADDR “!^ADMIN_IP_ADDRESS_HERE$”

# Preventing information leak
# In all versions of PHP, if a fatal error occurs the script will be terminated immediately (standard
# error handling routine will not be invoked). Information leak through these problems can be
# prevented by scanning the output and preventing it from reaching the user if it contains error
# messages.

SecFilterSelective OUTPUT “Fatal error:”

# Detecting intrusions
# Output filtering can also be used to detect successful intrusions. These rules will monitor output
# and detect typical keywords resulting from a command execution on the server.

SecFilterSelective OUTPUT “Volume Serial Number”
SecFilterSelective OUTPUT “Command completed”
SecFilterSelective OUTPUT “Bad command or filename”
SecFilterSelective OUTPUT “file(s) copied”
SecFilterSelective OUTPUT “Index of /cgi-bin/”
SecFilterSelective OUTPUT “.*uid\=\(”

# Você poderá precisar desta opção habilitada depois mas nunca deixe
# esta opção habilitada por definitivo pois debugar as regras pode deixar
# o servidor muito lento
SecFilterDebugLevel 0
SecFilterDebugLog logs/dominio_protegido.com.br-modsec_debug_log

# A ação padrão tomada para requisições negadas é o status 500
SecFilterDefaultAction “deny,log,status:500″

# Escreva suas regras do mod_security aqui
# …
</VirtualHost>

Para fazer regras efetivas é necessário ter conhecimentos de cabeçalhos e corpos de requisições e respostas HTTP, e ter uma mente bem fértil para imaginar as falcatruas que usuários ou programas mal-intencionados podem fazer… boa sorte em suas construções!

Algumas regras