it-swarm.com.de

SSH - Erzwingt die Befehlsausführung bei der Anmeldung, auch ohne Shell

Ich erstelle einen eingeschränkten Benutzer ohne Shell nur für die Portweiterleitung, und ich muss bei der Anmeldung über pubkey ein Skript ausführen, auch wenn der Benutzer über ssh -N [email protected] verbunden ist, der SSH-Server nicht nach einer Shell fragt.

Das Skript sollte admin über Verbindungen, die mit pubkey authentifiziert wurden, warnen, sodass der Benutzer, der die Verbindung herstellt, die Ausführung des Skripts nicht überspringen kann (z. B. durch Verbinden mit ssh -N).

Ich habe versucht, ohne Erfolg:

  • Den Befehl auf /etc/ssh/sshrc setzen.
  • Using command = "COMMAND" in .ssh/authorized_keys (man author_keys)
  • Einrichten eines Skripts mit dem Befehl als Benutzer-Shell. (chsh -s /sbin/myscript.sh USERNAME)
  • Übereinstimmender Benutzer in /etc/ssh/sshd_config wie: Match User MYUSERNAME ForceCommand "/sbin/myscript.sh"

Alle funktionieren, wenn der Benutzer nach Shell fragt. Wenn jedoch nur für die Portweiterleitung und keine Shell (ssh -N) protokolliert wird, funktioniert dies nicht.

15
Iacchus

Ich bin der Autor des OP. Ich kam zu dem Schluss, dass das, was ich erreichen muss, mit SSH nur bis zum Datum (OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015) nicht möglich ist, aber ich habe eine großartige Software gefunden, die verschlüsselte SPAuthentication zum Öffnen des SSH-Ports und seiner neuen Version (bis zu diesem Datum) verwendet Post, es ist GitHub Master Branch) verfügt über eine Funktion, um einen Befehl immer auszuführen, den ein Benutzer erfolgreich autorisiert.

FWKNOP - Verschlüsselung eines einzelnen Pakets

FWKNOP legt iptables-Regeln fest, die den Zugriff auf bestimmte Ports für ein einzelnes verschlüsseltes Paket ermöglichen, das über UDP gesendet wird. Nach der Autorisierung kann der berechtigte Benutzer für eine bestimmte Zeit, beispielsweise 30 Sekunden, darauf zugreifen. Danach wird der Port geschlossen, und die Verbindung bleibt geöffnet. 

1. Installation auf einem Ubuntu-Linux:

Die aktuelle Version (2.6.0-2.1build1) auf Ubuntu-Repositorys bis zum Datum erlaubt immer noch keine Befehlsausführung bei erfolgreichem SPA. (bitte stattdessen 2.6.8 von GitHub verwenden)

Auf dem Client-Rechner:

Sudo apt-get install fwknop-client

Auf der Serverseite:

Sudo apt-get install fwknop-server

Hier finden Sie ein Lernprogramm zum Einrichten der Client- und Server-Computer https://help.ubuntu.com/community/SinglePacketAuthorization

Dann, nachdem es eingerichtet wurde, serverseitig:

  1. /etc/default/fwknop-server bearbeiten
  2. Ändern Sie die Zeile START_DAEMON="no" in START_DAEMON="yes".
  3. Dann renne:

    Sudo service fwknop-server stop

    Sudo service fwknop-server start

2. Warnung für erfolgreiche SPA (E-Mail, Pushover-Skript usw.)

Wie bereits erwähnt, kann die aktuelle Version in den Ubuntu-Repositorys (2.6.0-2.1build1) den Befehl für ein erfolgreiches SPA nicht ausführen. Benötigen Sie diese Funktion ab dem OP, wird diese jedoch in der fwknop-Version (2.6.8) veröffentlicht, wie hier angegeben:

https://github.com/mrash/fwknop/issues/172

Wenn Sie es also jetzt brauchen, können Sie aus github branch master bauen, der die CMD_CYCLE_OPEN-Option hat.

3. Weitere Ressourcen auf fwknop

https://help.ubuntu.com/community/SinglePacketAuthorization

https://github.com/mrash/fwknop/ (Projekt auf GitHub)

http://www.cipherdyne.org/fwknop/ (Projektseite)

https://www.digitalocean.com/community/tutorials/how-to-use-fwknop-to-enable-single-packet-authentication-on-ubuntu-12-04 (Tutorial über DOs Community)

2
Iacchus

Die Option ForceCommand wird ohne PTY ausgeführt, es sei denn, der Client fordert einen an. Daher haben Sie nicht wirklich eine Shell, um Skripts wie erwartet auszuführen. Darüber hinaus sagt die Manpage OpenSSH SSHD_CONFIG (5) eindeutig:

Der Befehl wird mithilfe der Login-Shell des Benutzers mit der Option -c aufgerufen.

Das bedeutet, dass ForceCommand nicht funktioniert, wenn Sie die Login-Shell des Benutzers deaktiviert oder auf etwas wie /bin/false festgelegt haben. Vorausgesetzt, dass:

  1. der Benutzer hat eine sinnvolle Shell definiert,
  2. dass Ihr Zielskript ausführbar ist, und
  3. dass Ihr Skript eine entsprechende Shebang-Linie hat

dann sollte Folgendes in Ihrer global sshd_config -Datei funktionieren, sobald es ordnungsgemäß mit dem richtigen Benutzernamen und dem vollständig qualifizierten Pfadnamen für Ihr benutzerdefiniertes Skript geändert wurde:

Match User foo
    ForceCommand /path/to/script.sh
12
Todd A. Jacobs

Ich bin der Autor des OP. Sie können auch einen einfachen Logwatcher wie folgt in python3 schreiben, der für eine Datei liest und einen Befehl ausführt, wenn die Zeile Muster enthält.

logwatcher.python3

#!/usr/bin/env python3

# follow.py
#
# Follow a file like tail -f.

import sys
import os
import time

def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.5)
            continue
        yield line

if __== '__main__':
    logfilename = sys.argv[1]
    pattern_string = sys.argv[2]
    command_to_execute = sys.argv[3]

    print("Log filename is: {}".format(logfilename))

    logfile = open(logfilename, "r")
    loglines = follow(logfile)

    for line in loglines:
        if pattern_string in line:
            os.system(command_to_execute)

Verwendungszweck

  1. Machen Sie das obige Skript ausführbar:

chmod +x logwatcher.python3

  1. Fügen Sie einen Cronjob hinzu, um ihn nach dem Neustart zu starten

crontab -e

Dann schreibe diese Zeile dort und speichere sie danach:

@reboot /home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"

Das erstes Argument dieses Skripts ist die zu überwachende Protokolldatei und das das zweite Argument ist die Zeichenfolge, nach der gesucht werden soll. Das drittes Argument ist das auszuführende Skript, wenn die Zeile in der Datei gefunden wird.

Am besten verwenden Sie etwas zuverlässigeres, um das Skript für den Fall eines Absturzes neu zu starten/neu zu starten.

1
Iacchus