Categorias
Linux

SSH reverso

O SSH é uma das ferramentas mais versáteis para Linux, mas a maioria das pessoas o utiliza apenas de uma maneira - usando o servidor para enviar dados para o cliente. O que provavelmente você não sabe é que também é possível trocar a lógica usual SSH e usar o cliente para enviar dados ao servidor. Pode parecer contratintuitivo, mas este acesso pode evitar que você tenha que reconfigurar roteadores e firewalls, e é também muito cômodo para acessar a rede corporativa de casa sem VPN.

É necessário instalar o servidor OpenSSH na sua estação de trabalho e a partir de então você deve digitar o que está a seguir para contruir um túnel para a porta SSH na sua máquina de casa.

ssh -R 1234:localhost:22 home_machine

Substitua home_machine pelo endereço IP da sua máquina de casa. Usamos a porta número 1234 na máquina de casa para a sessão de SSH encaminhada e esta porta precisa estar disponível para ser usada e desbloqueada pelo firewall local. Uma vez que você tenha configurado a conexão no trabalho, já pode digitar o seguinte para acessar as máquinas do trabalho de casa:

ssh workusername@localhost -p 1234

Todas as sessão da sua máquina do trabalho serão abertas e você poderá trabalhar como se estivesse no escritório. Não é difícil de modificar o mesmo processo para acessar arquivos do servidor ou até mesmo áreas de trabalho remotas usando VNC. O único problema que você pode encontrar é a expiração do tempo da primeira sessão SSH. Para resolver isso, abra /etc/ssh/sshd.conf na sua máquina do trabalho e tenha certeza de que contém 'KeepAlive yes' e 'ServerAliveInterval 60', pois com isso a conexão não cairá automaticamente.

Categorias
Linux

Ponha seus cds em ordem

Verdadeiros hackers Unix sabem que mudar diretórios pode ser feito de várias maneiras diferentes, e com várias características diferentes, então em breve qualquer um aprenderá que o humilde comando cd pode, na verdade, ser o melhor amigo deles. Você já deve saber que cd ~ lhe leva para o seu diretório home, mas hackers de verdade não gastam dois comandos em nada: apenas digite cd para ter o mesmo resultado. Se você apenas pôr em ordem aquele pequeno rabisco, ~ se torna - e você tem cd -, o comando para navegar de e até o próximo diretório.

Para usuários mais avançados, cd - não é suficiente, porque ele apenas permite que você vá entre o diretório atual e o anterior. Um esquema melhor é usar pushd e popd no lugar de cd. Desta maneira, ao invés de digitar cd diretorio, use pushd diretorio - isto lembra seu atalho completo. Quando você quer dar passos para trás, apenas digite popd e vá para o diretório anterior.

Finalmente, você não odeia quando você está em um diretório simbólico e você não tem idéia de onde está? Pior, executando pwd para imprimir o diretório de trabalho o faz parecer que você não está em um diretório simbólico. Se isto acontecer com você, apenas use o parâmetro -P (pwd -P) para resolver o link simbólico e mostrá-lo aonde você está. E se você quer entrar no diretório real ao invés do link simbólico, apenas use cd 'pwd -P'.

Categorias
Linux

Crie pacotes

Baixar o código-fonte de uma aplicação e compilar você mesmo. Esta é uma tarefa clara para 90% dos programas que existem por aí, mas pode causar problemas com dependências. Enquanto os vários gerenciadores de pacotes possuem seus meios de trabalhar com as dependências, aqui vai outra.

Quando construir a partir do fonte usando o próprio método padrão de ./configure && make && make install, instale CheckInstall primeiro. Você pode pegá-lo em www.asic-linux.com.mx/~izto/checkinstall caso não esteja nos repositórios da sua distribuição. Execute-o ao invés de make install que, no lugar de instalar os novos arquivos diretamente no seu sistema de arquivos, irá primeiro montar um pacote e então instalá-lo. CheckInstall funciona com pacotes Deb, RPM e Slackware. Você pode especificar o tipo no arquivo de configuração ou esperar que ele pergunte quando executado

