[gelöst] SSH - Eine Session pro Benutzer

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

[gelöst] SSH - Eine Session pro Benutzer

Beitrag von shell4life » 17.02.2010 18:02:02

Hallo zusammen,

ich habe da folgende Problemstellung. :?: Ich möchte gerne das wenn ein Benutzer sich am SSH-Server anmeldet und eine aktive Session hat, es nicht möglich ist das sich ein anderer mit den gleichen Benutzerdaten anmeldet. Bisher kann ich mich mit einem Benutzer ja 10x anmelden wenn ich möchte.

Es soll dann irgendwie eine Meldung kommen dass der Benutzer bereits eingeloggt ist und sich erst abmelden muss bevor ein neuer Login möglich ist und der Verbindungsversuch soll abgebrochen werden. :!:

Eine direktvie in der Konfigurationsdatei wie -> "PermitOneLoginSessionPerAccount yes" wäre der ultimative bringer :idea: :mrgreen:

Ich habe auch schon ein wenig bei Google gesucht, mir die manpage angesehen, aber irgendwie scheint das so erstmal nicht möglich zu sein. Es soll wirklich nur anhand des Benutzernames passieren. Nicht jedoch anhand der IP.

Weiß das zufällig jemand etwas?


Viele Grüße
~T
Zuletzt geändert von shell4life am 24.02.2010 02:19:02, insgesamt 1-mal geändert.

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von habakug » 18.02.2010 00:19:34

Hallo!

Versuch mal so in der /etc/ssh/sshd_config :

Code: Alles auswählen

DenyUsers *
AllowUsers EinUser
Nach einem Dienstneustart sollte sich nur noch der eine User anmelden dürfen.
man sshd_config hat geschrieben:AllowUsers
This keyword can be followed by a list of user name patterns,
separated by spaces. If specified, login is allowed only for
user names that match one of the patterns. Only user names are
valid; a numerical user ID is not recognized. By default, login
is allowed for all users. If the pattern takes the form
USER@HOST then USER and HOST are separately checked, restricting
logins to particular users from particular hosts. The allow/deny
directives are processed in the following order: DenyUsers,
AllowUsers, DenyGroups, and finally AllowGroups.
Gruß, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

Re: SSH - Eine Session pro Benutzer

Beitrag von shell4life » 18.02.2010 01:05:14

Hi habakug,

ja damit kann man User eingrenzen die sich überhaupt einloggen dürfen. Wenn ich 20 User z.B in PAM drin habe, dann kann ich damit sagen davon dürfen sich aber nur 2 über SSH einloggen.

Ich möchte jedoch User A loggt sich ein, jetzt kommt User B mit den gleichen Benutzerdaten am Server an und soll keine Möglichkeit des Logins haben. Also jeder Benutzer bekommt maximal 1 pseudo-terminal zugewiesen, wenn das belegt ist, kein Login.

Aber ich habe es auch getestet weil ich dachte, es könnte ja klappen das der Benutzer sich dann auch nur 1x anmelden darf. :roll: Mit kommt eine Idee zu einem Script womit sich das sicherlicht machen lässt. Aber es ist bis jetzt nur eine grobe Idee.

1. Der User loggt sich ein
2. Das Script guckt ob es schon ein Pseudo-Terminal zu dem Benutzer gibt, der Name ist ja in $USER enthalten
3. Das Script schreibt sich die PID der zweiten Sitzung raus, evtl in einer Tabelle und man nimmt jede PID aus Spalte 2, Zeile 2 abwärts.
4. Das Script setzt ein $kill -9 <pid>
5. Das Script wird in die .bashrc eingetragen und die Dateirechte so gesetzt das kein Benutzer dieses ändern kann.

Code: Alles auswählen

mlz@mail:~$ echo $USER
mlz
mlz@mail:~$ ps auwxx | grep 'sshd: mlz@pts'
mlz       2792  0.0  0.0   8156  1660 ?        S    00:52   0:00 sshd: mlz@pts/0
mlz      24758  0.0  0.0   3936   784 pts/0    S+   01:01   0:00 grep sshd: mlz@pts
mlz@mail:~$
Jaaaaa 8) So ist erstmal die grobe Idee :mrgreen:


Viele Grüße
~T

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von gms » 18.02.2010 07:24:10

shell4life hat geschrieben:Mit kommt eine Idee zu einem Script womit sich das sicherlicht machen lässt. Aber es ist bis jetzt nur eine grobe Idee.

