Skip to content

Shell – omezení příkazů pro uživatele

V tomto miniblogu omrkneme možnosti omezení uživatele, který se loguje do systému ať už přímo nebo po ssh a dále pak na omezení příkazů, které lze po ssh vykonat bez přihlášení.Důvody jsou v podstatě jasné. Máme uživatele, které musíme nějakým způsobem pustit do systému, ale nechceme jim dát kompletní uživatelský přístup. Někdy ani nechceme, aby se uživatelé mohli přihlásit do shellu a potřebujeme, aby mohli vykonat pouze určité příkazy po ssh – např. nějaký ten svn commit, monitoring apod. Linuxová práva nám k tomuto nemusí stačit, nemůžeme či nechceme mít ACL a chceme omezit okruh příkazů, které smí naši uživatelé provádět.

SSH bez přihlášení s omezenými příkazy

Jako první věc vyrobíme wrapper, např. /bin/rshell s obsahem

#!/bin/sh
set $SSH_ORIGINAL_COMMAND
case "$1" in
    svn)
    ;;
    *)
        echo "Nepovoleny prikaz $@"
        exit 1
    ;;
esac
exec "$@"

Dále je potřeba upravit authorized_keys daného uživatele:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/bin/rshell $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB3NzaC1yc2EA..........J5peSgj

Takto jsme povolili uživateli, aby na serveru pomocí ssh volal pouze příkaz svn a to pouze vzdáleně, bez přihlášení.

Volání svn:

ssh uzivatel@server "svn help"
usage: svn <subcommand> [options] [args]
Subversion command-line client, version 1.6.12.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
  or 'svn --version --quiet' to see just the version number.

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)

Subversion is a tool for version control.
For additional information, see http://subversion.tigris.org/

Volání jiného příkazu:

ssh uzivatel@server "echo"
Nepovoleny prikaz echo

Pokus o přihlášení:

ssh uzivatel@server
PTY allocation request failed on channel 0
Nepovoleny prikaz

 

SSH s přihlášením nebo lokální přihlášení s omezenými příkazy

Toto je případ, kdy potřebujeme, aby se uživatel přihlašoval, měl svůj home atd. a zároveň nechceme, aby se nám příliš proháněl po systému.
Jako první věc zjistíme, zda máme /bin/rbash. Pokud ne, vyrobíme symlink bash -> rbash. Bash zjistí, jak je volán a podle toho se chová. Dále při vytvoření uživatele mu jako shell nastavíme rbash nebo mu ho nastavíme později, pokud uživatel již existuje a to buď přímou editací /etc/passwd a nebo pomocí

chsh -s /bin/rbash uzivatel

Dále vyrobíme adresář, kam poté umístíme symlinky od programů a příkazů, které smí daný uživatel spustit, např:

mkdir /rbin
ln -s /bin/ls /rbin/ls
ln -s /bin/ps /rbin/ps
ln -s /usr/bin/git /rbin/git

Nyní zajistíme, aby se uživateli správně nastavila PATH, aby viděl příkazy /rbin. Upravíme /etc/profile:

if [ "$SHELL" = /bin/rbash ]; then
                   PATH=/rbin
else
zbytek původního profile
fi

Uživatel, který nemá omezení, si může PATH změnit dle potřeby, uživatel, který má jako shell rbash, nemůže.

export PATH=/bin
-rbash: PATH: proměnná pouze pro čtení

Uživateli jsme povolili např. ls, ps a uname:

ls -lha
celkem 28K
drwx------ 3 honza root  4,0K bře 22 15:44 .
drwxr-xr-x 3 root  root  4,0K lis 28  2011 ..
-rw------- 1 honza honza  142 bře 22 17:21 .bash_history
-rw-r--r-- 1 honza honza  220 lis 28  2011 .bash_logout
-rw-r--r-- 1 honza honza 3,2K lis 28  2011 .bashrc
-rw-r--r-- 1 honza honza  675 lis 28  2011 .profile
drwx------ 2 honza honza 4,0K bře 22 05:57 .ssh
ps
  PID TTY          TIME CMD
 2403 pts/0    00:00:00 rbash
 2431 pts/0    00:00:00 ps
uname -a
Linux debian 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 GNU/Linux
/bin/bash
-rbash: /bin/bash: omezeno: v názvu příkazu nesmí být „/“
/usr/bin/mc
-rbash: /usr/bin/mc: omezeno: v názvu příkazu nesmí být „/“

Bohužel, rbash má několik omezení. Mezi ně patří například nemožnost změnit adresář a to ani v rámci svého home přes cd. Na druhou stranu je možné se dostat ke klasickému shellu, pokud jsme uživateli povolili používat např. vim nebo jiný sw, který může volat příkazy, popř. pokud jsme do /rbin přidali i symlink na bash.

Obě možnosti omezení uživatelů je vhodné ještě doplnit např. o grsec apod.

 

Povolení pouze pro port forwading

Tato možnost se dá skvěle využít například v případě, že potřebujeme někomu povolit přístup na službu, která běží pouze lokálně na serveru, nedá se na ní dostat z internetu a zároveň dotyčnému nechceme dát shell. Vytvoříme nového uživatele a do ~/.ssh/authorized keys vložíme kromě jeho klíče ještě následující:

command="echo 'Allowed only for port forwad'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:27017" ssh-rsa zde_bude_klic

Uživatel se tak může připojit na daný port, nebude se však moci k serveru přihlásit.
Pokud má uživatel nastaven shell např. /bin/bash, bude se mu vypisovat výše uvedená hláška Allowed only for port forward, pokud má shell např. /bin/false, hláška se nevýpíše.

… and that’s all, folks 🙂

3 thoughts on “Shell – omezení příkazů pro uživatele

  1. Pingback: Chroot SFTP « LinuxWay - Blog

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Time limit is exhausted. Please reload the CAPTCHA.