¿Es seguro usar `/ usr / local`?

15

Sé para qué /usr/localsirve: instalar software para la máquina local. Por defecto, rootposee el directorio. Esto significa que para instalar allí, debe usar sudo. Para una máquina de un solo usuario o desarrollador, esto parece un uso adicional innecesario del comando. Por lo tanto, mi pregunta: ¿es seguro para mí tenerla /usr/local?

Por ejemplo, Homebrew para OS X "Just Works" porque poseen /usr/locale instalan de manera segura su software allí sin el uso de sudo.

Además, si tiene instalado software compilado localmente /usr/local, el software actualmente necesita root para modificarse o instalar complementos. Esto parece inseguro: solo quiero usarlo sudocuando sé EXACTAMENTE lo que sucederá.

Opiniones?

PR3x
fuente

Respuestas:

5

No puedo recomendar convertirte en el dueño de /usr/local; para la mayoría de las situaciones, probablemente sea menos seguro que usarlo sudo.

Su pregunta sugiere dos razones por las que puede querer hacerlo chown /usr/local.

El primero es evitar tener que usar sudopara instalar software. Esto podría leer para algunos (como el autor de esta respuesta ) como decir que desea trabajar de manera eficiente, o guardar las pulsaciones de teclas necesarias para escribir sudoe ingresar su contraseña. Pero probablemente cuando dices "innecesario", te estás refiriendo al principio del menor privilegio :

Por defecto, rootposee el directorio. Esto significa que para instalar allí, debe usar sudo. Para una máquina de un solo usuario o desarrollador, esto parece un uso adicional innecesario del comando

A menudo escucho / leo a personas que opinan / se quejan en la línea de "Soy el único que usa este sistema, por lo que no debería necesitar usar sudoe ingresar una contraseña". Para los lectores que tienen ese punto de vista, y debido a que es relevante aquí, recordemos una razón de seguridad básica para que la raíz sea propietaria de cosas.

La mayoría de los archivos de programa instalados en un sistema Ubuntu tienen el modo de archivo 755, o en notación simbólica rwxr-xr-x, lo que significa que cualquier usuario o programa puede ejecutarlos , pero solo el propietario de los archivos, root, puede modificarlos. (Técnicamente, esto también requiere que nadie más que root tenga wpermiso en el directorio que los contiene, por lo que otros usuarios no pueden eliminarlos ni moverlos).

Esto significa que usted, el humilde usuario, puede ejecutar cualquier programa. Si intenta usar un programa para hacer algo que no tiene permiso para hacer, como realizar una operación de escritura en un archivo propiedad de root, se producirá un error. Esto hace que un error tipográfico en algún comando, una aplicación defectuosa o un código malicioso sea menos probable que estropee su sistema; a menos que se ejecute como root, no tendrá permiso para hacerlo. Esto es especialmente útil cuando se ejecutan programas que interactúan con Internet.

Si chown /usr/local, cualquier programa que se ejecute con sus privilegios podría escribir archivos allí, que luego podrían ejecutarse como root por alguna razón, como reemplazar otro comando del mismo nombre. /usr/local/binestá en el valor predeterminado $PATHy en sudo's secure_path, y viene antes de otras ubicaciones en ambos. Entonces si tengo dos ejecutables

/usr/local/bin/chown
/bin/chown

cuando yo haga sudo chown ..., el chownen /usr/local/binse ejecutará .

Pero probablemente ya sabías todo eso, ya que tu segunda razón es sobre seguridad:

Además, si tiene instalado software compilado localmente /usr/local, el software actualmente necesita root para modificarse o instalar complementos. Esto parece inseguro: solo quiero usarlo sudocuando sé EXACTAMENTE lo que sucederá.

En caso de que sea necesario mencionar esto aquí, es absolutamente correcto (de acuerdo con la FHS de todos modos) instalar un software compilado localmente /usr/local, pero la compilación en sí misma debe hacerse en algún lugar de su $HOME, sin sudo, hasta el último paso cuando escribe sudo make installo equivalente.

Creo que está sugiriendo que al ejecutar un programa instalado /usr/localcomo su propietario sin privilegios, podría usar errores de permisos específicos cuando intente actualizarse para ver que está tratando de modificar alguna otra ubicación del sistema de archivos que no le pertenece de una manera que usted no quiero, para que puedas evitar que lo haga.

Esto puede ser útil. La implicación es que confía en que el programa haga lo que quiera dentro /usr/local, pero no en otra parte. Si solicita permisos elevados, puede negarse a permitir que se actualice o lo desinstale. Eso tiene sentido para mí. Pero creo que intentar usar/usr/local como una especie de sandbox de esta manera probablemente no sea una buena idea, o al menos es poco probable que sea la solución más segura. No es una ubicación aislada adecuadamente ( /optestá un poco más aislada, ya que no está en el valor predeterminado $PATH). El programa puede escribir o eliminar algo /usr/localpara causar daño. Otros programas (potencialmente mal escritos) que ejecuta pueden escribir y ejecutar código allí que no conoce.

