¿Puedo hacer que un archivo solo sea accesible para un script y no para un usuario?

11

Tengo un usuario con acceso limitado en el sistema (es decir, no es un sudoer); Llamemos a lo Bob .

Tengo un script o un binario en el que confío el administrador del sistema y no tendría problemas para ejecutarlo como root; Llamemos al guión get-todays-passphrase.sh. El trabajo de este script es leer datos de un archivo "privado" (propiedad de un usuario / grupo que no sea Bob, o incluso root) ubicado en /srv/daily-passphrases, y solo generar una línea específica del archivo: la línea que corresponde con la fecha de hoy .

A los usuarios como Bob no se les permite saber la frase de contraseña de mañana, aunque esté en el archivo. Por esta razón, el archivo /srv/daily-passphrasesestá protegido por permisos Unix, por lo que los usuarios no root como Bob no pueden acceder al archivo directamente. Sin embargo, se les permite ejecutar el get-todays-passphrase.shscript en cualquier momento, lo que devuelve los datos "filtrados".


Para resumir (la versión TL; DR ):

  1. Bob no puede leer el archivo protegido
  2. El script puede leer el archivo protegido.
  3. En cualquier momento, Bob puede ejecutar el script que puede leer el archivo

¿Es posible hacer esto dentro de los permisos de archivos Unix? O si Bob inicia un script, ¿el script siempre estará condenado a ejecutarse con los mismos permisos que Bob?

IQAndreas
fuente

Respuestas:

13

Esto es realmente común y bastante sencillo. sudole permite limitar aplicaciones específicas que un usuario puede invocar. En otras palabras, no tienes que darles raíz o nada; puede darles sudopermisos para ejecutar un comando específico . Esto es exactamente lo que desea, y es una práctica muy común para cosas como permitir a los usuarios empujar repositorios Git a través de SSH y similares.

Para hacer esto, todo lo que tiene que hacer es agregar una línea /etc/sudoersque se parezca a

bob ALL=(root) NOPASSWD: /path/to/command/you/trust

(La NOPASSWD:parte no es obligatoria, pero es muy común en esta situación). En ese momento, bobpuede invocar a /path/to/command/you/trusttravés de sudo, pero nada más.

Dicho esto, darle a alguien raíz, lo que estamos haciendo aquí, puede no ser exactamente lo que quieres. Notablemente, si hubo algún defecto en su script, corre el riesgo de dejar que su caja se arraigue. Por esa razón, es posible que prefiera crear un usuario específicamente para que sea el propietario del archivo especial (por ejemplo,) luego les specialuserenvíe chownel archivo y /etc/sudoershaga bobque ese usuario sea ese usuario especial. En ese caso, la línea a la que agrega sudoerssimplemente sería

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust
Benjamin Pollack
fuente
77
Sugeriría no ir por el camino "raíz": cree un usuario / grupo especial para este propósito.
guntbert
Buen punto; Enmendaré la respuesta.
Benjamin Pollack
7

Prefacio:

Como se ha señalado en los comentarios y por las razones explicadas en esta respuesta, el kernel de Linux ignora el bit setuid / setguid cuando maneja un script. No voy a duplicar la respuesta de Benjamin, sino que reemplazaré el script con ejecutable para hacer que mi respuesta sea correcta.


Respuesta corta: use setgid

Pasos detallados:

  1. Crear un nuevo grupo (p. Ej. Readpass)
  2. Haga que ese grupo sea el propietario del archivo de frase de contraseña sudo chown :readpass thatfile
  3. Haga que el archivo sea legible solo por su grupo sudo chmod g=r,o= thatfile
  4. Haga su lectura sgid ejecutable :sudo chmod g+s thatfile

De esa forma, su ejecutable se ejecutará con los permisos del grupo propietario y, por lo tanto, podrá leer el archivo.

Guntbert
fuente
2
Setgid y setuid no son fáciles de trabajar en scripts, ¿verdad?
muru
1
No puede hacer un script setgid en Linux: el bit setgid será ignorado. En su lugar, agregue una regla de sudo que permita que bob se ejecute thatfilecon el grupo readpass.
Gilles 'SO- deja de ser malvado'