GNU/Linux >> Znalost Linux >  >> Linux

Jak omezit uživatele SSH na předdefinovanou sadu příkazů po přihlášení?

Můžete také omezit klíče na povolené příkazy (v souboru author_keys).

Tj. uživatel by se nepřihlásil přes ssh a měl by pak omezenou sadu příkazů, ale spíše by mohl tyto příkazy spouštět pouze přes ssh (např. "ssh somehost bin/showlogfile")


To, co hledáte, se nazývá Restricted Shell. Bash poskytuje takový režim, ve kterém mohou uživatelé provádět pouze příkazy přítomné v jejich domovských adresářích (a nemohou se přesouvat do jiných adresářů), což by pro vás mohlo být dost dobré.

Zjistil jsem, že toto vlákno je velmi ilustrativní, i když trochu staré.


ssh následuje za rsh tradici pomocí uživatelského shell programu ze souboru s hesly k provádění příkazů.

To znamená, že to můžeme vyřešit bez použití ssh konfiguraci jakýmkoli způsobem.

Pokud nechcete, aby uživatel mohl mít přístup k shellu, jednoduše nahraďte shell tohoto uživatele skriptem. Pokud se podíváte do /etc/passwd uvidíte, že existuje pole, které každému uživateli přiřadí interpret příkazů shellu. Skript se používá jako shell pro jejich interaktivní přihlášení ssh [email protected] stejně jako pro příkazy ssh [email protected] command arg ... .

Zde je příklad. Vytvořil jsem uživatele foo jehož shell je skript. Skript vytiskne zprávu my arguments are: následují jeho argumenty (každý na samostatném řádku a v lomených závorkách) a končí. V případě logu nejsou žádné argumenty. Zde je to, co se stane:

webserver:~# ssh [email protected]
[email protected]'s password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

Pokud se uživatel pokusí spustit příkaz, vypadá takto:

webserver:~# ssh [email protected] cat /etc/passwd
[email protected]'s password:
my arguments are:
<-c>
<cat /etc/passwd>

Náš "shell" obdrží -c vyvolání stylu, s celým příkazem jako jedním argumentem, stejně jako /bin/sh obdrží.

Jak tedy vidíte, co nyní můžeme udělat, je vyvinout skript dále, aby rozpoznal případ, kdy byl vyvolán s -c argument a poté analyzuje řetězec (řekněme pomocí porovnávání vzorů). Tyto povolené řetězce mohou být předány skutečnému shellu rekurzivním vyvoláním /bin/bash -c <string> . Případ odmítnutí může vytisknout chybovou zprávu a skončit (včetně případu, kdy -c chybí).

Musíte si dávat pozor, jak to píšete. Doporučuji psát pouze pozitivní shody, které povolují pouze velmi specifické věci, a zakázat vše ostatní.

Poznámka: pokud jste root , stále se můžete přihlásit k tomuto účtu přepsáním shellu v su příkaz, jako je tento su -s /bin/bash foo . (Nahraďte shell dle výběru.) Non-root to nemůže udělat.

Zde je příklad skriptu:omezte uživatele pouze na použití ssh pro git přístup k úložištím pod /git .

#!/bin/sh

if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
  printf "interactive login not permitted\n"
  exit 1
fi

set -- $2

if [ $# != 2 ] ; then
  printf "wrong number of arguments\n"
  exit 1
fi

case "$1" in
  ( git-upload-pack | git-receive-pack )
    ;; # continue execution
  ( * )
    printf "command not allowed\n"
    exit 1
    ;;
esac

# Canonicalize the path name: we don't want escape out of
# git via ../ path components.

gitpath=$(readlink -f "$2")  # GNU Coreutils specific

case "$gitpath" in
  ( /git/* )
     ;; # continue execution
  ( * )
    printf "access denied outside of /git\n"
    exit 1
    ;;
esac

if ! [ -e "$gitpath" ] ; then
   printf "that git repo doesn't exist\n"
   exit 1
fi

"$1" "$gitpath"

Samozřejmě věříme, že tyto programy Git git-upload-pack a git-receive-pack nemají díry ani únikové poklopy, které uživatelům umožní přístup do systému.

To je vlastní tomuto druhu omezovacího schématu. Uživatel je ověřen, aby mohl spouštět kód v určité bezpečnostní doméně, a my zavádíme omezení, abychom tuto doménu omezili na subdoménu. Pokud například uživateli povolíte spouštět vim příkazem na konkrétním souboru jej upravit, uživatel může získat pouze shell s :!sh[Enter] .


Linux
  1. Jak nastavit proměnnou uživatelského prostředí? (trvale, ne relace)?

  2. Jak změnit Cron Shell (sh to Bash)?

  3. Pokračovat v příkazech Shell po připojení k Ssh?

  1. Jak nastavit SSH tunelování

  2. Jak zakázat přihlášení SSH pomocí hesla

  3. jak zakázat přihlášení SSH pomocí hesla pro některé uživatele?

  1. Jak omezit přístup SSH pro uživatele pomocí LShell (Limited Shell)

  2. Jak nastavit klíče SSH

  3. Jak zkontrolovat, zda je Shell přihlašovací/interaktivní/dávkový?