./configure && make && checkinstall

Além do tipo de pacote, CheckInstall irá perguntar por outros detalhes. A maioria é opcional ou pode ser deixada no valor padrão, mas tenha certeza de que o nome é igual ao da versão anterior que você está substituindo, ou então o seu gerenciador de pacotes ficará confuso. Instalar com CheckInstall também permite a remoção simples do pacote, pois não há necessidade de manter o diretório fonte por perto e alguns programas nem possuem a opção make uninstall.

Categorias
Linux

Recupere espaço em disco

Ocupar 100% de uma participação pode ter um efeito desagradável no seu sistema. Quando serviços e outros programas não podem escrever nos seus arquivos de log ou não podem salvar dados em /var, você pode estar com problemas. Estes programas não poderão salvar seus dados e tipicamente encerrarão (ou, em alguns casos extremos, quebrar dramaticamente!). Para evitar isto, os sistemas de arquivo ext2 e ext3 reservam 5% da sua capacidade somente para processos root. Esta é uma boa idéia, mas 5% é muito em discos grandes - por exemplo, são 25GB num disco de 500GB. Além disso, não há necessidade de reservar nenhum espaço em um sistema de arquivos que não são usados para arquivos root, como /home.

A boa notícia é que isso pode ser alterado. Tune2fs é utilizado para ajustar vários parâmetros de um sistema de arquivo ext2 (ou ext3). Pode ser usado para trocar a etiqueta de um volume ou o número de montagens entre execução forçada do fsck e a hospedagem de outro, e outras configurações esotéricas, mas as opções nas quais estamos interessados são -m e -r. O primeiro altera o percentual dos blocos do sistema de arquivos reservados para o superusuário, enquanto o segundo usa um número absoluto de bloco. Então:

tune2fs -m 2 /dev/sda1

reduz a área reservada para 2% do sistema de arquivos, o que pode ser mais apropriado se você tem um sistema de arquivos grande em / ou /var. Se você está usando um disco de 500GB ou maior, esta é a melhor opção.

Esta linha de código:

tune2fs -r 0 /dev/sda1

define que o sistema de arquivos não terá blocos reservados, uma boa configuração para /home que não precisa de área reservada para o superusuário.

Categorias
Linux Segurança

Bloqueie os script kiddies

Você já está cheio do seu log de sistema lhe entupir com relatórios de centenas (ou até milhares) de falhas de tentativas de autenticação SSH por script kiddies buscando entrar na sua máquia?

Eles não causam dano enquanto estiverem falhando mas ainda assim incomodam. Mas há algumas maneiras de evitá-las. A melhor - desde que você nunca precise de acesso SSH de fora da sua rede - é fechar a porta 22 do seu roteador, e ninguém poderá entrar. Outra opção é executar um programa como Fail2ban ou DenyHosts. Eles vigiam seu arquivo de log por falhas de tentativas de login repetidas pelo mesmo endereço IP e adiciona o IP nas regras do seu firewall para bloquear qualquer futuro contato do remetente por um tempo.

A terceira opção é ridiculamente fácil. Tentativas de quebra de SSH geralmente assume que o SSH é executado na porta padrão 22; mude para uma alta e aleatória porta e as tentativas de quebra desapareção por mágica. Altere /etc/ssh/sshd_config e modifique a diretiva de escuta para algo como:

Listen 31337

e reinicie o sshd. A única desvantagem disso é a incoveniênica de precisar adicionar esta porta no commando ssh cada vez que você se autentica, mas você pode usar um apelido para lidar com isso:

alias myssh ssh -p 31337
Categorias
Linux

SSH sem senha

