Chrooted Shell com PAM (Jail)
Primeiro instale o pacote libpam-chroot
# apt-get install libpam-chroot
Configure o ambiente chrooted. No exeplo estou utilizando o user admin e o jail em /home/chroot.
Adicione a linha abaixo em /etc/security/chroot.conf
admin /home/chroot
Crie o usuário admin normalmente:
# useradd -d /home/admin -s /bin/sh admin
# passwd admin
Insira a linha abaixo nos arquivos /etc/pam.d/ssh e /etc/pam.d/login.
# Chroot features
session required pam_chroot.so debug
Depois finalizamos o ambiente chrooted executando scripts que se encontram em /usr/share/doc/libpam-chroot/examples/
# cd /usr/share/doc/libpam-chroot/examples/
# chmod 750 *.sh
Devemos fazer pequenas correções em dois scripts
1. No script setup-chrootdir-shell.sh
Alterar as linhas que contenham:
/bin/ln
por
/bin/cp
2. No script setup-chrootdir-template.sh
Alterar a variável DIRECTORIES para:
DIRECTORIES="bin dev lib"
3. O scripts setup-chrootdir-rsync.sh, deve ser executado apenas se desejar utilizar o "rsync"
Executar os scripts como abaixo:
./setup-chrootdir-shell.sh /home/chroot/
./setup-chrootdir-template.sh /home/chroot/Caso deseje utilizar rsync
./setup-chrootdir-rsync.sh /home/chroot/
Filizando copiamos o passwd e o PAM
# cd /home/chroot
# mkdir -p etc/pam.d/
# cp /etc/passwd etc/
# cp -r /etc/pam.d/* etc/pam.d/
OBS.: Se estive utilizando o shell "/bin/sh"
# cd /home/chroot
# cp /bin/sh bin/
# ldd bin/sh
linux-gate.so.1 => (0xffffe000)
libncurses.so.5 => /lib/libncurses.so.5 (0xb7efd000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7ef9000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7dc7000)
/lib/ld-linux.so.2 (0xb7f46000)
# cp /lib/libncurses.so.5 lib/
# cp /lib/ld-linux.so.2 lib/
Se durante o logon a conexão finalizar com a seguinte mensagem "Conection Closed", altere o /etc/ssh/sshd_config conforme abaixo":
UsePrivilegeSeparation yes
para
UsePrivilegeSeparation no
NOTA:
Algumas vezes faz se necessário as bibliotecas libnss_*
# cp /lib/libnss_* lib/
Chrooted Shell com RSSH (Jail)
Primeiro vamos instalar o pacote do rssh.
# apt-get install rssh
Depois criamos a seguinte configuração no arquivo /etc/rssh.conf:
logfacility = LOG_USER
allowscp
allowsftp
umask = 022
user=admin:011:00011:"/home/chroot"
Onde os paramêtros são:
user=<login>:<umask>:<service>:"<chroot directory>"
Verifique se no arquivo /etc/shells existe a entrada "/usr/bin/rssh".
Agora montamos o ambiente do usuário em chroot (Jail)
# mkdir /home/chroot
# cd /home/chroot
# mkdir bin/
# mkdir dev/
# mkdir -p etc/pam.d
# mkdir -p home/admin
# mkdir -p usr/bin
# mkdir -p lib/tls/i686/cmov
# mkdir -p usr/lib/rsh
# mkdir -p usr/lib/openssh
# mkdir -p usr/lib/i686/cmov
Depois é necessário copiar os programas e as bibliotecas correspondentes de cada um.
# cp /etc/passwd etc/
# cp -r /etc/pam.d/* etc/pam.d/
# cp /usr/bin/scp usr/bin/
# cp /usr/bin/sftp usr/bin/
# cp /usr/bin/rssh usr/bin/
# cp /usr/lib/rssh_chroot_helper usr/lib/
# cp /usr/lib/rssh/rssh_chroot_helper usr/lib/
# cp /usr/lib/sftp-server usr/lib/
# cp /usr/lib/openssh/sftp-server usr/lib/openssh/
Agora basta copiar as bibliotecas referente a cada programa, para isto use o comando "ldd". De acordo com o exemplo abaixo
# ldd /usr/bin/scp
linux-gate.so.1 => (0xffffe000)
libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb7f75000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb7e3b000)
libutil.so.1 => /lib/tls/i686/cmov/libutil.so.1 (0xb7e36000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7e22000)
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7e0c000)
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7dde000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0xb7dc2000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0xb7d46000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0xb7d20000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0xb7d1d000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0xb7d18000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7be7000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7be3000)
/lib/ld-linux.so.2 (0xb7f90000)
#
Como processo é demorado e repedito, utilize o script no link abaixo:
Por último vamos criar o usuário.
# useradd -d /home/chroot/home/admin -s /usr/bin/rssh
# password adminCaso user já exista
# usermod -d /home/chroot/home/admin -s /usr/bin/rssh admin
OBS.:
Lembre-se de atualizar o passwd para o ambiente chrooted.
Finalizamos com o restart do ssh.
service sshd restart
NOTA:
Algumas vezes faz se necessário as bibliotecas libnss_*
# cp /lib/libnss_* lib/
Colocar permissão de SUID para o arquivo rssh_chroot_helper
# chmod 4755 /usr/lib/rssh_chroot_helper
# chmod 4755 /usr/lib/rssh/rssh_chroot_helper
Caso contrário teremos a seguinte mensagem no syslog.
Jun 21 18:01:17 server rssh_chroot_helper[3120]: chroot() failed, 2: Operation not permitted
Se durante o logon a conexão finalizar com a seguinte mensagem "Conection Closed", altere o /etc/ssh/sshd_config conforme abaixo":
UsePrivilegeSeparation yes
para
UsePrivilegeSeparation no
How to Find
Busca por nome de arquivos e/ou diretórios (pode-se realizar busca com expressões regulares)
- Case sensitive
# find / -name "*.sh" -print
# find / -name apache2 -print
# find / -name "[Bb]ind*" -print
- Case insensitve
# find / -iname "*lock*" -print
Busca com dois parâmetros (AND/OR)
- Arquivos .sh e .ksh
# find / \( -name \*.sh -a -name \*.ksh \) -print
- Arquivos .sh ou .ksh
# find / \( -name \*.sh -o -name \*.ksh \) -print
Busca por owner
- User ID
# find / -user www
- Group ID
# find / -group bin
Busca por tipo de permissões
- Octal
# find /usr/sbin/ -perm +0500
# find /usr/sbin/ -perm -0664
# find /usr/sbin/ -perm 0775
- Symbolic
# find /usr/sbin/ -perm +ug=rx
# find /usr/sbin/ -perm -u=rw
# find /usr/sbin/ -perm o=r
Busca apenas no diretório corrente
# find /usr -name "*.txt" -maxdepth 1 -print
Busca no diretório corrente e desce um subdiretório
# find /usr -name "*.txt" -maxdepth 2 -print
Busca apenas no file system corrente (existindo por exemplo um file system /usr/aap, este será excluído da busca)
# find /usr -xdev -name "*.txt" -print
Busca mantendo no diretório corrente (não é preciso utilizar -depth)
# find /usr -name "*.txt" -prune
Busca por tipo
- Somente arquivos
# find / -name apache2 -type f -print
- Somente diretórios
# find / -name apache2 -type d -print
- Somente links
# find / -name apache2 -type l -print
- Arquivos no home do usuário com 2 hard links
# find $HOME -type f -links 2
- Arquivos no home do usuário com mais de 1 hard link
# find $HOME -type f -links +1
Busca por tamanho de arquivo
- Arquivos maiores que 5M
# find / -size +5000 -print
- Arquivos menores que 5M
# find / -size -5000 -print
- Arquivos exatamente igual a 5M
# find / -size 5000 -print
Busca de arquivos por data de: acesso, criação e modificação
- Arquivos acessados com mais de 3 dias
# find /etc -atime +3 -print
- Arquivos acessados com menos de 3 dias
# find /etc -atime -3 -print
- Arquivos modificados com mais de 5 dias
# find /etc -mtime +5 -print
- Arquivos modificados com menos de 5 dias
# find /etc/ -mtime -5 -print
- Arquivos criados com mais de 10 dias
# find /var -ctime +10 -print
- Arquivos criados com menos de 10 dias
# find /var -ctime -10 -print
- Arquivos modificados exatamente há 7 dias
# find /etc -mtime 7 -print
- Arquivos acessados nas útimas 24 horas
# find /etc -atime 0 -print
Busca de arquivos e/ou diretórios com exceção (imprime tudo exceto parâmetro informado)
# find /usr ! -name "*lib*" -print
# find /usr -not -name "*lib*" -print
Busca com execução de comandos na saída
- Lista detalhe dos arquivos encontrados (equivalente a opção "ls -dils")
# find /var/log/ -name "*.log" -ls
- Excluir todos os arquivos no /tmp com mais de 3 dias
# find /tmp/ -ctime +3 -exec rm -rf {} \;
- Excluir todos arquivos no /tmp com extensão .lock sem confirmação
# find /tmp/ -name *.lock -exec rm -rf {} \;
- Exlcluir todos arquivos no /tmp com extensão .lock com confirmação
# find /tmp/ -name *.lock -ok rm -rf {} \;
- Excluir arquivos com nome core (-delete apenas para GNU find)
# find / -name "*core*" -type f -delete
- Compactar todos arquivos no /tmp com extensões .tmp e .bak
# find /tmp/ \( -name \*.tmp -o \*.bak \) -exec gzip {} \;
- Busca arquivos dentro do homedir com permissões 664 e altera para 775
# find $HOME -xdev type f -perm 664 -exec chmod 775 {} \;
Nota: Abaixo seguem alguns exemplos de expressões regulares e formatação do resultado da busca.
- Busca todos arquivos criados com menos de 5 dias, exceto arquivos que contenham "svn" no nome.
# find . -ctime -5 -not -regex '.*svn.*' -print
- Busca arquivos modificados a mais de uma semana e que tenham as extensões .csh ou .ksh
# find . -mtime +7 -regex '.*[ck]sh*'
- Formanto da saída da busca
# find . -printf "%TY%TW:%p\n"
# find . -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\n'
# find . -printf '%p %a %m\n'
# find . -printf 'Name: %16f Size: %6s\n'
Importante: Descrição dos comandos acima.
%Ax - data do último acesso ao arquivo, formato da mesma definido em "x".
%Tx - data da última modificação do arquivo, formato da mesma definido em "x".d - dia do mês
D - data (dd/mm/aa)
h - mês (nome)
H - hora
m - mês (número)
M - minutos
S - segundos
T - hora (hh:mm:ss)
w - dia da semana
W - número da semana no ano
y - ano (2 digítos)
Y - ano (4 digítos)%a - data e hora do último acesso ao arquivo
%f - nome do arquivo (exclui PATH)
%m - permissões do arquivo (symbolic)
%p - nome do arquivo (inclui PATH)
%s - tamanho do arquivo (bytes)\n - quebra de linha
\t - tabulação horizontal
\v - tabulação vertical
OBS.: Neste artigo coloquei os arquivos que tenho utilizado diariamente, pois o comando find tem inúmeras possíbilidades, para explorá-las, basta dar uma lida no man. E lembrar também que todos os comandos poder ser mesclados, exemplos: busca por extensão de arquivo, permissão e mais de x dias acessados ou, busca por extensão x e y, tamanho e tipo de arquivo e etc...
Backup centralizado com rsync
Primeiro precisamos instalar o servidor de backup rsync
apt-get install rsync
Depois insira as configurações abaixo em /etc/rsyncd.conf
vim /etc/rsyncd.conf
# user/group de execução do daemon
uid = user
gid = user
log file = /var/log/rsyncd.log
# módulo de backup
[modname]
# diretório do backup, se necessário crie outros módulos
path = /home/user/backup
# usuários autorizados para o backup
auth users = user
# arquivo de usuário e senha
secrets file = /etc/rsyncd.secrets
# permite gravação
read only = false
# evita que as sessões de backup sejam listadas para outros usuários
list = false
hosts allow = 192.168.0.0/24
transfer logging = yes
log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
# eof
Depois de finalizada as confs, é necessário criar usuário e senha.
vim /etc/rsyncd.secrets
user:senha
chmod 600 /etc/rsyncd.secrets
chmod 600 /etc/rsync.conf
E por último habilite a inicialização do servidor rsync
vim /etc/default/rsync
RSYNC_ENABLE=true
Basta apenas inicializar o seu servidor de backup
/etc/init.d/rsyncd start
Para o rsync client não é necessário realizar nenhuma configuração, crie um arquivo com a senha do usuário de backup no rsync server
vim /etc/rsync.secrets
senha
chmod 600 /etc/rsync.secrets
Depois execute o comando para backup
rsync -Cravzp --delete --password-file=/etc/rsync.secrets /backupdir user@host::modname/
OBS.:
* Para cliente rsync Windows pode-se utilizar o DeltaCopy
* É possívelo realizar as criações de mais diretórios de backup, crie mais uma sessão no seu arquivo de configuração com por exemplo "[modname2]" e realize pequenas alterações como diretório para backup, usuário e senha. Não sendo necessário a criação de outro arquivo rsyncd.secrets, pois os usuários serão controlados através da permissões de acesso e da diretiva "auth users".
* Também é possível realizar cópias com o rsync através do ssh com o seguinte comando:
rsync -Cravzp /diretorio_origem sshuser@host:/diretorio/destino
* É por útimo podemos também sincronizar diretórios locais
rsync -Cravzp /diretorio/current /diretorio/sync
Filesystem superblock
Os blocos no filesystem são utilizados para duas diferentes finalidades.
Muitos blocos armazenam dados dos usuários
E alguns blocos em todos os filesystem armazem filesystem metadata, que é basicamente a descrição da estrutura do filesystem.
Onde cada filesystem contém um superblock que contém informações como tipo do filesystem, tamanho, status, estruturas de metadados e etc.
Isto é muito importante pois em uma situação de emergência é possível utilizar o backup superblock para recuperar o primário.
O camando abaixo exibe localização do primário e backup superblock
dump2fs /dev/sda3 | grep -i superblock
Quando você utiliza um filesystem em falha você pode corromper toda a estrutura de dados do filesystem.
Você pode corrigir este problema da seguinte forma (assumindo que a partiço /dev/sda3 é o filesystem /home)
umount /home
e2fsck -f /dev/sda3
Supondo que o comando não encontrou e superblock e retornou um erro, é possível contornar este problema utilizando o backup superblock. A localização do backup superblock denpende do tamanho dos blocos do filesystem.
=> 1K blocksize, no bloco 8193
=> 2K blocksize, no bloco 16384
=> 4k blocksize, no bloco 32768
Também podemos tentar localizar a localização do backup superblock com o comando
mk2fs -n /dev/sda3
ou
dump2fs /dev/sda3 | grep -i superblock
Para reparar o filesystem através do backup superblock utilizamos o seguinte comando
e2fsck -f -b 8193 /dev/sda3
OBS.: é recomendado que se faça um backup do filesystem antes de utilizar o e2fsck.
dd if=/dev/sda3 of=/opt/backupsda3.img
Criando uma partição ramdisk
A partição ramdisk é utilizada para leitura e gravação de dados, mas lembrado que a mesma é volátil (utiliza como gravação a memória RAM). Os dados contidos nesta partição ficam gravados enquando o sistem não é reiniciado.
Este tipo de partição é bastante útil caso você tenha apenas uma partição no seu Linux e precise de realizar backup de alguns arquivos porque o seu filesystem se encontra em read-only.
Primeiro passo criamos um device de 10MB
dd if=/dev/zero of=/dev/ram0 bs=1k count=10240
mk2fs -v -m 0 /dev/ram0 10240
mount -t ext3 /dev/ram0 /mnt
Assim teremos um ramdisk de 10MB e montando no /mnt como read-write
OBS.: Não desmonte o seu filesystem até que tenha realizado o backup dos dados necessário.
Backup de partições
Esta imagem pode ser criada de dua formas.
Primeira via dd
dd if=/dev/sda1 of=/tmp/backupsda1.img
Segunda utilizando cp
cp /dev/sda1 /tmp/partition
mkdir /mnt/espelho
mount -t ext3 -o loop /tmp/partition /mnt/espelho
Isto garante que você tenho um backup completo da sua partição, caso aconteça algum imprevisto com o seu filesystem.
Filesystem Inodes
O fundamental conceito de Linux filesystem é que cada objeto no filesystem é representado por um inode.
Onde os objetos apresentam atributos como: tipo de arquivo, tamanho de arquivo, permissões, ACLs e etc.
Todas estas informações estão guardadas no inode do arquivo, onde cada inode é identificado por um inode number no filesystem (este número é único, por isto index node).
Para visualizar o inode number de um determinado objeto
ls -i /var/log/syslog
Saída:
21250 /var/log/syslog
Pode também utlizar o comando stat para verificar o inode number e os atributos do objeto.
stat /var/log/syslog
Saída
File: `/var/log/syslog`
Size: 34520 Blocks: 20 IO Block: 4096 regular file
Divece: 341h/833d Inode: 21250 Links: 0
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2007-10-10 00:30:02. 000000000 +530
Modify: 2007-10-10 00:30:03. 000000000 +530
Change: 2007-10-10 00:30:03. 000000000 +530
Exemplo de utilização:
touch /tmp/\"teste*
Você não vai conseguir remover este tipo de arquivo, pois em seu nome contém caractes de controle e também caractes especiais.
Removendo este arquivo:
ls -il /tmp
Saída:
695523 -rw-r--r-- 1 root root 0 2007-10-10 00:35 "teste*
Usaremos o comando find para excluir por inode number
find . -inum 695523 -exec rm -i { } \;
OBS.:
Também é possível utilizar \ antes de um caracter especial para utilizar o comando rm normalmente.
rm "\"teste\*"
Também é possível recuperar um arquivo excluído pelo seu inode number utilizando o comando debugfs da seguinte forma:
Execute o comando apontando para a partição onde se encontrava o arquivo excluído.
debugfs /dev/sda3
Se desejar modificar os inodes diretamente utilize
debugfs -w /dev/sda3
Listando os inodes apagados
debugfs: lsdel
Como a saída será muito grande é necessário grava em algum arquivo
debugfs: quit
# echo lsdel | debufs /dev/sda3 > /tmp/inode.out
Para visualizar uma melhor descrição do inode desejado utilize
debugfs: stat <695523>
Caso possua muitos arquivos para verificar utilize:
cut -c1-6 /tmp/inode.out | grep "[0-9]" | tr -d " " > /tmp/inode.number
Para visualizar os detalhes de cada inode number:
sed '/^.*$/stat <\0>/'inode.number | debugfs /dev/sda3 > /tmp/inodes.detail
Agora sabendo quais inodes queremos vamos recupar os arquivos
debugfs: start <695523>
debugfs: dump <695523> /tmp/inodefile.out
Se por acaso ficou algum lixo no arquivo podemos, recupera-lo da seguinte maneira.
dd if=/tmp/inodefile.out of=/tmp/inodefileresize.out bs=6050 count=1
OBS.:
O valor do bs no comando dd, corresponde ao valor contido no campo Size: na saída do comando dubugfs: dump <695523>.
Os inodes se aplicam a todos os sistemas Linux e Unix.
Configurando uma interface de rede TUN/TAP
Primeiro carregamos o módulo necessário.
modprobe tun
Depois criamos a interface tap:
tunctl -t tap0 -u login
ip link set up dev tap0
Para que a interface tap0 seja iniciada automáticamente é necessário adicionar as configurações abaixo em /etc/network/interfaces:
auto tap0
iface tap0 inet dhcp
tunctl_user login
A entrada "login" é relacionada ao usuário que irá carregar a interface de virtualização, caso este usuário seja o root estas entradas não são necessárias.
Havendo algum
Pronto sua interface tap, esta finalizada.
Configurando interface Bridge
Instação dos pacotes necessários para configuração de uma interface bridge.
apt-get install bridge-utils uml-utilities
Primeiro criamos a bridge
brctl addbr br0
brctl addif br0 eth0 eth1
Depois adicionamos as seguintes configurações no aquivo /etc/network/interfaces
auto br0
iface br0 inet dhcp
bridge_ports eth0 eth1auto eth0
iface eth0 inet manualauto eth1
iface eth1 inet manual
Depois basta realizar um restar nas interfaces de rede:
/etc/init.d/networking restart
OBS.: A configuração acima foi realizada para se utilizar com servidor DHCP podendo ser alterada para IP Static.