Estoy experimentando con capacidades, en Debian Gnu / Linux.
Copié / bin / ping en mi directorio de trabajo actual. Como se esperaba, no funciona, originalmente era setuid root.
Luego le doy a mi ping las capacidades mínimas (no root) haciendo sudo /sbin/setcap cap_net_raw=ep ./ping
, y mi ping funciona, como se esperaba.
Luego sudo /sbin/setcap -r ./ping
revocar esa capacidad. Ahora no funciona como se esperaba.
Ahora trato de hacer que el ping funcione usando capsh
.
capsh
no tiene privilegios, por lo que necesito ejecutarlo como root, pero luego descartar root y, por lo tanto, todos los demás privilegios.
Creo que también necesito secure-keep-caps
, esto no está documentado capsh
, pero está en el manual de capacidades. Tengo los números de bit de /usr/include/linux/securebits.h
. Parecen correctos, ya que la salida de --print
muestra que estos bits son correctos.
He estado jugando durante horas, hasta ahora tengo esto.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Sin embargo, ping
errores con ping: icmp open socket: Operation not permitted
esto es lo que sucede cuando no tiene la capacidad. También los --print
espectáculos Current: =p cap_net_raw+i
, esto no es suficiente lo que necesitamos e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
establecerá la capacidad para que Current: = cap_net_raw+eip
esto sea correcto, pero nos deja como root
.
Editar-1
Ahora he intentado sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Esto produce:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
El primer error se espera como secure-noroot: yes
Pero el segundo no esCurrent: = cap_net_raw+eip
Editar-2
Si lo puse ==
antes --print
, ahora se muestra Current: = cap_net_raw+i
, por lo que eso explica el error anterior, pero no por qué estamos perdiendo capacidad al cambiar de raíz, pensé que eso secure-keep-caps
debería solucionarlo.
Editar-3
Por lo que puedo ver, estoy perdiendo Efectivo (e) y Permitido (p), cuando se llama a exec. Esto es de esperarse, pero pensé que seguro-topes, debería evitar que se pierdan. Me estoy perdiendo de algo.
Editar-4
He estado investigando más y leyendo el manual nuevamente. Parece que normalmente e
y las p
capacidades se pierden cuando: cambias de usuario root
(o aplicas secure-noroot
, haciendo que la raíz sea un usuario normal), esto puede ser anulado secure-keep-caps
; cuando llamas exec
, por lo que puedo decir, esto es invariante.
Por lo que puedo decir, está funcionando de acuerdo con el manual. Por lo que puedo decir, no hay forma de hacer nada útil capsh
. Por lo que puedo decir, para usar las capacidades que necesita: use las capacidades de archivo o tenga un programa que tenga en cuenta las capacidades, que no usa exec
. Por lo tanto, no hay contenedor privilegiado.
Así que ahora mi pregunta es qué me estoy perdiendo, para qué sirve capsh
.
Editar-5
He agregado una respuesta sobre las capacidades ambientales. Tal vez capsh
también se pueda usar con capacidades heredadas, pero para ser útiles, estas deberían establecerse en el archivo ejecutable. No puedo ver cómo Capsh puede hacer algo útil sin capacidades ambientales, o para permitir capacidades heredadas.
Versiones
capsh
de lalibcap2-bin
versión del paquete1:2.22-1.2
- antes de editar-3 Agarré la última
capsh
degit://git.debian.org/collab-maint/libcap2.git
y empecé a usarlo. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
La tierra del usuario es de 32 bits.
capsh
, en ausencia de ambiente (como era originalmente). Qué me estoy perdiendo. Debe tener un uso.
capsh
del repositorio collab-maint no le habría dado lo "más reciente"capsh
, el paquete Debian todavía no admite capacidades ambientales. Upstream 2.27 hace.