[gelöst]Anmledung über LDAP läuft, aber wer ist angemeldet?

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Benutzeravatar
bertol
Beiträge: 145
Registriert: 07.10.2003 10:40:19
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

[gelöst]Anmledung über LDAP läuft, aber wer ist angemeldet?

Beitrag von bertol » 27.07.2007 13:05:18

Hallo!

Habe einen LDAP-Server aufgesetzt, an dem sich die User übers netz authifizieren können (Client und Server sind Debian Etch. (pam.d mod_ldap).

Jetzt möchte ich aber wisssen, welcher user wo gerade angemeldet ist. Mein erster Gedange war . Der spuckt aber nur den/die lokal angemeldeten User aus.

Wenn der client ne Windowsmaschine ist, ist das kein Problem
smbstatus
Gibt es ne möglichkeit Linux Anmeldung herauszubekommen?
Zuletzt geändert von bertol am 01.08.2007 13:23:08, insgesamt 1-mal geändert.

Benutzeravatar
bertol
Beiträge: 145
Registriert: 07.10.2003 10:40:19
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

möglicher ansatzt gefunden

Beitrag von bertol » 30.07.2007 16:58:08

Ein Möglicher Ansatz sollte vieleicht

Code: Alles auswählen

sessreg
sein. muss ich aber noch genauer testen und prüfen

Pawel
Beiträge: 284
Registriert: 27.11.2006 03:59:39

Beitrag von Pawel » 30.07.2007 21:42:25

Bei mir zeigt "who" (zusätzlich noch "w" und "last") alle angemeldeten User - auch die, die sich per LDAP angemeldet haben - an.
Könnte es sein, dass du kein libnss-ldap installiert hast?

Benutzeravatar
bertol
Beiträge: 145
Registriert: 07.10.2003 10:40:19
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von bertol » 31.07.2007 08:39:44

Am Client und Server ist das Paket libnss-ldap installiert?

Wie sehen denn bei Dir die
  • /etc/nsswitch.conf
    /etc/pam.d/common-account
    /etc/pam.d/common-auth
    /etc/pam.d/common-password
    /etc/pam.d/common-session
aus?

bei mir

Code: Alles auswählen

# /etc/nsswitch.conf
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

hosts:          nis files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Code: Alles auswählen

# /etc/pam.d/common-account - authorization settings common to all services
account         sufficient      pam_ldap.so
account         required        pam_unix.so

Code: Alles auswählen

# /etc/pam.d/common-auth - authentication settings common to all services
auth    sufficient      pam_ldap.so
auth    required        pam_unix.so nullok_secure

Code: Alles auswählen

# /etc/pam.d/common-password - password-related modules common to all services
password   sufficient pam_ldap.so
password   required   pam_unix.so nullok obscure min=4 max=8 md5

Code: Alles auswählen

# /etc/pam.d/common-session - session-related modules common to all services
session sufficient      pam_ldap.so
session required        pam_unix.so

Pawel
Beiträge: 284
Registriert: 27.11.2006 03:59:39

Beitrag von Pawel » 31.07.2007 10:55:38

bertol hat geschrieben:Am Client und Server ist das Paket libnss-ldap installiert?
Ist das eine Frage oder eine Feststelltung?
Wenn es installiert ist, ist es auch richtig konfiguriert?
Das kannst du mit folgendem Befehl herausfinden, der dir ein Äquivalent zur /etc/passwd liefert inkl. den Daten auch aus dem LDAP Server:

Code: Alles auswählen

getent passwd
bertol hat geschrieben:Wie sehen denn bei Dir die
  • /etc/nsswitch.conf
    /etc/pam.d/common-account
    /etc/pam.d/common-auth
    /etc/pam.d/common-password
    /etc/pam.d/common-session
aus?
Relativ identisch.

Benutzeravatar
bertol
Beiträge: 145
Registriert: 07.10.2003 10:40:19
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von bertol » 31.07.2007 11:33:13

Hallo Pawel!

Sorry das war ne Feststelleung, Das Fragezeichen war ein Versehen.

Am Client gibt getent passwd ; getnent group schon die LDAP-Datenenbank des Servers aus.

Nochmals kurz Zusammengefasst:

Code: Alles auswählen

Client:
=====
/etc/passwd                             -> nur Systemkonten
/etc/group                              -> nur Systemgruppen 
/home                                   -> gemountet via NFS auf den Server
Login mit LDAPServergespeicherten User  -> OK
getent passwd und getent group          -> OK (Ausgabe der Servergespeicherten Users | Groups)
ls -l /home                             -> Aufgelöste User und Group ID's (also statt 10000 = bertol)
who                                     -> der User der an dem Client angemeldet ist

Server:
======
who                                     -> NOT OK nur die lokal angemeldeten User, keine User 
                                           die sich an einem Anderem Rechner via LDAP-Angemeldet habe
Und bei Dir am Server gibt who soetwas in der Art aus?

Code: Alles auswählen

root     tty2         2007-07-31 10:19
user1     tty1        2007-07-31 10:40 (meinclient1)
user2     tty1        2007-07-31 10:54 (meinClient2)

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 31.07.2007 11:44:13

Hi,

mal Klartext: willst du auf dem Server herausbekommen welche User auf den Clients angemeldet sind ? Das bekommst du so mit Ldap nicht hin. Der Client teilt dem Server ja auch nicht unbedingt mit wann er sich ausloggt. Durch geschicktes Parsen des Logs könntest du sowas vll. "erraten", aber nicht zuverlässig feststellen.
Gruss,
mauser

Benutzeravatar
bertol
Beiträge: 145
Registriert: 07.10.2003 10:40:19
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von bertol » 31.07.2007 11:58:14

Hallo mauser!
mauser hat geschrieben:mal Klartext: willst du auf dem Server herausbekommen welche User auf den Clients angemeldet sind ?
richtig, Allerdings habe ich nicht erwähnt, dass es hauptsächlich um X geht. Bei gdm gibt es ja eben dieses sessreg, das mit -a ja die Anmdledung einträgt und mit dem Parameter -d löscht. (vergl. /etc/gdm/Postsession/default; /etc/gdm/Presession/default). Leider ist dieses sessreg nicht netzwerkfähig
mauser hat geschrieben:Das bekommst du so mit Ldap nicht hin.
gibt es was, mit dem es gehe würde (ausser ssh)?

Pawel
Beiträge: 284
Registriert: 27.11.2006 03:59:39

Beitrag von Pawel » 31.07.2007 12:52:25

bertol hat geschrieben:Hallo mauser!
mauser hat geschrieben:mal Klartext: willst du auf dem Server herausbekommen welche User auf den Clients angemeldet sind ?
richtig,
Ah,okay, dann habe ich dich falsch verstanden. Ich versteh was anderes unter einem lokal angemeldetem Benutzer als du ;)
Leider habe ich keine fertige Lösung für dein Problem.

