Dodanie użytkownika, który może wykonywać skrypty tylko zdalnie


14

Chciałbym stworzyć użytkownika, który może zrobić tylko jedną rzecz: poprzez ssh podaj skrypt (i argumenty wiersza polecenia do skryptu), który znajduje się w jednym określonym folderze (na potrzeby tego pytania nazwijmy go /local/remote_only_scripts/foo) i niech ten skrypt zostanie wykonany i zwraca wynik.

Aby wyjaśnić niektóre przykłady rzeczy, których nie chcę, aby użytkownik mógł:

  • Lokalnie zaloguj się na konto. Aplikacja do logowania to /bin/login. To nie jest skrypt w /local/remote_only_scripts/foofolderze, więc użytkownik nie powinien go wywoływać.
  • Zdalne logowanie do konta. Znowu logowanie (czy to się nazywa ssh?) Nie jest skryptem w odpowiednim folderze.
  • Wyświetl zawartość katalogu. Ls jest w środku /bin/ls. To nie jest skrypt w odpowiednim katalogu.
  • Edytuj plik w tym katalogu. emacs, vi, gedit większość innych edytorów nie jest skryptami w tym directoy.
  • Wyświetl zawartość pliku w tym katalogu.
  • Wykonaj plik w tym katalogu, którego nie ma uprawnień do wykonania.

Zauważ, że są to przykłady, istnieje wiele innych działań, których nie chcę, aby użytkownik mógł wykonać. Zastanawiając się nad działaniem, zapytaj „czy robi to skrypt w /local/remote_only_scripts/foo?” jeśli odpowiedź jest przecząca, użytkownik nie powinien być w stanie tego zrobić. Jeśli odpowiedź brzmi „tak”, użytkownik powinien móc to zrobić.

PS: Pozwól mi wyjaśnić, co rozumiem przez „dodanie użytkownika”. Nie mam na myśli dodawania użytkownika do jakiegoś podsystemu ssh. Chodzi mi raczej o dodanie użytkownika do systemu komputerowego. Na przykład mam system z stabilną wersją Debiana, nazwij go jego adresem, www.hg.bar.com. Chcę dodać użytkownika (przez kuser, users-admin lub useradd lub w podobny sposób) nazwać go hg_guest. hg_guest nie może zalogować się lokalnie ani wykonać żadnej z powyższych czynności. Wszystko, co może zrobić hg_guest, to wykonywanie skryptów „zdalnie”. Powiedziałem, że powinien być w stanie to zrobić za pośrednictwem ssh, ale myślenie o tym teraz, być może pozwolenie mu na użycie ssh może pozwolić mu zalogować się lokalnie, więc może być wymagany jakiś inny mechanizm.

Odpowiedzi:


12

W pliku autoryzowanych_kluczy znajduje się opcja polecenia . Ta opcja wydaje się robić dokładnie to, co chcesz.

Pamiętaj, że nie jest to chroot ani ograniczona powłoka. Pozwala na wykonywanie tylko tych poleceń przez ssh. W twoim przykładzie byłoby to:

ssh somehost /local/remote_only_scripts/foo

W przypadku tego pliku kluczy autoryzowanych:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Jest wiele sposobów, jeśli nie chcesz, aby użytkownik mógł logować się lokalnie. Możesz albo :

  • po prostu ustaw jego powłokę na / bin / false (być może będziesz potrzebować / bin / true, ponieważ ssh potrzebuje poprawnego logowania)
  • zablokuj hasło, patrz passwd -l

EDYCJA : dodano więcej opcji ograniczeń i wyjaśniono, jak usunąć dostęp lokalny.


Nie sądzę, że musisz podać tę komendę w ssh po stronie klienta, jest to komenda „wymuszona”, więc zawsze będzie wykonywana;) Użytkownik na zdalnej stronie nadal potrzebuje poprawnej powłoki zdefiniowanej w / etc / passwd.
jirib

1
Poza command=tym no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptypotrzebne są opcje , aby naprawdę ograniczyć konto.
jofel

Dobrze. Obudziłem się w środku nocy i postanowiłem sprawdzić odpowiedzi. Ponieważ jestem senny, nie przyjmuję całej odpowiedzi, ale pytam o coś, co mnie dezorientuje. W jaki sposób zapobiega to logowaniu hg_quest z tty?
HandyGandy

@HandyGandy To jest najprostsza część. Dodałem 2 sposoby na zrobienie tego, ale myślę, że jest więcej
Coren

0

Spróbuj tego jako powłoki logowania dla użytkownika:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Prawdopodobnie zechcesz również mieć to w authorized_keyspliku jawnie, jak w odpowiedzi Corena; ale zamień „... / foo; z programem tutaj. Które będą zapobiegać poleceń SSH jak sftp, scpi ssh hostname command.


Jeśli chcesz tylko, aby użytkownik mógł wykonywać polecenia z katalogu (a nie ma ich zbyt wiele), możesz usunąć „prog” z powyższego tekstu i użyć instrukcji select, aby zaoferować menu tekstowe z opcjami tych programów, a następnie wykonaj odczyt argumentów. Sprawdziłbym to również, aby upewnić się, co się stanie, jeśli wpiszesz kilka Ctrl-C w różnych punktach skryptu. Możesz także chcieć użyć polecenia pułapki.
Joe

0

W przypadku, gdy potrzebują tylko dostępu do jednego skryptu, działa to naprawdę dobrze dla mnie. Dodaj użytkownika i zmień domyślną powłokę na ścieżkę skryptu. Kiedy połączą się przez ssh, wykona skrypt i zamknie sesję.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.