paper.gifPubblicato su www.linuxvalley.com

fire.gif

MONITORARE LE CONNESSIONI PPP
Le doti di flessibilità, scalabilità ed economicità di Linux sono molto apprezzate dagli Internet Service Provider (ISP), che spesso e volentieri lo usano come server di autenticazione per offrire servizi di connettività alla Rete. In questo articolo , spacciandoci per un ISP, vedremo come si possono realizzare alcune statistiche sui collegamenti via modem utilizzando il linguaggio php
Quando si telefona al provider preferito per effettuare un collegamento alla rete Internet, i dati relativi allo username ed alla password del nostro account verranno con molta probabilità valutati e registrati da un server di autenticazione. Quest'ultimo è in sostanza un software che dopo aver vagliato tali dati decide, sulla base di alcuni criteri che possono essere anche personalizzati, se concedere o negare la connessione ad Internet. Effettuando alcune semplificazioni, necessarie visto l'oggetto dell'articolo, possiamo dire che i componenti principali per offrire un servizio di connettività PPP alla Rete comprendono: i modem, i terminal server (i più apprezzati sono i Cisco 2511 o i più moderni e costosi 5200), ed una macchina nella quale sia in esecuzione il server di autenticazione. Non di rado si scopre che la macchina adottata è proprio un pc Linux. Per quanto riguarda il software di autenticazione in generale si può scegliere tra Tacacs, Tacacs+ o Radius a seconda del grado di sicurezza e controllo che si desidera ottenere. Gli esempi di programmazione presentati nell'articolo prevedono l'uso di Xtacacs, una versione migliorata ed "extended" di tacacs.
linea.gif
XTACACS
Il termine xtacacs, acronimo di "Extended Terminal Access Controller Access Control System", indica un protocollo di autenticazione sviluppato da Cisco Systems e documentato in RFC 1492. Cisco è il principale produttore mondiale di apparecchiature per la connettività in reti LAN e WAN, noto soprattutto per la costruzione di "terminal access server" e router. La funzione di autenticazione viene garantita da un demone (xtacacsd) che dopo aver ricevuto i valori di username e password dal terminal server li confronta con quelli contenuti nel file /etc/passwd o in un archivio dbm del server Linux. xtacasd può essere eseguito in modalità standalone oppure avviato dall'internet super server (inetd) con un comando scritto in /etc/inetd.conf. Una caratteristica interessante di xtacasd è la sua capacità di loggare alcuni dati della connessione PPP di un utente nei file wtmp e utmp. Questi file contengono rispettivamente i dati di apertura e chiusura di tutte le sessioni di login ad un terminal server ed i dati delle connessioni correnti. Precisiamo inoltre che tali file non sono uguali a quelli che Linux scrive in /var/adm ma bensì si tratta di una versione mantenuta dallo stesso server xtacacs. Usando l'utility taclast, fornita insieme al pacchetto xtacacsd, potremo analizzare i file wtmp e utmp ricavandone informazioni preziose ai fini della realizzazione di alcune statistiche relative alla quantità ed alla durata delle connessioni di ogni singolo utente. Poi, sfruttando le funzioni di php ed i comandi messi a disposizione dalla libreria grafica GD, potremo allegare ai numeri grezzi anche un grafico in modo da rendere la rappresentazione dei dati più significativa.
linea.gif
AL LAVORO CON PHP
Il modo più semplice per accedere al contenuto del file wtmp di xtacacs consiste nell'usare il comando taclast senza alcun parametro. L'output sarà una lista simile a questa
pippo     sli1     192.168.0.1    Fri Oct 22 11:08 - 12:29  (01:21) 4877
pippo     tty1     192.168.0.1    Fri Oct 22 11:08 - 11:08  (00:00) 0
pluto     sli4     192.168.0.1    Fri Oct 22 11:05 - 11:11  (00:06) 369
pluto     tty4     192.168.0.1    Fri Oct 22 11:05 - 11:05  (00:00) 0
paperino  sli5     192.168.0.1    Fri Oct 22 11:03 - 11:07  (00:04) 250
paperino  tty5     192.168.0.1    Fri Oct 22 11:03 - 11:03  (00:00) 0
Si osserva che le righe stampate sono formate da una serie di valori separati da spazi. Possiamo quindi dire, adottando alcuni termini tipici del mondo dei database, che ogni riga è un record composto da più campi (field). Il primo campo è lo username dell'utente; il secondo contiene il nome e il numero dell'interfaccia asincrona del terminal server ed il tty del server linux; il terzo è l'indirizzo ip dell'interfaccia ethernet del terminal server. Gli altri valori in sequenza sono; giorno, mese, numero del giorno, ora di inizio e di fine della connessione dell'utente (separate da un trattino). Gli ultimi due campi sono i tempi totali della connessione: uno espresso nel formato (giorni+ore:minuti) e l'altro in secondi. Il nostro obiettivo è quello di intabellare i dati relativi alle connessioni di un particolare utente in un mese ben preciso dell'anno ed offrirne una rappresentazione grafica con un diagramma statistico. Si inizia preparando il form taclast.php3 per la scelta dell'utente e del mese.

<html>
<head>
<title>Xtacacs Monitor</title>
</head>
<body>
<form method="post" action="http://localhost/result.php3">
<table border>
<tr>
<td>UTENTE<br>
<select name="user">
<?php
  // apro in lettura il file /etc/passwd
  $fp = fopen("/etc/passwd", "r");
  while(! feof($fp)) {
    // leggo una riga del file
    $row = fgets($fp, 132);
    // creo un array dei campi della riga
    // usando il carattere : come separatore 
    $field = split(":", $row);
    if ($field[3] == 100) {
      // se l'utente e del gruppo users creo
      // un array associativo composto dalle
      // coppie username-nome_utente
      $users[$field[0]] = $field[4];
    }
  }
  fclose($fp);
  // ordino l'array associativo
  asort($users);
  // creo il menu html per la scelta dell'utente
  for(reset($users); $indice=key($users); next($users)) {
    echo "<option value=\"$indice\">$users[$indice]\n";
  }
