LINUX FU: não compartilham BEM COM OUTRO

No jardim de infância, você aprende que você deve compartilhar. mas para a segurança do computador, a partilha é normalmente uma coisa ruim. O kernel Linux introduziu o conceito de namespaces a partir da versão 2.6.24. Isso tem sido há alguns anos, mas namespaces não são utilizados por numerosos apesar de existirem as ferramentas para manipulá-los. Concedido, você não precisa sempre de namespaces, mas é uma daquelas coisas que quando você precisar dele, a capacidade é inestimável. Em poucas palavras, namespaces deixá-lo fazer um processo de seus próprios recursos privados e – muito mais importante – impede um processo de ver os recursos em outros namespaces.

Acontece que, você usa namespaces o tempo todo porque cada processo é executado vidas em algum conjunto de namespaces. Eu digo definir, porque há um número de namespaces para diferentes recursos. Por exemplo, você pode definir um espaço de nomes de rede diferente para dar um processo seu próprio conjunto de itens, incluindo tabelas de roteamento, regras de firewall, e tudo mais relacionado à rede de redes.

Então vamos dar uma olhada em como o Linux não compartilha nomes.

Os possíveis namespaces são:

Montagem – montagens de sistema de arquivo. É possível montagens compartilhar com outros namespaces, mas você tem que fazê-lo explicitamente.

UTS – Isto controla namespace coisas como nome de host eo nome de domínio.

IPC – Um programa com um namespace IPC separado terá suas próprias filas de mensagens, semáforos, memória compartilhada, e itens de outras comunicações entre processos.

Rede – Processos no espaço de nomes terão suas próprias pilhas de rede e configurações relacionadas.

PID – Processos em um namespace PID não pode ver outros processos fora do namespace.

Cgroup – Um espaço de nomes que oferece uma visão virtualizada dos montes cgroup para a gestão de CPU.

Usuário – usuários individuais, grupos, etc.

Obviamente, alguns destes são muito mais úteis do que outros. É fácil de ver, no entanto, que se você tivesse um sistema de programas associados, você pode encontrá-lo atraente para criar um espaço privado para IPC ou rede entre eles.

Ir para Shell

Se você quiser experimentar namespaces do shell, você pode usar unshare. O nome pode parecer estranho, mas o comando tem o seu nome do fato de que um novo processo geralmente compartilha os namespaces de seu pai. O comando unshare permite criar novos namespaces.

Uma característica essencial ou capricho do unshare é que, por padrão, ele executa um programa com os novos namespaces criadas, mas não associar esse programa com estes namespaces. Em vez disso, os novos namespaces ir para qualquer criança que o programa cria. Você pode adicionar uma opção -fork para fazer o trabalho muito mais como você esperaria.

Por exemplo, vamos começar um novo shell em seu próprio Idaho privado:

1.
2.
sudo unshare –pid –fork –mount-proc / bin / bash
ps alx

Se você tentar esse comando sem um namespace separado, você terá uma longa lista de processos. mas a saída dentro do nosso novo espaço de nomes é muito menos volumoso:

1.
2.
3
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TEMPO DE COMANDO
4 0 1 0 0 20 10820 4376 – S pts / 6 00:00 / bin / bash
0 0 9 0 1 20 12048 1168 – R + pts / 6 00:00 ps alx

Você tem que pensar um pouco sobre como os diferentes serviços públicos funcionam. Por exemplo, ps lê / proc por isso, se nós não oferecemos –mount-proc, seria ainda exibir todos os principais processos. (Experimente.) Você não seria capaz de interagir com eles, mas porque você pode ler / proc, você ainda vê-los. A bandeira –mount-proc é realmente apenas um atalho para –mount (para obter um namespace nova montagem) e, em seguida, fazendo um monte de sistema de arquivos proc.

Omitindo a opção garfo vai causar um comportamento shell incomum porque o shell normalmente gira fora novos processos que irão agora ser um espaço de nomes diferente do seu processo principal.

