Estuve jugando con PowerShell esta semana y descubrí que debes firmar tus scripts para que puedan ejecutarse. ¿Existe alguna funcionalidad segura similar en Linux que se relacione con la prevención de la ejecución de scripts bash?
La única funcionalidad similar a esta, que yo sepa, es la de SSH que requiere una determinada clave.
noexec
en una partición de solo lectura en un dispositivo de bloque firmado de dm-verity.Respuestas:
Si está bloqueando la capacidad de los usuarios para ejecutar scripts a través de,
sudo
entonces podría usar ladigest
funcionalidad.Puede especificar el hash de un script / ejecutable en el
sudoers
que se verificarásudo
antes de ejecutarse. Entonces, aunque no es lo mismo que firmar, le brinda una garantía básica de que el script al menos no se ha modificado sin que también se modifiquen los sudoers.http://www.sudo.ws/man/1.8.13/sudoers.man.html
fuente
Si y no.
La distribución de software de Linux funciona de manera algo diferente a la distribución de software de Windows. En el mundo Linux (no integrado), el método principal para distribuir software es a través de una distribución (Ubuntu, Debian, RHEL, Fedora, Arch, etc.). Todas las distribuciones principales han estado firmando sus paquetes sistemáticamente durante aproximadamente una década.
Cuando el software se distribuye de forma independiente, depende del proveedor decidir cómo enviarán su software. Los buenos proveedores proporcionan fuentes de paquetes que son compatibles con las principales distribuciones (no existe un mecanismo de distribución unificado para todo Linux: la distribución de software es uno de los principales puntos de diferenciación entre las distribuciones) y que se firman con la clave del proveedor. Las distribuciones de Linux rara vez actúan como una autoridad de firma para proveedores externos (Canonical hace esto con los socios de Ubuntu, pero eso cubre muy pocos proveedores), y creo que todas las distribuciones principales usan la red de confianza PGP en lugar de la infraestructura de clave pública TLS, por lo que depende del usuario determinar si desea confiar en una clave.
No existe un mecanismo especial que destaque los paquetes de software que consisten en un solo script de paquetes de software que consisten en un archivo ejecutable nativo, un archivo de datos o varios archivos. Tampoco se incluye ninguna verificación de firma en ningún intérprete de script común, porque verificar un paquete de software es una preocupación completamente ortogonal al ejecutar un script.
Creo que Windows anota los archivos con su origen y requiere la confirmación del usuario para ejecutar un archivo cuyo origen se "descargue" en lugar de "local". Linux realmente no tiene un mecanismo similar. Lo más cercano es el permiso de ejecución: un archivo descargado no tiene permiso de ejecución, el usuario debe habilitarlo explícitamente (
chmod +x
en la línea de comando o la acción equivalente en un administrador de archivos).fuente
Linux no proporciona la capacidad de limitar la ejecución de scripts bash basados en firmas digitales.
Hay algo de trabajo en la autenticación de ejecutables binarios. Consulte https://lwn.net/Articles/488906/ para obtener información.
fuente
En una palabra, "no".
Linux realmente no diferencia entre ejecutables y scripts; el
#!
al principio es una forma de decirle al núcleo qué programa se ejecute para evaluar la entrada pero no es la única forma en que un script puede ser ejecutado.Entonces, por ejemplo, si tengo un script
Entonces puedo ejecutar esto con el comando
Eso hará que el núcleo intente ejecutarlo, detecte
#!
y luego se ejecute efectivamente/bin/sh x
.Sin embargo, también podría ejecutar cualquiera de estas variantes:
o incluso
Entonces, incluso si el núcleo intentó imponer la firma en la
exec
capa, podemos evitar esto ejecutando solo el intérprete con el script como parámetro.Esto significa que el código de firma debería estar en el propio intérprete. ¿Y qué impediría a un usuario compilar su propia copia de un shell sin el código de cumplimiento de firma?
La solución estándar para esto no es usar la firma, sino usar los Controles de acceso obligatorios (MAC), como
SELinux
. Con los sistemas MAC puede especificar exactamente lo que cada usuario puede ejecutar y hacer la transición de capas. Entonces, por ejemplo, puede decir "los usuarios normales pueden ejecutar cualquier cosa menos que el servidor web y los procesos CGI solo puedan acceder a cosas del/var/httpd
directorio; todo lo demás se rechaza".fuente
This means that signing code would have to be in the interpreter itself. And what would stop a user from compiling their own copy of a shell without the signing enforcement code?
No permitir la ejecución de ningún ejecutable sin firmar lo haría, si el usuario no tiene la clave de firma. Ya hay varios proyectos * nix para esto.Las distribuciones de Linux generalmente tienen gnupg . Me parece que todo lo que desea es un simple contenedor de bash que verifique una firma de GPG separada contra el script de argumento y solo proceda a ejecutar el script si la verificación tiene éxito:
fuente
La contrapregunta que viene a la mente de inmediato es: "¿Por qué querrías evitar que los usuarios ejecuten programas que escribieron? " Existen varias posibilidades:
* Esto probablemente se está volviendo cada vez menos cierto a medida que más personas comienzan a usar Linux
fuente
La razón por la cual los sistemas han evolucionado de manera diferente es que Linux tiene el atributo de archivo 'exec' y Windows usa extensiones de archivo para determinar la ejecubilidad.
Por lo tanto, en Windows es fácil engañar al usuario para que descargue un archivo con la extensión ".exe", ".bat", ".scr", que estará oculto de forma predeterminada . Hacer doble clic en ese archivo le daría ejecución de código arbitrario. Por lo tanto, se creó un gran mecanismo de seguimiento de origen y firma ejecutable / script para mitigar este riesgo.
En Linux, es posible que pueda obtener un archivo para el usuario, pero no puede forzar fácilmente la configuración del bit 'exec'. Además, es posible crear sistemas de archivos completos 'noexec'.
En cualquier caso, puede ejecutar un script explícitamente invocando al intérprete. Incluso puede crear scripts de shell en tiempo de ejecución y canalizarlos a "sh", o ejecutar "sh -c".
fuente
Por costumbre, muchos programas de archivo no conservan el bit de ejecución en archivos contenidos. Esto hace que sea imposible ejecutar ejecutables arbitrarios. Bueno, casi.
El punto es que lo que se describió en otra respuesta es que la falta de bit de ejecución no le impide pasar dicho script directamente
bash
. Si bien es discutible que la mayoría de estos scripts seanbash
scripts, el shebang puede especificar cualquier programa como intérprete. Esto significa que depende del usuario ejecutar el intérprete apropiado si decide ignorar la semántica ejecutable.Si bien esto no es mucho, cubre la prevención de ejecutar ejecutables no confiables en * nixes con solo kernel y shell .
Como mencioné en uno de los comentarios, hay otra capa de protección
SeLinux
, que rastrea el origen de los archivos en función de un conjunto de reglas. Una configuraciónSeLinux
no permitiría, por ejemplo, que la raíz ejecute un ejecutable con un conjunto de bits ejecutable que se descargó de Internet, incluso si copia y mueve el archivo. Se puede agregar una regla de que dichos archivos solo se pueden ejecutar a través de otro binario que verifique la firma, no muy diferente de lo que mencionó en su pregunta.Entonces, al final es una cuestión de configuración de herramientas preinstaladas comúnmente, y la respuesta es sí .
fuente
tar
no preservar el bit de ejecución.tar -p
fuente-p, --preserve-permissions, --same-permissions
significa extraer información sobre los permisos de archivos (predeterminado para superusuario)touch permtest; chmod +x permtest; tar cf permtest.tar.gz permtest; rm permtest; tar xf permtest.tar.gz; ls -l permtest
- Es ejecutable aquí, y no soy root.