# Linux Systeembeheer/De gereedschapskist van een systeembeheerder
## Leerdoelen

* Basiscommando's voor Linux systeembeheer kennen en kunnen gebruiken:
** info over het systeem opvragen: lsof, lspci, lsusb
** superuser: su [-] en sudo
** procesbeheer: ps, top, kill, killall
** probleemoplossen in een netwerk:
*** bereikbaarheid van een systeem testen: ping, traceroute, mtr,
*** bereikbaarheid van applicaties testen: nmap port scanner:
**** de scantypes -sP, -sL, -sS, -sT, -sU, -O begrijpen en kunnen toepassen
**** specifieke hosts en poorten scannen
*** packet sniffer wireshark:
**** promiscuous mode begrijpen,
**** individuele pakketten kunnen identificeren en analyseren, de structuur van een pakket begrijpen,
**** TCP streams kunnen identificeren, opvangen en bekijken,
*** andere netwerktools: arp, dig, ifconfig, netstat, route, service (specifiek voor de RedHat-familie), ssh, telnet, whois

## Systeeminformatie opzoeken
### lsof

lsof , letterlijk list open files, is een commando dat een lijst weergeeft van geopende bestanden en door processen deze gebruikt worden. We verstaan onder geopende bestanden o.a. bestanden die op een opslagmedium zijn opgeslagen, netwerksockets en ook aangesloten randapparatuur. Als er een bestand in gebruik is kan men dit bestand niet wijzigen, of kan men een disk niet kan unmounten. Met lsof kan men dan gaan kijken waar het gebruikt wordt.
lsof /var toont de lijst van geopende bestanden in de map /var
Nuttige flags zijn:
* -i Toon sockets.
* -n Maak geen gebruik van dns.
* -P Toon poortnummers.
Met het volgende commando kunnen we zien dat bijvoorbeeld sendmail luistert naar de tcp-poort 25.

### lspci

lspci is een unix-commando dat informatie weergeeft van al de PCI-bussen en apparaten van het systeem. Het is gebaseerd op een gemeenschappelijke draagbare bibliotheek libpci die de toegang tot de PCI-configuratie ruimte biedt op verschillende besturingssystemen.
Als je het uitvoert krijg je een soortgelijke uitvoer:
Met de optie -n krijg je in plaats van de namen van apparaten een identificatiecode, bijvoorbeeld:
Op positie 01:00.0 vinden we een apparaat met code 10de:0407. De 10de staat voor de fabrikant (in dit geval nVidia), de 0407 voor het type apparaat (GeForce 8600M GT grafische kaart). Deze code is in sommige gevallen nuttig om drivers op te zoeken voor hardware die niet standaard ondersteund wordt door de Linuxdistributie.

### lsusb

Het commando lsusb is analoog aan het lspci commando. Het geeft informatie weer van de usb apparaten die met het apparaat verbonden zijn.

### hwinfo

hwinfo geeft informatie weer over al de geïnstalleerde hardware op het systeem. lshw geeft een verkorte lijst van hwinfo weer.

## SubstituteUser & Sudo

Veel beheerscommando's kunnen niet uitgevoerd worden wanneer u niet als root bent ingelogd. Om die reden is het soms makkelijk om als een andere gebruiker in te loggen. Dat kan met het commando su (wat staat voor Substitute User).
su [USER]: Het path wijzigt niet, omgevingsvariabelen blijven bewaard en je blijft in je eigen shell. Je kan optioneel een gebruikersnaam meegeven om in te loggen als die gebruiker. Zonder opties word je root. Eigenlijk log je niet echt in, maar wordt enkel je UID veranderd.
su - [USER]: dit is equivalent met daadwerkelijk inloggen als root (su - root). Hierbij worden wel de omgevingsvariabelen aangenomen van de andere gebruiker (in dit geval root).
Sudo kan een gebruiker toestaan om een commando als de superuser of een andere gebruiker uit te voeren. Standaard vereist sudo dat gebruikers zichzelf authenticeren met hun eigen wachtwoord. Zodra een gebruiker is geverifieerd, kan de gebruiker sudo gebruiken zonder een wachtwoord voor een korte periode van tijd (5 minuten, tenzij overschreven in bestand sudoers).
Instellen van het Sudo commando is enkel mogelijk als root. Door gebruik van het commando visudo kan aan een bepaalde gebruiker commando's toegewezen worden die anders enkel maar door de root uitvoerbaar zijn. De lijst van sudo gebruikers kan teruggevonden worden in /etc/sudoers. /etc/sudoers.tmp is de lockfile die toelaat om het visudo commando te gebruiken. Van zelfsprekend bezit enkel root deze rechten.
visudo bestaat uit 3 kolommen. De eerste kolom kan een gebruiker zijn of een groep. De tweede kolom omvat 2 delen. De eerste variabele verwijst naar de toelatingen van de host. Dit is bijna altijd de localhost en het is veilig om ALL te gebruiken. De tweede variabele verwijst tussen de haakjes verwijst naar de uitvoerder van het commando. Men kan een sudo commando dus specifiek toewijzen. De derde kolom zijn de commando's die een bepaalde gebruiker of groep mag uitvoeren. Met NOPASSWD laat je toe de sudo gebruiker zijn commando uit te voeren zonder telkens zijn paswoord in te voeren.

