A troca pode ser desativada no nível do aplicativo?

10

Atualmente, estou usando o thunderbird com o gnupg para ler e-mails criptografados. Se eu entender o comportamento da troca corretamente, as páginas de memória que contêm os e-mails descriptografados podem ser trocadas e deixar vestígios no disco rígido que, em teoria, podem ser recuperados posteriormente forenses.

Embora certamente seja possível usar apenas um arquivo de troca criptografado ou desativar a troca global durante o uso de arquivos confidenciais, isso afeta o desempenho, pode ser esquecido e requer privilégios de root.

É possível marcar determinados arquivos ou programas como não sendo trocados? Mesmo sem acesso root? Alguém poderia escrever um aplicativo que possa ser distribuído a usuários tecnicamente ingênuos e cujo conteúdo de memória nunca seja trocado em disco?

user54114
fonte
2
Relacionado essencialmente, você criaria um cgroup, ajustaria a swappiness para que nunca fosse trocada e traria um pássaro cgexecnele. Você ainda precisa de acesso root, mas essa é a resolução no nível do administrador. Se você estiver desenvolvendo seu próprio aplicativo, usaria o mlock .
Bratchley
1
O GPG já pode ligar mlock, você deve verificar.
Steve Wills
Obrigado! Eu ainda não sabia sobre cgroups, eles parecem interessantes.
user54114
1
@SteveWills Sim . Não tenho certeza sobre o Thunderbird, que está exibindo o resultado descriptografado.
user54114
@Bratchley, você pode responder? Eu não sabia que você poderia definir swappiness para cgroups, parece intrigante.
Frostschutz 13/02/2015

Respostas:

9

Nos comentários, sugeri que você crie um cgroup, defina memory.swappinesscomo zero (para minimizar a troca) e execute seu aplicativo dentro dele. Se você fizesse isso, seu aplicativo provavelmente não seria trocado, a menos que você estivesse com uma memória física tão baixa que trocar páginas por programas nesse cgroup era a única maneira de disponibilizar memória física suficiente.

