Je ne sais pas comment le faire avec bash, mais je connais un autre shell qui limite l'environnement de l'utilisateur :lshell (shell limité).
Un aperçu rapide de la configuration
Lshell est configuré via un fichier INI. Par défaut, il contient une liste blanche de commandes autorisées, mais il peut être facilement configuré pour interdire à l'utilisateur d'utiliser une commande spécifique.
Cette configuration (config par défaut /etc/lshell.conf
) interdit l'utilisateur foo
d'utiliser mkdir
:
[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']
Afin de configurer un compte utilisateur pour utiliser lshell par défaut, vous devez :
chsh -s /usr/bin/lshell foo
Lshell peut faire plus, comme :
- 3 niveaux de précision :utilisateur, groupe, tous.
- Peut restreindre l'accès à certains chemins du système.
- Peut restreindre l'utilisation de certains caractères (comme
|
). - Peut restreindre l'utilisation de certaines commandes uniquement via SSH.
Et plus encore.
Mise à jour 1# Résultat du test ajouté :
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
La façon dont j'implémente habituellement ce type de restrictions nécessite que plusieurs conditions soient remplies, sinon la restriction peut être facilement contournée :
- L'utilisateur n'appartient pas au
wheel
groupe, le seul autorisé à utilisersu
(appliqué via PAM). -
L'utilisateur reçoit un
rbash
correctement sécurisé avec un PATH en lecture seule pointant vers un~/bin
privé , ce~/bin/
répertoire contient des liens vers des utilitaires simples :$ 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'utilisateur reçoit un environnement restreint en lecture seule (pensez à des choses comme
LESSSECURE
,TMOUT
,HISTFILE
variable). - l'utilisateur est mappé sur l'utilisateur SELinux
staff_u
et a reçu le droit d'exécuter des commandes en tant qu'autre utilisateur selon les besoins viasudo
. -
le
/home
de l'utilisateur ,/tmp
et éventuellement/var/tmp
sont polyinstanciés via/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
Aussi,
/etc/security/namespace.init
rend tous les fichiers squelettes en lecture seule pour l'utilisateur et détenus parroot
.
De cette façon, vous pouvez choisir si $USER
peut exécuter mkdir
en son nom propre (via un lien dans le domaine privé ~/bin
répertoire, provisionné via /etc/skel
, comme expliqué ci-dessus), au nom d'un autre utilisateur (via sudo
) ou rien du tout.
Ajoutez un groupe factice, ajoutez l'utilisateur à ce groupe, chown root:somegroup /bin/mkdir
, chmod g-x /bin/mkdir
. Notez que cela repose sur l'impossibilité pour l'utilisateur de modifier ses groupes. IIRC c'est vrai dans GNU/Linux mais pas dans certains autres Unices.