¿Hay alguna manera de evitar que todos los comandos se definan como un alias?
Por ejemplo, un usuario no debería poder definir rm
ni ningún otro comando (comandos predeterminados de Ubuntu) como un nombre de alias.
~/.bashrc
.
¿Hay alguna manera de evitar que todos los comandos se definan como un alias?
Por ejemplo, un usuario no debería poder definir rm
ni ningún otro comando (comandos predeterminados de Ubuntu) como un nombre de alias.
~/.bashrc
.
Respuestas:
No hay forma de evitar que un usuario defina los alias que prefiera. Considerar:
/etc/bash.bashrc
. Lo habilitan donde lo elijan./etc/bash.bashrc
, y todo ~/.bashrc
y a ~/.bash_aliases
través de un script. Ponen sus alias en otro archivo y lo obtienen.PROMPT_COMMAND
que deshabilita ciertos alias. Redefinen o indefinen PROMPT_COMMAND
.DEBUG
y no define alias. Quitan la trampa.unset
, builtin
y enable
; hacer alias
una función ; declare -rf alias
para evitar que los usuarios modifiquen la función; y exportar la función. Se ejecutan /bin/bash
con --rcfile
y --init-file
para iniciar un nuevo shell, donde dichas incorporaciones ahora están habilitadas.Puede deshabilitar los alias en el momento de la compilación, entonces dependerá de usted mantener actualizado el bash y asegurarse de que no se vea afectado por el próximo Shellshock. Por supuesto, los usuarios podrían construir su propio bash.
unalias alias
.
\unalias unalias
.
La única forma de evitar que un usuario cree alias es proporcionarle un shell que no sea compatible con alias. Este es generalmente un problema X / Y, donde X es realmente un modelo de amenaza que debe resolverse con controles o arquitecturas apropiadas en lugar de tratar de resolver el problema post facto después de que un usuario recibe un shell en un sistema compartido.
A continuación, proporciono una respuesta técnicamente correcta, así como una guía sobre qué problemas resolverá y no resolverá. También proporciono alguna orientación adicional sobre controles alternativos.
Puede usar el shell restringido de Bash asignando rbash como el shell de inicio de sesión del usuario. Por ejemplo:
foo:x:2001:2001:restricted user:/home/foo:/bin/rbash
Luego debe deshabilitar el alias integrado para el usuario, preferiblemente sin romper el shell de todos los demás. Como ejemplo, puede agregar lo siguiente a un archivo como /etc/profile.d/rbash.sh :
# Limit effect to users in a specific UID range.
if ((UID >= 2000)) && ((UID < 3000)); then
# Check shell options; disable alias builtins when shell is restricted.
if [[ $- =~ r ]]; then
enable -n alias
enable -n unalias
fi
fi
A menos que haya colocado al usuario en una cárcel chroot o le haya proporcionado una RUTA modificada que no incluya el acceso a otros shells, no hay nada que impida que el usuario simplemente escriba bash
en el indicador y obtenga un shell sin restricciones.
Además, por diseño, el shell restringido evita muchas actividades comunes, como cambiar directorios:
$ cd /tmp
rbash: cd: restricted
pero no impide que otros scripts o programas en PATH lo hagan. Esto significa que debe crear cuidadosamente el entorno del usuario, y específicamente que debe evitar que puedan modificar la RUTA en sus archivos de inicio, porque aunque rbash hace que la RUTA sea de solo lectura, lo hace después de la inicialización.
Incluso si usa rbash, debe hacerlo como parte de un conjunto más amplio de controles. Algunos ejemplos pueden incluir:
Evitar que los usuarios no técnicos de forma accidental que invocan los comandos peligrosas por proporcionar alias predeterminados, tales como rm -i
, mv -i
y cp -i
en el /etc/bash.bashrc archivo.
enable -n alias
si quieres.Permisos Unix tradicionales o ACL POSIX para proteger archivos y directorios.
Inicios de sesión que realizan un solo comando no interactivo. Por ejemplo:
foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
Utilice comandos forzados SSH por tecla. Por ejemplo:
# ~foo/.ssh/authorized_keys
command="/usr/local/bin/foo.sh" [remainder of line]
Use la opción OpenSSH ForceCommand con un bloque Match condicional.
Use herramientas especiales como gitolita o scponly diseñadas para su caso de uso específico.
Usa una cárcel chroot .
Utilice la virtualización como Xen, OpenVZ, LXC, VMware, VirtualBox u otras tecnologías para proporcionar un entorno segregado.
Una vez que haya definido con precisión su modelo de amenaza, puede identificar los controles más apropiados para su caso de uso. Sin una comprensión más significativa de por qué desea evitar el aliasing (por ejemplo, ¿qué problema del mundo real resuelve?) No puede seleccionar los controles más apropiados.
Este es un esfuerzo bastante inútil, como lo muestra la respuesta de muru. Pero hay algunas opciones, pero no son perfectas.
Según el bash
manual, las funciones siempre tienen prioridad sobre los alias, por lo que podríamos hacer lo siguiente:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no
Podría colocar la definición de función en todo el sistema .bashrc
, sin embargo, como señaló Muru, los usuarios inteligentes encontrarán la forma de obtener alias al obtener un bashrc
archivo diferente , por ejemplo.
Otra idea con la que he jugado es enable
incorporada.
alias
es un shell integrado y bash
tiene un enable
comando agradable que permite habilitar o deshabilitar los builtins. Por ejemplo, aquí estoy yo deshabilitándome alias
.
xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:
Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'
No command 'alias' found, did you mean:
Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$
Nuevamente, usar todo el sistema bashrc
es una opción aquí.
rm
, verifica la lista. Teniendo en cuenta que las listas serían bastante grandes, tomaría mucho tiempo comenzar, sus usuarios se quejarán mucho y lo odiarán como administrador del sistema :)
Usted podría definir (en /etc/profile
) una función llamada alias
que realiza la validación desea (probablemente usando type -p
) (después de todos los "comandos por defecto de Ubuntu" son "ejecutables en $PATH
") antes de llamar a la orden interna alias
, pero, como otros tienen cabo en punta, los usuarios podrían obtener Alrededor de eso. ¿Por qué no obtener un conjunto diferente de usuarios o educarlos ("Definir un alias
comando que anula un comando es una muy buena manera de dispararse en el pie y causar confusión (por ejemplo, ¿por qué ls
solicita mi contraseña?))?