?>
</select>
</td>
<td>MESE<br>
<select name=mese>
<option value="Jan">Gennaio
<option value="Feb">Febbraio
<option value="Mar">Marzo
<option value="Apr">Aprile
<option value="May">Maggio
<option value="Jun">Giugno
<option value="Jul">Luglio
<option value="Aug">Agosto
<option value="Sep">Settembre
<option value="Oct">Ottobre
<option value="Nov">Novembre
<option value="Dec">Dicembre
</select>
</td>
<td>TIPO<br>
<input type="radio" name="tipo" value="giornaliere" checked> Giornaliere<br>
<input type="radio" name="tipo" value="totali"> Totali
</td>
<td>
<input type="submit" value="Ok"><br>
<input type="reset" value="Annulla">
</td>
</tr>
</table>
</form>
</body>
</html>

img_articolo

Successivamente si scrive il codice (result.php3) per realizzare la presentazione di dati e grafico.


<html>
<head>
<title></title>
</head>
<body>
<?php
  // scrivo il titolo usando i parametri passati da taclast.php
  echo "CONNESSIONI PPP DELL'UTENTE \"$user\" NEL MESE DI \"$mese\"<p>\n";
?>
<table border>
<tr bgcolor=#c0c0c0> 
<td>GIORNO</td>
<td>ORA DI INIZIO CONNESSIONE</td>
<td>ORA DI FINE CONNESSIONE</td>
<td>DURATA (gg+hh:mm)</td>
</tr>
<?php
// definisco la densità della griglia del grafico
define("GRID", 60);
// eseguo taclast filtrando il risultato per utente e mese
// l'output del comando viene memorizzato in un array
exec("/usr/local/bin/taclast | grep -e $user.*sli.*$mese", $record);
// calcolo in numero di elementi dell'array
$n_record = sizeof($record);
$n = $n_record - 1;
// larghezza in pixel del grafico
$x_max = 720;
// altezza in pixel del grafico
$y_max = $n_record * GRID;
// creo l'immagine per il grafico
$img = imagecreate($x_max+1, $y_max+1);
// definisco il colore di sfondo del grafico
$bianco = imagecolorallocate($img, 255, 255, 255);
// definisco gli altri colori del grafico
$nero = imagecolorallocate($img, 0, 0, 0);
$grigio = imagecolorallocate($img, 200, 200, 200);
$blu = imagecolorallocate($img, 0, 0, 255);

// disegno le etichette per i valori del grafico
// e creo la tabella html per i dati numerici
$k = 0;
while($k < $n_record) {
  $field = split(" +", $record[$k]);
  // creo l'array della durata in secondi delle connessioni
  $secondi[] = $field[10];
  // creo l'array della durata in hh:mm delle connessioni
  $oreminuti[] = $field[9];
  // disegno un'etichetta
  imagestring($img, 5, 0, GRID*$k, "$field[5] $field[3] $field[6] $field[8]", $nero);
  $x1 = $secondi[$k]/60 + 185;
  $y1 = GRID * $k;
  imagestring($img, 4, $x1, $y1, "$oreminuti[$k]", $nero);
  echo "<tr>\n";
  echo "<td>$field[5] $field[3]</td>\n";
  echo "<td><font color=#00ff00>$field[6]</font></td>\n";
  echo "<td><font color=#ff0000>$field[8]</font></td>\n";
  echo "<td><font color=#0000ff>$field[9]</font></td>\n";
  echo "</tr>";
  $k++;
}
echo "</table>\n";

// disegno il grafico
$k = 0;
while($k < $n_record - 1) {
  $i = $k + 1;
  $x1 = $secondi[$k]/60 + 180;
  $y1 = GRID * $k;
  $x2 = $secondi[$i]/60 + 180;
  $y2 = GRID * ($k + 1);
  // traccio una linea
  imageline($img, $x1, $y1, $x2, $y2,  $nero);
  $k++;
}
imageline($img, 180, 0, $secondi[0]/60+180, 0, $nero);
imageline($img, 180, 0, 180, $y_max-GRID, $nero);
imageline($img, 180, $y_max-GRID, $secondi[$n]/60+180, $y_max-GRID, $nero);
// coloro il grafico di blu
imagefill($img, 185, 5, $blu);

// disegno la griglia del grafico
// usando delle linee tratteggiate
$x = 0;
while ($x <= $x_max) {
  imagedashedline($img, $x, 0, $x, $y_max-GRID, $grigio);
$x = $x + GRID;
}
$y = 0;
while ($y < $y_max) {
  imagedashedline($img, 0, $y, $x_max, $y, $grigio);
$y = $y + GRID;
}

// salvo il grafico su una immagine gif
imagegif($img, "/www/share/apache/htdocs/img/grafico.gif");
sleep(3);
?>

<p>
<img src="img/grafico.gif">
</body>
</html>

Il risultato dell'esecuzione dello script result.php3 da parte di taclast.php3 sarà simile a quello mostrato in figura2 e 3.

img_articolo

img_articolo

fire.gif

Data creazione HTML: Gennaio 2000
Autore: Francesco Munaretto
E-mail: NoSpam@thank.you
exclaim.gif