Pessoal, publiquei um artigo na Linux Magazine ed. 48 intitulado Regras de Conduta. O intuito deste artigo é aplicar o princípio do menor privilégio utilizando Posix Capabilities, que pode ser lido online através deste link. Como complemento desse artigo também melhorei o módulo do kernel que verifica as capacidades exigidas de um processo, o código fonte do módulo e como usar pode ser acessado no post Módulo Kernel Capable discovery.
“Neste final de semana um colega de faculdade me solicitou um guia com alguns comandos mais utilizados na distribuição Debian. Então acessei o Google e realizei uma pesquisa. Além de encontrar um guia (cartão de referência) dos comandos mais utilizados no Debian, também encontrei diversos guias com os comandos mais utilizados nas linguagens de desenvolvimento C, C++, Java, Perl, PHP, Python, Ruby, UML, XML, até mesmo um cartão de referência da linguagem SQL.”
Meu primeiro acesso a internet foi em 1996 na Escola Técnica Federal, fiquei maravilhado, na época o melhor buscador era o cadê.
Hoje as redes estão presentes cada vez mais em todos os ambientes que vivemos, muitas vezes nem notamos, mas telefonia celular, wireless, 3G, … são alguns exemplos de redes, que estão se tornando tão comuns nas nossas vidas que nem percebemos mais.
Para um usuário é simplesmente um clique com o mouse e esta ali toda a informação desejada. Todavia, para informação chegar até ao monitor, passa por uma gigantesca infraestrutura.
Saber como é formado um pacote ethernet, como ele trafega através de links de fibra ótica, rádio, satélite, cabos submarinos interligando continentes, roteadores, switch, switch nível 3, backbones e outra tecnologias de rede. Entender essa infraestrutura, é fascinante!
Os protocolos são as engrenagens que movimentam todo esse sistema. Olhando sobre o ponto de vista superficial parece uma sopa de letrinhas: HTTP, TCP/IP, ARP, DNS, FTP, ICMP, ….
Para quem tiver interesse em aprender o que cada protocolo faz e como faz, existem ótimos livros como por exemplo:
A título de curiosidade a Cooperative Association for Internet Data Analysis (CAIDA) , traçou a caminho de cada pacote de switch para switch e país para país, formando o mapa da internet.
Esses dados foram colhidos em duas semanas entre 01 a 17 de janeiro de 2008. Mais detalhes podem ser encontrados no site da CAIDA.
Hoje estamos cada vez mais dependentes da internet, assim como os chineses eram do ábaco.
A propósito se quiser saber mais sobre a história da china estou lendo um livro ótimo chamado: China uma Nova História.
A pergunta que fica é: Esse domínio da internet sobre nós é bom ou ruim?
Simples com o um applet chamado BGPlay @ Route Views . Para utilizar basta informar o endereço ip da rede, máscara de rede, e o intervalo de tempo. Após montar todos os grafos, a applet mostra a atividade do período selecionado.
Pessoal, todos que trabalhamos com notebook, temos o mesmo problema. Quando necessitamos colocar um HD externo é uma briga. Encontrei no mercado livre um conversor de usb para sata,ide 2.5″ e ide 3.5″ .
Conecta na porta USB e o computador reconhece como se fosse uma pendrive. Testei em Linux, Windows e no Playstation 2. Em todos funcionou muito bem. Para os HDs ide 3.5″ e Sata acompanha uma fonte externa, segundo o vendedor é possível colocar também gravador de DVD e CD, mas ainda não tive tempo de testar, mas acredito que funcione sem problema.
Resumindo uma excelente ferramenta para realizar manutenção e backups em notebooks, e até mesmo em micros em garantia que não dá para romper o lacre e adicionar um HD secundário.
Posix capabilities permite que as capacidades do super usuário root sejam delegadas a binários, possibilitando que usuários comuns possam executar um serviço. Usando esse recurso de forma correta pode-se executar serviços utilizando somente as capacidades mínimas, ao contrário de executar com todos os privilégios do root.
Publiquei um artigo na revista Linux Magazine Ed. 48 mostrando como usar Posix Capabilities para rodar serviços como: Samba, Dns e apache. Reduzindo os chances de acontecer um ataque de buffer overflow, onde se consiga abrir um terminal de super usuário.
Para descobrir as capacidades exigidas pelos serviços reescrevi o módulo de kernel capable_probe desenvolvido originalmente por Serge E. Hallyn. Na primeira versão usei jprobe ao invés de kprobe, fiz uma associação entre o valor numérico e a string. Ex. 21:CAP_SYS_ADMIN. Porém, esse código pode encher os logs do sistema, pois captura todos os processos que estão rodando. Para sanar o problema, reescrevi o módulo para que aceite como parâmetro o processo que se deseja monitorar, reduzindo dessa forma as mensagens duplicadas no log.
tail -f /var/log/messages
localhost Module capable_discovery inserted for discover the capabilities of "ping" process
localhost capability 21=CAP_SYS_ADMIN for ping
localhost capability 13=CAP_NET_RAW for ping
localhost capability 7=CAP_SETUID for ping
localhost capability 21=CAP_SYS_ADMIN for ping
localhost capability 21=CAP_SYS_ADMIN for ping
Como podemos ver o ping precisa das capacidades 7,13,21
Após usar o módulo devemos removê-lo com o seguinte comando:
rmmod capable_discovery
Confirmando a remoção do módulo irá aparecer nos logs a seguinte mensagem:
Nov 16 11:57:06 localhost Module capable_discovery unregistered
Para monitar outro processo o módulo deve ser recarregado passando como parâmetro o nome do processo.
Qualquer dúvida,sugestão, crítica ou elogio, deixe um comentário.
A extensão nrg é um arquivo do Nero Burning Rom, que é usado para criar e queimar imagens ISO 9666.
Mas as vezes não queremos queimar um DVD ou CD, somente necessitamos acessar o conteúdo.
Como o Linux sempre tem solução pra tudo. Podemos montar a imagem nrg, com o seguinte comando:
Utilizando a versão 8.2.7 do Postgresql verifiquei a possibilidade de criar funções aninhadas.
Veja o exemplo:
CREATE OR REPLACE FUNCTION testNestedFunction() RETURNS REAL as
$$
<>
DECLARE
v_test REAL;
r REAL;
BEGIN
CREATE OR REPLACE FUNCTION addTest(a REAL,b REAL) RETURNS REAL AS
$BODY_ADDTEST$
DECLARE
r REAL;
BEGIN
r := a + b;
RETURN r;
END;
$BODY_ADDTEST$language plpgsql;
r := addTest(1,1);
RAISE NOTICE 'addTest = %',r;
r := addTest(2,2);
RAISE NOTICE 'addTest = %',r;
RETURN r;
END global;
$$ LANGUAGE 'plpgsql';
Na função acima criei uma função aninhada chamada addTest(REAL,REAL) recebendo como parâmetro dois valores do tipo real, com os quais é efetuado uma soma e retornado o resultado. Executando a função temos o seguinte resultado:
SELECT testNestedFunction();
NOTA: addTest = 2
NOTA: addTest = 4
Tempo total de execução da consulta: 18 ms.
1 registros recuperados.
Como pode ser visto foi realizado duas chamadas a função aninhada addTest() passando diferentes parâmetros.
O interessante é que o Postgresql cria duas funções: testNestedFunction() e addTest(REAL,REAL). E não somente uma função aninhada, isso favorece aos bugs, vamos simular um então.
Vamos deletar a função addTest(REAL,REAL) e executar novamente.
DROP FUNCTION addtest(real, real);
SELECT testNestedFunction();
ERRO: cache lookup failed for function 1906343
CONTEXT: PL/pgSQL function "testnestedfunction" line 16 at assignment
********** Erro **********
ERRO: cache lookup failed for function 1906343
SQL state: XX000
Contexto: PL/pgSQL function "testnestedfunction" line 16 at assignment
O comando DROP FUNCTION addTest(REAL,REAL) não verificou que a função testnestedfunction() é depende daquela para sua execução, procurei na documentação uma maneira de declarar a dependência mas não encontrei. Outro detalhe interessante é que a função addTest() não existe até a primeira execução, ou seja, quando o comando é executado SELECT testnestedfunction() pela primeira vez a função addTest() é criada. Então quando deletamos a função addTest() e executamos novamente o comando SELECT testnestedfunction(), a função addTest() não é criada novamente.
Funções aninhadas são interessantes para melhorar a leitura do código e prover reutilização de código. O problema é se por acidente algum DBA deletar a função aninhada como mostrado acima. Irá causar um bug difícil de resolver. Pois, a resposta do erro é pouco intuitiva não informando claramente a função que não foi encontrada.
Criar funções separadas é uma outra solução invés de criar uma função aninhada. Mas, o problema que dificulta a leitura e entendimento do código.
A linguagem PL/PGSQL permite a criação de blocos de código. Com essa característica é possível definir o escopo das variáveis. Sendo um recurso interessante para deixar o código mais legível, auxiliando também na depuração do código.
As variáveis existem no momento da declaração do bloco até o final do bloco onde a variável é declarada.
Rótulos podem ser adicionados aos blocos para melhorar a leitura e também para qualificar as variáveis que existem dentro do bloco. Os blocos de código são definidos da seguinte forma:
<
Como exemplo vamos criar uma função onde teremos dois blocos global e local, com uma variável declarada no bloco global com o nome v_test do tipo real e outra variável também declarada com o nome v_test dentro do bloco local. Veja o exemplo:
CREATE OR REPLACE FUNCTION test() RETURNS VOID as
$$
<>
DECLARE
v_test REAL;
BEGIN
v_test := 1;
<>
DECLARE
v_test REAL;
BEGIN
v_test :=2;
RAISE NOTICE 'global.v_test = %, v_test = %',global.v_test,v_test;
END local;
RAISE NOTICE 'Global v_test = %',v_test;
END global;
$$ LANGUAGE 'plpgsql';
Resultado da execução:
select test();
NOTA: global.v_test = 1, v_test = 2
NOTA: Global v_test = 1
Tempo total de execução da consulta: 6 ms.
1 registros recuperados.
Essa função demonstra claramente o escopo da variáveis e também demonstra que podemos ter sub blocos de código dentro de uma função.
É importante notar que BEGIN/END é utilizado para agrupar as declarações da linguagem PL/PGSQL e também como comandos de controle de transações. Mas, um detalhe interessante é que funções e triggers não podem iniciar ou encerrar transações e o Postgresql não suporta transações aninhadas.
Ontem foi a gota d’água!! Começei um download as 22:00H, já era 00:30H e nada do download terminar, faltava 40% para o download terminar, e estava louco de sono. Então me inspirei e desenvolvi um pequeno script em Python, para desligar o notebook após o download ser concluído.
Utilizei o firefox para realizar o download, o qual possui a característica de adicionar ao nome do download a extensão .part. Através desse princípio desenvolvi o script, o qual verifica a existência do arquivo *.part, existindo o arquivo o script dorme por um minuto, quando o arquivo deixar de existir o computador será desligado.
import os.path
from time import sleep
import commands
while 1:
if os.path.exists('/home/marlon/downloads/teste.rar.part'):
print 'espera 1 minuto'
sleep(60)
else:
os.system("poweroff")
Hoje pela manhã, o computador estava desligado!
A linguagem Python é muito versátil e elegante, excelente para desenvolvimento rápido. Este script pode ser modificado para tomar a decisão através do tamanho do arquivo, que com Python pode ser descoberto através do método os.path.getsize(‘file’).