A maneira que eu geralmente implemento esse tipo de restrição requer que várias condições sejam atendidas, caso contrário as restrições podem ser facilmente contornadas:
- O usuário não pertence ao grupo
wheel
, o único autorizado a usarsu
(imposto pelo PAM). -
O usuário recebe um propriamente protegido
rbash
com umPATH
de somente leitura apontando para um~/bin
privado, esse diretório~/bin/
contém links para utilitários simples:$ ll ~/bin total 0 lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear* lrwxrwxrwx. 1 root dawud 7 Sep 17 08:58 df -> /bin/df* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep* lrwxrwxrwx. 1 root dawud 8 Sep 17 08:58 env -> /bin/env* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep* lrwxrwxrwx. 1 root dawud 9 Sep 17 08:58 grep -> /bin/grep* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo* lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail* lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
-
o usuário recebe um ambiente restrito e somente leitura (pense em coisas como
LESSSECURE
,TMOUT
,HISTFILE
variables). - opcionalmente, o usuário é mapeado para o usuário do SELinux
staff_u
e recebe direitos para executar comandos como outro usuário, conforme necessário, por meio desudo
. -
o usuário
/home
,/tmp
e possivelmente/var/tmp
são polyinstantiated via/etc/security/namespace.conf
:/tmp /tmp/.inst/tmp.inst-$USER- tmpdir:create root /var/tmp /tmp/.inst/var-tmp.inst-$USER- tmpdir:create root $HOME $HOME/$USER.inst/ tmpdir:create root
Além disso,
/etc/security/namespace.init
faz todos os arquivos esqueletais somente para o usuário e pertencem aroot
.
Dessa forma, você pode escolher se $USER
pode executar qualquer comando em seu próprio nome (por meio de um link no diretório ~/bin
privado, provisionado via /etc/skel
, conforme explicado acima), em nome de outro usuário (via sudo
) ou nenhum.
Com relação a "acesso a um conjunto de arquivos", você não especifica se é somente leitura ou acesso de leitura / gravação.
Em qualquer caso, isso pode ser configurado por meio das regras sudo
.
Eu implementaria regras para conceder acesso somente leitura a arquivos via rview
e leitura-gravação via rvim
, o último normalmente sendo configurado usando a diretiva editor
no seu arquivo sudoers
:
Defaults editor=/usr/bin/rvim
Assim, os usuários podem sudoedit
de arquivos permitidos.
Esta solução pode ser facilmente implementada usando sua ferramenta de gerenciamento de configuração de escolha.
Novos comandos podem ser adicionados rapidamente ao diretório ~/bin
privado (já que são apenas links simbólicos gerenciados a partir da lógica de namespace).
Novas regras sudo
também podem ser gerenciadas da mesma maneira.