Sakarias NettJournal

Automatisk WPA nøkkel på OpenWRT

Her om dagen så satt jeg på ramma og tenkte på sikkerheten på det trådløse nettet hjemme. Og kom fram til at en automatisert metode for å bytte wpa nøkkelen ville ha vært det beste. Men det må også være en enkel måte for brukeren (meg) å hente ut nøkkelen slik at de trådløse enhetene kan benytte seg av nettet. Løsningen min er da å kopiere nøkkelen ut på en usb minnestikke.

Jeg har da en router med OpenWRT RC4 installert og en vanlig Linux boks stående bak sofaen. Jeg kunne sikkert ha gjort hele løsningen i routeren, men jeg synes det ble enklere å la Linux boksen generere wpa nøkkelen og sende denne til routeren(e) og legge den på minnestikken. Grunnen til at jeg legger wpa nøkkelen på minnebrikken istedet for f.eks å maile den til meg er hvis jeg har besøkende så har jeg liten lyst til å prøve å stave en 63 tegns langt "ord" med små og store bokstaver. Da er det bare å ta fram usb minnepinnen og gi den til besøkende som kopierer wpa koden fra wpa.txt fila og limer den inn i sitt wlan konfigurasjons program.

Linux boksen: Vanlig Ubuntu Server installasjon, med shred og pwgen programmene installert. Skriptet jeg lar cron kjøre den 1 hver måned er (husk dette er min kode, møkkete og fæl) :

#!/bin/bash

MOUNT="/mnt/usbstick/"
ROUTERS="192.168.1.1" #; seperated
FILENAME="wpa.txt"
PWGEN=`/usr/bin/pwgen -c -n -s 63 1`
####################################
DATE=`date +%F`
IFS=";"

if [ -d "$MOUNT" ]; then
    if [ -f "$MOUNT""$FILENAME" ]; then
        for ROUTER in $ROUTERS
            do
                ping -c 1 -i 5 "$ROUTER" &>/dev/null
                if [ $? -ne 0 ] ; then
                    echo "Sorry, but $ROUTER is down"
                else
                    echo "$PWGEN" > /tmp/"$FILENAME"
                    echo "$DATE - $PWGEN" >> "$MOUNT""$FILENAME".log
                    scp -q /tmp/"$FILENAME" root@"$ROUTER":/etc/"$FILENAME"
                    cp /tmp/"$FILENAME" "$MOUNT""$FILENAME"
                    shred -z -u /tmp/"$FILENAME"
                fi
        done
    else
        echo "Sorry, you have to create $FILENAME on $MOUNT"
    fi
else
    echo "Sorry, exiting because $MOUNT does not exist, nowhere to save wpa key."
    exit 0
fi

Koden er lagt opp slik at den kan kunne oppdatere flere routere på engang, bare legge inn flere ipadresser i variablen ROUTERS med ; som seperator tegn.

På OpenWRT boksen er ikke koden så vanskelig, den kjøres en time senere enn den på Linux boksen, og er som følger:

#!/bin/sh

FILENAME="/etc/wpa.txt"
OLDWPA=`nvram get wl0_wpa_psk`
NEWWPA=`cat /etc/$FILENAME`

if [ "$OLDWPA" != "$NEWWPA" ]; then
    nvram set wl0_wpa_psk "$NEWWPA"
    nvram commit
    reboot
fi

Dette er alt som skal til, nesten. Du må også sette opp crond på OpenWRT boksen og bruke ssh nøkkel slik at du slipper å taste passord når wpa nøkkelen skal kopieres over fra Linux boksen.

Følg med på Twitter for oppdateringer på nye posteringer.