## Procesbeheer
### ps (process status)

ps is een commando om informatie over actieve processen te tonen.
enkele opties voor het ps commando:
* -A: toon informatie over alle actieve processen. doet hetzelfde als optie -e (every)
* -a: toon informatie over alle actieve processen, behalve group leaders en processen zonder terminal
* -u UIDlijst: toon enkel processen geassocieerd met volgende UIDs.
* u: toon gedetailleerde informatie over het proces
* -p PIDlijst: toon enkel processen met volgende PIDs.
* x: toon processen zonder een terminal, bijvoorbeeld daemons
pstree is een gelijkwaardig programma op Unix systemen. Het toont de actieve processen in een boomdiagram om zodoende de relaties en hiërarchie tussen deze weer te geven.

### top

Top geeft een real-time overzicht van al de actieve processen

### kill

Het commando om een process te eindigen.
Stop allemogelijke processen.
Stopt het process met id nummer 450. (dit nummer wordt gevonden met top of ps)

### killall

Het commando killall stopt alle processen op commandonaam. Als er meer dan een proces het meegegeven commando gebruikt, dan worden ze allemaal afgesloten.
Flags:
* -g Sluit de procesgroep waarvan het proces deel uit maakt
* -v Toont na afsluiten van proces of het gelukt is en het proces ID.

## Troubleshooting in een netwerk
### Ping

Ping wordt gebruikt om te kijken of een computer bereikbaar is. Het stuurt een ICMP echo-request en krijgt dan een ICMP echo-response terug. Met ping kan je zowel de hostname als een IP-adres 'pingen'. Meest gebruikte parameters zijn -c om het aantal ping-pakketten aan te geven dat er mag gestuurd worden en -s die de grootte van de ping-pakketten specifieert.

### Traceroute

Traceroute geeft de route van de gebruikte host naar de meegegeven host weer. Het maakt gebruik van de TTL waarde (time to live) in de header van een IP-pakket. Routers onderweg verlagen het TTL-veld van passerende met 1 en de router die het op 0 zet, stuurt een ICMP-foutbericht (TTL exceeded). Traceroute start met de waarde 1 en verhoogt telkens met 1 tot het aan het bestemmingsadres bereikt is. Zo krijg je een voor een antwoorden terug met daarin het IP-adres van de volgende hop. Typisch wordt voor elke TTL-waarde 3 pakketten gestuurd.
Net als bij ping kan je zowel een hostname als een ip-adres gebruiken bij traceroute:
Traceroute gebruikt normaal UDP of ICMP-berichten. Veel systeembeheerders blokkeren ICMP op hun routers uit veiligheidsoverwegingen. Daarom gebruikt men tegenwoordig ook vaak TCP connect-berichten op poort 80; dat lijkt op een webbrowser die een connectie wil openen met een webserver. Dit soort berichten raakt vaker door firewalls. Sommige versies van traceroute laten je toe om voor tcp-berichten te kiezen, of je kan ook alternatieven gebruiken, zoals tcptraceroute of tracepath. Die laatste heeft trouwens als voordeel dat je geen root moet zijn om het uit te voeren.

### Mtr

Mtr combineert de functionaliteit van de traceroute en ping-programma's in een enkel diagnostisch command.
Wanneer mtr wordt uitgevoerd, onderzoekt het de netwerkverbinding tussen de host waar mtr op draait en de doelhost door het zenden van pakketten met lage TTL waarde. Het blijft pakketjes verzenden met een lage TTL, lettend op de reactietijd van de tussenliggende routers. Hierdoor kan mtr de responstijden en antwoordpercentages van alle hops op de route weergeven.
Voorbeeld output van mtr www.google.com:

## Nmap

Nmap (“Network Mapper”) is een open source tool om een netwerk te verkennen en de beveiliging van het netwerk te monitoren. Nmap gebruikt ip-pakketten om het aantal hosts te bepalen op het netwerk alsook om de services te zien die deze hosts aanbieden , op welk operating system ze draaien, welk type firewalls en filters in gebruik zijn etc. Nmap wordt over het algemeen gebruikt door netwerkbeheerders om hun eigen netwerk te kunnen monitoren en om een eventueel beveiligingslek te vinden en dichten. Er bestaan ook enkele grafische interfaces voor nmap , zoals Zenmap. Voor de meeste opties heb je root-rechten nodig.
Gebruik

### Host Discovery

Wanneer er geen opties meegegeven zijn dan stuurt Nmap een ICMP echo request, een TCP SYN pakket naar poort 443, een TCP ACK pakket naar poort 80 en een ICMP timestamp request.

### Port Specification and Scan Order

Men kan ook wildcards gebruiken, bijvoorbeeld:

### Timing and Performance

Manueel instellen hoe aggressief of snel Nmap de hosts moet scannen (-T4< of -T aggressive is normaal op een breedbandverbinding)

### Voorbeelden

