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 ./pingrevocar 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 --printmuestra 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, pingerrores con ping: icmp open socket: Operation not permittedesto es lo que sucede cuando no tiene la capacidad. También los --printespectá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+eipesto 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-capsdeberí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 ey las pcapacidades 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 capshtambié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
capshde lalibcap2-binversión del paquete1:2.22-1.2- antes de editar-3 Agarré la última
capshdegit://git.debian.org/collab-maint/libcap2.gity empecé a usarlo. uname -aLinux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/LinuxLa tierra del usuario es de 32 bits.
capsh, en ausencia de ambiente (como era originalmente). Qué me estoy perdiendo. Debe tener un uso.
capshdel 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.