Usar SSH para conectar a um computador remoto é conveniente, mas há algumas desvantagens. Uma delas é que você precisa digitar a senha a cada vez que você conecta, o que é incômodo num terminal interativo mas inaceitável em um script, pois você precisa que a senha esteja no script. O outro é que uma senha pode ser quebrada. Uma senha longa, aleatório e complexa ajuda, mas torna as autenticações interativas ainda mais incovenientes. É mais seguro ativar o SSH para funcionar sem senhas de uma vez. Primeiro, você precisa ativar um par de chaves para o SSH usando ssh-keygen como este para gerar chaves RSA (mude o argumento para dsa em chaves DSA).

ssh-keygen -t rsa

Serão criados dois arquivos em ~/.ssh, id_rsa (ou id_dsa) com sua chave privada e id_rsa.pub com a sua chave pública. Copie a chave pública para o computador remoto e adicione-a na lista de chaves autorizadas com

cat id_rsa.pub >>~/.ssh/authorized_keys

Agora você pode sair da sessão SSH e iniciá-la novamente. Você não será solicitado a entrar com senha, embora se relacionar uma frase-senha para a chave você será solicitado a digitá-la. Repita isso para cada usuário e cada computador remoto. Você pode fazer isto de maneira ainda mais segura ao adicionar

PasswordAuthentication no

a /etc/ssh/sshd_config. O SSH passará a recusar todas as conexões sem uma chave, tornando a quebra de senhas impossível.

Categorias
Linux

Conserte senhas corrompidas com chroot

Se você é o administrador de sistema responsável por missões críticas em data centers ou se trabalha em casa, Live CDs são maravilhosos para ter em volta para quando você estiver com um problema. Se você gerencia para bagunçar alguma coisa, você pode iniciar de um Knoppix, Ubuntu, GRML ou um dos outros vários Live CDs, montar as partições do disco rígido e editar qualquer dois arquivos que necessitam de recuperação. Contudo, há algumas coisas que não podem ser corrigidas facilmente, porque elas precisam que você esteja no próprio sistema que precisa de correção.

A solução é usar o comando chroot (mudar root), que configura um ambiente de trabalho dentro de um diretório. Perceba que o root do nome se refere ao root do diretório e não ao usuário root (ou superusuário) embora o usuário root seja o único permitido a executar este comando. Chroot cria um sistema 'enjaulado' dentro do diretório especificado, um que não tem acesso ao restante do sistema e pensa que o diretório informado é o diretório root. Para corrigir uma senha, por exemplo, você deveria iniciar de um Live CD, montar o root do seu sistema de arquivos /mnt/tmp e fazer isto:

sudo -i
mount --bind /dev /mnt/tmp/dev
mount -t proc none /mnt/tmp/proc
chroot /mnt/bin/bash

A primeira linha é necessário para se tornar root no Ubuntu. As duas próximas tornam o /dev/ e o /proc diretórios disponíveis dentro do chroot, e a última entra no diretório que foi configurado executando um terminal Bash. Agora você pode executar passwd ou qualquer outro comando que precisar e encerrar com logout ou pressionando Ctrl-D para sair.

Categorias
Linux

Gulosos por tráfego de banda

Você já percebeu que sua conexão de internet se tornar bem mais lenta mesmo que você não esteja baixando nada? É pela maneira como algumas conexões de banda larga assimétrica são configuradas, se você saturar a taxa de tráfego para enviar arquivos, baixar arquivos se torna quase impossível.

Isto é por causa da maneira como o tráfego é colocado na fila pelo modem e pelo provedor de internet (ISP). Mesmo a mais lenta e mais baixa operação de tráfego, como usar um shell remotamente ou procurar um endereço DNS, se torna dolorosamente lenta ou expira. Se você está usando alguma coisa como um cliente BitTorrent para enviar arquivos, você pode limitar a taxa de envio, que evitará este problema. Alguns outros probramas, como rsync, tem uma característica similar, mas a maioria não possui. Da mesma maneira, executar dois programas assim continuará a causar problemas caso cada um tenha sido permitido a usar 90% do tráfego de envio.