Scant al de gereserveerde TCP poorten op de machine scanme.nmap.org en geeft uitgebreide informatie.
Lanceert een SYN en OS scan naar elke machine die online is in het netwerk waar scanme.nmap.org zich bevindt.
Nmap scant 4096 IP's op zoek naar webservers zonder deze te pingen en bewaart de output in grepable en XML formaten.

## Andere netwerktools
### Ifconfig

De opdracht ifconfig wordt gebruikt om een netwerkinterface te configureren. Men kan o.a. het ip-adres, het subnetmask wijzigen of bijvoorbeeld een netwerkinterface in- of uitschakelen.
De opdracht
ifconfig eth0 address=192.168.1.2 mask=255.255.255.0 stelt de interface eth0 in met ipadres 192.168.1.2 en subnetmasker 255.255.255.0. Als er geen argumenten met ifconfig worden meegegeven, dan wordt getoond wat de huidige instellingen zijn.
Voorbeeldoutput:

### Netstat

Netstat wordt gebruikt om de status van alle netwerkverbindingen te bekijken. Het gaat dan om openstaande verbindingen (handig om te detecteren of iemand op uw systeem aan het werk is), de routing-tabel en netwerkinterfaces. Het verwarrende aan netstat is dat het niet alleen informatie weergeeft over openstaande verbindingen, maar ook over sockets die in gebruik zijn. Het commando netstat zonder argumenten laat dus heel veel informatie zien over interne processen die actief zijn.
Enkele handige flags:
* -t: Weergave van welke (TCP-)verbindingen er naar uw computer open staan
* -l: Toon enkel de serverpoorten ("luisterende" poorten)
* -n: Geef enkel IP-adressen weer, probeer niet om te zetten naar hostnamen (zo vermijd je DNS-requests die lang kunnen duren)
* -u: Welke UDP-verbindingen open staan
* -r: Lees de kernel routing tables uit.
* -s: Display beknopte statistieken voor elk protocol.
* --interface=iface , -i: Toon een tabel met alle netwerk interfaces, of de opgegeven iface.
Een voorbeeld:

### Route

Route manipuleert of toont de kernel IP-routing tabellen. Het primaire gebruik is het aanmaken van statische routes naar specifieke hosts of netwerken via een interface nadat deze is geconfigureerd met het ifconfig programma.
Wanneer de 'add' of 'del' opties worden gebruikt, wijzigt route de routing tabellen. Zonder deze opties, geeft route de huidige inhoud van de routing tabellen. In dat geval is de optie -n nuttig, die probeert niet om hostnamen op te zoeken via DNS-requests.
Toegang tot individuele computer host gespecificeerd via netwerkkaart eth1:
Stel de default gateway in voor toegang tot remote network via interface card eth0:

### SSH

SSH ("secure shell") is een protocol dat vanop afstand op een veilige manier inloggen op een linux systeem mogelijk maakt. Het is de opvolger van telnet en onderscheidt zich door het gebruik van encryptie. De standaardpoort voor SSH is 22.
Gebruik Standaard probeert de openSSH client in te loggen op het doel ip-adres met de gebruikersnaam van de gebruiker die ssh uitvoert, je kan een gebruikersnaam specifiëren met de -l vlag.
Clients Op alle Unix systemen (Linux, OSX, BSD, Solaris, ...) is er een standaard een SSH client aanwezig. Er bestaat ook een open source SSH client voor Windows die geen installatie vereist: PuTTY
De server daemon Het ssh daemon proces heet sshd. Deze start bij RedHat-systemen standaard op en heeft een uitzondering in de firewall. De configuratie is te vinden in /etc/ssh/sshd_config, waar je bijvoorbeeld de volgende beveiligingsmaatregel kan nemen om rechtstreekse logins met de root gebruikersnaam te verhinderen:
Handig om weten
bestanden kopiëren via ssh:
inloggen zonder wachtwoord
– stap 1: publiek/privaat sleutelpaar aanmaken ssh-keygen – stap 2: publieke sleutel kopiëren naar server ssh-copy-id

### Telnet

Telnet is een netwerkprotocol dat het mogelijk maakt op afstand in te loggen op een machine en die via een opdrachtregel te besturen. Als gebruiker ziet dit er hetzelfde uit als SSH. Tekstregels die de gebruiker intikt, evenals het antwoord van de server, worden via een eenvoudige TCP-verbinding doorgestuurd, zonder versleuteling. Telnet wordt daarom als een belangrijk beveiligingsrisico gezien, omdat wie dit netwerkverkeer kan onderscheppen gevoelige data, o.a. wachtwoorden kan lezen. Een systeembeheerder zal telnet dus ook ten allen tijde vermijden.

### Whois

Zoek in een whois-database naar een domeinnaam, IP-adres of netwerkkaart naam. De geretourneerde informatie varieert, maar bestaat meestal uit administratieve en technische contacten, zodat u een persoon die problemen op dat domein kan behandelen kan vinden. Standaard retourneert het commando informatie over .Com, .Net, en .Edu-domeinen, maar andere hosts voor andere domeinen kunnen ook worden opgevraagd met behulp van de host of -h optie.
Voorbeeld: