doku:pamsshaccess
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| — | doku:pamsshaccess [2009-05-16 09:00] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== | ||
| + | Per SSH sollen sich Benutzer jeweils nur von bestimmten Hosts erlaubt werden. | ||
| + | |||
| + | Siehe auch [[pamdiensteerlauben]] | ||
| + | |||
| + | Beispiel Benutzer < | ||
| + | |||
| + | * / | ||
| + | < | ||
| + | account | ||
| + | </ | ||
| + | |||
| + | * / | ||
| + | < | ||
| + | + : testuser : fc4.strukturpunkt.de | ||
| + | - : testuser : ALL | ||
| + | </ | ||
| + | |||
| + | * DNS-Lookup wird jeweils on-the-fly gemacht, keine Neustart nötig. | ||
| + | |||
| + | * Falls root reglementiert wird: access.conf wird auch für cron gelesen, daher für '' | ||
| + | < | ||
| + | + : root : cron | ||
| + | + : root : 192.168.4.1 | ||
| + | - : root : ALL | ||
| + | </ | ||
| + | |||
| + | Getestet: | ||
| + | * Zugriff via Passwort und/oder authorized_keys | ||
| + | * Fedora 7 | ||
| + | * Debian 4.0 (Etch) | ||
| + | ===== Umgang mit dynamischen IP-Nummern | ||
| + | |||
| + | * / | ||
| + | < | ||
| + | # | ||
| + | # (c) 2006 Klaus.Franken@StrukturPunkt.de | ||
| + | # | ||
| + | |||
| + | # creates $SYSTEMFILE from $TEMPLATE | ||
| + | # change lines like " | ||
| + | # store actual ip-numer in / | ||
| + | # print ip-number only if changed | ||
| + | |||
| + | # Version: 6.12.1 | ||
| + | |||
| + | use strict; | ||
| + | use Net::DNS; | ||
| + | use IO::File; | ||
| + | |||
| + | my $SYSTEMFILE="/ | ||
| + | my $TEMPLATE="/ | ||
| + | |||
| + | sub getSaveIp ($) { | ||
| + | my $DYNDOMAIN=shift; | ||
| + | |||
| + | my $VARRUN="/ | ||
| + | my $dynip; | ||
| + | my $dynipLast; | ||
| + | my $res = Net:: | ||
| + | my $query = $res-> | ||
| + | |||
| + | if ($query) { | ||
| + | foreach my $rr ($query-> | ||
| + | next unless $rr-> | ||
| + | # | ||
| + | $dynip=$rr-> | ||
| + | } | ||
| + | } else { | ||
| + | warn "query failed: ", $res-> | ||
| + | # exit 1; | ||
| + | } | ||
| + | |||
| + | |||
| + | if (-r $VARRUN) { | ||
| + | my $Fd = new IO::File; | ||
| + | open ($Fd, $VARRUN) || die ("open $VARRUN: $!"); | ||
| + | $dynipLast = < | ||
| + | chomp($dynipLast); | ||
| + | close($Fd); | ||
| + | } | ||
| + | |||
| + | if ($dynipLast ne $dynip) { | ||
| + | print "new dynip($DYNDOMAIN): | ||
| + | my $Fd = new IO::File; | ||
| + | open ($Fd, "> $VARRUN" | ||
| + | print $Fd " | ||
| + | close($Fd); | ||
| + | } | ||
| + | return ($dynip); | ||
| + | } | ||
| + | |||
| + | my $FdTemplate = new IO::File; | ||
| + | open ($FdTemplate, | ||
| + | |||
| + | my $FdSystem = new IO::File; | ||
| + | open ($FdSystem, "> | ||
| + | |||
| + | while (my $line = < | ||
| + | if ($line =~ / | ||
| + | my $hostname=$1; | ||
| + | #print " | ||
| + | my $dynip=getSaveIp($hostname); | ||
| + | if (! $dynip) { | ||
| + | warn " | ||
| + | } | ||
| + | $line =~ s/ | ||
| + | } | ||
| + | print $FdSystem $line; | ||
| + | } | ||
| + | close ($FdTemplate); | ||
| + | close ($FdSystem); | ||
| + | |||
| + | exit 0; | ||
| + | |||
| + | </ | ||
| + | * Perl-Modul Net::DNS | ||
| + | * Test: %%perl -e "use Net:: | ||
| + | * Debian: '' | ||
| + | * mkdir / | ||
| + | * / | ||
| + | < | ||
| + | account | ||
| + | account | ||
| + | </ | ||
| + | * :!: Debian-Trouble: | ||
| + | |||
| + | * / | ||
| + | < | ||
| + | + : testuser : dynip(fc4.strukturpunkt.de) | ||
| + | - : testuser : ALL | ||
| + | </ | ||
| + | |||
| + | ===== Ausblick | ||
| + | * pam_exec.so | ||
| + | ===== Trouble gelöst ===== | ||
| + | < | ||
| + | so richtig glücklich bin ich mit den Hausmitteln von PAM nicht geworden: | ||
| + | |||
| + | - in der Prüfung von pam_access.so wird dummerweise imm der erste | ||
| + | gefundene Hostname hergenommen (also: es wird eine Reverse-Lookup auf | ||
| + | die IP-Nummer gemacht und dieser Name wird für weitere Prüfungen | ||
| + | hergenommen; | ||
| + | nicht überprüft) | ||
| + | |||
| + | - damit können wir nicht formulieren, | ||
| + | eine IP-Nummer aufgelöst wird und erlaubt/ | ||
| + | |||
| + | - Es gibt zwar ein PAM-Modul pam_exec. Aber darin ist nicht vorgesehen | ||
| + | die aktuellen Login-Daten abzufragen. Man kann einfach nur ein Programm | ||
| + | starten. | ||
| + | |||
| + | Ich sehe folgende Lösungmöglichkeiten: | ||
| + | |||
| + | 1. http:// | ||
| + | Das pam-exec (nicht zu verwechseln mit pam_exec !) startet ein Programm | ||
| + | _und_ übermittelt die Login-Daten ähnlich wie das Modul pam_warn. Darin | ||
| + | könnten wir die gewünschte Prüfung machen. | ||
| + | |||
| + | Allerdings muss dafür selbst compiliert werden. Das halte schlecht | ||
| + | pflegbar und zu fehleranfällig auf Dauer (insbesondere bei vielen Systemen) | ||
| + | |||
| + | 2. Wir schränken den Login auf Domains ein, z.B. .dsl.de.ignite.net | ||
| + | Das entspricht als Login-Regel dem was wir aktuell in der Logwatch per | ||
| + | Sichtprüfung machen. Allerdings bringt das nicht wirklich viel und Sie | ||
| + | haben damit kein Möglichkeit mal eben von einem anderen Provider die | ||
| + | Verbindung aufzubauen. | ||
| + | |||
| + | 3. per " | ||
| + | r2d2.selfip.net aktuell ermittelt und dies die Regeldatei | ||
| + | / | ||
| + | pam_access.so bzw. / | ||
| + | IP-Nummer darf. | ||
| + | Das ist zwar ein wenig von hinten durch die Brust ins Auge programmier, | ||
| + | aber der Aufwand hält sich in Grenzen und es ist IMHO übersichtlich genug. | ||
| + | |||
| + | Die Variante 3 ist mein Favorit! Soll ich's so machen? | ||
| + | </ | ||
| + | |||
| + | Variante wurde umgesetzt, s. o. | ||