nach beheben von 2 kleinen Fehlern im Bash Skript
Hab nur einen gefunden (
}
statt
fi
in der if-Bedingung, blödes "muscle memory"
) und auch editiert, was war der Zweite?
Ich habe nun ein Python Skript erstellt, welches die Funktion des Bash Skripts etwas erweitert. (Ich bin nicht wirklich erfahren was Programmierung an geht)
Nice, und danke fürs Teilen!
Was mir auffällt, dein logging scheint verkehrt herum zu sein, bei exit 0 wird ja akzeptiert, nicht "rejected".
Kein verhaltens bug, aber kann wohl verwirrend sein. IPv4-inIPv6 handlet deine regex wohl halbwegs richtig, aber geht sicher auch bissl schöner, sonst sehe ich nur paar stilistische Sachen, aber da ist vieles auch einfach Persönliche Geschmackssache.
Hab dann auch noch was in Perl geschrieben, das behandelt auch IPv4-mapped-in-IPv6 Addressen, ist etwa für den Proxmox Backup Server relevant, aber für neuere Proxmox VE und Proxmox Mail Gateway haben wir die LISTEN_IP auch auf "any" umgestellt, und da kann man dann hier auch IPv4 als IPv6 erhalten. Sowas würde bei deinem Script die Regex wohl auch unnötig machen.
Das Perl script, mit statischer Config nur für root (erweitern auf per-user config, und/oder auslesen aus File wie du's hast wäre nicht eine allzu große Änderung):
Perl:
#!/usr/bin/perl
use strict;
use warnings;
use Net::IP qw($IP_B_IN_A_OVERLAP $IP_IDENTICAL);
# Define the list of allowed CIDRs
my @allowed_cidrs = (
'127.0.0.0/8', # IPv4 loopback
'::1/128', # IPv6 loopback
'fe80::/10', # IPv6 link-local addresses
'10.0.0.0/8', # LAN
'172.16.0.0/12', # LAN
'192.168.0.0/16', # LAN
# ...
);
my $user = $ENV{'PAM_USER'} or die "PAM_USER not defined\n";
my $rhost = $ENV{'PAM_RHOST'} or die "PAM_RHOST not defined\n";
# only check the all-powerfull user, ignore all others
exit(0) if $user ne 'root';
if (my $embedded_ipv4 = Net::IP::ip_get_embedded_ipv4($rhost)) {
$rhost = $embedded_ipv4; # normalize IPv4-mapped-in-IPv6 first
}
my $request_ip = Net::IP->new($rhost) or die "invalid IP address '$rhost' in PAM_RHOST\n";
for my $ip_range (map { Net::IP->new($_) } @allowed_cidrs) {
my $overlap = $ip_range->overlaps($request_ip);
next if !defined($overlap);
if ($overlap == $IP_B_IN_A_OVERLAP || $overlap == $IP_IDENTICAL) {
`logger "allowing login request for user '$user' from '$rhost' to proceed"`; # uncomment for debugging
exit(0); # OK
}
}
`logger "rejecting login for user '$user' from '$rhost' early"`;
exit(1); # no configured CIDR matched the IP, exit with failure
An jeden der sowas ausrollt: Es empfiehlt sich das nicht über die Shell im PVE/PBS/PMG web-interface zu konfigurieren, sondern lieber über SSH o.ä., und dann auch testen, sonst kann man sich auch mal leicht selbst aussperren.