Harjoitus 5: IPTABLES asentaminen ja käyttö

w47 j-5 Asenna koneellesi iptables-tulimuuri. Kuvaile, mitä sen eri osat tekevät ja miksi ne ovat valitussa järjestyksessä. Testaa tulimuurin toiminta nmap-porttiskannerilla. Avaa joitakin portteja ja kokeile, miten skannaustulos muuttuu. Testaa käyttöjärjestelmän sormenjälki, -P0, banner grabbing ja skannattavien porttien vaihtaminen. Testaa jotain itse valitsemaasi tietoturvatyökalua. Ole huolellinen, ettet aiheuta häiriötä toisten koneille tai verkoille.

Sisällysluettelo

  1. Ajoitus
  2. Harjoitus
  3. Jälkikommentteja
  4. To-Do

Ajoitus

Suoritin harjoituksen 24.11.2005 aikana, luokassa 5013 koneella numero 0x. Aikaa harjoitukseen kului kaiken kaikkiaan noin 2 tuntia, josta dokumenttien kirjoittaminen vei noin tunnin verran.


Harjoitus

Aloitin harjoituksen tarkistamalla mitä Fedora Core 4:n mukana tuleva palomuuri oli konfiguroitu seuraavalla komennolla:

# iptables -L

Komento tulosti varsin näyttävän näköisesti paljon rivejä joissa oli määritelty jos minkälaisia asetuksia palomuurille. Fedoran asentamaan palomuuriinhan tehdään säädöt jo asennusvaiheessa, joten kuten odottaa saattoi, päästi oma palomuurini kaiken liikenteen ulospäin, kielsi sisäänpäin tulevasta liikenteestä kaiken muun paitsi yhteydenotot ssh-palvelimeeni ja salli localhost liikenteen sekä paluuliikenteen.

Seuraavaksi kävin kopioimassa Tero Karvisen sivuilta malliskriptin iptables-määrityksille. Malliskripti sisälsi tämännäköistä tavaraa:

#!/bin/sh
# firewall.sh - Configurable per-host firewall for workstations and
# servers.(c) 2003 Tero Karvinen - tero karvinen at iki fi - GPL
# Cleanup old rules # All the time firewall is in a secure, closed state
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables --flush        # Flush all rules, but keep policies 
iptables --delete-chain
## Workstation Minimal firewall ###
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -A INPUT -i lo --source 127.0.0.1 --destination 127.0.0.1 -j ACCEPT
iptables -A INPUT -m state --state "ESTABLISHED,RELATED" -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
####### HOLES ####### Edit holes below, then run this script again
#iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#iptables -A INPUT -p tcp --dport http -j ACCEPT
#iptables -A INPUT -p tcp --dport https -j ACCEPT
##################### Edit above
iptables -A INPUT -j LOG -m limit --limit 40/minute
iptables -A INPUT -j DROP
# Save
iptables-save > /etc/sysconfig/iptables
echo "$0: Done."

Tallensin opettajan sivuilta kopioimani skriptin /etc/firewall.sh nimiseksi tiedostoksi omalle koneelleni ja annoin ko. tiedostolle ajo-oikeudet komennolla:

# chmod u+x /etc/firewall.sh

Jonka jälkeen olikin jo aika testata miten skripti toimii - siispä ajoin skriptin komennolla

# /etc/firewall.sh

Seuraavaksi tarkistin skriptin tekemät muutokset iptables -L komennolla. Tuloksena oli jo hiukan luettavampi tuloste, josta sai paremmin selvää mitä määrityksiä palomuurille oli tehty.

Seuraavaksi piti hiukan tutustua iptables-komennon manuaaliin ja selvittää mitä kukin rivi ajetussa skriptissä tarkoitti ja miksi rivit oli asetettu ylläolevaan järjestykseen. Opettaja kävi asiaa tunnilla jo melkoisen paljon läpi, joten tässä yhteenvetona aluksi perusfaktat IPTABLES-komennosta:

