[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ssh-Schlüsselpaar auf Dateizugiff in ein spezifisches Directory beschränken


On Sat, Sep 07, 2024 at 02:37:41PM +0200, Michael Lestinsky wrote:
> hat hier evtl. jemand eine Idee, wie man ein ssh-Schlüsselpaar in seiner
> ssh/authorized_keys soweit beschränken kann, dass damit nur noch
> Dateiaustausch (wahlweise rsync oder sshfs, ich kann mich da anpassen) aus
> einem ganz bestimmten Verzeichnis möglich ist?
> 
> Eine Einschränkung wäre, dass der sshd auf Debian Buster läuft und folglich
> Versionsstand 7.9 hat und ich dort nur normale Userrechte besitze.

Du kannst einen Schlüssel in der authorized_keys auf ein bestimmtes
Kommando festnageln.

Ich mache das gerne so:

from="(liste von IP-Adressen, optional)",command="/path/to/ssh-forced-command some-key-ID"

Die Dokumentation dazu findet sich in man sshd. Interessant ist, dass
das dem ssh-Client mitgegebene Kommando in $SSH_ORIGINAL_COMMAND
hinterlegt wird und somit ausgewertet werden kann. Das command wird mit
einer shell ausgeführt, kann also Parameter aus authorized_keys
erhalten.

Hier ein Script das ich dazu gerne verwende:

/path/to/ssh-forced-command:
#!/bin/bash

KEY="$1"
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
me=$(basename "$0")
logger -t "$0" "called with [$KEY] $SSH_ORIGINAL_COMMAND"
FQDN="$(hostname --fqdn)"

cmd()
{
  logger -p user.info -t "$me $KEY" -- "$@"
  "$@"
}

execute-all() {
  KEY="$KEY execute-all"
  case "$SSH_ORIGINAL_COMMAND" in
    *) cmd "$SSH_ORIGINAL_COMMAND";;
  esac
}

illegal-command() {
    echo "$me@$(hostname): illegal command $SSH_ORIGINAL_COMMAND"
    logger -p user.err -t "$me $KEY" -- "ignoring illegal command $SSH_ORIGINAL_COMMAND"
    exit 1
}

mh-hostmaster-torres-ppl() {
  if echo "$SSH_ORIGINAL_COMMAND" | grep -E --quiet "^${FQDN} rsync --server -v?log?D?t?pre\.iLs?f?x?C?I?v?u? --delete . /etc/bind/?"; then
    cmd rsync --server -loDpre.iLsf --delete . /etc/bind/
  elif [ "$SSH_ORIGINAL_COMMAND" = "mkbinddirs" ]; then
    cmd /etc/bind/scripts/mkbinddirs
  elif [ "$SSH_ORIGINAL_COMMAND" = "rndc reload" ]; then
    cmd /usr/sbin/rndc reload
  else
    illegal-command
  fi
}

case $KEY in
  mh-hostmaster-torres-ppl) mh-hostmaster-torres-ppl ;;
  *) echo "$me@$(hostname): illegal key $KEY presented"
     logger -p user.err -t "$me" -- "ignoring illegal key $KEY"
     exit 1
     ;;
esac

Hier sieht man also, dass ssh user@host rsync (mit auf die Regexp
passenden Parametern) das genannte hartcodierte rsync-Kommando auslöst
(das u.a. den Zugriff auf /etc/bind beschränkt) und die beiden Kommandos
mkbinddirs und rndc reload die entsprechenden Aktionen auslösen. Alles
andere führt zu einer Ausgabe am Client und einer geloggten Fehlermeldung.

Die Funktion "execute-all" kann man in der Findungsphase einem Key
zuweisen, da ist dann alles erlaubt und wird geloggt, so dass man die
dazu passende Regexp bauen kann, wenn man das so komplex machen 

Und jetzt wo ich das alles niedergeschrieben habe und dachte, daraus
könnte man eigentlich einen Blogartikel machen, fällt mir auf, dass ich
darüber 2017 bereits gebloggt HABE. Hrmph.

https://blog.zugschlus.de/archives/982-Login-als-technischer-User-mit-ssh-forced-commands.html

Grüße
Marc

-- 
-----------------------------------------------------------------------------
Marc Haber         | "I don't trust Computers. They | Mailadresse im Header
Leimen, Germany    |  lose things."    Winona Ryder | Fon: *49 6224 1600402
Nordisch by Nature |  How to make an American Quilt | Fax: *49 6224 1600421

-- 
Unix User Group Rhein-Neckar e.V.: https://www.uugrn.org
Archiv und An-/Abmeldung:          https://mail2.uugrn.org
Social Media:                      https://social.uugrn.org

Follow-Ups:
Re: ssh-Schlüsselpaar auf Dateizugiff in ein spezifisches Directory beschränkenMichael Lestinsky <michael@xxxxxxxxxxxx>
References:
ssh-Schlüsselpaar auf Dateizugiff in ein spezifisches Directory beschränkenMichael Lestinsky <michael@xxxxxxxxxxxx>