1. Der User loggt sich ein
2. Das Script guckt ob es schon ein Pseudo-Terminal zu dem Benutzer gibt, der Name ist ja in $USER enthalten
3. Das Script schreibt sich die PID der zweiten Sitzung raus, evtl in einer Tabelle und man nimmt jede PID aus Spalte 2, Zeile 2 abwärts.
4. Das Script setzt ein $kill -9 <pid>
5. Das Script wird in die .bashrc eingetragen und die Dateirechte so gesetzt das kein Benutzer dieses ändern kann.
kannst du uns einmal den Grund für diesen Dirty-Hack erklären ? Ok, du möchtest, daß sich jeder Benutzer nur einmal einloggen kann, aber warum ?
btw die .bashrc wird von der Login-Shell nicht verwendet, wenn diese nicht von einer anderen Profile-Datei ( z.B ~/.bash_profile ) explizit aufgerufen wird

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: SSH - Eine Session pro Benutzer

Beitrag von ThorstenS » 18.02.2010 07:28:50

Wenn dein Script mal versagt, kannst du dich auch nicht mehr einloggen.
Je nachdem wo die Kiste steht, wäre das ein erstklassiges Knieschussgerät. :THX:

yeti

Re: SSH - Eine Session pro Benutzer

Beitrag von yeti » 18.02.2010 07:34:56

shell4life hat geschrieben:Eine direktvie in der Konfigurationsdatei wie -> "PermitOneLoginSessionPerAccount yes" wäre der ultimative bringer :idea: :mrgreen:
Bau's doch ein... sooo schwer kann das doch granininicht sein...

Oder klär Deine User über Debianscreen auf und gib ihnen ebendieses als Loginshell. Eine Variable in der systemweiten /etc/screenrc oder der userlokalen ~/.screenrc ermöglicht das Vorbestimmen der gewünschten Shell dann immernoch...

...und dann besteht einfach kein Notwendigkeitsdruck mehr mehrere ssh-Sessions zu benutzen...

...und in Ausnahmefällen, wo es vielleicht doch sinniger ist mal zwei ssh-Verbindungen aufbauen zu dürfen, ist's nicht verwehrt...

uname
Beiträge: 12480
Registriert: 03.06.2008 09:33:02

Re: SSH - Eine Session pro Benutzer

Beitrag von uname » 18.02.2010 08:33:19

Debianscreen ist wirklich die genialste Linux-Anwendung überhaupt.

Setze in /etc/passwd die Shell auf /usr/bin/screen:

Auszug /etc/passwd:

Code: Alles auswählen

user:x:1001:1001:,,,:/home/user:/usr/bin/screen
globale Screen-Konfiguration /etc/screenrc:

Code: Alles auswählen

startup_message off
hardstatus alwayslastline '[%H] %Lw%=%u %d.%m.%y %c '
defshell /bin/bash
aclchg  * -x "screen detach pow_detach"             
Mit der letzten Zeile kannst du dem Benutzer einige Befehle verbieten. So wird es unmöglich innerhalb der Screen-Sitzung weitere Terminals zu öffnen. Insgesamt würde ich diese Zeile aber weglassen.

Bedenke:
Der Benutzer kann sich immer noch beliebig oft anmelden. Der Unterschied ist nur, dass er immer wieder das selbe Terminal zu sehen bekommt, egal wie oft er sich anmeldet. Das wird irgendwann ziemlich uncool. Außerdem kommt man sich dann natürlich ins Gehege, wenn zwei Personen gleichzeitig auf die Tastatur einhauen. Das "&" in der Statuszeile gibt im übrigen an, dass mehr als ein Benutzer aktuell zugreifen.
Ich nutze Screen im übrigen auf all meinen Systemen. Ist schön sich wieder anzumelden und alle Anwendungen sind noch da.

Meine Konfiguration, damit auch z.B. sftp funktioniert.

~/.bash_profile:

Code: Alles auswählen

/usr/bin/screen -xRR
~/.screenrc:

Code: Alles auswählen

hardstatus alwayslastline '[%H] %Lw%=%u %d.%m.%y %c '

shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

Re: SSH - Eine Session pro Benutzer

Beitrag von shell4life » 18.02.2010 10:31:04

Hiho,

@gms

Ich brauche das für ein Tool was ich für die automatische Konfiguration von Cisco Geräten gebaut habe. Dort soll es halt so sein das sich nur 1x pro Benutzerkennung eingeloggt werden darf. Aber mit der .bashrc, da muss ich leider widersprechen, weil das geht. :roll: Oder ich finde einfach nicht wo sie referenziert wird. Geguckt in -> /etc/profile und alle Dateien um ~home des Benutzers. Hierzu ein kleiner Auszug.