1) IPTABLES oletusketjuja on 3 kappaletta
	INPUT = sisääntuleva liikenne
	OUTPUT = ulosmenevä liikenne
	FORWARD = NAT liikenne, eli eteenpäin ohjattu liikenne

2) sääntölistaa tulkitaan aina ylhäältä alaspäin

3) säännöt
	ACCEPT
	  - hyväksy läpi muurista
	  - paketin käsittely loppuu tähän

	DROP
	  - paketti hylätään ilman vastausta
	  - paketin käsittely loppuu tähän

	LOG
	  - kirjataan lokiin
	  - käsittely jatkuu

	REJECT
	  - paketti hylätty ja lähettäjälle ilmoitetaan paketin hylkäyksestä
	  - paketin käsittely loppuu tähän

4) miten näitä ketjuja yleensä käytetään

FORWARD(DROP) -- oletetaan, että kone ei suorita NAT:ia
OUTPUT (ACCEPT) -- ulospäin lähtevä liikenne aina sallittu
INPUT (DROP) -- suurin osa säännöistä tulee tänne

5) mallikomento

iptables -I INPUT 1 -p tcp --dport ssh -j ACCEPT

Tässä malliskriptimme rivi riviltä selitettynä. Selitykset ovat kommenteissa aina komennon jälkeen.

iptables -P INPUT DROP
	# ensin määritellään INPUT ketjulle policyksi(-P) DROP sääntö. 
	# Tämä tarkoittaa sitä että jos paketti läpäisee kaikki alla määritellyt
	# säännöt, tiputetaan paketti lopussa pois Policyn toimesta.
	# Lisäksi Policyn määrittely heti skriptin alussa pitää huolen siitä,
	# että kone ei koskaan jää suojattomaan tilaan 
iptables -P FORWARD DROP
	# FORWARD ketjulle asetataan policynä DROP sääntö, eli kaikki paketit jotka vaativat 
	# uudelleenohjausta eteenpäin pudotetaan pois.
iptables --flush
	# Flush all rules, but keep policies 
iptables --delete-chain 
	# poistetaan kaikki (käyttäjän) määritellyt ketjut (ei poista oletusketjuja INPUT, OUTPUT, FORWARD)
## Workstation Minimal firewall ###
iptables -P FORWARD DROP	
	# asetetaan FORWARD ketjulle DROP sääntö policy-asetuksena
iptables -P INPUT DROP		
	# asetetaan INPUT ketjulle DROP sääntö policy-asetuksena
iptables -A INPUT -i lo --source 127.0.0.1 --destination 127.0.0.1 -j ACCEPT 
	# sallitaan localhost liikenne. Määritys on luettavampi kun annetaan sekä source että destination tiedot.
iptables -A INPUT -m state --state "ESTABLISHED,RELATED" -j ACCEPT  
	# sallitaan paluuliikkenne
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT 
	# sallitaan icmp-liikenne, tyyppiä destination unreachable
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT 
	# sallitaan icmp-liikenne, tyyppiä time exceeded
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT 
	# sallitaan icmp-liikenne, tyyppiä echo request
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT 
	# sallitaan icmp-liikenne, tyyppiä echo-reply
	# tarkempi selitys icmp tyypeistä löytyy täältä: http://www.networksorcery.com/enp/Protocol.htm
####### HOLES ####### Edit holes below, then run this script again
#iptables -A INPUT -p tcp --dport ssh -j ACCEPT
	# avataan portti 22(ssh) sisääntulevalle liikenteelle
#iptables -A INPUT -p tcp --dport http -j ACCEPT
	# avataan portti 80(http) sisääntulevalle liikenteelle 
#iptables -A INPUT -p tcp --dport https -j ACCEPT
	# avataan portti 443 (https) sisääntulevalle liikenteelle
