lu.se

Datavetenskap

Lunds Tekniska Högskola

Denna sida på svenska This page in English

open_ports.sh 2.6

Nytt! I version 2.3 är den geografiska uppslagningen tillbaka – jippie! :-)
Version 2.4 visar alla aktiva nätverksinterface och i rätt ordning dessutom!
Nytt i version 2.6 är att open_ports har flyttat till GitHub: https://github.com/Peter-Moller/open-ports

Om scriptet

Scriptet open_ports.sh visar vilka öppna förbindelser man har på sin dator, både utgående och inkommande.

Scriptet fungerar även på Linux – för testade distros, se punkten nederst!

På Mac kan man med hjälp av GeekTool (ingår inte) visa resultatet direkt på skärmens bakgrund såsom i denna bild:


(Klicka för en större bild)

Så här kan det se ut när man befinner sig bakom en NAT-router:


På en Linux-maskin kan det se ut så här (man kan använda conky eller root tail eller liknande för att smeta ut utskriften på skärmen):

(Klicka för en större bild)

För utgående trafik visas följande information:
• Program
• Port
• Användare
• Antal uppkopplingar
• Server som man är kopplat till
• Var i världen (land och stad) som den maskinen finns

Den rapporterar även för vad som är igång och väntar på trafik utifrån. För det rapporteras följande:
• Protokoll (IPv4 eller IPv6)
• Program
• Användare
• Port
• ”Servicerange”, d.v.s. vilka som betjänas (en del betjänar endast den lokala datorn eller det lokala nätet)

Scriptet körs av systemanvändaren ”root” varannan minut (med launchd på Mac och cron på Linux) och använder kommandot lsof för att samla in data i ett antal filer. När man kör scriptet som vanlig användare (t.ex. m.h.a. GeekTool) analyseras dessa datafiler och resultatet presenteras.

Kontroller

• varannan timme kontrolleras checksumman för programmet lsof för att upptäcka ett eventuellt intrång (se bild)
• accessrättigheterna på de ingående filerna
• så att det finns datafiler alls (varnar annars, se bild)
• så att launchd-komponenten kör (endast Mac, se bild)
• så att datafilerna är yngre än 1 timme (se bild)
• så att vi har en IP-adress alls (se bild)

En gång i timmen kontrolleras datorns externa IP-adress (sitter man bakom en NAT så är det den externa adressen som används av scriptet) och om den förändras adderas detta till en ”dagbok” (så att man i efterhand kan se var man har varit :-).

Färgnyckel:

röd bakgrundprocessen ägs av root
röd textIP-numret har inget motsvarande DNS-namn (det är inte bra men det behöver inte vara "farligt")
blå textIP-numret slås upp till flera DNS-namn
grön textprotokollet är "säkert" (ssh, https, imaps, smtps, scp, sftp) eller programmet är sshd

 

Installation

  1. Hämta scriptet från
    http://fileadmin.cs.lth.se/cs/Personal/Peter_Moller/scripts/open_ports_install.sh (Mac)
    http://fileadmin.cs.lth.se/cs/Personal/Peter_Moller/scripts/open_ports_install_linux.sh (Linux)
  2. Starta ett terminalprogram
  3. Bli root:
    Mac: om du är en vanlig användare skriver du sudo adminanvändarnamn och sedan sudo -i; om du är admin-användare skriver du bara sudo -i.
    Linux: skriv: su -
  4. Sätt accessrättigheter på scriptet:
    chmod 755 open_ports_install.sh resp. open_ports_install_linux.sh (du måste leta upp var det finns)
  5. Kör scriptet:
    ./open_ports_install.sh resp. open_ports_install_linux.sh
  6. Installationen går normalt snabbt. För Linux är det klart nu. På Mac avslutas det med att GeekTool öppnas. För att installera det, dubbelklicka på dess .PrefPane
  7. I GeekTool: klicka på ikonen som det står ”Shell” under och drag ut på en del tomt skrivbord (måste vara tomt annars vill den inte). Drag den så stor som du vill ha den och där du vill ha den.
  8. Det dyker upp ett ”Properties”-fönster. Det du behöver fylla i här är:
    • Command: open_ports.sh
    • Refresh every: 120 s
    • Byt typsnitt till ett monospace-typsnitt (jag använder Menlo och vit typsnittsfärg)
  9. Nu kan du stänga GeekTool

Notera att GeekTool inte flyttar runt sitt innehåll om du ändrar antalet skärmar etc. (t.ex. med en bärbar dator som har en extern skärm). Däremot blir dess fönster åter synligt när skärmgeometrien återställs!

