Estou experimentando recursos, no Debian Gnu / Linux.
Copiei / bin / ping para o meu diretório de trabalho atual. Como esperado, ele não funciona, foi originalmente definido como raiz.
Então, dou ao meu ping os recursos mínimos (não raiz) sudo /sbin/setcap cap_net_raw=ep ./ping
, e meu ping funciona como esperado.
Em seguida, sudo /sbin/setcap -r ./ping
revogar essa capacidade. Agora não está funcionando conforme o esperado.
Agora eu tento fazer o ping funcionar usando capsh
.
capsh
não tem privilégios, então eu preciso executá-lo como root, mas depois largue o root e, portanto, todos os outros privilégios.
Acho que também preciso secure-keep-caps
, isso não está documentado capsh
, mas está no manual de recursos. Eu recebi os números dos bits /usr/include/linux/securebits.h
. Eles parecem corretos, pois a saída de --print
mostra que esses bits estão corretos.
Eu tenho mexido por horas, até agora eu tenho isso.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
No entanto ping
, com erros ping: icmp open socket: Operation not permitted
, é isso que acontece quando ele não tem capacidade. Também os --print
shows Current: =p cap_net_raw+i
, isso não é suficiente, precisamos e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
irá definir a capacidade para Current: = cap_net_raw+eip
isso está correto, mas nos deixa como root
.
Edit-1
Eu já tentei sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Isso produz:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
O primeiro erro é esperado como secure-noroot: yes
Mas o segundo não éCurrent: = cap_net_raw+eip
Edit-2
Se eu colocar ==
antes do --print
, agora mostra Current: = cap_net_raw+i
, o que explica o erro anterior, mas não o porquê de perdermos a capacidade ao sair da raiz, embora isso secure-keep-caps
deva corrigir isso.
Edit-3
Pelo que posso ver, estou perdendo Efetivo (e) e Permitido (p), quando exec é chamado. Isso é esperado, mas eu pensei que o secure-keep-caps, deveria impedir que eles se perdessem. Estou esquecendo de algo.
Edit-4
Tenho pesquisado mais e lido o manual novamente. Parece que normalmente e
e os p
recursos são perdidos quando: você muda de usuário root
(ou aplica secure-noroot
, tornando o usuário root normal), isso pode ser substituído secure-keep-caps
; quando você liga exec
, até onde eu sei, isso é invariável.
Tanto quanto posso dizer, está funcionando de acordo com o manual. Até onde eu sei, não há como fazer algo útil capsh
. Tanto quanto posso dizer, para usar recursos, você precisa: usar recursos de arquivo ou ter um programa que reconhece recursos, que não usa exec
. Portanto, nenhum invólucro privilegiado.
Então agora minha pergunta é o que estou perdendo, para que serve capsh
.
Edit-5
Adicionei uma resposta aos recursos ambientais. Talvez capsh
também possa ser usado com recursos herdados, mas para serem úteis, eles precisam ser configurados no arquivo executável. Não vejo como o capsh pode fazer algo útil sem os recursos do ambiente ou para permitir recursos herdados.
Versões:
capsh
dalibcap2-bin
versão do pacote1:2.22-1.2
- antes de editar-3 Peguei o mais recente
capsh
degit://git.debian.org/collab-maint/libcap2.git
e começou a usá-lo. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
A área do usuário é 32 bits.
capsh
, na ausência de ambiente (como era originalmente). O que estou perdendo. Deve ter um uso.
capsh
do repositório collab-maint não lhe daria o "mais recente"capsh
, o pacote Debian ainda não suporta recursos ambientais. Upstream 2,27 faz.