##################### Edit above
iptables -A INPUT -j LOG -m limit --limit 40/minute
	# sisääntulevat paketit, jotka eivät ole tähän mennessä ylläoleviin
	# sääntöihin "osuneet", logataan, jos niitä tulee enemmän kuin 40kpl/minuutti
	# -m limit = ladataan moduli, jonka nimi on "limit" ==> mahdollistaa määrä/aika valvonnan
iptables -A INPUT -j DROP
	# dropataan jäljelle jääneet sisääntulevat paketit, joita ei ole käsitelty ylläolevien sääntöjen mukaisesti
# Save
iptables-save > /etc/sysconfig/iptables
	# talletetaan iptables-määritykset 
echo "$0: Done."

Tässä oli siis IPTABLES osuus harjoituksista - seuraavaksi listalla oli nmap.


nmap

nmap-ohjelman kotisivut löytyvät täältä: http://www.insecure.org/. Kyseessä on turvallisuus työkalu, jonka avulla voidaan tutkia onko kohdekoneissa mahdollisesti avoimia portteja sekä joissain tapauksissa tunnistaa kohdekoneen käyttöjärjestelmä.

aloitin ohjelmaan tutustumisen asentamalla sen harjoitustyöasemaani komennolla:

# yum install nmap

Seuraavaksi oli sitten vuorossa eri optioihin tutustuminen, jossa nopeiten pääsi alkuun lukemalla nmap-ohjelman manuaali sivun. Alla on listattuna tyypillisimmät optiot, jotka saa näkyville antamalla komennon nmap ilman parametreja:

[root@localhost ~]# nmap
Nmap 3.81 Usage: nmap [Scan Type(s)] [Options] 
Some Common Scan Types ('*' options require root privileges)
* -sS TCP SYN stealth port scan (default if privileged (root))
  -sT TCP connect() port scan (default for unprivileged users)
* -sU UDP port scan
  -sP ping scan (Find any reachable machines)
* -sF,-sX,-sN Stealth FIN, Xmas, or Null scan (experts only)
  -sV Version scan probes open ports determining service & app names/versions
  -sR RPC scan (use with other scan types)
Some Common Options (none are required, most can be combined):
* -O Use TCP/IP fingerprinting to guess remote operating system
  -p  ports to scan.  Example range: 1-1024,1080,6666,31337
  -F Only scans ports listed in nmap-services
  -v Verbose. Its use is recommended.  Use twice for greater effect.
  -P0 Don't ping hosts (needed to scan www.microsoft.com and others)
* -Ddecoy_host1,decoy2[,...] Hide scan using many decoys
  -6 scans via IPv6 rather than IPv4
  -T  General timing policy
  -n/-R Never do DNS resolution/Always resolve [default: sometimes resolve]
  -oN/-oX/-oG  Output normal/XML/grepable scan logs to 
  -iL  Get targets from file; Use '-' for stdin
* -S /-e  Specify source address or network interface
  --interactive Go into interactive mode (then press h for help)
Example: nmap -v -sS -O www.my.com 192.168.0.0/16 '192.88-90.*.*'
SEE THE MAN PAGE FOR MANY MORE OPTIONS, DESCRIPTIONS, AND EXAMPLES

Pikaohjeen lukemisen jälkeen suoritin komennon ifconfig, jonka tulosteesta tarkistin oman koneeni IP:n, joka oli 172.28.1.129. Ajatuksena oli varmuuden vuoksi skannata omaa konettani, jolloin ainakin teoriassa vältytään turhalta verkkoliikenteeltä asiattomiin paikkoihin... vaikka kyllähän tietysti mieleen tuli, että skannauksen ajaminen omaa kotiserveriä vasten olisi ollut mielenkiintoisempaa hommaa ;)

Seuraavaksi aloin suorittamaan skannauksia eri optioilla. Tuloksena oli tämän näköistä tavaraa...