Notera även att scriptet automatiskt kommer att starta efter en omstart!

 

sha1-checksumma för open_ports.sh:

Geografisk uppslagning

Tidigare använde jag en site som fritt gav up geografisk uppslagning. De har nu slutat med det och numera (nytt i mars 2014) använder jag en annan site som fungerar väl:

http://db-ip.com/api/

(Klicka på knappen ”Free” och ange din emailadress så mailar de en nyckel till dig. De har en begränsning på 2.000 frågor per dygn, men eftersom redan gjorda frågor sparas är det ingen risk att trilla över den gränsen vid vanlig användning)

Denna nyckel (en lång räcka med bokstäver och siffror) måste du själv spara som denna fil:
/Library/cs.lth.se/OpenPorts/apidb.key

Om ingen sådan fil finns, kommer  open_ports.sh inte att leta upp datorernas geografiska lokation.

 

Uppdatering

Man uppdaterar scriptet (manuellt) genom att som root i ett terminalfönster skriva:
open_ports.sh -u

Den kommer då att hämta ner den senaste versionen av scriptet och installera det (om den är annorlunda än den du har). Har du redan den senaste versionen kommer den berätta det!

Alternativt kan du själv göra detta som root:
curl fileadmin.cs.lth.se/cs/Personal/Peter_Moller/scripts/open_ports.sh > /usr/bin/open_ports.sh
chmod 755 /usr/bin/open_ports.sh

 

Funktionskontroll

Du kan när som helst köra scriptet (i ett terminalfönster). Vad som händer beror på vilken användare du kör som:
• är du root genereras nya data (men visas inte)
• är du en annan användare visas de senast genererade data i terminalfönstret

Om den säger att du inte har några förbindelser öppna kan du kontrollera detta genom att (som root) skriva:
lsof +c 0 -i 4 -n | grep EST
Blir det tomt så är rapporteringen korrekt.

 

Stoppa / avinstallera

Vill du inte se data längre (men fortsätta samla in) räcker det med att stoppa GeekTool (på dess menyikon eller via dess panel i systeminställningar).

Du stoppar exekvering genom att (som root) i ett terminalfönster skriva:
launchctl stop se.lth.cs.open_ports
launchctl unload /Library/LaunchDaemons/se.lth.cs.open_ports.plist

Du avinstallerar det genom att sedan ytterligare skriva:
rm -rf /bin/open_ports.sh  (scriptet)
rm -rf /Library/LaunchDaemons/se.lth.cs.open_ports.plist  (bakgrunds-datainsamlingen)
rm -rf /Library/cs.lth.se/OpenPorts  (datafilerna)

 

Beskrivning av komponenterna

De ingående komponenterna är dessa:

/usr/bin:
open_ports.shScriptet som körs av både bakgrunds-datasamlaren och av GeekTool (och användaren)
/Library/LaunchDaemons:(endast Mac)
se.lth.cs.open_ports.plistStyrscript till launchd; gör så att open_ports.sh-scriptet körs var 120:e sekund och samlar data
/Library/cs.lth.se (Mac)    /usr/share/cs.lth.se (Linux)
GeoLookupKatalog som innehåller uppslagna datorers geografiska placering. De sparas som en fil per IP-adress med namnet ”IP-address.txt”.
Samanvänds av många script!!
/Library/cs.lth.se/OpenPorts (Mac)    /usr/share/cs.lth.se/OpenPorts (Linux)
apidb.keyOm denna filen finns och innehåller en giltig nyckel (från http://db-ip.com/api/), kommer datorerrnas geografiska lokation att letas upp när ≠ root kör scriptet
Checksum.txtChecksumma för binären /usr/sbin/lsof. Kontrolleras varannan timme för att upptäcka intrång
Countries.txtEn lista över korta och långa namn på länder (från http://www.worldatlas.com/aatlas/ctycodes.htm)
ExternIP.txtDatorns externa IP-adress. Används om man sitter bakom en bredbandsdelare
ExternIP_history.txt”Dagbok” över var datorn har varit; IP-nummer, tidpunkt samt geolokation (kollas en gång i timmen)
ip4.txtData gällande ESTABLISHED-IPv4. Uppdateras varannan minut
ip6.txtData gällande ESTABLISHED-IPv6. Uppdateras varannan minut
listen.txtLista över LISTEN-portar. Uppdateras varannan minut

 

Testade distributioner

Förutom Mac OS X (där scriptet utvecklades först) har följande distributioner testats med open_ports.sh:

• Mandriva 2010
• Kubuntu

Maila mig gärna med erfarenheter från andra distros!