Suspender automaticamente o volume luks após o atraso

2

Alguém tem alguma idéia de como eu posso fazer automaticamente um luksSuspend em um volume luks depois que ele não for usado por um determinado período de tempo. Eu estava pensando em apenas programar um comando com crontab ou algo assim, mas não quero suspendê-lo se realmente estiver usando o volume.

    
por brianmearns 20.01.2013 / 15:51

3 respostas

1

A intenção de luksSetup deve ser usada quando o dispositivo ainda estiver em uso, mas você deseja bloquear temporariamente todos os acessos até que a frase secreta seja digitada a partir de uma fonte externa. Portanto, não faz muito sentido chamar apenas luksSetup quando o dispositivo não é usado: se não for usado, feche-o com luksClose .

Não há como aplicar atomicamente que o dispositivo não esteja em uso e chame luksSuspend . O que você pode fazer se realmente quiser suspender o dispositivo, mas apenas se ele não estiver em uso, chame luksSuspend e, em seguida, verifique com fuser ou lsof para qualquer arquivo montado no sistema de arquivos que esteja no dispositivo criptografado; Se o sistema de arquivos estiver em uso, chame luksResume imediatamente. Isso tem uma pequena chance de exigir que você insira a frase secreta.

Para detectar se um sistema de arquivos está inativo, recomendo pegar carona em um montador automático existente, como o autofs.

    
por 22.01.2013 / 01:11
0

Eu trabalhei com um conjunto de scripts que estão funcionando razoavelmente bem, mas ainda estou procurando outras sugestões, se alguém tiver algum.

O que eu fiz foi escrever um script que suspende o volume luks, um que envia uma mensagem wall , alertando todos os usuários (nos terminais) que está prestes a ser suspenso, e um que diz para mantê-lo aberto (gravando em um arquivo em um caminho reservado em /var/run ). Eu usei o cron para executar o script de suspensão automática a cada meia hora, e o script de "alerta" dois minutos antes disso (ele só emitia o alerta se o volume estivesse realmente aberto). Se alguém estiver interessado nesses scripts, posso publicá-los ou pelo menos mais detalhes sobre eles.

    
por 21.01.2013 / 03:39
0

Sugiro usar lsof para determinar se há processos em execução e passar os PIDs para pidstat para analisar IO. A partir daí, saberemos se é seguro e desejável suspender com base no que, se algum processo estiver acessando o sistema de arquivos subjacente do volume LUKS.

Isso permitiria que você agendasse o script com confiança sem se preocupar com corrupção ou processos manipulando a suspensão de maneira inesperada.

#!/bin/bash

if [ ! $1 ] ; then
  echo "Usage: $0 device-path"
  exit 1
fi

DEVICE=$1

# Collect PIDs that are running on LUKS filesystem
pids=$(lsof $DEVICE | tail -n+2 | awk '{ print $2 }')

SUSPEND=1
if [ "$pids" ] ; then
  # Get the IO statistics of each process running from LUKS device
  pidactivity=$(echo -E "$pids" | tr "\n" "," | xargs pidstat -d -p)

  # Pull out only the IO fields of the pidstat response
  pidio=$(echo -E "$pidactivity" | tail -n+4 | awk '{ print $5 " " $6 }')

  # If there is IO going on for any of these PIDs, we should suspend
  for io in "$pidio" ; do
    for stat in $io ; do
      if [ 'echo "$stat > 0" | bc' -gt 0 ] ; then
        SUSPEND=0
        break 2
      fi
    done
  done
fi

if [ $SUSPEND -eq 1 ] ; then
  cryptsetup luksSuspend $DEVICE
fi
    
por 08.08.2016 / 22:44