## SCAN 1 - firewall(iptables) on päällä, eikä salli mitään läpi

[root@localhost ~]# nmap 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:08 EET
All 1663 scanned ports on 172.28.1.129 are: filtered

Nmap finished: 1 IP address (1 host up) scanned in 35.237 seconds

## SCAN 2 - firewall off

[root@localhost ~]# /etc/init.d/iptables stop
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
[root@localhost ~]# nmap 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:10 EET
Interesting ports on 172.28.1.129:
(The 1660 ports scanned but not shown below are in state: closed)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
111/tcp open  rpcbind

Nmap finished: 1 IP address (1 host up) scanned in 0.266 seconds

## SCAN 3 - firewall off, -P0 optiolla (ei tehdä ping:ä kohdekoneeseen)

[root@localhost ~]# nmap -P0 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:11 EET
Interesting ports on 172.28.1.129:
(The 1660 ports scanned but not shown below are in state: closed)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
111/tcp open  rpcbind

Nmap finished: 1 IP address (1 host up) scanned in 0.152 seconds

## SCAN 4 - firewall off, -O optiolla (OS fingerprint)

[root@localhost ~]# nmap -O 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:12 EET
Interesting ports on 172.28.1.129:
(The 1660 ports scanned but not shown below are in state: closed)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
111/tcp open  rpcbind
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7)
Uptime 0.005 days (since Mon Nov 28 19:04:57 2005)

Nmap finished: 1 IP address (1 host up) scanned in 2.174 seconds

## SCAN 5 - firewall off, banner grabbing