Uma solução é um útil script chamado Winder Shaper. Ele utiliza o comando tc (traffic control) para limitar o uso completo do tráfego de banda para levemente abaixo do máximo disponível. Pege-o em https://github.com/magnific0/wondershaper, coloque o script whaper em alguma pasta - /usr/local/bin é uma boa escolha - e edite o inicio do script para se adaptar ao seu sistema. Defina DOWNLINK e UPLINK para logo abaixo da sua banda máxima (em kilobits/s) e execute-o. Você agora vai perceber que envio de arquivos pesados, como enviar fotos para o Flickr, não irá mais puxar seu modem para baixo. Quando você estiver contente com as definições, configure-o para ser executado na inicialização com qualquer método que sua distro use.

Categorias
Linux

Encontre arquivos perdidos

Alguma vez você salvou um arquivo, talvez um download, e então não conseguiu encontrá-lo? Talvez você o tenha salvo em um diretório diferente ou com um nome incomum.

O comando find é útil aqui:

find ~ -type f -mtime 0

e mostrará todos os arquivos do seu diretório home que forão modificados ou criados hoje. Por padrão, find conta dias a partir da meia-noite, então o valor 0 siginifica hoje.

Você deve ter usado a opção -name com o find antes, mas ele pode fazer muito mais. Estas opções podem ser combinadas, então, se o elusivo download foi um arquivo MP3, você pode reduzir a pesquisa com:

find ~ -type f -mtime 0 -iname '*.mp3'

As aspas simples são necessárias para para evitar que o shell fique tentando expandir o coringa, e -iname torna a combinação insensível ao caso.

Permissões incorretas podem causar erros obscuros algumas vezes. Você pode, por exemplo, ter criado um arquivo no seu diretório pessoal enquanto trabalhava como root. Para encontrar arquivos e diretórios que não peretencem a você, use:

find ~ ! -user ${USER}

O shell define a variável de ambiente USER para o usuário atual, e um ! muda o resultado para o próximo teste, então este comando encontra qualquer coisa no atual diretório do usuário que não pertencem a este usuário. Você pode até usar o find para corrigir permissões

find ~ ! -user $USER -exec sudo chown ${USER}:"{}" \;

A página man do find explica o uso de -exec e muitas outras possibilidades.

Categorias
Linux

A maneira fácil de compartilhar arquivos

O compartilhamento de arquivos com Samba ou NFS é fácil desde que você tenha tudo previamente configurando em ambos os computadores, mas e se você quer apenas transferir um arquivo para outro computador na rede sem o trabalho de configurar programas? Se o arquivos é pequeno, você pode enviá-lo por e-mail. Se os computadores estão na mesma sala e o uso do compartimento USB é permitido nos computadores, você pode usar a porta USB, mas há também outra opção.

Woof é um script Python que pode ser executado em qualquer computador com Linux (ou similar). O nome é um acrônimo para Web Offer One File (A Teia Oferece Um Arquivo), que o define muito bem, como se o fosse um servidor web a um clique. Não há nada a instalar; apenas baixe o script de www.home.unix-ag.org/simon/woof.html e o defina como executável, então compartilhe o arquivo digitando:

./woof /pasta/do/meuarquivo

Isto irá responder com uma URL que pode ser digitada em um navegador em outro computador na rede - nenhum programa além do navegador é necessário. Woof irá disponibilizar o arquivo para aquele computador e então retirá-lo (você pode usar a opção -c para deixá-lo disponível por mais de uma vez). Woof disponibiliza também um diretório, como:

./woof -z /um/diretorio

O diretório será compactado com gzip tarball e enviado, e você pode substituir -z por -j ou -u para ter um arquivo bzip ou tarball descompactado. Se outros gostarem do Woof e quiserem usá-lo, você pode até mesmo dar-lhes uma cópia com:

./woof -s