Benutzeravatar
bertol
Beiträge: 145
Registriert: 07.10.2003 10:40:19
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von bertol » 31.07.2007 18:06:10

Gestern hatte ich ja die Idee mit sessreg. heute mittag habe ich dann das in der shell ausprobiert funktioniert dann dachte ich mir mache ich ein inetd eintrag

Code: Alles auswählen

/etc/inetd.conf
9101    stream  tcp     nowait  root  /usr/local/bin/netlogon-server.pl.pl netlogon-server.pl
der Inhalt von netlogon-server.pl

Code: Alles auswählen

#!/usr/bin/perl
use IO::Socket::INET;
#Erstelle eine Zufallsdatei
$file=int(rand(1000000000)).".sh";

# Lese Übergabe
# und erstelle
# VARname=VARwert
open(J,">/tmp/$file");
print J "#!/bin/sh\n\n";
while (<STDIN>) {
    print J "$_";

}
print J "/usr/bin/sessreg -\$RMODUS -w /var/log/wtmp -u /var/run/utmp -x \$RX_SERVER -h \$RHOST -l \$RDISPLAY \$RUSER";
close J;
system("chmod a+x /tmp/$file");
system("/tmp/$file");
# Lösche schrott
unlink("/tmp/$file");
exit 0;
dann natürlich noch /etc/init.d/openbsd-inetd restart
dann habe ich dem Client das gegenstück geschreiben:
/us/local/bin/netlogon-client.pl