Code: Alles auswählen

root@mail:/home/mlz# cat /etc/passwd | grep mlz
mlz:x:50014:50014::/home/mlz:/bin/bash
root@mail:/home/mlz# ls -la
-rw-r--r-- 1 root root    0 14. Feb 20:31 .bash_history
-rw-r--r-- 1 root root    0 14. Feb 20:32 .bash_login
-rw-r--r-- 1 root root    0 14. Feb 20:32 .bash_logout
-rw-r--r-- 1 root root   32 14. Feb 20:35 .bash_profile.orig
-rw-r--r-- 1 root root   44 18. Feb 10:02 .bashrc
-rw-r--r-- 1 root root 2,4K 18. Feb 00:51 .bashrc.orig
-rw-r--r-- 1 root root    1 14. Feb 20:42 .profile
-rwxr-xr-x 1 root root   33 18. Feb 01:16 ssh_identify.sh
root@mail:/home/mlz# cat .bash_login
root@mail:/home/mlz# cat .profile

root@mail:/home/mlz# cat .bashrc
echo ""
echo ".bashrc abgearbeitet"
echo ""
root@mail:/home/mlz# su mlz
.bashrc abgearbeitet
mlz@mail:~$
@ThorstenS

Ja das ist absolut kein Problem, weil diese Einschränkung sich nicht auf ~root beziehen wird. Und wenn es funktioniert werde ich es ziemlich lange testen. Es ist nichts kritisches und der Server ist 20 Schritte entfernt. :D

@yeti

Programmieren kann ich leider kein Stück :roll:

@uname

Erst ein mal vielen Dank für deine Ausführliche Antwort. Nur leider ist Screen da keine alternative. Es soll nicht die Möglichkeit bestehen das sich 2x eingeloggt wird. :wink:


Viele Grüße
~T

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von gms » 18.02.2010 11:41:11

shell4life hat geschrieben: root@mail:/home/mlz# su mlz
.bashrc abgearbeitet
mlz@mail:~$
du hast hier keine Login-Shell aufgerufen, versuchs mal mit "su - mlz" bzw gleich über ssh

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von gms » 18.02.2010 11:47:56

shell4life hat geschrieben: Ich brauche das für ein Tool was ich für die automatische Konfiguration von Cisco Geräten gebaut habe.
dann müßtest Du eigentlich auch über dieses Tool eine Lockdatei erstellen können, über die ein exklusiver Zugriff gesteuert werden kann. Ich möchte dir da jetzt auch nichts drein reden ( obwohl das tu ich gerade :D), mit würde diese Lösung halt sauberer vorkommen

shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

Re: SSH - Eine Session pro Benutzer

Beitrag von shell4life » 18.02.2010 12:31:47

du hast hier keine Login-Shell aufgerufen, versuchs mal mit "su - mlz" bzw gleich über ssh
Okayyy :mrgreen: es geht nur über die .bash_login :hail:

Aber meine Anforderung an die Lösung soll sich leider ein auf den SSH-Login beziehen. Ich denke es wird auf das Script hinauslaufen. Muss ich die Tage einfach mal probieren zu schreiben.

Viele Grüße
~T

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von gms » 18.02.2010 12:38:38

shell4life hat geschrieben: Okayyy :mrgreen: es geht nur über die .bash_login :hail:
mach mal ein "touch ~/.bash_profile", dann sollte es eigentlich nimmer mehr gehen :roll:

( die ~/.bash_login sollte nur verwendet werden, wenn es keine ~/.bash_profile gibt )

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von rendegast » 18.02.2010 12:40:22

Den einfachen shell-Hack stelle ich mir so vor, /etc/profile.local und/oder /etc/bash.bashrc.local :

Code: Alles auswählen

grep "$USER" /etc/ssh/allowed.list || {
test $(who | grep "$USER" | wc -l) -gt 1 && logout
}



Noch eine Idee.
sshd_config:

Code: Alles auswählen

DenyGroups istschondrin
ForceCommand /usr/local/bin/sshlogintest.sh
/usr/local/bin/sshlogintest.sh :

Code: Alles auswählen

#!/bin/sh
/usr/bin/grep -r "$SUDO_USER" /etc/ssh/allowed.list && exit
/usr/sbin/usermod --append -G istschondrin "$SUDO_USER"
in /etc/sudoers.local so etwas:

