Arquivos globalmente graváveis e processos presos pelo usuário

1

Eu quero poder escolher genericamente um determinado executável (potencialmente mal intencionado) x e executá-lo (de uma conta de administrador) com acesso de gravação restrito a determinados diretórios (deduzidos dinamicamente) "${dirs[@]}" .

O executável deve ter acesso ao que estiver acessível globalmente no sistema.

Eu imaginei que eu poderia usar uma simples troca de usuário e ter um usuário do sistema dedicado e sem estado foreveralone , para executar esses executáveis.

Sempre que eu quiser executar x com essas restrições, eu usarei flock de um arquivo de bloqueio, chown -R foreveralone:foreveralone -- "${dirs[@]}" e, em seguida, sudo -u foreveralone -g foreveralone $PWD/x .

Depois disso, eu iria chown escrever os diretórios para outra pessoa, para que foreveralone não tivesse arquivos persistentes no sistema de arquivos. Eu acho que também precisaria limpar diretórios de gravação globais (por exemplo, /tmp, /dev/shm ) de arquivos foreveralone s.

Minhas perguntas são:

  1. Este é um mecanismo viável e seguro para processos de prisão, dado um sistema * nix de configuração padrão?
  2. Quais são exatamente os locais e arquivos padrão graváveis globalmente em uma configuração padrão * nix?
  3. Como posso encontrá-los melhor do que com algo como

    sudo -u foreveralone -g sempre encontrar /! -type l -writable 2 > / dev / null | grep -v '^ / proc'

    (Meu find jogo é muito fraco. /proc/$pid parece ter muitos arquivos que parecem graváveis mas, na verdade não são assim, eu estou pulando esses (eu me pergunto o que há com isso)).

De qualquer forma, no meu sistema, 3. retorna (filtrada para mostrar tipos de arquivos):

  character special file    /dev/full
  character special file    /dev/fuse
  character special file    /dev/net/tun
  character special file    /dev/null
  character special file    /dev/ptmx
  character special file    /dev/random
  character special file    /dev/tty
  character special file    /dev/urandom
  character special file    /dev/zero
  character special file    /sys/kernel/security/apparmor/.null
  directory /run/lock
  directory /run/shm
  directory /tmp
  directory /tmp/.ICE-unix
  directory /tmp/.X11-unix
  directory /var/local/dumps
  directory /var/mail
  directory /var/spool/samba
  directory /var/tmp
  regular empty file    /run/sendmail/mta/smsocket
  regular empty file    /sys/kernel/security/apparmor/.access
  socket    /dev/log
  socket    /run/acpid.socket
  socket    /run/avahi-daemon/socket
  socket    /run/cups/cups.sock
  socket    /run/dbus/system_bus_socket
  socket    /run/gdm_socket
  socket    /run/mysqld/mysqld.sock
  socket    /run/samba/nmbd/unexpected
  socket    /run/sdp
  socket    /tmp/.ICE-unix/2537
  socket    /tmp/mongodb-27017.sock
  socket    /tmp/.X11-unix/X0
  1. Existe uma solução melhor (mais simples / mais flexível para isso)

No meu caso particular, x seria um script de criação potencialmente mal-intencionado, que deveria ser executado sem escrever nos lugares errados ou ler coisas que não são globalmente legíveis.

    
por PSkocik 30.05.2016 / 12:42

1 resposta

2

Primeiro, desculpe pelo meu inglês ruim. Vamos mostrar algo para você usando apenas conceitos unix, porque eu acho que pode ajudar (ou talvez não).

Imagine que eu quero que o executável nano possa ser executado por todos os usuários, mas nunca deve ser executado como o usuário que chama seu executável, mas com um ambiente limitado, com acesso para editar somente a configuração do apache ou arquivos em determinados grupos, em outras palavras, eu quero que o nano seja executado como um serviço linux limitado a privilégios específicos de um usuário virtual.

1- Primeiro eu vou criar o usuário nano e desabilitar o seu login:

useradd nano -d /var/nano
mkdir /var/nano 
chown -R nano:nano /var/nano
passwd -l nano

2 - força o nano a rodar como usuário nano (por exemplo, se o root nano precisar rodar como nano e não pelo root)

chown nano:nano /usr/bin/nano
chmod a+s /usr/bin/nano

Agora, + s significa que o nano será executado como proprietário e não por quem o chamou.

3- Ligue para nano com root para um teste:

#nano
#ps aux | grep nano
nano      3399  0.0  0.0  13828  3840 pts/0    S+   08:48   0:00 nano

Lindo! Nano agora é executado como usuário nano não dependendo de com qual usuário eu fiz o login.

4- Então e agora? Eu quero que o nano edite os arquivos em / var / www / apache2

chgrp -R www-data /var/www/ (yes i now that is unnecessary in Debian if the group are respected)
chmod -R g+rw /var/www 
adduser nano www-data

5- O que mais?

Você notará que todo usuário agora pode usar o nano (ou uma cópia especial dele "nano-especial" ;-) para editar arquivos / var / www, e se você quiser que apenas usuários do grupo nano possam fazer isso? ?

Simples, remova outros privilégios para executá-lo:

chmod o-x /usr/bin/nano 

E adicione os usuários ao grupo nano

adduser myuser1 nano
    
por 30.05.2016 / 14:01