Quando meu aplicativo precisaria ser executado com privilégios?

2

Uma maneira de garantir que um aplicativo seja menos propenso a ataques é garantir que ele seja executado com o mínimo de privilégios necessários (o modo de usuário é o preferido).

Eu normalmente só programo para o Windows usando o .NET framework , mas tenho brincado com o desenvolvimento de aplicativos da web usando o Go recentemente. Eu sou novo no Ubuntu (e Linux em geral), então estou querendo saber o que eu preciso fazer para garantir que o meu aplicativo de servidor use o menor privilégio possível?

Suponho que não permitir que meu programa grave em pastas do sistema é uma maneira, mas quais são as outras?

    
por leylandski 29.05.2015 / 12:51

2 respostas

1

O acesso e a pasta fora de sua casa precisarão de privilégios elevados, por isso é melhor manter todos os seus arquivos em sua casa.

$ ls -l /~$ ls -l /
total 152
drwxr-xr-x   2 root root 12288 May 28 08:29 bin
drwxr-xr-x   4 root root  4096 May 26 09:54 boot
drwxr-xr-x   3 root root  4096 May  5 10:22 build
drwxr-xr-x   2 root root  4096 Apr  8  2014 cdrom
drwxr-xr-x  15 root root  4540 May 27 12:35 dev
drwxr-xr-x 208 root root 12288 May 28 08:29 etc
drwxr-xr-x   5 root root  4096 Dec 23 09:43 home
lrwxrwxrwx   1 root root    32 Apr  8  2014 initrd.img -> boot/initrd.img-3.2.0-23-generic
drwxr-xr-x  28 root root  4096 May 22 08:38 lib
drwxrwxrwx   2 root root 12288 May  7 13:20 lib32
drwxr-xr-x   2 root root  4096 Apr 14 08:28 lib64
lrwxrwxrwx   1 root root    36 Feb 25 14:00 libnss3.so -> /usr/lib/x86_64-linux-gnu/libnss3.so
drwx------   2 root root 16384 Dec 23 09:43 lost+found
drwxr-xr-x   7 root root  4096 May 13 18:17 media
drwxr-xr-x   3 root root  4096 Dec 23 09:43 mnt
drwxr-xr-x  19 root root  4096 May  8 08:05 opt
dr-xr-xr-x 308 root root     0 May 26 13:35 proc
drwx------  23 root root  4096 May 20 08:53 root
drwxr-xr-x  32 root root  1200 May 28 08:29 run
drwxr-xr-x   2 root root 12288 May 28 08:29 sbin
drwxr-xr-x   2 root root  4096 Mar  5  2012 selinux
drwxr-xr-x   2 root root  4096 Apr  7  2014 srv
drwxr-xr-x  13 root root     0 May 26 13:35 sys
drwxr-xr-x   3 root root  4096 Dec 23 09:43 timeshift
drwxrwxrwt  22 root root 24576 May 29 13:52 tmp
drwxr-xr-x  13 root root  4096 Jun 20  2014 usr
drwxr-xr-x  15 root root  4096 May 22 12:52 var
lrwxrwxrwx   1 root root    29 Apr  8  2014 vmlinuz -> 

Como você vê, todos esses diretórios são de propriedade do root e, para trabalhar com eles, você precisa de mais permissões, a menos que sua página seja representada por ~ e possa ser acessada a partir de /home/username . seu playground como um usuário normal.

    
por Maythux 29.05.2015 / 13:00
1
Primeiro, não tenho certeza se esse é o lugar certo para perguntar, já que isso é sobre o Ubuntu, mas sua pergunta é uma questão de programação genérica do Unix / Linux. Enfim, aqui vai:

  1. Aprenda sobre as permissões do Unix / Linux

Você está dizendo "(modo de usuário preferido)" me faz pensar que você pode misturar as coisas. "Modo de usuário" versus "Modo de kernel" é um conceito de programação de sistema operacional. Isso vai para privilégios de CPU, onde depois de um contexto mudar para o modo kernel, algumas rotinas do kernel fazem seu trabalho. Eles podem ver registros adicionais da CPU e ter acesso a instruções privilegiadas da CPU. É onde seu Kernel e drivers operam e, a menos que você se torne um desenvolvedor de kernel / driver, nunca terá acesso a ele.

Todo o material normal acontece no modo de usuário.

Lá você tem "root", o super usuário com privilégios elevados e usuários "regulares". Além disso, um usuário pode ser membro de vários grupos com privilégios diferentes.

Veja: Uma introdução às permissões do Linux e IDs Reais e Eficientes ou um livro sobre programação em Unix / Linux (por exemplo, "The Art of Unix Programming" por Eric S. Raymond - Eu conheço sua "Unix Network Programming", que é um clássico)

  1. Não use privilégios ou solte-os após o uso

Você está escrevendo um aplicativo de rede? Se você quiser se vincular a portas de números baixos (& lt; 1024 IMHO), precisará de permissões de root. Se você está codificando em C, usando a API POSIX normal, você pode até digitar "man function" no terminal (ou seja, "man bind"). Deve dizer-lhe quais ações precisam de privilégios. Ou tentativa e erro. Depende do que você quer fazer. Há muitas coisas em que você não precisa de privilégios elevados. Assim, você pode iniciar seu programa como um usuário ou até mesmo criar um novo usuário com menos membros do grupo do que seu usuário padrão do Ubuntu (que está em "sudoers" etc.). Se você fizer precisar de privilégios de root, poderá soltá-los após o uso. Por exemplo. muitos servidores são daemons "setuid root". Eles são iniciados com a raiz do ID do usuário, fazem o que precisam para privilégios elevados e, em seguida, chamam de "setuid" para alterar seu ID do usuário (isto é, descartar privilégios). Veja A Biblioteca GNU C: Exemplo de Programa Setuid

De qualquer forma, eu recomendaria um livro sobre o assunto. Você também pode pesquisar no Google por "slides de segurança unix", dá alguns bons resultados da Unis (infelizmente, os da minha Uni não são publicamente acessíveis).

    
por Benjamin Maurer 29.05.2015 / 13:36