Code: Alles auswählen

User_Alias      SSHLOGINGROUP=ALL
Cmnd_Alias      SSHLOGINTEST="/usr/local/bin/sshlogintest.sh"
SSHLOGINGROUP       hostname=NOPASSWD:SSHLOGINTEST
Eventuell funktioniert der einfache Aufruf des Scripts nicht, dann muß vielleicht mit 'sh -c Script' kombiniert werden.

Aber wie wird der User wieder aus istschondrin ausgetragen?
~/.bash_logout mit einem sudo-Script?
Ein cron-Job, der auf die User in istschondrin mit 'who' prüft, und gegebenenfalls austrägt?
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

Re: SSH - Eine Session pro Benutzer

Beitrag von shell4life » 18.02.2010 12:56:32

Ich Danke Dir. :THX:

Nun ist ja immerhin schon mal klar wie das Script aufgerufen wird. Aber da werde ich selber sobald ich mehr Zeit habe testen.


Viele Grüße
~T

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: SSH - Eine Session pro Benutzer

Beitrag von ThorstenS » 18.02.2010 13:32:00

shell4life hat geschrieben:

Code: Alles auswählen

root@mail:/home/mlz# cat /etc/passwd | grep mlz
mlz:x:50014:50014::/home/mlz:/bin/bash
Autsch!
grep kann direkt aus Dateien lesen, mach bitte in Zukunft lieber sowas:

Code: Alles auswählen

grep mlz /etc/passwd
Oder noch besser für diesen Fall so

Code: Alles auswählen

getent passwd mlz

shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

Re: SSH - Eine Session pro Benutzer

Beitrag von shell4life » 18.02.2010 13:51:18

Hi,

@rendegast

die Lösung funktioniert im Grunde schon mit dem Einzeiler in der .bash_login 8) Damit muss ich mal hin und her testen.

test $(who | grep "$USER" | wc -l) -gt 1 && echo "The user $USER is already logged in. You will be disconnected in 5 seconds" && sleep 5 && logout

Dazu probiere ich noch die IP-Adresse zu zeigen welche sich bereits eingeloggt hat. Mal schauen wo ich die rausziehen kann. Bitte fragt jetzt nicht nach dem Sinn :D Ich finde es halt nett wenn sie angezeigt wird. :wink:

Der nächste Punkt wird das der angemeldete User nichts im System machen darf ausser was ich ihm zuteile. Er soll nichtmal in der Lage sein über TAB-completion den Inhalt von /etc anzeigen lassen. Da bin ich bei meiner Suche auf die rbash gestoßen. Gut, bei der rbash ist er schon eingeschränkt, aber es gibt noch einen Haufen Kommandos die er absetzen kann. Die würde ich wiederrum mit einem alias belegen der Beispielsweise alias top='restricted!' heißen wird. Die PATH Variable wird dann einfach auf /home/mlz/bin gesetzt und die Dateien die benötigt werden für die Anmeldeüberprüfung kommen dort rein.


@ThorstenS Danke, werde ich mir angewöhnen.

Aber allen bis hier erstmal vielen Dank, das hat mir sehr geholfen! :THX:


Viele Grüße
~T

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von goeb » 18.02.2010 15:23:21

Hat noch niemand PAM vorgeschlagen? Ein

Code: Alles auswählen

session required pam_limits.so
in der PAM-Konfiguration für SSH und

Code: Alles auswählen

<username> hard maxlogins 1
in /etc/security/limits.conf sollte auch funktionieren. Setzt natürlich voraus daß SSH PAM verwendet.

Details: http://www.kernel.org/pub/linux/libs/pa ... imits.html

shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

Re: SSH - Eine Session pro Benutzer

Beitrag von shell4life » 18.02.2010 15:37:55

Ok,

die IP-Adresse steht in einer Variable:

SSH_CLIENT='172.10.10.23 14596 22'

Das Script fügt jetzt diese Variable auch gefiltert ein durch:

IP=`echo $SSH_CLIENT | awk '{print $1}'`

test $(who | grep "$USER" | wc -l) -gt 1 && echo "The user $USER is already logged in with IP $IP . You will be disconnected in 5 seconds" && sleep 5 && logout

Jetzt habe ich einfach mal innerhalb der 5 Sekunden STRG-C gedrückt und man bricht aus und bekommt den Prompt. Mal doof gefragt, gibt es eine möglichkeit die Tastatur komplett zu deaktivieren in einer Login-Shell? Der Sinn ist frei, nur geht das?

