¿Por qué son 666 los permisos de creación de archivos predeterminados?

12

Como descubrí, cuando usas umask, los permisos más altos que puedes otorgar a los archivos son 666. Lo cual es realizado por umask 0000. Esto se debe a los permisos de creación de archivos predeterminados, que parecen ser 666 en todos los sistemas que conozco.

Sé que para los archivos necesitamos derechos ejecutables para mostrar su contenido.
Pero, ¿por qué limitamos los permisos de creación de archivos predeterminados en 666?

Peter
fuente
¿Qué tipo de sistema? Lo único umaskque conocía era siempre 0022, creando el permiso predeterminado 644.
manatwork
No, lo malinterpretaste. Umask está utilizando los permisos de archivo predeterminados de 666 y resta su propio valor (que es 0022 para su sistema). Entonces, la mayoría de los permisos que podría establecer es umask 0000, lo que todavía limita a los permisos de archivo de 666. (Pero aparentemente las carpetas usan 777)
Peter
Te tengo. Ahora esta es una buena pregunta.
trabajo de
2
No necesita permisos ejecutables para ver el contenido del archivo. Esto es así para los directorios, razón por la cual los directorios se crean de forma predeterminada con permisos de ejecución.
Joseph R.
1
Creo [pero necesitaría mirar más para estar seguro] que esto es por diseño, para evitar algunos problemas de seguridad: sin acceso a "chmod", no se puede hacer que un archivo sea ejecutable. umask 0000 crea archivos con 0666 y directorios con 0777 [que, por cierto, es una configuración predeterminada bastante horrible, ¡en cuanto a seguridad!]
Olivier Dulac

Respuestas:

10

Por lo que puedo decir, esto está codificado en las utilidades estándar. I straceD tanto touchla creación de un nuevo archivo y mkdircrear un nuevo directorio.

El touchrastro produjo esto:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

mientras que el mkdirrastro produjo esto:

mkdir("newdir", 0777)                   = 0

A falta de codificar el proceso de creación de archivos / directorios en C, no veo una forma de modificar los permisos predeterminados. Sin embargo, me parece que no tiene sentido hacer que los archivos sean ejecutables de manera predeterminada: no desea que ningún texto aleatorio se interprete erróneamente como comandos de shell.

Actualizar

Para darle un ejemplo de cómo los bits de permiso están codificados en las utilidades estándar. Aquí hay algunas líneas relevantes de dos archivos en el coreutilspaquete que contiene el código fuente para ambos touch(1)y mkdir(1), entre otros:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

En otras palabras, si no se especifica el modo, configúrelo en S_IRWXUGO(lectura: 0777) modificado por umask_value.

touch.c es aún más claro:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Es decir, otorgue permisos de lectura y escritura a todos (lectura: 0666), que serán modificados por el proceso umaskde creación de archivos, por supuesto.

Es posible que pueda sortear esto solo mediante programación: es decir, al crear archivos desde un programa en C, donde realiza las llamadas al sistema directamente o desde un lenguaje que le permite realizar una llamada al sistema de bajo nivel (consulte, por ejemplo, Perl sysopenen perldoc -f sysopen)

Joseph R.
fuente
Tienes razón, no quiero ningún accidente. ¡Pero no tener forma de cambiarlo es horrible! Los valores estándar deberían ser 777. Y necesitamos umask filey umask dir. Establecer dos valores predeterminados diferentes y bien. Pero ahora no tengo forma de crear archivos con permisos de ejecución.
Peter
1
@PeterI Bueno, mkdir(1)le ofrece un -minterruptor para especificar el modo del directorio en el momento de la creación. Sin embargo, con los archivos, dado que la creación de archivos utiliza la open(2)llamada al sistema, la herramienta que utiliza para crear el archivo es la responsable de pasar los bits de modo openy no tiene voz en el asunto. install(1)de forma predeterminada, copia su archivo a una nueva ubicación y establece los bits de ejecución, pero eso aún no sucede en el momento de la creación.
Joseph R.
Lo que está diciendo es que, touchpor ejemplo, es responsable de establecer los valores correctos. ¿Sabes dónde almacena los valores? Tal vez están configurados en todo el sistema, ¿para que podamos cambiarlos? Porque quiero liberarme ;)
Peter
@PeterI Vea la respuesta actualizada.
Joseph R.
1
@PeterI Actualicé la respuesta nuevamente. Es posible que pueda realizar la llamada al sistema directamente desde C u otro idioma como Perl.
Joseph R.
6

En primer lugar, no hay un valor predeterminado global, los permisos dependen de la aplicación que crea el archivo. Por ejemplo, este pequeño programa en C creará un archivo '/ tmp / foo' con permisos 0777 si umask es 0000 (en cualquier caso, los permisos serán 0777 y ~ umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

Dicho esto, muchas aplicaciones crean archivos con permisos de 0666. Eso tiene dos razones:

  1. Seguridad: no desea que ningún archivo arbitrario sea ejecutable.
  2. Conveniencia: la mayoría de los archivos no necesitan ser ejecutables. Es más fácil configurar el bit ejecutable en unos pocos archivos seleccionados que desactivarlo en la gran cantidad de otros archivos. Por supuesto, umask 0133 resolvería esto, pero entonces no se gana nada y no puede permitir que los programas creen archivos ejecutables incluso si así lo desea.
Adaephon
fuente
1
Los archivos se crean sin el bit x (ejecutar) establecido por razones de seguridad. La ejecución inadvertida de archivos [cw] podría ser una "mala cosa" (tm). El programa chmod le brinda la capacidad de (re) establecer bits de permisos según sea necesario.
ChuckCottrill