¿Cuáles son los permisos correctos para / tmp? Involuntariamente lo puse todo público recursivamente

78

He abusado sudo.

He creado un directorio temporal de muy, muy corta vida que quería compartir entre algunos usuarios durante unas horas ... y llamé a este directorio /some/path/tmp

Desafortunadamente, he lanzado en sudo chown 777 -R /tmplugar de sudo chown 777 -R tmp, por lo que mi /tmparchivo ahora es completamente público.

Utilizo el común con /tmpbastante frecuencia (todos los días, casi cada hora) personalmente para archivos de corta vida, guiones, muchos guiones.

¿Es un problema de seguridad ahora que está completamente configurado como público? ¿Debería volver a cambiarlo a configuraciones más seguras, o como configuraciones predeterminadas comunes para una distribución Debian o Ubuntu - (no sé cuáles eran)? ¿Para qué son los permisos correctos /tmp?

Stephane Rolland
fuente
Tenga en cuenta que olvidé algo importante en mi respuesta inicial: el socket X11 debe ser de acceso público, de lo contrario no podrá iniciar nuevas aplicaciones GUI. He actualizado mi respuesta.
Gilles
¿Fue chowno chmod?
Melebius
@Melebius Estoy un poco desconcertado por su pregunta: no lo mencioné chmod. chown (como ch - own), trata sobre la propiedad de los archivos, cuyo usuario posee un archivo. chmod (como ch - modifify) trata más sobre quién puede ejecutar, escribir dentro o leer el contenido de un archivo.
Stephane Rolland
2
@StephaneRolland Sí, eso es lo que me confundió. Puede usar chown 777que establece la propiedad de un archivo para el usuario con el ID 777. Sin embargo, todas las respuestas, incluida la aceptada, funcionan chmod. Dado que todos establecen el permiso en el mismo valor para todos los usuarios (propietario, grupo, otros), la mayoría de los efectos de la propiedad del archivo se vuelven irrelevantes. Sin embargo, el comando correcto para rectificar el resultado de sudo chown 777 -R /tmpdebería ser sudo chown root -R /tmp.
Melebius

Respuestas:

117

La configuración normal para /tmpes 1777, que se lsmuestra como drwxrwxrwt. Es decir: abierto, excepto que solo el propietario de un archivo puede eliminarlo (eso es lo que significa este tbit extra para un directorio).

El problema con un /tmpmodo 777 es que otro usuario podría eliminar un archivo que haya creado y sustituir el contenido de su elección.

Si su /tmpes un sistema de archivos tmpfs, un reinicio restaurará todo. De lo contrario, corre chmod 1777 /tmp.

Además, muchos archivos /tmpdeben ser privados. Sin embargo, al menos un directorio debe ser críticamente legible: /tmp/.X11-unixy posiblemente otros directorios similares ( /tmp/.XIM-unix, etc.). El siguiente comando debería en su mayoría arreglar las cosas:

chmod 1777 /tmp
find /tmp -mindepth 1 -name '.*-unix' -exec chmod 1777 {} + -prune -o -exec chmod go-rwx {} +

Es decir, hacer que todos los archivos y directorios sean privados (eliminar todos los permisos para grupos y otros), pero hacer que los sockets X11 sean accesibles para todos. El control de acceso en estos sockets es impuesto por el servidor, no por los permisos del archivo. Puede haber otros enchufes que deben estar disponibles públicamente. Ejecútelo find /tmp -type s -user 0para descubrir los sockets propiedad de la raíz que puede necesitar hacer accesibles al mundo. Puede haber también tomas de corriente de otros usuarios del sistema (por ejemplo, para comunicarse con un bus del sistema) explore con find /tmp -type s ! -user $UID(donde $UIDestá su ID de usuario).

Gilles
fuente
1
¿podrías explicar el segundo chmod más?
Bartlomiej Lewandowski
@BartlomiejLewandowski go-rwx: sin permisos para grupo y otros. Esto establece los permisos en rwx------(excepto que los archivos que se crearon ya que chmodpueden terminar con menos permisos, por ejemplo rw-------). En otras palabras, los archivos serán accesibles solo por su propietario. /tmp/.[!.]*es incluir archivos de puntos, que comúnmente existen en /tmp.
Gilles
@BartlomiejLewandowski: chmod -go-rwx: establece los derechos "rwx" para Propietario y Grupo. r = leer, w = escribir, x = ejecutar (para archivo) o enter / traverse (para directorio). 777 = rwxrwxrwx (la parte derecha se puede ver como: "set 'r' set 'w' set 'x', set 'r' set 'w' set 'x', set 'r' set 'w' set 'x '", que en binario se representa como" 111111111 "(1 para establecer, 0 para desarmar). Y" 111111111 "en binario se representa en octal como" 777 "(octal = grupos de 3 bits, cada grupo tiene un valor de 0 a 7). Si "rwxr-xr--" sería "111101100" que en octal es "754"
Olivier Dulac
2
El + t se conoce como el bit adhesivo. Eso es lo que impide que cualquier persona que no sea el propietario pueda eliminar archivos, a pesar de que los permisos son 777 de lo contrario. La parte pegajosa fue originalmente hacer que el núcleo dejara los programas comunes en la memoria cuando salían para que no tuvieran que ser recuperados del disco la próxima vez que se ejecuten. Estamos hablando de PDP11 días ...
kurtm
1
@GabrielFair Reemplacé el comando usando comodines por uno usando find que no se encontrará con ese problema.
Gilles
10

/tmpy /var/tmpdebería tener derechos de lectura, escritura y ejecución para todos; pero por lo general también agregaría el sticky-bit ( o+t), para evitar que los usuarios eliminen archivos / directorios que pertenecen a otros usuarios. Entonces chmod a=rwx,o+t /tmpdebería funcionar.

En cuanto a cambiar los permisos de forma recursiva ... Mientras el propietario / grupo permanezca como lo es para los archivos y directorios, no debería ser un gran problema. Pero quizás podría cambiar el permiso de todo lo que se encuentra debajo /tmp(no / tmp) para garantizar la privacidad de los usuarios, eliminando los rxderechos de los demás y quizás del grupo.

Encontrar es una buena manera de hacer esto. Como root, haz:

cd /tmp
find . -type f -exec chmod u=rw,go= {} \;   # (or u=rw,g=r,o= {})
find . -type d -exec chmod u=rwx,go= {} \;  # (or u=rwx,g=rx,o= {})
Baard Kopperud
fuente
En un sistema de escritorio típico, será mejor que también sea /tmp/.X11-unix/*legible en todo el mundo, o ya no podrá iniciar aplicaciones X.
Gilles
chmod a=rwX,o+t /tmp -RDebería hacer la findmagia.
dhill
3
[root@Niflheim tmp]# ls -alF .
total 1632
drwxrwxrwt 15 root root    4096 Apr  7 04:24 ./
drwxr-xr-x 28 root root    4096 Apr  2 21:02 ../
[root@Niflheim tmp]# stat -c '%A %a %n' .
drwxrwxrwt 1777 .

Desde una máquina CentOS 5.9.

Aaron D. Marasco
fuente