[root@localhost ~]# nmap -sV 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:14 EET
Interesting ports on 172.28.1.129:
(The 1660 ports scanned but not shown below are in state: closed)
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 4.0 (protocol 2.0)
80/tcp  open  http    Apache httpd 2.0.54 ((Fedora))
111/tcp open  rpcbind 2 (rpc #100000)

Nmap finished: 1 IP address (1 host up) scanned in 5.421 seconds
## SCAN 6 - firewall off, kaikki portit 30000 asti

[root@localhost ~]# nmap -p1-30000 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:16 EET
Interesting ports on 172.28.1.129:
(The 29997 ports scanned but not shown below are in state: closed)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
111/tcp open  rpcbind

Nmap finished: 1 IP address (1 host up) scanned in 2.482 seconds

## SCAN 7 - firewall off, kaikki optiot yhtäaikaa

[root@localhost ~]# nmap -P0 -O -sV -p1-30000 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:17 EET
Interesting ports on 172.28.1.129:
(The 29997 ports scanned but not shown below are in state: closed)
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 4.0 (protocol 2.0)
80/tcp  open  http    Apache httpd 2.0.54 ((Fedora))
111/tcp open  rpcbind 2 (rpc #100000)
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7), Linux 2.6.3 - 2.6.8
Uptime 0.009 days (since Mon Nov 28 19:04:57 2005)

Nmap finished: 1 IP address (1 host up) scanned in 9.410 seconds

## SCAN 8 - firewall off, muita mielenkiintoisia optioita (-sX = xmas scan)

[root@localhost ~]# nmap -P0 -O -sV -p1-30000 -sX 172.28.1.129

Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:18 EET
Interesting ports on 172.28.1.129:
(The 29997 ports scanned but not shown below are in state: closed)
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 4.0 (protocol 2.0)
80/tcp  open  http    Apache httpd 2.0.54 ((Fedora))
111/tcp open  rpcbind 2 (rpc #100000)
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7), Linux 2.6.3 - 2.6.8
Uptime 0.010 days (since Mon Nov 28 19:04:56 2005)

Nmap finished: 1 IP address (1 host up) scanned in 10.599 seconds

Eri parametrien hyödyntäminen skannauksessa tuotti erilaisia tuloksia sekä vaikutti selkeästi skannauksien kestoon. Kannattaa siis tehdä tarkkoja yksittäisiä skannauksia jos haluaa suoriutua skannauksesta nopeasti - jos taas ajalla ei ole väliä, voi optioita latoa melkoisen määrän suoraan yhteenkin komentoon....


John the Ripper

Seuraavaksi tehtävälistalla oli tutustuminen johonkin toiseen tietoturvatyökaluun. Itse päätin demonstroida oivaa heikkojen salasanojen tutkimisohjelmaa nimeltään "John the Ripper". Kyseisellä ohjelmalla voi testata UNIX/Linux ympäristöissä minkätasoisia salasanoja käyttäjät käyttävät. Ohjelman valitsin siksi, että mielestäni heikot salasanat ovat melkoinen uhka hyvääkin tietoturvaa toteuttavassa ympäristössä ja siksi administraattoreiden olisi syytä pitää yllä jonkinlaisia laatustandardeja salasanojen käytössä.

Aloitin testaamisen asentamalla kyseisen ohjelman koneelleni:

[root@localhost ~]# yum install john.i386

Seuraavaksi suoritin pikaisen muistinvirkistyksen ohjelman käytöstä lukaisemalla ohjelman pikahelpin:

[root@localhost ~]# john

John the Ripper  Version 1.6  Copyright (c) 1996-98 by Solar Designer

Usage: john [OPTIONS] [PASSWORD-FILES]
-single                   "single crack" mode
-wordfile:FILE -stdin     wordlist mode, read words from FILE or stdin
-rules                    enable rules for wordlist mode
-incremental[:MODE]       incremental mode [using section MODE]
-external:MODE            external mode or word filter
-stdout[:LENGTH]          no cracking, just write words to stdout
-restore[:FILE]           restore an interrupted session [from FILE]
-session:FILE             set session file name to FILE
-status[:FILE]            print status of a session [from FILE]
-makechars:FILE           make a charset, FILE will be overwritten
-show                     show cracked passwords
-test                     perform a benchmark
-users:[-]LOGIN|UID[,..]  load this (these) user(s) only
-groups:[-]GID[,..]       load users of this (these) group(s) only
-shells:[-]SHELL[,..]     load users with this (these) shell(s) only
-salts:[-]COUNT           load salts with at least COUNT passwords only
-format:NAME              force ciphertext format NAME (DES/BSDI/MD5/BF/AFS/LM)
-savemem:LEVEL            enable memory saving, at LEVEL 1..3

Tämän jälkeen ohjelman testaaminen hoitui yksinkertaisesti suorittamalla komento:

[root@localhost ~]# john -single /etc/shadow
Loaded 3 passwords with 3 different salts (FreeBSD MD5 [32/32])
vilppi           (vilppi)
guesses: 1  time: 0:00:00:01 100%  c/s: 5219  trying: 999991969

Eli komennon tuloksena oli yhden käyttäjän salasanan selvittäminen, joka hoitui melkoisen nopeasti. Kyseinen tunnus oli SSH-harjoituksen aikana luomani käyttäjätunnus, jonka salasanan laatu tuli todistettua melkoisen huonoksi - tarkistusohjelmahan teki vain yhden arvauksen...

Vitosharjoitus oli näin kokonaisuudessaan suoritettu onnistuneesti ;)


Jälkikommentteja

Harjoituksen aiheet olivat tällä kertaa hyvinkin tuttuja, joten varsinaista uutta asiaa ei hirveästi tullut, mutta näiden asioiden läpikäyminen on aina yhtä hauskaa ja hyödyllistä...


To-Do

iptablesin ominaisuuksiin pitäisi perehtyä vielä hiukan lisää, jotta käyttövarmuutta tulisi lisää. Linuxin palomuuria kun ei kuitenkaan tule säädettyä kovinkaan usein, niin nämä asiat pitää aina kerrata jostain ennenkuin asetuksia uskaltaa lähtee muuttelemaan.