Code: Alles auswählen

#!/usr/bin/perl
use IO::Socket::INET;

#Variablen (noch) in der Rheinfolge eingeben
# "utmp"-Server
# Port
# modus a/d (add/delete)
# user
# X_SERVER
# Host/Clientname
# Display
$SERVER=@ARGV[0];
$PORT=@ARGV[1];
$MODUS=@ARGV[2];
$USER=@ARGV[3];
$X_SERVER=@ARGV[4];
$HOST=@ARGV[5];
$DISPLAY=@ARGV[6];
$ERROR=0;
$CLIENTSOECKET=new IO::Socket::INET->new(PeerPort=>$PORT,Proto=>'tcp',PeerAddr=>$SERVER) or $ERROR=1;
if ($ERROR > 0)
{
    print "NO ACCESS to $SERVER:$PORT\n";
    exit 1;
}
$CLIENTSOECKET->send("RMODUS=$MODUS\n".
    "RUSER=$USER\n".
    "RX_SERVER=$X_SERVER\n".
    "RHOST=$HOST\n".
    "RDISPLAY=$DISPLAY\n");
exit 0;
dann vom Client getestet

Code: Alles auswählen

netlogonclient 192.168.1.101 9101 "a" "bertol" "/var/lib/gdm/:0.Xservers"  "myClient12" ":0"
auf dem Server wird eine Datei im tmp-Verzeichnis erstellt

Code: Alles auswählen

#!/bin/sh

RMODUS=a
RUSER=bertol
RX_SERVER=/var/lib/gdm/:0.Xservers
RHOST=myClient12
RDISPLAY=:0
/usr/bin/sessreg -$RMODUS -w /var/log/wtmp -u /var/run/utmp -x $RX_SERVER -h $RHOST -l $RDISPLAY $RUSER
jetzt kommts.
der Führt das aus aber er macht nichts. hab die datei von hand angestartet (/tmp/34567785432.sh) auch nichts. als ich dann

Code: Alles auswählen

. /tmp/34567785432.sh
bzw.

Code: Alles auswählen

source /tmp/34567785432.sh
getippt hatte dann konnte ich mit who den eintrag sehen.

Hat jemand ne Ahnung wie ich das ausgefhürt bekomme, das komische ist ja auch ich bekomme auch kein Fehler hinweis also $?=0

Mir ist klar, dass das, wie es so da steht ein Sicherheitsrisiko ist. aber für den Test wollte ich jetzt nicht gross irgendwelche Abfragen einbauen.

Benutzeravatar
bertol
Beiträge: 145
Registriert: 07.10.2003 10:40:19
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von bertol » 01.08.2007 13:12:03

so bin jetzt dahinter gekommen
be der Eingabe von "last" habe ich gesehn, dass die Einträge mit gone - no logout gecancelt wurden.
somit war mir dann auch klar, warum der befehl nur mit . bzw. source funktioniert hatte: die laufente Shell-Umgebung blieb ja durch source bestehen!!

somit habe ich das Server script mit einer Endlosschleife versehen und vola. Hier nochmals die Scripts:

Auf dem Server (wo who die Anmeldungen anzeige soll)
/etc/inetd.conf anpassen

Code: Alles auswählen

9101    stream  tcp     nowait  root  /usr/local/bin/netlogon-server.pl netlogon-server.pl
wobei der port 9101 frei gewählt werden kann, der war bei mir frei.

führe

Code: Alles auswählen

/etc/init.d/openbsd-inetd reload
aus.