@ goeb

Hey die Möglichkeit ist auch echt sehr gut, kennst Du da eine Möglichkeit der Benachrichtigung das der Benutzer schon 1x eingeloggt ist?


Viele Grüße
~T

uname
Beiträge: 12480
Registriert: 03.06.2008 09:33:02

Re: SSH - Eine Session pro Benutzer

Beitrag von uname » 18.02.2010 16:07:17

Die Idee mit PAM finde ich gut. Die ".bash_login" bekommt man im Zweifelsfall wohl immer kaputt. Bei ".bash_profile" kann man z.B. direkt CTRL+C beim anmelden drücken, damit es nicht ausgeführt wird. Mag bei .bash_login anders sein.

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von goeb » 18.02.2010 16:52:40

Die Benachrichtigung dürfte im Nachhinein nicht mehr gehen (bzw. ich kenne keine Möglichkeit das zu realisieren), du könntest aber vor dem Loginprompt mit dem Issue-Modul eine Nachricht anzeigen die den Benutzer darauf hinweist daß falls er schon eingeloggt ist die Verbindung getrennt wird. Du kannst auch nochmal die ganzen PAM-Module durchgehen, vielleicht gibt es ja doch eine Möglichkeit...

Edit: Evtl. kannst du auch pam_exec verwenden, mit einem kleinen Shellskript, um die Issue-Datei anzupassen sobald sich ein Benutzer anmeldet. Ich würde diese Spielereien aber sein lassen und einfach darauf hinweisen daß man sich nur einmal einloggen kann.

uname
Beiträge: 12480
Registriert: 03.06.2008 09:33:02

Re: SSH - Eine Session pro Benutzer

Beitrag von uname » 18.02.2010 17:00:01

statt /etc/issue würde ich /etc/motd nutzen

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH - Eine Session pro Benutzer

Beitrag von goeb » 18.02.2010 17:09:21

Mh, glaub nicht daß das geht:
man motd hat geschrieben:The contents of /etc/motd are displayed by login(1) after a successful login
Das Login ist ja eben nicht erfolgreich wenn das Limit überschritten wird. Kommt vielleicht auch auf die Reihenfolge in der PAM-Konfiguration an, müsste man mal ausprobieren...

shell4life
Beiträge: 13
Registriert: 17.02.2010 17:52:18

Re: SSH - Eine Session pro Benutzer

Beitrag von shell4life » 24.02.2010 02:18:39

Hi zusammen,

abschließend fasse ich die gefundenen Lösungen zusammen. Es sind 2, wobei die Lösung mit dem Script sicherlich noch verfeinert werden muss damit es sich nicht abbrechen lässt.
Hiermit wird geprüft ob sich ein Benutzer schon einmal angemeldet hat und wenn er es hat, wird er ausgeloggt.

Danke rendegast!

test $(who | grep "$USER" | wc -l) -gt 1 && echo "The user $USER is already logged in. You will be disconnected in 5 seconds" && sleep 5 && logout
Diese Lösung finde ich etwas besser da es schon gleich so im System vorhanden ist.
Danke goeb!

session required pam_limits.so
in der PAM-Konfiguration für SSH und

<username> hard maxlogins 1
in /etc/security/limits.conf sollte auch funktionieren. Setzt natürlich voraus daß SSH PAM verwendet.

Details: http://www.kernel.org/pub/linux/libs/pa ... imits.html

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: [gelöst] SSH - Eine Session pro Benutzer

Beitrag von Duff » 24.02.2010 07:54:43

shell4life hat geschrieben:
Danke goeb!

session required pam_limits.so
in der PAM-Konfiguration für SSH und

<username> hard maxlogins 1
in /etc/security/limits.conf sollte auch funktionieren. Setzt natürlich voraus daß SSH PAM verwendet.

Details: http://www.kernel.org/pub/linux/libs/pa ... imits.html
Diese Lösung finde ich auch sehr interessant.
Werde ich mal ausprobieren.
Oh, yeah!

severin
Beiträge: 481
Registriert: 26.04.2005 13:30:43

Re: [gelöst] SSH - Eine Session pro Benutzer

Beitrag von severin » 24.02.2010 08:28:32

in der Fredüberschrift steht [GELÖST]. Kannst Du vielleicht kurz skizzieren, wie Du das jetzt hingekriegt hast? Ich finde das Thema nämlich ziemlich witzig

Antworten