Si le preocupa permitir que un programa se actualice de manera segura, probablemente debería buscar alternativas (tal vez específicas para el programa, como con Python, por ejemplo, o podría buscar una implementación rápida o similar que se adapte a sus necesidades, o use contenedores o una máquina virtual para probar software potencialmente inseguro) antes de exponer una ubicación del sistema (incluso una relativamente de usuario) para que sea escrita por programas ejecutados por un usuario normal. Me parece que es probable que tenga efectos impredecibles como permitir que los programas aumenten temporalmente los permisos con sudo.

Zanna
fuente
6

Es inusual que /usr/localno sea propiedad de root. Pero puedes cambiar el propietario como quieras.

Pero le aconsejo que se asegure de que /usr/local/sbinaún le pertenece rootpara evitar un problema de seguridad. Los comandos aquí generalmente se invocan solo por root.

H.-Dirk Schmitt
fuente
2
Hice una instalación de Bower anteriormente, y el tutorial sugirió hacer chown -R $ USER / usr / local, así que ahora estoy ejecutando chown -R root / usr / local / sbin. ¿Hay alguna otra carpeta en / usr / local que estar mejor con la propiedad de root? Debería haber verificado todos los permisos antes de ejecutar el comando. Instantáneo "arrepentimiento al regreso".
OnethingSimple
2
Esta respuesta no es satisfactoria y la explicación no es realmente correcta. Si, por razones de seguridad, es necesario mantener los comandos de los que depende root, ¿qué pasa con los comandos de /usr/local/binesa raíz (y también de otros usuarios)? ¿No tendrían que ser propiedad de root? Además, los usos raíz de los comandos, incluidos los comandos en, /usr/local/sbinpueden depender de las bibliotecas compartidas en /usr/local/lib. Cambiar esas bibliotecas puede introducir cambios arbitrarios en el comportamiento de los comandos que las usan. Insistir en que solo /usr/local/sbinsigue siendo propiedad de root parece completamente arbitrario.
Eliah Kagan
5

Para el software única que necesita, utiliza el directorio de inicio en lugar de /usr/local.

En lugar de cambiar la propiedad /usr/localo tener que ejecutar comandos como root cuando no lo desee, debe configurar sus compilaciones para que se instalen en su directorio de inicio en lugar de hacerlo /usr/local. Todo esto direcciones de los posibles problemas con el cambio de la propiedad de la /usr/local, incluyendo cómo sus biny sbinsubdirectorios están en rootcamino 's.

Si necesita permitir que otros usuarios ejecuten su software, puede darles acceso. De hecho, probablemente ya podrán hacerlo, porque de manera predeterminada su directorio de inicio tiene acceso de lectura y ejecución permisivo . (Si no quiere eso, puede cambiarlo con bastante facilidad, simplemente usando chmodcualquier archivo o directorio que desee que sea privado y posiblemente también cambiando su umask).

Con el software instalado en su directorio de inicio, los binarios que habrían entrado /usr/local/binentrarán en su lugar . Obtendrá otros subdirectorios de su directorio de inicio correspondientes a los subdirectorios que necesita el software que instala. Esto suele suceder automáticamente cuando instala el software desde el código fuente./home/username/bin/usr/local

Configurando tus Builds

La mayoría del software que crea a partir del código fuente tiene un paso en el que ejecuta:

./configure

Para la gran mayoría del software que se envía con un configurescript que se puede ejecutar de esa manera, el valor predeterminado es configurar la compilación para la instalación en el interior /usr/localcuando finalmente se ejecuta sudo make installpara instalarlo. La razón es que es implícitamente equivalente a ejecutar:

./configure --prefix=/usr/local

Para configurar una compilación para la instalación en su directorio de inicio, use esto en su lugar:

./configure --prefix="$HOME"

En la práctica, en Ubuntu, las rutas del directorio de inicio no contienen espacios, otros espacios en blanco u otros caracteres que serán tratados especialmente por el shell *, por lo que, a menos que haya configurado su cuenta de usuario de manera extraña, puede escribir:

./configure --prefix=$HOME

(Sin embargo, no recomiendo acostumbrarse a eso para escribir scripts . Además, en algunos otros sistemas operativos, como macOS, es menos raro que las rutas a los directorios de inicio de los usuarios contengan espacios).

O si lo prefiere, puede escribir la ruta completa del directorio de inicio:

./configure --prefix=/home/username

(Reemplácelo usernamecon su nombre de usuario real, por supuesto. Si por alguna razón su directorio de inicio no se encuentra, /homeentonces tendrá que ajustarlo en consecuencia).

Instalación de sus compilaciones

