Blocca comandi particolari in Linux per utenti specifici


27

Come bloccare il comando, diciamo mkdirper un utente specifico?

Quello che ho fatto ha appena creato la funzione di sola lettura e l'archiviazione nel profilo degli utenti ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

Test:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

Quindi la mia domanda è: quale dovrebbe essere il modo per raggiungere questo obiettivo? c'è qualche strumento per questo?

Aggiornamento 1 # Ma se l'utente è intelligente, potrebbe copiare binario mkdir e rinominarlo e usarlo. Quindi come raggiungere questo obiettivo?


7
Il tuo esempio fallirà perché l'utente potrebbe compilare il proprio mkdire rinominarlo, o anche semplicemente copiare e rinominare il binario esistente. Inoltre, c'è una shell integrata per l'override di alias e funzioni.
Strugee,

hmm è corretto, quindi c'è comunque?
Rahul Patil,

inoltre l'utente non ha bisogno di compilare, può facilmente copiarlo e cp /bin/mkdir mkdir2poi usarlo :(
Rahul Patil,

La creazione di una directory è un compito così comune / fondamentale che ci sono molti modi per farlo, e sarebbe quasi impossibile bloccarli tutti (tranne per non consentire all'utente di creare file; cioè proteggere da scrittura tutte le directory contro di lui). Ad esempio, cp -r /usr/local/lib gggcreerà una directory chiamata ggg(contenente una copia del contenuto /usr/local/lib, se presente, che l'utente può semplicemente eliminare). È possibile utilizzare find / -type d -emptyper trovare una directory vuota da copiare.
G-Man dice 'Reinstate Monica' il

Risposte:


21

Non so come farlo con bash, ma conosco un'altra shell che limita l'ambiente dell'utente: lshell (shell limitata) .

Una rapida panoramica della configurazione

Lshell è configurato tramite un file INI. Per impostazione predefinita, contiene una lista bianca di comandi consentiti, ma può essere facilmente configurato per impedire all'utente di utilizzare un comando specifico.

Questa configurazione (conf predefinito /etc/lshell.conf) impedisce all'utente foodi utilizzare mkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

Per configurare un account utente per utilizzare lshell per impostazione predefinita, è necessario:

 chsh -s /usr/bin/lshell foo

Lshell può fare di più, come:

  • 3 livelli di granularità: utente, gruppo, tutti.
  • Può limitare l'accesso a determinati percorsi nel sistema.
  • Può limitare l'uso di determinati caratteri (come |).
  • Può limitare l'uso di determinati comandi solo su SSH.

E altro ancora

Aggiornamento 1 # Risultato del test aggiunto:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir

3
con allowed = 'all' - ['mkdir'], non puoi semplicemente eseguire bashed essere di nuovo senza restrizioni?
Dawud,

3
Solo essere pedanti, mi dispiace, ma ci sono ancora molti modi per aggirare le restrizioni imposte da quell'elenco, ad es dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Penso che il problema sia la mancanza di una politica predefinita restrittiva, vale a dire, in questo scenario si concedono le autorizzazioni di default, quindi le autorizzazioni DENY basate su un elenco, quando dovrebbe essere il contrario: DENY per impostazione predefinita, quindi GRANT basato sulla politica .
Dawud,

1
@dawud: sono d'accordo che mantenere una whitelist di comandi consentiti sia un approccio migliore rispetto ad avere una lista nera e sperare che l'utente non lo aggiri ingannando l'amministratore.
Rahmu,

2
@Marco, controlla l'esempio fornito nella mia risposta. Fornisco una lista bianca di comandi consentiti e, in quello scenario, l'utente non può semplicemente eseguire cpun binario nel proprio PERCORSO ( rootdirectory di proprietà, rxper l'utente) e rbashimpedisce l'esecuzione ./executables. Risponde alla tua domanda?
Dawud,

2
@dawud Sì, davvero. Ho perso la directory bin di sola lettura.
Marco,

15

Il modo in cui di solito implemento questo tipo di restrizioni richiede che siano soddisfatte diverse condizioni, altrimenti la restrizione può essere facilmente aggirata:

  • L'utente non appartiene al wheelgruppo, l'unico autorizzato ad utilizzare su(applicato tramite PAM).
  • All'utente viene fornito correttamente rbashun PATH di sola lettura che punta a un privato ~/bin, questa ~/bin/directory contiene collegamenti a semplici utility:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • l'utente riceve un ambiente di sola lettura limitata (si pensi a cose come LESSSECURE, TMOUT, HISTFILEvariabili).

  • l'utente viene mappato all'utente SELinux staff_ue gli viene dato il diritto di eseguire comandi come altri utenti come richiesto tramite sudo.
  • l'utente /home, /tmpe possibilmente /var/tmpsono polinistanziati tramite /etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    Inoltre, /etc/security/namespace.initrende tutti i file scheletrici di sola lettura per l'utente e di proprietà di root.

In questo modo è possibile scegliere se $USEReseguire mkdirper proprio conto (tramite un collegamento nella ~/bindirectory privata , fornito tramite /etc/skel, come spiegato sopra), per conto di un altro utente (tramite sudo) o nessuno.


4

Aggiungere un gruppo fittizio, aggiungere l'utente a tale gruppo, chown root:somegroup /bin/mkdir, chmod g-x /bin/mkdir. Si noti che ciò si basa sul fatto che l'utente non è in grado di modificare i propri gruppi. IIRC questo è vero in GNU / Linux ma non in alcuni altri Unices.


2
Sulla maggior parte dei filesystem è anche possibile utilizzare ACL estesi per un controllo più preciso: il numero di gruppi necessari aumenterebbe in modo esponenziale con il numero di utenti (a causa di possibili combinazioni), per non parlare dei problemi di denominazione.
peterph,

2
aggiungere un altro punto, rimuovere anche l'autorizzazione in lettura dagli altri utenti 710, in modo che l'utente non possa copiare e rinominare quel binario non è vero?
Rahul Patil,

1
@RahulPatil sì, e ovviamente devi limitare anche il loro uso di un compilatore.
peterph,

1

Il meglio che ho testato è usare Profile.d il modo migliore e più sicuro

Passaggio n. 1 (creare un file alias)

[root@newrbe ~]# vim /etc/customalias.sh

Aggiungi righe sotto:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

Salva ed esci

Passaggio 2 (Crea caricatore di profili)

/etc/profile.d/ questa posizione contiene file per il completamento bash

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

Aggiungi sotto le righe sotto i file queste righe bloccheranno i comandi menzionati per gli utenti sottostanti

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

salva ed esci

Ora esci e accedi nuovamente

Saluti, -Mansur


/etc/profile.d/non è per il bashcompletamento , è dove posizionare le personalizzazioni della sessione di accesso per gli utenti che utilizzano shell di accesso simili a POSIX, quindi non è in genere dove bashdovrebbero andare le personalizzazioni alias (che preferirebbero andare /etc/bash.bashrc) e dovrebbe avere una sintassi della shell POSIX (quindi in genere .invece di sourcee =invece di ==).
Stéphane Chazelas,

-1

installa sudoers e prova a configurare lì i cui utenti e quale comando.


4
Benvenuti in SX. Aggiungi i dettagli alla tua risposta; l'OP, o chiunque legga questa domanda in futuro, potrebbe non esserne a conoscenza sudo.
Joseph R.,

Questa risposta è semplicemente sbagliata
Kiltek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.