Se você adicionar um nome de arquivo para muitos dos argumentos (como –pid ou –mount) você pode criar um espaço de nomes persistente que você compartilha entre os processos. Você também pode usar adaptadores virtuais Ethernet (tipo Veth) ou uma ponte de rede para expor uma rede em um espaço de nomes para o outro.

Montagens e muito mais opções

Outra isolamento útil é na tabela de montagem. Linux lida com montagens um pouco diferente. Você pode fazer montagens propagar de várias maneiras. Se desejar total privacidade, você pode fazer isso, mas você também pode compartilhar dentro de um grupo, ou acompanhar as mudanças em outros grupos, mas não propagar suas próprias mudanças. Você pode ler muito mais na página homem.

Uma coisa interessante é que porque os namespaces são isolados, é possível para um usuário normal ter privilégios quasi-raiz nos novos namespaces. A raiz do usuário –map permite isso e também se transforma em uma opção para negar aos usuários que chamam setgroups o que poderia permitir-lhes obter permissões elevadas.

Há mais, claro. Se você tem util-linux instalado, basta perguntar para a página man unshare para ler mais. Se você quiser usar essas coisas em um programa, que é provavelmente mais simples de imaginar, há uma chamada de sistema unshare. usar man 2 unshare para ver os detalhes. note que você pode exercer, mesmo muito mais controle com a chamada de sistema. para example, você pode desassociar o sistema de arquivos. Está intimamente ligado à chamada do sistema clone, que é uma espécie de uma versão muito de garfo.

Você pode achar interessante que todos os dados do namespace para um processo apareçam em / proc. Por exemplo, tente:

sudo ls -l / proc / $$ / ns / *
Você verá symlinks especializados com informações sobre os diferentes namespaces para o processo atual. Por exemplo:

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
lrwxrwxrwx 1 alw alw 0 dezembro 07:29 / proc / 2182630 / ns / cgroup -> ‘cgroup: [4026531835]’
lrwxrwxrwx 1 alw alw 0 dezembro 07:29 / proc / 2182630 / ns / ipc -> «IPC: [4026531839] ‘
lrwxrwxrwx 1 alw alw 0 dezembro 07:29 / proc / 2182630 / ns / mnt -> ‘mnt: [4026531840]’
lrwxrwxrwx 1 alw alw 0 dezembro 07:29 / proc / 2182630 / ns / net -> ‘net: [4026531992]’
lrwxrwxrwx 1 alw alw 0 dez 07:29 / 2182630 / ns / pid -> ‘pid: [4026531836]’
lrwxrwxrwx 1 alw alw 0 dezembro 07:29 / proc / 2182630 / ns / pid_for_children -> ‘pid: [4026531836]’
lrwxrwxrwx 1 alw alw 0 dez 07:29 / proc / 2182630 / ns / tempo -> ‘tempo: [4026531834]’
lrwxrwxrwx 1 alw alw 0 dezembro 07:29 / proc / 2182630 / ns / time_for_children -> ‘tempo: [4026531834]’
lrwxrwxrwx 1 alw alw 0 dez 07:29 / proc / 2182630 / ns / user -> ‘Usuário: [4026531837]’
lrwxrwxrwx 1 alw alw 0 dezembro 07:29 / proc / 2182630 / ns / uts -> ‘UTS: [4026531838]’

Este é um daqueles ismos do Linux que é um pouco obscuro, mas pode ser muito útil quando você precisar. Mesmo se você não precisar melhor agora, vale a compreensão porque só pode resolver seu próximo desafio de desenvolvimento. Claro, você poderia executar seu programa em sua própria máquina virtual, mas essa é uma opção bastante pesada em comparação com simplesmente isolar o que você quer de maneira limpa e fácil. mesmo de um script de casca.

Leave a comment

Your email address will not be published. Required fields are marked *