Después de ejecutar make, es posible que esté acostumbrado a hacerlo sudo make install, pero cuando lo instala en su propio directorio de inicio, no necesita ejecutarlo como root, por lo que puede, y debe, omitir sudo. Solo corre:

make install

Del mismo modo, para el software que admite un uninstallobjetivo:

make uninstall

Esto es exactamente lo que estaba pidiendo ... solo en su directorio personal, no /usr/local.

Ejecutando sus programas

Probablemente el binsubdirectorio de su directorio de inicio sea:

  • ya en tu $PATH, o
  • estará en su $PATHsi simplemente cierra sesión y vuelve a iniciar sesión.

La razón es que el .profilearchivo en su directorio de inicio, que contiene comandos que se ejecutan cuando inicia sesión, contiene esto de forma predeterminada para las cuentas de usuario creadas en la mayoría de las versiones de Ubuntu (incluida la cuenta de administrador inicial creada cuando instala el sistema operativo):

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Ese código se ejecuta cuando inicia sesión (porque está dentro .profile) y coloca su bindirectorio personal $PATH solo si existe en ese momento. Es por eso que es posible que deba cerrar sesión y volver a iniciarla.

Las versiones anteriores como Ubuntu 14.04, así como las nuevas versiones como Ubuntu 17.10, vienen con eso. Sin embargo, Ubuntu 16.04, que es probablemente la versión más popular a partir de este escrito, tiene esto en su lugar:

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

Eso simplemente agrega el binsubdirectorio de su directorio de inicio, así como el .local/binsubdirectorio, a su $PATH, sin verificar si esos directorios realmente existen. Entonces, si usa 16.04, o si actualizó desde un sistema que era 16.04 cuando se creó su cuenta de usuario, entonces el binsubdirectorio de su directorio de inicio probablemente ya esté en su$PATH .

Su .profilearchivo se copia del /etc/skeldirectorio cuando se crea su cuenta de usuario. Si su cuenta de usuario se creó en una versión anterior de Ubuntu, obtuvo esa versión de.profile y no se modificó, para su cuenta de usuario, al actualizar a una versión más reciente.

Una vez que el binsubdirectorio de su directorio de inicio esté en su $PATH, podrá ejecutar programas cuyos archivos ejecutables se instalen allí simplemente escribiendo sus nombres, tal como lo haría con los programas instalados por el administrador de paquetes de Ubuntu o instalados dentro/usr/local .

los .local opción

Es posible que haya notado que el .profilearchivo predeterminado para las cuentas de usuario creadas en algunas versiones de Ubuntu, incluido en 16.04 como se describe anteriormente, agrega no solo $HOME/bina su ruta, sino también $HOME/.local/bin. Si tu .profileno agrega eso, pero quieres , simplemente puede editarlo.

Aunque a menudo se usa para almacenar configuraciones y datos en caché , también puede instalar software dentro del .localsubdirectorio de su directorio de inicio. Debería sentirse desinhibido al hacerlo, ya que desde un punto de vista de usabilidad y seguridad, --prefix="$HOME/.local"es similar a--prefix="$HOME" .

Recuerde que los archivos y directorios que comienzan .no se muestran de manera predeterminada en los exploradores de archivos gráficos (use Ctrl+ Hpara mostrarlos y volver a mostrarlos) o mediante el lscomando (pase el -Ao-a indicador para mostrarlos). Esto puede no ser lo que quieres, o puede ser exactamente lo que quieres. Esta es una cuestión de preferencia personal.

Sin embargo, he observado que algunos administradores de paquetes automatizados basados ​​en fuentes que construyen e instalan software en el uso del directorio personal $HOME/.local. Realmente no sé qué tan común es esto, espero investigar más y actualizar esta respuesta, pero es posible que prefiera usar$HOME para cosas que compila manualmente. De esa manera quedará claro de dónde provienen las cosas. Y si hay una colisión, es probable que el software coexista de manera aceptable.

También puede instalar deliberadamente algún software $HOME/.localy otro software en $HOME. Tu decides. Cualquier bindirectorio que aparezca primero en su $PATHvariable de entorno es aquel desde el que se ejecutará un comando, en el caso de que existan comandos del mismo nombre en ambos.


El crédito es para Zanna y Videonauth por señalar errores en una versión anterior de esta respuesta, con respecto a qué versiones de Ubuntu tienen qué código predeterminado .profiley me ayudan a corregirlos (ver también aquí ).

Eliah Kagan
fuente
0

Si sudo es un inconveniente, simplemente actualice / etc / sudoers para que no tenga que ingresar su contraseña cuando ejecute sudo. Creo que es una mejor solución que cambiar el propietario de / usr / local.

notkevin
fuente
44
Las contraseñas no son el problema, es más la idea de que para instalar módulos en un programa /usr/localtienes que usar sudo, lo que es potencialmente peligroso.
PR3x