/usr/local/bin/netlogon-server.pl

Code: Alles auswählen

#!/usr/bin/perl
use IO::Socket::INET;
#Erstelle eine Zufallsdatei
$file=int(rand(1000000000)).".sh";

# Lese Übergabe
open(J,">/tmp/$file");
print J "#!/bin/sh\n\n";
while (<STDIN>) {
    print J "$_";

}

# Melde User als angemeldet
print J "/usr/bin/sessreg -\$RMODUS -w /var/log/wtmp -u /var/run/utmp -x \$RX_SERVER -h \$RHOST -l \$RDISPLAY \$RUSER\n";
#Prüfe ob parameter d übergeben wurde, dann erstelle eine User-Datei und beende
print J "if [ \$RMODE == \"d\" ]; then touch /tmp/\$RUSER.rlogin; exit 0; fi\n";
# Solange bis User-Datei erstellt wurde, dann beenden
print J "while [ ! -f /tmp/\$RUSER.rlogin ]; do sleep 0.1; done \n";
print J "rm /tmp/\$RUSER.rlogin\n";
close J;
# Datei handling
system("chmod u+x /tmp/$file");
system("/tmp/$file");

# Lösche schrott
unlink("/tmp/$file");

exit 0;
Auf den Clients
/usr/local/bin/netlogon-client.pl

Code: Alles auswählen

#!/usr/bin/perl
use IO::Socket::INET;
# lese Parameter ein
$RSERVER=@ARGV[0];
$RPORT=@ARGV[1];
$RMODUS=@ARGV[2];
$RUSER=@ARGV[3];
$RX_SERVER=@ARGV[4];
$RHOST=@ARGV[5];
$RDISPLAY=@ARGV[6];
$ERROR=0;
$CLIENTSOECKET=new IO::Socket::INET->new(PeerPort=>$RPORT,Proto=>'tcp',PeerAddr=>$RSERVER) or $ERROR=1;
# Wenn Fehler breche ab
if ($ERROR > 0)
{
    print "NO ACCESS to $SERVER:$PORT\n";
    exit 1;
}
# Sende Daten an Server
$CLIENTSOECKET->send("RMODUS=$MODUS\n".
    "RUSER=$USER\n".
    "RX_SERVER=$X_SERVER\n".
    "RHOST=$HOST\n".
    "RDISPLAY=$DISPLAY\n");

exit 0;
/etc/gdm/PreSession/Default
suche nach

Code: Alles auswählen

exec "$SESSREG" ....
füge danach oder davor folgende Zeile ein

Code: Alles auswählen

/usr/local/bin/netlogon-client.pl meinserver 9101 "a" "$USER" "$X_SERVERS" "REMOTE_HOST" "$DISPLAY"
/etc/gdm/PostSession/Default
suche nach

Code: Alles auswählen

"$SESSREG" ....
füge danach oder davor folgende Zeile ein

Code: Alles auswählen

/usr/local/bin/netlogon-client.pl meinserver 9101 "d" "$USER" "$X_SERVERS" "REMOTE_HOST" "$DISPLAY"
Restarte gdm

Code: Alles auswählen

/etc/init.d/gdm restart
melde Dich in der X an.

Das ganze kann matürlich auch für KDE oder andere Logon-Manager machen. Habe aber überall GDM drauf. Die shell wird von den anderen nicht genutzt daher habe ich das auch nicht in die bashrc eingetragen, ginge aber auch.

Wenn jetzt noch einer meint, warum ich nicht gleich xdmc benutze, möchte ich Ihm gesagt haben, dass wenn da mehre User dran Arbeiten, das kein Spass mehr macht. Nomachine hat das recht gut hinbekommen, aber die Lizenz erlaubt nur 2 oder 3 User, das ist zuwenig und für mehr zu teuer.


Ich werde jetzt, bevor ich das in betrieb nehme noch einige Sicherheitshürden einbauen, damit da mit Netzwerk-sniffern nichts passieren kann.

Antworten