Para fazer isso no RHEL 6.5:

  • Verifique se o libcgrouppacote está instalado. Isso lhe dá acesso a ferramentas de espaço do usuário como cgcreatee cgexec.

  • Inicie e ative o cgconfigserviço para que as alterações na configuração do cgroup sejam persistentes entre as reinicializações. No RHEL, este serviço também deve montar os sistemas de arquivos necessários embaixo da /cgroupárvore.

  • Crie o cgroup com cgcreate -g memory:thunderbird

  • Defina a troca como zero neste grupo com cgset -r memory.swappiness=0 thunderbird

  • Use cgsnapshot -s > /etc/cgconfig.confpara salvar uma configuração persistente atualizada para o cgconfigserviço (todas as alterações até agora foram de tempo de execução. Provavelmente, você desejará salvar o arquivo de configuração padrão em algum lugar e dar uma olhada novamente antes de fazer a configuração persistente.

  • Agora você pode usar cgexecpara iniciar os aplicativos desejados no thunderbirdcgroup:

    [root @ xxx601 ~] # cgexec -g memória: thunderbird ls

    anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp sleep sleep.c teste de pilha ssl-build

    [root @ xxx601 ~] #

thunderbirdNa verdade, eu não tenho instalado, caso contrário, eu teria feito isso. Não sei por que a formatação do texto acima está desarrumada.

  • Uma alternativa cgexecseria iniciar o thunderbird e adicionar o PID ao tasksarquivo do aplicativo. Por exemplo:

    [root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tasks

    [root @ xxx601 ~] # pidof httpd

    25926 10227 10226 10225 10163 10162 10161 10160 10159 10157 10156 10155 10152 10109

    [root @ xxx601 ~] # eco 25926> / cgroup / memory / thunderbird / tasks

    [root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tasks

    25926

Mais uma vez, é importante mencionar que isso não impede tecnicamente a troca, mas, sem modificar o aplicativo em si, provavelmente é sua melhor aposta. Acabei de descobrir o memory.memsw.limit_in_bytesque parece ser um controle mais direto em forçar a não troca, mas não brinquei com isso o suficiente para me sentir à vontade ao dizer que resolve o problema completamente. Dito isto, pode ser algo para investigar isso.


A resposta real seria ter as mlockinformações confidenciais do aplicativo para contornar esse tipo de preocupação. Estou disposto a apostar que um aplicativo como o Thunderbird faz isso, mas não sei o suficiente sobre os internos para comentar sobre isso.

Bratchley
fonte
Para lidar com todos os outros FSs que o @Gilles menciona, você também desejaria um espaço para nome d chrootem unshared --mount. Faça isso e estou disposto a apostar que o efeito no desempenho final seria melhor do que uma troca criptografada.
mikeserv
Sim, sem dúvida que um administrador só pode fazer muito; em última análise, o aplicativo precisa levar esse tipo de coisa em consideração, pois existem muitos e os controles no nível do administrador podem ser bem elaborados.
Bratchley
Um coredump ainda pode ser inspecionado para revelar o que acontece em um processo arbitrário, mesmo memory.swappiness=0que você ache? Eu não saberia - mas estou curioso.
mikeserv
1
Sim, mas isso é verdade em quase tudo, incluindo aplicativos com mlock, mas não MADV_DONTDUMP. Na maioria das vezes, porém, as pessoas preocupadas em trocar informações confidenciais estão preocupadas com o roubo de laptops e a área de troca sendo vasculhada. No momento em que estão iniciando os despejos básicos, o sistema já foi completamente comprometido.
Bratchley 14/02
5

Os aplicativos podem bloquear sua memória para que não possa ser trocada.

mlock, munlock, mlockall, munlockall - lock and unlock memory

Mas não sei como influenciar isso de fora. O aplicativo teria que ser escrito para usar isso sozinho. Com os e-mails, é provavelmente particularmente difícil, pois geralmente envolve também programas externos para a visualização de anexos.

Além disso, mesmo com o memlock, é possível que ele acabe na sua partição de swap - quando você usa a suspensão no disco, que grava toda a memória no disco, independentemente de quaisquer preferências que não sejam de troca.

É mais fácil usar criptografia de disco completo em primeiro lugar.

frostschutz
fonte
5

Sim, um aplicativo pode impedir que parte de sua memória seja trocada com a mlockchamada do sistema. No entanto, isso não é realmente útil no seu caso.

Dados confidenciais não estão apenas na memória do aplicativo. Ele acaba em arquivos temporários em vários lugares ( /tmp, /var/spool, etc.). O próprio Thunderbird está exibindo o email descriptografado, então você também deve bloqueá-lo na RAM.

Se você deseja garantir que seu disco não contenha vestígios de arquivos confidenciais, é necessário criptografar sua troca, bem como todos os locais possíveis de arquivos temporários (em particular, /tmpse não for tmpfs, e a maioria /var, além disso, para o seu diretório pessoal, é claro).

O impacto da troca criptografada no desempenho é pequeno ou nulo. A criptografia é muito mais rápida que a E / S do disco.

Gilles 'SO- parar de ser mau'
fonte
Parece que um chrootcontêiner de espaço para nome e swapoffseria uma alternativa melhor à troca criptografada. Resposta muito boa - nenhuma outra resposta mencionou outros efeitos no sistema de arquivos. Eu mesmo não tenho um swap- não possuo nenhum computador com menos de 4 GB de RAM e não vejo nenhum benefício em usá-lo. Seu uso é prático apenas para qualquer uma das máquinas em que a suspensão está relacionada - e isso é fácil de criar scripts.
mikeserv
0

Eu só estou pensando se seria melhor começar com a mudança da prioridade do processo de candidatura on por exemplo com um script de inicialização iniciá-lo com uma alta prioridade utilizando nicee renicee com a mudança de prioridade I / O que, com ionicee depois ver o que acontece.

Você pode 'agregar' o aplicativo ao nível de prioridade mais alta, por exemplo, -20dessa forma, você ainda deixa o sistema operacional para fazer o que é melhor, tomando a decisão sobre quando trocar os processos do aplicativo.

Mas sugeriu por outros que, se você deseja mais controle e granularidade, precisa começar a observar cgroupse definirmemory.swappiness

tdr
fonte