C'è un modo per impedire che tutti i comandi vengano definiti come alias?
Ad esempio un utente non dovrebbe essere in grado di definire rm
o qualsiasi altro comando (comandi predefiniti di Ubuntu) come nome alias.
~/.bashrc
.
C'è un modo per impedire che tutti i comandi vengano definiti come alias?
Ad esempio un utente non dovrebbe essere in grado di definire rm
o qualsiasi altro comando (comandi predefiniti di Ubuntu) come nome alias.
~/.bashrc
.
Risposte:
Non è possibile impedire a un utente di definire gli alias che preferisce. Ritenere:
/etc/bash.bashrc
. Lo abilitano ovunque abbiano scelto./etc/bash.bashrc
e tutte ~/.bashrc
e ~/.bash_aliases
tramite uno script. Hanno messo i loro alias in un altro file e lo hanno sorgente.PROMPT_COMMAND
che disabilita determinati alias. Ridefiniscono o indefiniscono PROMPT_COMMAND
.DEBUG
e definisci gli alias. Rimuovono la trappola.unset
, builtin
e enable
; fare alias
una funzione ; declare -rf alias
per impedire agli utenti di modificare la funzione; ed esporta la funzione. Funzionano /bin/bash
con --rcfile
e --init-file
per avviare una nuova shell, dove i builtin sono ora abilitati.È possibile disabilitare gli alias al momento della compilazione, quindi spetta a te mantenere bash aggiornato e assicurarsi di non essere influenzato dal prossimo Shellshock. Ovviamente, gli utenti potrebbero costruire la propria bash.
unalias alias
.
\unalias unalias
.
L'unico modo per impedire a un utente di creare alias è fornire loro una shell che non supporti l'aliasing. Questo è generalmente un problema X / Y, in cui X è in realtà un modello di minaccia che dovrebbe essere risolto con controlli o architetture appropriate anziché cercare di risolvere il problema post-facto dopo che a un utente è stata assegnata una shell su un sistema condiviso.
Di seguito, fornisco una risposta tecnicamente corretta, nonché alcune indicazioni su quali problemi questo risolverà e non risolverà. Fornisco anche alcune indicazioni aggiuntive sui controlli alternativi.
È possibile utilizzare la shell con restrizioni di Bash assegnando rbash come shell di accesso dell'utente. Per esempio:
foo:x:2001:2001:restricted user:/home/foo:/bin/rbash
È quindi necessario disabilitare l' alias incorporato per l'utente, preferibilmente senza interrompere anche la shell di tutti gli altri. Ad esempio, è possibile aggiungere quanto segue a un file come /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 meno che tu non abbia inserito l'utente in una prigione chroot o abbia fornito loro un PERCORSO modificato che non include l'accesso ad altre shell, non c'è nulla che impedisce all'utente di digitare semplicemente bash
al prompt e ottenere una shell senza restrizioni.
Inoltre, in base alla progettazione, la shell con restrizioni impedisce molte attività comuni come cambiare directory:
$ cd /tmp
rbash: cd: restricted
ma non impedisce ad altri script o programmi nel PERCORSO di farlo. Questo significa che devi creare con cura l'ambiente dell'utente, e in particolare che devi impedire loro di poter modificare il PERCORSO nei loro file di avvio, perché anche se rbash rende PATH di sola lettura, lo fa dopo l' inizializzazione.
Anche se usi rbash, devi farlo come parte di un insieme più ampio di controlli. Alcuni esempi possono includere:
Impedire agli utenti non tecnici di accidentalmente Richiamo dei comandi pericolosi, fornendo gli alias di default come rm -i
, mv -i
e cp -i
nel /etc/bash.bashrc di file.
enable -n alias
se vuoi.Autorizzazioni Unix tradizionali o ACL POSIX per proteggere file e directory.
Login che eseguono un singolo comando non interattivo. Per esempio:
foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
Utilizzare i comandi forzati SSH per tasto. Per esempio:
# ~foo/.ssh/authorized_keys
command="/usr/local/bin/foo.sh" [remainder of line]
Usa l' opzione OpenSSH ForceCommand con un blocco Match condizionale.
Usa strumenti speciali come gitolite o scponly progettati per il tuo caso d'uso specifico.
Usa una prigione chroot .
Utilizzare la virtualizzazione come Xen, OpenVZ, LXC, VMware, VirtualBox o altre tecnologie per fornire un ambiente separato.
Dopo aver definito con precisione il modello di minaccia, è possibile identificare i controlli più appropriati per il proprio caso d'uso. Senza una comprensione più significativa del motivo per cui si desidera impedire l'aliasing (ad es. Quale problema del mondo reale risolve?) Non è possibile selezionare i controlli più appropriati.
Questo è uno sforzo abbastanza inutile, come mostra la risposta di Muru. Ma ci sono alcune opzioni, ma non sono perfette.
Secondo il bash
manuale, le funzioni hanno sempre la precedenza sugli alias, quindi potremmo fare quanto segue:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no
È possibile inserire la definizione della funzione in tutto il sistema .bashrc
, tuttavia, come ha sottolineato Muru, gli utenti intelligenti troveranno il modo di ottenere gli alias acquistando un bashrc
file diverso , ad esempio.
Un'altra idea con cui ho giocato è enable
integrata.
alias
è una shell integrata e bash
ha un bel enable
comando che consente di abilitare o disabilitare i builtin. Ad esempio, ecco che sto disabilitando 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:~$
Ancora una volta, l'utilizzo di tutto il sistema bashrc
è un'opzione qui.
rm
, controlla l'elenco. Considerando che le liste sarebbero piuttosto grandi, ci vorrebbe molto tempo per iniziare, i tuoi utenti si lamenteranno molto e ti odieranno come amministratore di sistema :)
È possibile definire (in /etc/profile
) una funzione chiamata alias
che esegue la convalida desiderata (probabilmente utilizzando type -p
) (dopo che tutti i "comandi predefiniti di Ubuntu" sono "eseguibili in $PATH
") prima di chiamare l'integrato alias
, MA, come altri hanno sottolineato, gli utenti potrebbero ottenere intorno a quello. Perché non ottenere un diverso gruppo di utenti o istruirli ("Definire un alias
comando che ignora un comando è un ottimo modo per spararsi nel piede e creare confusione (ad esempio, perché ls
richiede la mia password?))?