⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 log_badlogins

📁 radius服务器
💻
字号:
#!/usr/bin/perl## Log failed logins in the sql database# Works with mysql and postgresql# It will read the sql parameters from the admin.conf file## Usage:# log_badlogins <radius.log> [<admin.conf>] [all]## Defaults:# radius.log: none# admin.conf: /usr/local/dialup_admin/conf/admin.conf # all:        no. Go to the end of the file. Don't read it all.use Date::Manip qw(ParseDate UnixDate);use Digest::MD5;$|=1;$file=shift||'none';$conf=shift||'/usr/local/dialup_admin/conf/admin.conf';$all_file=shift||'no';## Uncomment to force inserts even if there are sql errors. That can# help in case there is one sql query which stops the whole failed# logins logging system from working#$force=1;### CHANGE THESE TO MATCH YOUR SETUP##$regexp = 'from client localhost port 135|from client blabla ';$tmpfile='/var/tmp/sql.input';##open CONF, "<$conf"	or die "Could not open configuration file\n";while(<CONF>){	chomp;	($key,$val)=(split /:\s*/,$_);	# Fixme : recursivly solve %{.*} replacement for $val	# Fixme: Conf should be put in an associative array	$sql_type = $val if ($key eq 'sql_type');	$sql_server = $val if ($key eq 'sql_server');	$sql_username = $val if ($key eq 'sql_username');	$sql_password = $val if ($key eq 'sql_password');	$sql_database = $val if ($key eq 'sql_database');	$sql_accounting_table = $val if ($key eq 'sql_accounting_table');	$realm_strip = $val if ($key eq 'general_strip_realms');	$realm_del = $val if ($key eq 'general_realm_delimiter');	$realm_for = $val if ($key eq 'general_realm_format');	$domain = $val if ($key eq 'general_domain');	$sql_timeout = $val if ($key eq 'sql_connect_timeout');	$sql_extra = $val if ($key eq 'sql_extra_servers');	$sqlcmd = $val if ($key eq 'sql_command');	$clients= $val if ($key eq 'general_clients_conf');}close CONF;open CLIENTS, "<$clients"	or die "Could not open $clients file\n";while(<CLIENTS>){	chomp;	s/^\s*//g;	s/\s*#.*//g;	if (!/^\s*$/ && /=/) {		($key,$val)=(split /\s*=\s*/,$_);		$client_short = $val if ($key eq 'shortname');	} else {		if (/\{/) {			s/.*client\s+([^\s]*)\s+\{.*$/\1/;			if (/^\d+\.\d+\.\d+\.\d+/) {				$client = $_;			} else {				if (/\./ || /localhost/) {					$name = $_ ;				} else {					$name = $_.".".$domain;				}				$addr = gethostbyname $name;				($a,$b,$c,$d)=unpack('C4',$addr);				$client = "$a.$b.$c.$d";#DEBUG#				print $name." = ".$client."\n";			}		} else {			if (/\}/) {				$client_array{$client_short} .= $client;			}		}	}}close CLIENTS;$realm_del = '@' if ($realm_del eq '');$realm_for = 'suffix' if ($realm_for eq '');$pass = ($sql_password ne '') ? "-p$sql_password" : '';die "SQL server not defined\n" if ($sql_server eq '');die "sql_command directive is not set in admin.conf\n" if ($sqlcmd eq '');die "Could not find sql binary. Please make sure that the \$sqlcmd variable points to the right location\n" if (! -x $sqlcmd);$opt = "";$opt = "-O connect_timeout=$sql_timeout" if ($sql_timeout);$opt .= " -f" if ($force);@servers = (split /\s+/,$sql_extra) if ($sql_extra ne '');unshift @servers, $sql_server;open LOG, "<$file"	or die "Could not open file $file\n";seek LOG, 0, 2 if ($all_file eq 'no');for(;;){	while(<LOG>){		$do=0;			chomp;		next if ($regexp ne '' && !/$regexp/);		if ($_ ne ''){			$user = $nas = $port = $caller = '-';			if (/Login incorrect/){				if (/Login incorrect \((.+?)\):/){					$cause = "Login-Incorrect ($1)";				}else{					$cause='Login-Incorrect';				}				$do=1;			}			elsif (/Invalid user/){				if (/Invalid user \((.+?)\):/){					$cause = "Invalid-User ($1)";				}else{					$cause='Invalid-User';				}				$do=1;			}			elsif (/Multiple logins/){				if (/MPP attempt/){					$cause='Multiple-Logins (MPP Attempt)';				}else{					$cause='Multiple-Logins';				}				$do=1;			}			elsif (/(Outside allowed timespan \(.+?\)):/){				$cause = "$1";				$do=1;			}			if ($do){				$date = (split / : /,$_)[0];				$date2 = ParseDate($date);				if ($date2){					($year,$mon,$mday,$hour,$min,$sec)=UnixDate($date2,'%Y','%m','%d','%H','%M','%S');				}				$time = "$year-$mon-$mday $hour:$min:$sec";				if (/\[([\w\-\.\!\@\s]+?)\]\s+\(from (.+?)\)/){					$user = $1;					($nas,$port) = (split /\s+/,$2)[1,3];					if ($2 =~ /cli (.+?)$/){						$caller = $1;					}				}				elsif (/\[([\w\-\.\!\@\s]+?)\/.+?\]\s+\(from (.+?)\)/){					$user = $1;					($nas,$port) = (split /\s+/,$2)[1,3];					if ($2 =~ /cli (.+?)$/){						$caller = $1;					}				}				$caller='' if (!defined($caller));				$user =~s/[^\w\-\.\d\!\@\s]//g;				$nas =~s/[^\w\.\-]//g;				$port =~s/[^\d]//g;				$addr = $client_array{$nas};				if ($user ne '' && $realm_strip eq 'yes'){					($one,$two) = (split /$realm_del/, $user)[0,1];					if ($two ne ''){						$user = ($realm_for eq 'suffix') ? $one : $two;					}				}				foreach $server (@servers){					unlink "$tmpfile.$server" if ($delete{$server});					open TMP, ">>$tmpfile.$server"						or die "Could not open temporary file\n";					$ctx = Digest::MD5->new;					$ctx->add($user);					$ctx->add($addr);					$ctx->add($port);					$ctx->add($time);					$ctx->add('badlogin');					$uniqueid = $ctx->hexdigest;#DEBUG#					print "INSERT INTO $sql_accounting_table (UserName,AcctUniqueId,NASIPAddress,NASPortId,AcctStartTime,AcctStopTime,AcctSessionTime,AcctInputOctets,AcctOutputOctets,CallingStationId,AcctTerminateCause) VALUES ('$user','$uniqueid','$addr','$port','$time','$time','0','0','0','$caller','$cause');\n";					print TMP "INSERT INTO $sql_accounting_table (UserName,AcctUniqueId,NASIPAddress,NASPortId,AcctStartTime,AcctStopTime,AcctSessionTime,AcctInputOctets,AcctOutputOctets,CallingStationId,AcctTerminateCause) VALUES ('$user','$uniqueid','$addr','$port','$time','$time','0','0','0','$caller','$cause');\n";					close TMP;					$command = "$sqlcmd -h$server $opt -u$sql_username $pass $sql_database <$tmpfile.$server" if ($sql_type eq 'mysql');					$command = "$sqlcmd  -U $sql_username -f $tmpfile.$server $sql_database" if ($sql_type eq 'pg');					`$command`;					$exit = $? >> 8;					$delete{$server} = ($exit == 0) ? 1 : 0;					print "ERROR: SQL query failed for host $server\n" if ($exit != 0);				}			}		}	}	if ($all_file ne 'once') {		sleep 2;		seek LOG,0,1;	} else {		exit(0);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -