Como listar todos os arquivos usados durante a inicialização do Linux

7

Eu gostaria de obter a lista de arquivos que são usados durante o processo de inicialização do Linux. Estamos desenvolvendo o sistema corporativo protegido baseado no RHEL 6.4. A integridade dos arquivos especificados será verificada por um hardware especial.

Portanto, a questão é: como obter a lista desses arquivos (com dependências resolvidas provenientes de diferentes serviços de inicialização e daemons).

    
por Vitaly Isaev 06.11.2013 / 09:29

4 respostas

1

Graças ao suporte do RHEL, a solução clara foi descoberta. É baseado no uso do módulo do kernel do systemtap. Citado de aqui para evitar a podridão de links. E agradeço novamente por todos os seus conselhos:)

Eu nem imaginava que o systemtap é capaz de iniciar antes mesmo do script de inicialização e rastrear o processo de inicialização. Eu aprecio muito o Red Hat Suporte e pessoalmente Pushpendra Chavan para obter ajuda com esta ferramenta perfeita (infelizmente eu não conheço os desenvolvedores com os quais este método pertence exatamente - caso contrário, eu os creditaria em primeiro lugar).

Então, precisamos criar dois scripts simples:

bootinit.sh :

#!/bin/sh


# Use tmpfs to collect data
/bin/echo "Mounting tmpfs to /tmp/stap/data"
/bin/mount -n -t tmpfs -o size=40M none /tmp/stap/data

# Start systemtap daemon & probe
/bin/echo "Loading bootprobe2.ko in the background. Pid is :"
/usr/bin/staprun \
    /root/bootprobe2.ko \
    -o /root/bootprobe2.log -D

# Give daemon time to start collecting...
/bin/echo "Sleeping a bit.."
sleep 5

# Hand off to real init
/bin/echo "Starting."
exec /sbin/init 3

e bootprobe2.1.stp escritos em linguagem de script systemtap incorporada:

global ident

function get_usertime:long() {
  return task_utime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->utime;
}

function get_systime:long() {
 return task_stime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->stime;
}

function timestamp() {
  return sprintf("%d %s", gettimeofday_s(), ident[pid()])
}

function proc() {
  return sprintf("%d \(%s\)", pid(), execname())
}  

function push(pid, ppid) {
   ident[ppid] = indent(1)
   ident[pid] = sprintf("%s", ident[ppid])
}

function pop(pid) {
  delete ident[pid]
} 

probe syscall.fork.return {
  ret = $return
  printf("%s %s forks %d  \n", timestamp(), proc(), ret)
  push(ret, pid())
}

probe syscall.execve {
  printf("%s %s execs %s \n", timestamp(), proc(), filename)
}

probe syscall.open {
  if ($flags & 1) {
    printf("%s %s writes %s \n", timestamp(), proc(), filename)
  } else {
    printf("%s %s reads %s \n", timestamp(), proc(), filename)
  }
} 

probe syscall.exit {
  printf("%s %s exit with user %d sys %d \n", timestamp(), proc(), get_usertime(), get_systime())
  pop(pid())
}
<linux sched.h=""><linux sched.h="">
</linux></linux>

Para receber a lista de arquivos acessados durante o processo de inicialização no formato de log systemtap, devemos implementar o seguinte:

Faça o download e instale as versões CORRECTAMENTE nomeadas de systemtap e kernel debuginfo packages (foi-me dado este link , mas é melhor você usar isso se você estiver no CentOS);

Crie /tmp/stap e /tmp/stap/data

mkdir -p /tmp/stap/data

Coloque bootprobe2.1.stp e bootinit.sh em /root e torne-os executáveis:     chmod + x / root / boot *

Edite bootinit.sh e altere 'exec / sbin / init 3' para 'exec / sbin / init 5' se 5 for o seu nível de execução padrão.

Crie o módulo .ko em bootprobe2.stp

 cd /root
 stap bootprobe2.1.stp -m bootprobe2 -p4

Reinicie.

Pare grub (pressione Esc ou Shift) e pressione 'a' no kernel padrão. No final da linha do kernel, digite o seguinte e pressione enter:

init=/root/bootinit.sh,

A inicialização normal será retomada. Após o login, kill o stapio process, copie bootprobe2.log do diretório tmpfs /tmp/stap/data e desmonte-o.

killall stapio
cp /tmp/stap/data/bootprobe2.log /tmp/stap/
umount /tmp/stap/data  

Agora, verifique o arquivo /tmp/stap/bootprobe2.log para a lista de todos os arquivos que são lidos durante a inicialização.

    
por 10.12.2013 / 18:11
6

Configure o subsistema de auditoria para gravar chamadas para open .

auditctl -a exit,always -S open,openat,creat,execve

Faça isso no initramfs, para que a regra esteja em vigor quando o sistema principal ( /sbin/init no sistema de arquivos raiz real) for iniciado.

Observe que o que você está propondo não trará qualquer segurança real em uma configuração típica. Qualquer pessoa que possa substituir esses arquivos por outras versões tem acesso root e também pode alimentar dados falsos para o sistema de registro.

Se a mídia de boot estiver protegida externamente para que o root não possa modificá-la (por exemplo, porque é somente leitura ou sob o controle exclusivo de um bootloader seguro), e se o carregamento de módulos do kernel estiver bloqueado, a medição dos arquivos pode ser confiável está bem feito. Entretanto, se tudo o que você está fazendo com as medidas é compará-las com valores de referência, isso é mais difícil e menos eficaz do que usar um sistema de arquivos raiz protegido por integridade (ou seja, na prática em dmcrypt, com Trusted Grub para o gerenciador de inicialização). p>     

por 06.11.2013 / 23:33
1

Um bom ponto de partida seria /etc/rci.d , em que i é um número que representa o nível de execução no qual você está inicializando. Por exemplo, se o seu servidor estiver sem cabeça, i normalmente será 3. Examinar em /etc/rc3.d mostrará quais serviços estão sendo iniciados quando você inicializa no nível de execução 3.

    
por 06.11.2013 / 11:47
1

Certifique-se de que atime esteja habilitado para seus sistemas de arquivos raiz e de inicialização em seu kernel (ou que noatime não esteja definido), depois da inicialização você pode usar stat para verificar o tempo de acesso de cada arquivo e ver qual foram acessados durante a inicialização.

    
por 06.11.2013 / 23:39

Tags