# Linux

# 1.1 Introductie

#### Wat gaan we leren?

- Een web server opzetten op Linux (Unix).
- Installeren van Linux.
- Installeren van software op Linux.
- Directories, users en rechten op Linux.
- Beveiligen van Linux; iptables, firewall
- Installeren en configurenen Apache
- Installeren van MariaDB en DB opzetten
- Eenvoudige web site opzetten: vhosts.

#### Opdracht

1. Wat is een Operating Systeem?
2. Zoek uit wat het verschil is tussen Unix en Linux. Leg het uit.
3. Noem drie Linux distributies.
4. Hoe oud zijn elk van de genoemde Linux distributions (schrijf jaar op)?
5. Noem van elk van de genoemde Linux distributions een voordeel op.
6. Je kunt drie soorten Operating Systems ondersheiden: Unix, Linux en Windows. Schrijf van elk van deze Operating Systems een voordeel en één nadeel op.
7. Waarom zou je als Web Developer wat van Linux moeten weten?
8. Wat kun je verdienen als Linux beheerder (zoek naar een vacature)?
9. Wat wil jij leren in de Linux lessen?

*Download template met vragen, vul die in en upload dit in Teams*

# 1.2 Ubuntu (onder VMWare)

### Installatie Ubuntu Server

Let op dit proces duurt erg lang. Tijdens de installatie worden alle security updates gedownload en geïnstalleerd. Tijdens dit proces kun je de installatie gewoon laten door draaien en andere dingen doen.

Onder VMWare Workstation player 15 installeren we Ubuntu Server 18.x.x

- Download en installeer VMWare Workstation 15  
    ( [https://www.vmware.com/nl/products/workstation-player/workstation-player-evaluation.html](https://www.vmware.com/nl/products/workstation-player/workstation-player-evaluation.html) )
- Download Ubuntu Server 18.x.x dit is een iso file van ongeveer 900 MB
- Start VMWare Workstation 15 - Create New Virtual Machine
- Selecteer de iso file en start ed installatie.
- Installeer open SHH server, maar importeer geen identiteit verder kun je overal de default waarden nemen tijdens de installatie.
- **Password**
    
    <span style="background-color: #ffff00;">Let op dat jouw username en password goed moet onthouden!  
      
    </span>
- Download MobaXterm (als je het verschil niet weet tussen de portable version en de installer dan kies je installer)
- **IP Nummer**
    
    Start jouw Ubuntu Server binnen VMWare, log aan en type `ifconfig` kijk welk ip nummer jouw server heeft. Onthoud dit nummer.
- Start MobaXterm en create een nieuwe sessie, kies SSH en vul je ip nummer van jouw Ubuntu Server in
- Log aan met jouw username en password.

### Installatie MobaXTerm

- download [MobaXterm](https://mobaxterm.mobatek.net) the Home Edition, die is 'Free'.
- installeer MobaXterm

Start MobaXTerm op.

- Start je Ubuntu Server binnen VMWare op.
- Klik op Session, SSH en vul daar het ip nummer van je Ubuntu server in en druk op OK. Als he goed is, maak je nu een verbinding met jouw Ubuntu Linux Server.

### Aanmaken gebruiker op Ubuntu WS

**(dit hoeft alleen als je tijdens de installatie geen gebruiker hebt aangemaakt)**

Maak een gebruiker aan op je Ubuntu Server.

Je wilt niet onder *root* aanloggen, omdat dat onveilig is. Je wilt dus een 'gewone user' aanmaken.

Op he Ubuntu server waar je nu nog onder root bent aangelogd type je:

```terminal
adduser username
```

Vervang username door jouw username. Let op in een Linux username zijn geen spaties en degelijke toegestaan.

Om ervoor te zorgen dat je administratieve rechten (root) hebt voer je het volgende commando uit:

```terminal
usermod -aG sudo username
```

Vervang ook hier de username door jouw gekozen naam.

Log nu uit. met exit en probeer via MobaXterm opnieuw aan te loggen onder jouw nieuw user account.

### Probleem met connecten

##### Stap 1

Als je met MobaXterm gen verbinding kunt maken, maar je kunt met een Windows cmd-box wel pingen naar het IP nummer van je Ubuntu sever dan kun je met het volgende commando dit waarschijnlijk oplossen. Dit moet je uitvoeren op je Ubuntu WS binnen VM Ware.

`sudo apt-get install openssh-server```

Dit installeert open SSH server.

##### Stap 2

Kun je vanuit de windows command box het IP nummer van je Ubuntu Server pingen? Open hiervoor een cmd box en type het commando` ping 0.0.0.0` in. Vervang hierbij 0.0.0.0 met het ip nummer van jouw Ubuntu Server.

Als dit niet lukt dan helpt het soms om je Windows machine te re-booten (herstarten).

### Mac

Werk je op een Mac dan heb je een paar extra uitdagingen.

VMWare werkt niet op een Mac, kies in plaats daarvan VirtualBox (6.x) van Oracle.

MobaXterm werkt ook niet op een Mac, maar de terminal applicatie op een Mac voldoet ook. Er zijn enkele verschillen en die hebben vooral te maken met het opzetten van SSH keys. Dit heeft te maken met security en komt pas later in deze lessenserie aan de orde.

Na de installatie van Ubuntu binnen VirtualBox niet vergeten de VM uit te zetten en opnieuw op te starten.

### Clean disk space

https://itsfoss.com/free-up-space-ubuntu-linux/

```shell
# This option removes libs and packages that were installed automatically to satisfy the dependencies of an installed package.
sudo apt-get autoremove

# APT package management system keeps a cache of DEB packages in /var/cache/apt/archives.
sudo du -sh /var/cache/apt
sudo apt-get autoclean
sudo du -sh /var/cache/apt

# or clean cache completely: sudo apt-get clean

# Clean log files older than 30 days 
journalctl --disk-usage
sudo journalctl --vacuum-time=30d
journalctl --disk-usage

# clean up snap packages (2 versions are kept and these packages tend to be large).
du -h /var/lib/snapd/snaps
set -eu
snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done
 du -h /var/lib/snapd/snaps   
```

### Update Ubuntu System  


```
sudo apt-get update
sudo apt-get upgrade
sudo reboot
```

\--

# 2.1 CLI and text file handling

#### Command Line Interface

*In deze les gaan we voor het eerst kennis maken met de command line. We bespreken wat commando's en gaan daarmee oefenen. Het doel van deze les is een kennismaking met de command line.*

<span style="background-color: #ccffff;">CLI </span>is de command line interface van LInux.  
Linux bestaat eigenlijk uit de CLI en optioneel zit daarbij een grafische gebruikers interface (<span style="background-color: #ccffff;">GUI</span>). Linux Servers die in datacenters staan zijn vaak <span style="background-color: #ccffff;">headless</span>. Dat betekent dat er geen monitor en toetsenbord is aangesloten op de server. Vaak bestaat één fysieke server ook meerdere virtuele servers. ALs je zelf zo'n server wilt dan moet je zoeken naar VPS, dat staat voor <span style="background-color: #ccffff;">Virtual Personal Server</span>. Een VPS met Linux is erg goedkoop omdat het OS gratis is. Ook is de performance vaak zeer redelijk tot goed. Deze website draait ook op een VPS van een paar euro per maand en samen met deze website draaien er nog een paar websites op dezelfde Virtual Server. Er draaien meerdere virtuele (web) hosts op één virtuele server. Wat een virtual web host is leren we over een paar lessen.

#### Headless

In data centers staan dus veel headless Linux servers.

![](https://www.roc.ovh/uploads/images/gallery/2020-02/scaled-1680-/image-1581438435007.png)

Op zich kan er wel een GUI worden toegevoegd, maar dit wordt vaak als omslachtig en traag gezien. Bovendien hebben echte 'hackers' een voorkeur voor een CLI. Je zult leren dat de CLI van Linux erg rijk is en dat je hele gave dingen met een paar commando's kan uitvoeren. Binnen Linux kun je ook vrij eenvoudig zaken automatiseren. Een goede Linux systeembeheerder automatiseert dus als zijn taken en hoeft daarna alleen nog maar updates uit te voeren en te monitoren dat alles goed gaat.

#### Linux en tekst bestanden (text files)

Linux heeft veel configuratie in plain text files staan. Daarom zijn er veel commando's die iets met files doen.

In de Linux lessen gaan we af en toe een paar handige Linux CLI commando's behandelen.

Om te beginnen gaan we samen in de les naar de volgende commando's kijken. In deze les een paar handige commando's die te maken hebben met files.

##### Belangrijke commando's voor file handling

<table border="1" id="bkmrk-commando-wat-doet-he" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 12.0987%; background-color: #f0f0f0;">commando</td><td style="width: 43.0864%; background-color: #f0f0f0;">wat doet het?</td><td style="width: 44.8148%; background-color: #f0f0f0;">voorbeeld</td></tr><tr><td style="width: 12.0987%;">man</td><td style="width: 43.0864%;">laat een help pagina van een commando zien</td><td style="width: 44.8148%;">man cat</td></tr><tr><td style="width: 12.0987%;">cat</td><td style="width: 43.0864%;">laat de inhoud van één of meerdere files zien</td><td style="width: 44.8148%;">cat /var/og/syslog</td></tr><tr><td style="width: 12.0987%;">grep</td><td style="width: 43.0864%;">zoekt in een file naar een woord</td><td style="width: 44.8148%;">grep error /var/log/syslog</td></tr><tr><td style="width: 12.0987%;">head</td><td style="width: 43.0864%;">laat de eerste regels van een file zien</td><td style="width: 44.8148%;">head /var/log/syslog

</td></tr><tr><td style="width: 12.0987%;">tail</td><td style="width: 43.0864%;">laat de laatste regels van een file zien</td><td style="width: 44.8148%;">tail /var/log/syslog

</td></tr><tr><td style="width: 12.0987%;">touch</td><td style="width: 43.0864%;">maak een legel file</td><td style="width: 44.8148%;">touch test

</td></tr><tr><td style="width: 12.0987%;">echo</td><td style="width: 43.0864%;">print iets</td><td style="width: 44.8148%;">echo "Hallo"

</td></tr><tr><td style="width: 12.0987%;">cp</td><td style="width: 43.0864%;">CoPy - kopieer een file</td><td style="width: 44.8148%;">cp file01 file02

</td></tr><tr><td style="width: 12.0987%;">mv</td><td style="width: 43.0864%;">MoVe - verplaats/hernoem een file</td><td style="width: 44.8148%;">mv file01 file02

</td></tr><tr><td style="width: 12.0987%;">rm</td><td style="width: 43.0864%;">ReMove - verwijder een file</td><td style="width: 44.8148%;">rm file01

</td></tr></tbody></table>

<p class="callout info">Belangrijk: Linux is case senstive!</p>

#### Redirect output

Linux heeft een paar handige concepten. Zo kan je de output die naar het scherm gaat omleiden naar een file. Dat heet <span style="background-color: #ccffff;">*redirect output*.</span>

Neem bijvoorbeeld het commando `head /var/log/syslog` Dat laat de eerst paar regels van de Linux log zien. Je kunt deze output naar een file wegschrijven. Bijvoorbeeld `head /var/log/syslog > mijnTestFile`

Het <span style="background-color: #ccffff;">&gt;</span> teken schrijft dus de output van een commando naar een file. Het <span style="background-color: #ccffff;">&gt;&gt;</span> teken voegt de output van een commando toe aan de file.

Voer de volgende commando's uit en probeer te begrijpen wat er gebeurt en waarom.

```
echo 0123456789 > file01
cat file01 file01 > file02
cat file02
cp file02 file01
cat file01 >> file02
ll
cat file02
```

Haal alle files weg: `rm file01 file02`

#### Commando's aan elkaar rijgen

In Unix/Linux kun je commando's aan elkaar rijgen, dat kan super handig zijn en we komen daar nog in detail op terug, maar kijk eens naar het volgende voorbeeld:

```shell
cat /etc/passwd | cut -d ":" -f1 | sort
```

Wat hier staat is het volgende. Laat de inhoud van de file /etc/passwd zien en gebruik de output als input foor het commando cut. Het commando cut haalt de eerste kolom uit de input en deze output wordt weer gebruikt voor de input van het sort commando. Deze sorteert de output en stuurt de output naar het scherm

Je kunt natuurlijk de output ook naar een file sturen zoals we in het vorige hoofdstuk hebben geleerd.

```
cat /etc/passwd | cut -d ":" -f1 | sort > user_names.txt
```

Het commando is nu uitgebreid met &gt; user\_names.txt en dat zorgt ervoor dat de output niet naar het scherm gaat, maar naar een file.

#### Opdrachten

Zorg ervoor dat je VM met Ubuntu Server draait en log aan onder jouw eigen gemaakte user met MobaXterm.

1. Ubuntu WS heeft een soort notepad/kladblok.  
    Met de editor nano kan je iets in de file zetten of veranderen. Open een nieuwe file met `nano file01.txt`  
    Zet jouw naam in de file en bewaar (save) de file.  
      
    Zoek uit de lijst hierboven met welk commando je de inhoud van de file kunt afdrukken, probeer of het werkt en zet het commando op je antwoordenblad.
2. Voer de onderstaande stappen uit en schrijf op wat de uitkomst van stap 4 is. Je ziet drie getallen, beschrijf wat deze getallen betekenen. 
    1. Maak met het touch commando een file aan en noem die *file.txt*
    2. Gebruik het echo commando om *Hello world this is nice!* in de file.txt te plaatsen
    3. Gebruik de geleerde kennis om de tekst *Hello world this is nice!* vier keer onder elkaar in de file.txt te krijgen.
    4. Voer het commando `wc file.txt` uit. Wat zie je en wat betekent dat? Als je niet zeker bent, controleer dan met `man wc` hoe wc precies werkt.
3. Zoek op hoe je met het commando tail de laatst 20 regels moet afdrukken. Druk de laatste 20 regels van /var/log/syslog af en plaatst die in een file laatst20.txt.   
    Voer het commando `cat laatste20.txt laatste20.txt laatste20.txt > laatste.txt` uit.  
    Hoeveel regels staat er in laatste.txt? Schrijf op hoe je dit hebt gedaan en schrijf je antwoord op.
4. Als ubuntu is opgestart dan wordt er een regel in de /var/log/syslog gelplaatst, bijvoorbeeld;  
    `Jan 12 21:27:40 ubuntu_vm systemd[1121]: Startup finished in 102ms.`  
    Gebruik grep en zoek uit hoe lang jouw Ubuntu er de laatste keer over deed om te starten. Schrijf het commando dat je hebt gebruikt op.
5. Laat alleen alle regels uit de syslog file zien van vandaag. Schrijf het commando dat je hebt gebruikt op.
6. Begin met een file01 en zet daar text in. Het commando `cat file01 > file01` doet iets vreemds; de file01 is leeg, leg uit waarom.
7. Met het commando `sudo apt-get install sl` installeren we een programmaatje. Omdat we iets selecteren moeten we 'elevated rights' krijgen. Dat is een mooie manier om te zeggen dat we root toegang moeten hebben. Sudo staat voor "Super User DO". In een vervolg les gaan we hier nog verder op in. Installeer het programmaatje en start het op.  
      
    Vraag: *Kan je de stoomlocomotief ook laten vliegen? Ja, hoe dan - en hoe ben je hier achter gekomen?  
      
    Met `sudo apt-get remove sl` kunnen we het programmaatje weer verwijderen.
8. Kijk naar het volgende commando en test het uit.  
      
    `cat /var/log/syslog | wc | awk '{print $1}'`  
      
    Het commando is aan elkaar geregen, je kunt er stapjes afhalen om te kijken wat de vorige stapjes deden.   
    Omschrijf kort op je antwoordenblad wat commando laat zien.
9. Met `ifconfig` konden we ons ipnummer vinden weet je nog? Probeer maar.  
      
    Alle ipnummers in onze VM's beginnen met 192. Met `grep 192` kun je dus de juiste regel vinden.  
    Rijg de twee commando's aan elkaar, zodat je in één keer de regel met het juiste ipnummer vind.  
    Schrijf het commando op dat je hebt gebruikt.
10. Het volgende commando kan ook korter.  
      
    `cat /var/log/syslog | tail`  
      
    Hoe doe je hetzelfde, maar dan met minder commando's? Schrijf he verkorte antwoord op.
11. Maak een file met het commando `echo test > test.txt`  
      
    Je wilt de file kopiëren en je typt in:  
    mv test.txt test-bak.txt  
      
    Helaas is dat niet goed gegaan want je wilde de file kopiëren en je hebt een verkeerd commando gebruikt. Kijk met `ls -la` welk(e) files je nu hebt.  
      
    Met welk commando corrigeer je dit en zorg je ervoor dat je alsnog een kopie hebt?
12. Maak drie files, *file01.txt,* *file02.txt* en *file03.txt* en zet in alle drie de files de volgende regel tekst: "Dit is een test bestand!". Voer het commando `cat file01.txt file02.txt >> file03.txt` uit.  
      
    (1) Hoeveel keer staat de test-regel nu in het bestand file03.txt ?  
      
    Voer nu het commando `cat file01.txt file02.txt > file03.txt` uit.  
      
    (2) Hoeveel keer staat nu de test-regel in het bestand file03.txt ?  
      
    Leg uit waarom het tweede geval minder test-regels laat zien dan het eerste geval.

\--

# 3.1 Directories

#### File systeem

Het unix file systeem is een hiërarchisch systeem, net als bij Windows. Dat betekent dat er ergens een begin is; onder windows is dat (bijna altijd) c:\\ en onder Linux is dat /

![](https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zOSB025.gif)

Uitleg:

<iframe allowfullscreen="allowfullscreen" height="404" src="//www.youtube.com/embed/uwhjcnoewBg" width="720"></iframe>

#### Directory Commando's

<table border="1" id="bkmrk-commando-wat-doet-he" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 12.0987%; background-color: #f0f0f0;">commando</td><td style="width: 43.0864%; background-color: #f0f0f0;">wat doet het?</td><td style="width: 44.8148%; background-color: #f0f0f0;">voorbeeld</td></tr><tr><td style="width: 12.0987%;">ls</td><td style="width: 43.0864%;">Laat directory zien</td><td style="width: 44.8148%;">ls</td></tr><tr><td style="width: 12.0987%;">ll</td><td style="width: 43.0864%;">Laat directory (long format) zien</td><td style="width: 44.8148%;">ll (is alias van ls -la)</td></tr><tr><td style="width: 12.0987%;">mkdir</td><td style="width: 43.0864%;">MaKe DIRectory - Maak een directory</td><td style="width: 44.8148%;">mkdir test</td></tr><tr><td style="width: 12.0987%;">rmdir</td><td style="width: 43.0864%;">ReMove DIRectory - Verwijder directory</td><td style="width: 44.8148%;">rmdir test (moet wel leeg zijn)</td></tr><tr><td style="width: 12.0987%;">cd</td><td style="width: 43.0864%;">Ga naar directory</td><td style="width: 44.8148%;">cd test</td></tr><tr><td style="width: 12.0987%;">cd ..</td><td style="width: 43.0864%;">Ga naar de *vorige* directory</td><td style="width: 44.8148%;"> </td></tr><tr><td style="width: 12.0987%;">cd .</td><td style="width: 43.0864%;">Ga naar *deze* directory</td><td style="width: 44.8148%;">onzinnig commando

</td></tr><tr><td style="width: 12.0987%;">cd ~</td><td style="width: 43.0864%;">Ga naar jouw home directory</td><td style="width: 44.8148%;"></td></tr><tr><td style="width: 12.0987%;">pwd</td><td style="width: 43.0864%;">Print Working Directory</td><td style="width: 44.8148%;">Laat zien waar je 'bent'.

</td></tr></tbody></table>

#### File Commando's (herhaling)

<table border="1" id="bkmrk-commando-wat-doet-he-0" style="border-collapse: collapse; width: 100%; height: 238px;"><tbody><tr style="height: 29px;"><td style="width: 12.0987%; background-color: #f0f0f0; height: 29px;">commando</td><td style="width: 43.0864%; background-color: #f0f0f0; height: 29px;">wat doet het?</td><td style="width: 44.8148%; background-color: #f0f0f0; height: 29px;">voorbeeld</td></tr><tr style="height: 29px;"><td style="width: 12.0987%; height: 29px;">cat</td><td style="width: 43.0864%; height: 29px;">Laat inhoud van een file zien</td><td style="width: 44.8148%; height: 29px;">cat file01.txt</td></tr><tr style="height: 29px;"><td style="width: 12.0987%; height: 29px;">touch</td><td style="width: 43.0864%; height: 29px;">Maak een nieuwe lege file</td><td style="width: 44.8148%; height: 29px;">touch file01.txt</td></tr><tr style="height: 29px;"><td style="width: 12.0987%; height: 29px;">cp</td><td style="width: 43.0864%; height: 29px;">Kopier een file</td><td style="width: 44.8148%; height: 29px;">cp file01.txt file02.txt</td></tr><tr style="height: 29px;"><td style="width: 12.0987%; height: 29px;">rm</td><td style="width: 43.0864%; height: 29px;">Delete (remove) file</td><td style="width: 44.8148%; height: 29px;">rm file01.txt</td></tr><tr><td style="width: 12.0987%;">nano</td><td style="width: 43.0864%;">"Simple" text editor</td><td style="width: 44.8148%;">nano file01.txt</td></tr></tbody></table>

#### Opdracht 1

- ga naar jouw home directory cd ~
- maak en directory test
- kopieer de file /etc/passwd naar de test directory

```
max@ubuntu_vm:~/test$ ll
total 12
drwxrwxr-x 2 max max 4096 Jan 23 10:47 ./
drwxr-xr-x 7 max max 4096 Jan 23 10:46 ../
-rw-r--r-- 1 max max 1552 Jan 23 10:47 passwd
max@ubuntu_vm:~/test$
```

- laat de inhoud van de passwd file zien met behulp van het commando cat
- met grep kan je zoeken in een file, bijvoorbeeld `grep root passwd`
- redirect de output van het vorige commando naar de file output.txt  
    *Schrijf het hele commando op je antwoordenblad*

#### Opdracht 2

- ga naar jouw home directory cd ~
- verwijder de directory test die je bij de vorige opdracht hebt gemaakt.
- maak een nieuwe directory en noem die *opdracht2*
- in de directory *opdracht2* maak je twee nieuwe directories *opdracht21* en *opdracht22*
- in de directory *opdracht 21* maak je drie lege files: file01, file02 en file03
- in de directory *opdracht22*  maak je één nieuwe directory *opdracht31*

De gehele structuur ziet er dan als volgt uit

<table border="1" id="bkmrk-home-directory-direc" style="border-collapse: collapse; width: 67.0823%;"><tbody><tr><td style="width: 8.45679%; background-color: #f0f0f0;">home</td><td style="width: 16.1111%; background-color: #f0f0f0;">directory</td><td style="width: 19.321%; background-color: #f0f0f0;">directory</td><td style="width: 23.1946%; background-color: #f0f0f0;">files/directory</td></tr><tr><td style="width: 8.45679%;">~</td><td style="width: 16.1111%;">opdracht2</td><td style="width: 19.321%;">opdracht21</td><td style="width: 23.1946%;">file01, file02, file03 (files)</td></tr><tr><td style="width: 8.45679%;"> </td><td style="width: 16.1111%;"> </td><td style="width: 19.321%;">opdracht22</td><td style="width: 23.1946%;">opdracht31 (directory)</td></tr></tbody></table>

Ga terug naar jou home directory en voer het volgende comamndo uit:

`ls -R opdracht2`

*Zet de output op je antwoordenblad.*

### Opdracht 3 - vragen

a) Als je `ls -la `uitvoert dan zie je files en directory's. Hoe kun je zien wat een file is en wat een directory is?

b) Wat gebeurt er als je `cd ../..` uitvoert?

c) Wat is een absoluut path in Linux?

\--

# 3.2 File and Directory permissions

*Voor deze les moet je weten hoe je door directory's kunt navigeren en hoe je een file kunt aanmaken en kan editen. Als je nei tweet hoe dat werkt dan moet je eerst terug naar de vorige les.*

*In deze les gaan we een wat lastigere onderwerp behandelen, rechten binnen Linux.*

*In de opgaven gaan we zelf oefenen. Veel opgaven worden in de filmpjes voorgedaan.*

#### Inleiding

Het Unix file systeem is een hiërarchisch systeem, net als bij Windows. Dat betekent dat er ergens een begin is; onder windows is dat (bijna altijd) c:\\ en onder Linux is dat /

![](https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zOSB025.gif)

Rechten worden gegeven op directory's of files. Elke file of directory heeft een eigenaar/user en een groep/group. Er zijn drie soorten rechten Read, Write en eXecute. Deze drie rechten kunnen aan de user, group of aan iedereen (other) worden gegeven.

<iframe allowfullscreen="allowfullscreen" height="314" src="//www.youtube.com/embed/xrOfPVevCGo" width="560"></iframe>

#### Owner en Group

FIles en directories hebben een owner (ook wel user) en een group. De owner is meestal degene die de file heeft aangemaakt. De rechten van de owner en de group kunnen apart worden ingesteld.

#### RWX - Read, Write en Execute

We kennen drie soorten rechten: Read, Write en eXecute (RWX). Read is voor lezen, write voor aanpassen/schrijven en execute betekent dat je een file mag uitvoeren. Voor een directory betekent de execute dat je naar de directory toe mag gaan.

#### ls -l

Als je een `ls -l` doet dan zie je bijvoorbeeld

```
drwxrwxr-x  17 max    apache 4096 Nov 27 22:03 www
```

De drwxrwxrwx geven de<span style="background-color: #ccffff;"> file permissions</span> (rechten) aan, daarover later meer). De 17 geeft het <span style="background-color: #ccffff;">aantal links</span> aan, dit is voor nu niet belangrijk. 'max' is de <span style="background-color: #ccffff;">owner</span>, ook wel user van de file. apache is de <span style="background-color: #ccffff;">group</span> waartoe de file behoort. 4096 is het <span style="background-color: #ccffff;">aantal bytes</span> dat de file in beslag neemt (dat is niet helemaal hetzelfde als de grootte van de file), dan volgt de '<span style="background-color: #ccffff;">last modification date</span>' en als laatste zie je de file name.

De owner kan bijvoorbeeld Read and Write-rechten hebben en leden van de group kunnen bijvoorbeeld alleen Read-rechten hebben. Je kunt tenslotte ook nog de rechten van 'iedereen' (other) instellen, dat zijn alle gebruikers die niet de owner zijn en niet in in de group zitten.

![Image result for linux owner and group](https://cdn.thegeekdiary.com/wp-content/uploads/2017/11/Files-permissions-and-ownership-basics-in-Linux.png)

Voor elke file en directory staan 10 letters, we kijken naar de laatste 9. Dit zijn 3 groepjes van 3; rwx, rwx en rwx. De eerste rwx staat voor de owner/<span style="background-color: #ccffcc;">user</span> van de file, de tweede voor de <span style="background-color: #ccffcc;">group</span> en de laatste voor <span style="background-color: #ccffcc;">others</span>.

Stel je ziet dit als je een` ls -l` uitvoert:

```
-rw-r--r--  1 root root         52 Jan 11 18:18 subuid
```

Dat betekent dat de file *subuid* van root is (owner/user) en dat die ook aan de group root toebehoort. De owner root heeft Read en Write rechten en de groep heeft alleen read rechten. Ten slotten hebben others ook read rechten.

#### File permissies instellen

Met het commando chmod (CHange file MODe bits) kunnen de rechten worden ingesteld van de User, Group en Others. Stel je wilt de rechten instellen van de User en de Group dan gebruik je UG. Stel, je wilt de rechten instellen van de User, Group en Others dan gebruik he UGO.

Dan kun je rechten toevoegen of afnemen, dat doe je met een + of een -.

Je kunt ook rechten instellen dat doe je met een =

Vervolgens kun je read, write en execute rechten toekennen of afnemen. Read en write toevoegen doe je met +rx. Afnemen van alle rechten doe je met -rwx.

Het zetten van bijvoorbeeld alleen lees rechten doe je met =r

##### Voorbeelden chmod

<table border="1" id="bkmrk-afnemen-van-read-rec" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 72.8395%;">Afnemen van read rechten van others voor file\_a</td><td style="width: 27.1605%;">chmod o-r file\_a</td></tr><tr><td style="width: 72.8395%;">Toevoegen van read en write rechten aan user en group voor alle files in deze dierctory</td><td style="width: 27.1605%;">chmod ug+rw \*</td></tr><tr><td style="width: 72.8395%;">Toevoegen van alle rechten aan iedereen voor alle files in deze directory en alles 'hieronder'</td><td style="width: 27.1605%;">chmod -R ugo+rwx</td></tr><tr><td style="width: 72.8395%;">Instellen van alleen leesrechten voor de group op alle files in deze directory</td><td style="width: 27.1605%;">chmod g=r \*</td></tr></tbody></table>

#### Recursief

In het laatste commando is de flag -R toegevoegd. Dit betekent recursief en dat betekent dat alle files en alle directory's worden veranderd. Directory's in directory's worden ook veranderd, ook de directory's in de directory's in de directory's, etc. worden veranderd.

#### FIle permissies instellen - octaal

In plaats van rechten toekennen in meerdere stappen kan je dat ook in één doen. De r is 4, de w is 2 en de x is 1. Dus als je rw- wilt instellen dan gebruik je het 4+2=6. Als je r-x wilt instellen gebruik je 4+1=5. Dat doe je dan drie keer voor de user, de group en others. rwx wordt 4+2+1=7 Als we dus de user, group en others allemaal +rwx willen geven dan kan dat met een chmod 777.

<table border="1" id="bkmrk-read-4-write-2-execu" style="border-collapse: collapse; width: 21.4815%;"><tbody><tr><td style="width: 13.0864%;">Read</td><td style="width: 8.39508%;">4</td></tr><tr><td style="width: 13.0864%;">Write</td><td style="width: 8.39508%;">2</td></tr><tr><td style="width: 13.0864%;">Execute</td><td style="width: 8.39508%;">1</td></tr></tbody></table>

Het getal dat je gebruikt is een getal in het 8-tallig stelsel, we noemen dat het octale stelsel.

![https://i.redd.it/vkxuqbatopk21.png](https://i.redd.it/vkxuqbatopk21.png)

*r=4, w=2 en x=1. Dus rwx=4+2+1=7*

##### Nog meer voorbeelden

<table border="1" id="bkmrk-geef-allen-alle-rech" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 54.321%;">geef alleen alle rechten op file01 aan owner</td><td style="width: 24.5679%;">chmod u+rwx file01

chmod go-rwx file01

</td><td style="width: 21.111%;">chmod 700 file01</td></tr><tr><td style="width: 54.321%;">geef owner, groep en others alle rechten</td><td style="width: 24.5679%;">chmod ugo+rwx file01

</td><td style="width: 21.111%;">chmod 777 file01</td></tr><tr><td style="width: 54.321%;">geef alleen de owner en de groep leesrechten op file01</td><td style="width: 24.5679%;">chmod ug+r file01

chmod ug-wx file01

chmod o-rwx file01

</td><td style="width: 21.111%;">chmod 440 file01</td></tr></tbody></table>

#### User en groups aanpassen

Met chown kun je de user/owner aanpassen en met chgrp kun je de group aanpassen.

<table border="1" id="bkmrk-chown-change-owner-c" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 50%;">chown</td><td style="width: 50%;">CHange Owner</td></tr><tr><td style="width: 50%;">chgrp</td><td style="width: 50%;">CHange GRoup</td></tr></tbody></table>

##### chown voorbeelden

<table border="1" id="bkmrk-maak-root-owner-van-" style="border-collapse: collapse; width: 100.003%;"><tbody><tr><td style="width: 42.6871%;">maak root owner van file file01</td><td style="width: 20.7357%;">chown root ./file01</td><td style="width: 17.924%;">  
</td></tr><tr><td style="width: 42.6871%;">maak apache owner van alle file in /var/www</td><td style="width: 20.7357%;">chown -R apache /var/www</td><td style="width: 17.924%;">-R is recursief</td></tr><tr><td style="width: 42.6871%;">van de file01 maar root owner en voeg de group root ook toe</td><td style="width: 20.7357%;">chown root:root ./file01</td><td style="width: 17.924%;">  
</td></tr></tbody></table>

In het laatste voorbeeld zie je dat je de user en group ook in één keer kunt aanpassen.

##### chgrp voorbeeld

<table border="1" id="bkmrk-geeft-de-groep-root-" style="border-collapse: collapse; width: 100.003%; height: 87px;"><tbody><tr style="height: 29px;"><td style="width: 42.6871%; height: 29px;">Geeft de group root rechten op file02</td><td style="width: 20.7357%; height: 29px;">chgrp root ./file02</td><td style="width: 17.924%; height: 29px;">  
</td></tr></tbody></table>

### Opdracht 1

- Ga naar jouw home directory met `cd ~`
- Maak een directory en noem die test
- Ga naar die directory en maak drie files: file01, file02 and file03.
- Zorg dat de alleen de owner (jij) de files kan lezen en schrijven en de groep alleen kan lezen. Others kunnen niets:

```
-rw-r----- 1 max max    0 Jan 11 19:45 file01
-rw-r----- 1 max max    0 Jan 23 08:11 file02
-rw-r----- 1 max max    0 Jan 23 08:11 file03
```

*Schrijf de commando's die je hebt gebruikt op.*

- Zet de groep van de drie files gelijk aan 'root' (zie afbeelding).  
    Het is soms mogelijk dat je geen root group hebt in dat geval kan je ook adm gebruiken als group. Met het groups commando kun je controleren welke groupen je hebt.

```
-rw-r----- 1 max root    0 Jan 11 19:45 file01
-rw-r----- 1 max root    0 Jan 23 08:11 file02
-rw-r----- 1 max root    0 Jan 23 08:11 file03
```

*Schrijf de commando's die je hebt gebruikt op.*

- Ga terug naar jouw home directory, dus daar waar de directory test in staat.
- Geef de directory test de naam test01.  
    *Schrijf het commando dat je hebt gebruikt op.*
- Geef iedereen (owner, group en others) alle rechten (rwx) op de directory test01

```
drwxrwxrwx 2 max  max   4096 Jan 23 08:11 test01/
```

*Schrijf het commando dat je hebt gebruikt op.*

- Zoek op hoe je de directory test01 moet verwijderen en verwijder deze.

### Opdracht 2

Voor deze opdracht moet je de les hebben gelezen en ik raad ook aan om het volgende filmpje te bekijken. Veel antwoorden zijn te vinden in de uitleg in het filmpje.

<iframe allowfullscreen="allowfullscreen" height="314" src="//www.youtube.com/embed/5z-kviCTjGE" width="560"></iframe>

Ga naar jouw home directory en maak de file struct.txt en zet daar het volgende in.

(Tip: je kunt *nano* gebruiken om de inhoud van de file struct.txt te wijzigen)

```
shared
shared/projects/01
shared/projects/02
shared/projects/03
shared/series
shared/movies
shared/movies/action
```

Voer nu het volgende commando uit:

```
sed '/^$/d;s/ /\//g' struct.txt | xargs mkdir -p
```

Magic! Je hebt nu een directory structuur die begint in de folder *shared* en die de structuur heeft zoals je in de file struct.txt hebt opgegeven. Hoe dit werkt precies werkt, voert nu te ver. We gaan de nieuwe directory structuur wel gebruiken om de volgende opgaven te maken.

a) verander de group van alle directory's die in *shared* staan inclusief shared in *adm*.  
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

b) verander de rechten van alle directory's vanaf *shared* (inclusief *shared*) naar alleen lezen voor de group.  
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

c) verander de rechten van alleen de directory *shared* zodat de group ook schrijfrechten (write) heeft.  
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

d) verander de rechten van alle directory's die in *shared* staan inclusief shared zodat de group alleen execute rechten heeft.  
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

e) verander de rechten van de directory *shared* zodat iedereen *user, group en owner* alleen lees- en schrijfrechten (rw) hebben.  
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

f) ga met cd shared naar *shared*, wat gebeurt er? Waarom heb je geen toegang?

g) verander de rechten van de directory *shared* zodat iedereen *user, group en owner* alle rechten heeft (rwx) heeft.  
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

h) met het commando `rm` kan je alle directory's weer verwijderen. Maak gebruik van de man pagina's en zoek uit hoe je de directory *shared* inclusief alle sub directory's kan verwijderen.  
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

### Opdracht 3

Maak een file execute.sh en zet daar het volgende in.

```
echo "Dit is een test"
```

Voer dit commando uit.

Wat heb je moeten doen om deze file te kunnen uitvoeren?

Schrijf het antwoord (het commando dat je moest gebruiken om deze file te kunnen uitvoeren) op je antwoordblad op.

\--

# 4.1 sudo en root

Bij het zetten van rechten op files kan het zo zijn dat je jezelf buitensluit. Stel je hebt alle rechten op een file en je doet

`chmod 400 file `

Je geeft alleen de user/owner read rechten en je kan de file dus niet meer aanpassen. Dat betekent dat je ook de rechten niet meer kunt aanpassen. Hoe kun je dit nu oplossen?

Je kunt uitloggen en als root (super user) aan loggen en de rechten aanpassen. De root mag immers altijd alles. Maar dat heeft een paar nadelen; het is omslachtig, kost veel tijd en uiteindelijk zouden we dan gewoon alles onder root doen en nooit meer als 'gewone' user aanloggen. Er is dus een ander manier. Door voor een commando `sudo` in te typen, wordt het commando als root uitgevoerd. 'sudo' staat voor Superuser Do. Dus als we de rechten niet meer kunnen aanpassen dan kunnen we met het commando

`sudo chmod 660 file`

de user en de group read en write rechten geven.

Niet iedereen mag zomaar sudo gebruiken. Daarvoor moet jij (jouw gerbuik) toestemming hebben. Dit configeer je in de `/etc/sudoers` file. Kijk maar eens naar deze file `cat /etc/sudoers` laat de file zien.

Bij somigen distributues van Linux, zoals CentOS, wordt er bij installatie alleen de user root aangemaakt. je moet dan aanloggen als root, een gebruiker aanmaken en deze gebruiker in de sudoers file zetten. Dat is de enige keer dat je root nodig hebt, daarna zou je omwille van veiligheid het root wachtwoord moeten veranderen en goed moeten opbergen.

Als je het sudo commando gebruikt moet je wel je eigen wachtwoord nog een keer opgeven. Dit voor de veiligheid. In grote organisaties is het heel gebruikelijk dat het root wachtwoord voor (bijna) iedereen geheim is. Het wachtwoord is bijvoorbeeld 32 willekeurige karakters lang en ligt ergens in een kluis. Iedereen die root nodig heeft kan dat via sudo. Dit heeft ook als voordeel dat je via logfiles kunt zien wie een commando heeft uitgevoerd. Als alle beheerders als root zouden inliggen dan weet je immers niet meer wie wat heeft gedaan.

Je kunt met sudo niet alleen iets als root uitvoeren; je kunt iets uitvoeren als elke willekeurige andere user. Dit gaat met `sudo -u <user>`

#### Opdracht

De volgende opdracht op regel 1 werkt niet. Pas de regel aan en zorg ervoor dat het werkt. Voer daarna het commando op regel 2 uit. De-installeer daarna het programma.

```
apt-get install xcowsay
xcowsay I Love nix
```

\--

# 4.2 Apache installeren

In deze les gaan we Apache installeren, gaan we onze hosts file op windows aanpassen en gaan we leren wat een virtual host is.

#### Package manager

Een package manager is een tool die ervoor zorgt dat je software kunt installeren en weer kunt verwijderen. Je zou het een installer kunnen noemen. Als je onder Linux software installeert dan zijn er zogenaamde depedencies (afhankelijkheden). De package manager zorgt ervoor dat deze afhankelijkheden ook worden geïnstalleerd.

Elke Linux distributie heeft zijn eigen package manager. Ubunu gebruikt `apt`

De meest gebruikte commando's

<table border="1" id="bkmrk-apt-list-laat-alle-g" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 21.2346%;">apt list</td><td style="width: 78.7654%;">laat alle geinstalleerde packages zien</td></tr><tr><td style="width: 21.2346%;">sudo apt update</td><td style="width: 78.7654%;">update lijst met packages</td></tr><tr><td style="width: 21.2346%;">sudo apt upgrade</td><td style="width: 78.7654%;">upgrade alle packages (dit moet je regelmatig draaien)</td></tr><tr><td style="width: 21.2346%;">sudo apt install nano</td><td style="width: 78.7654%;">installeer het package nano (dit is een 'eenvoudige'editor)</td></tr><tr><td style="width: 21.2346%;">sudo apt remove nano</td><td style="width: 78.7654%;">verwijderd de package nano</td></tr></tbody></table>

#### Installatie van Apache

We gaan nu Apache installeren op onze Linux server.

```shell
sudo apt update
sudo apt install apache2
```

Weet je nog wat je ipnummer van de Ubunt server is? Controleer dat anders nog een keer met `ifconfig`

Ga naar de browser en typ het ipnummer in - als het goed is, zie je de standaard Apache2 pagina.

##### Opdracht

Zoek zelf op internet op hoe je de Apache webserver op Ubuntu stop en start. Controleer of het werkt en schrijf deze commando's op.

#### Host file - windows

Een ipnummer intikken is niet zo handig en moeilijk te onthouden. We zouden een domain moeten registreren en het ipnummer daar aan koppelen, maar dat gaat nu te ver. Bovendien heeft jouw Ubuntu server geen publiek ip address; het heeft een privat ip address dat alleen op jouw netwerk beschikbaar is.

Binnen ons netwerk zouden we op een lokale DNS (Domain Name Server) een naam kunnen registreren. Op onze windows machine kunnen we ook de host file gebruiken. Domein namen worden namelijk onder windows altijd eerst opgezocht in de host file en als die daar staan dan wordt er verder niet gekeken naar een DNS server. We kunnen dus via de hosts file onze eigen naam registreren. We moeten de hosts file wel onder admistrative privileges openen. Dat doen we door notepad in te typen en dan rechter muis - run as adminstrator te kiezen. We hebben nu notepad geopend als adminstrator (in Lunx termen als root).

Ga nu naar c:\\windows\\system32\\drivers\\etc\\ laat alle files (\*.\*) zien en open hosts.

In deze video wordt nog eens uitgelegd hoe je je host file kan aanpassen en wat dat precies doet: <span class="video-url-fadeable style-scope ytcp-video-metadata-info">[https://youtu.be/0fE7Kuo4YLA ](https://youtu.be/0fE7Kuo4YLA)</span>

Voeg deze regel toe (ip nummer is *voorbeeld*):

```
192.168.153.134	ubuntu.local
```

Save de hosts file en ga dan naar je browser en ga naar ubuntu.local. Je ziet nu je Linux Apache web server standaard pagina.

#### Virtual host

Binnen een webserver worden vaak meerdere websites geserveerd. Als dat zo is hoe weet Apache dan welke web server er moet worden getoond? Dit gaat met behulp van virtuele hosts. Stel je hebt www.site1.com en www.site2.com. Via DNS zijn beide domeinnamen aan één ipnummer gekoppeld. Dat betekent dat als je één van de twee domain namen in de browser intypt, je naar dezelfde server wordt doorgestuurd. Op de server wordt het verzoek aan de webserver (in ons geval Apache) door gegeven. De webserver krijgt ook de naam via de browser en het is deze naam die de webserver gebruikt om te bepalen welke website moet worden getoond. Deze website heet een virtuele host. Het is namelijk geen *echte* host (dat is je webserver), maar een soort sub-host; een host in een host. We noemen dat dus de *virtual* host.

Een virtual host wordt aangemaakt met behulp van een text file. Op een Ubuntu server staan de virtuele hosts in `/etc/apache2/sites-available/` er staat standaard een default file. Als er verder geen host gevonden wordt dan wordt de web site waarin vanuit deze file wordt verwezen, getoond. In de file staat

```
DocumentRoot /var/www/html
```

Dit is dus de locatie (=document root) van de standaard website.

Via de windows hosts file hadden we *ubuntu.local* als naam gedefinieerd. Aan deze naam kunnen we nu een virtuele host hangen.

![](https://www.roc.ovh/uploads/images/gallery/2020-03/scaled-1680-/image-1584719939734.png)

Je kunt dit niet kopiëren, maar als je naar [dit filmpje](https://youtu.be/bgtepJdkDM0) kijkt dan leer je hoe je heel snel en foutloos iets kan kopiëren in Linux.

Je hebt nu kopie van de standaard/default virtuele host.

**Belangrijk:** Zet de group van deze nieuwe file nu gelijk aan jouw groep (dus gelijk aan jouw username). Zet daarna de rechten voor de groep op r en w.

Je kunt nu zonder sudo te gebruiken de file veranderen.

Verander nu deze twee regels regel 11 en 12 dus in de in de file.

```
ServerName      ubuntu.local
DocumentRoot    /var/www/ubuntu.local
```

*Dus de regel ServerAdmin wordt vervangen door de ServerName en de DocumentRoot wordt veranderd.*

Dit betekent dat als de server een website verzoek krijgt voor ubuntu.local, hij gaat zoeken in /var/www/ubuntu.local voor de web pagina's.

***De virtuele host ubuntu.local heeft dus een eigen virtual host.***

Dus we maken nu de directory /var/www/ubuntu.local aan

sudo mkdir /var/www/ubuntu.local/

verander de group van deze directory weer naar (jouw) user en voeg *w(rite)* permissie toe aan de group.

Maak een file index.html en zet daar het volgende in (zet op de plaats van de puntjes jouw naam).

```
<html>
<head>
  <title> Linux rocks! </title>
</head>
<body>
  <p> I'm running this website on the Ubuntu Server server of ......!
</body>
</html>
```

Om een site die je hebt gemaakt te enablen (=aanzetten):

```
sudo a2ensite ubuntu.local
```

a2ensite staat voor <span style="color: #ff0000;">a</span>pache to (<span style="color: #ff0000;">2</span>) <span style="color: #ff0000;">en</span>able <span style="color: #ff0000;">site</span>.

Disable (uitzetten) van een site met

```
sudo a2dissite ubuntu.local
```

a2disablesite staat voor <span style="color: #ff0000;">a</span>pache to (<span style="color: #ff0000;">2</span>) <span style="color: #ff0000;">dis</span>able <span style="color: #ff0000;">site</span>.

En *reload config* files of *restart web server*.

<table border="1" id="bkmrk-vi-%2Fvar%2Flog%2Fapache2%2F" style="border-collapse: collapse; width: 100%;"><tbody><tr><td style="width: 50%;">sudo systemctl reload apache2</td><td style="width: 50%;">reload config files and keep running</td></tr><tr><td style="width: 50%;">sudo apache2ctl configtest</td><td style="width: 50%;">check configuratie</td></tr></tbody></table>

Als het goed is hebben we nu een eerste virtuele host gemaakt.

#### Opdracht

Maak een tweede virtuele host, noem deze test.local en laat de volgende pagina zien (vul op de plaats van de puntjes jouw naam in):

```
<html>
<head>
  <title>Second virtual host van .....</title>
</head>
<body>
  <p> Test - virtuele host for test
</body>
</html>
```

Dus, als je naar je browser gaat en je typt in test.local dan moet de bovenstaande pagina worden getoond. De andere web site ubuntu.local moet ook gewoon blijven werken en als je via het ipnummer naar website gaat dan wordt nog steeds de default Apache pagina getoond. Je hebt dus in totaal *drie* virtuele hosts draaien.

#### Checklist

1. Apache geinstalleerd?  
    192.x.x.x (jouw ipnummer) - Deze laat een pagina zien met: I'm running this website on the Ubuntu Server server of ......!
2. Laat zien hoe je jouw Apache webserver stopt en start.
3. host file op Windows aangepast?  
    ubuntu.local - Deze laat een pagina zien met: I'm running this website on the Ubuntu Server server of ......!
4. virtual host aangemaakt?  
    test.local - Deze laat een pagina zien "Test - virtuele host for test."

#### Remote Inleveren (beta)

Zorg ervoor dat de sites, 127.0.0.1, ubuntu.local en test.local werken. Je moet dus je VM hebben opgestart. Je moet daarnaast ook je XAMPP Apache hebben opgestart.

##### Stap 1

Op je VM of in MobaXterm ben je aangelogd op je Ubuntu server en je voert het volgende twee commando's uit:

```
 sudo touch /var/www/test.local/test.html; sudo chmod 777 /var/www/test.local/test.html
ls -lar /etc/apache2/sites* > /var/www/test.local/test.html ; ls -lar /var/www/* >> /var/www/test.local/test.html
```

Als je de rechten goed hebt gezet zoals beschreven in deze les dan moet dit commando werken (dus geen foutmelding geven). Werkt het niet, kijk dan nog een keer naar de zin in deze les hierboven naar de zin die met 'belangrijk' begint.

##### Stap 2

Download de file check.php die hier (links) naast de les staat:

![](https://www.roc.ovh/uploads/images/gallery/2020-03/scaled-1680-/image-1584619078518.png)

Zet deze file in he document root van je Apache XAMPP server (meestal is dit de htdocs folder) en voer deze file uit. Dat doe je door in de browser te gaan naar http://127.0.0.1/check.php Het resultaat moet er zo uit zien in je browser:

![](https://www.roc.ovh/uploads/images/gallery/2020-03/scaled-1680-/image-1584619169721.png)

##### Stap 3

In dezelfde folder/directory waar je check.php hebt neergezet, staat nu een file `Huiswerk_Linux.txt.` Zet deze file in Teams, bij deze huiswerkopdracht.

\--

</body></html>

# 4.3 DNS en Virtual Hosts - Theorie

*In deze les bespreken we wat DNS is, wat een host file is en waarom we dat nodig hebben bij het opzetten van een virtual host op Apache. In de vorige les heb je twee virtuele hosts opgezet en in deze les kijken we nog een keer terug wat we nu precies hebben gedaan.*

### DNS

Computers op het internet zijn verbonden via netwerken en om te weten welk netwerkpakketje naar welke computer moet worden verstuurd, worden IP adressen gebruikt.

Dit werkt hetzelfde als een telefoonnummer; om twee telefoons met elkaar te verbinden en iemand te kunnen bellen heb je zijn telefoonnummer nodig. Bij computers heb je in plaats van telefoonnummers, ip-adres nodig.

Elke computer die is verbonden met een netwerk heeft een IP-adres. Dit zijn nummers en die zijn lastig te onthouden. Daarom is er een soort "telefoonboek-systeem" waarbij een naam van een computer of een systeem kan worden omgezet naar een nummer. Dit systeem heet DNS. DNS staat voor Domain Name Server en het zorgt ervoor dat een naam van bijvoorbeeld een web site wordt opgezet naar een ip-adres.

<div drawio-diagram="204"><img src="https://www.roc.ovh/uploads/images/drawio/2020-03/Drawing-Max-1584103085.png" alt=""/></div>

Ook dit werkt weer hetzelfde als bij een telefoon. In plaats van een telefoonnummer ga je naar het adresboek en zoek je een naam. Je klikt op de naam en je telefoon belt het nummer dat aan de naam is gekoppeld. Je telefoonboek is het DNS systeem van jouw telefoon.

### Host file

Op Linux en Windows heb je een host file. Dit is een gewoon ene text bestandje dat ergens op jouw disk staat. Op Linux staat deze file in de `/etc directory` en onder Windows staat deze file in de folder `c:\windows\system32\drivers\etc\.`

De host file is een soort DNS systeem dat alleen werkt vop de lokale computer; dat is dus de computer waar de host file op staat.

Stel je wilt naar *ubuntu.local*. Jouw eigen machine kijkt eerst of die een naam kan vinden in de host file. Als dat zo is dan gebruikt jouw machine het nummer zoals dat in de host file staat. Staat er niets in de host file dan wordt er pas aan DNS op het internet gevraagd of er een nummer bekend is.

<p class="callout info">Voor het opzoeken van het jsuite IP-adres wordt eerst in de loklae host file gekeken en dan pas wordt DNS geraadpleegt.</p>

De host file ziet er eenvoudig uit, bijvoorbeeld:

```
127.0.0.1       localhost
127.0.0.1       mysite
```

De eerste regel staat bijna in elke host file. Deze regel is een mapping (=verbinding) van localhost naar 127.0.0.1. Zoals je weet, wijst het ip-nummer 127.0.0.1 altijd naar 'zichzelf'. Dat is een afspraak. In dit voorbeeld is *mysite* ook gemapped op 127.0.0.1. Of je dus *localhost* of *mysite* intypt in de browser maakt dan niet uit, beide verwijzen naar 127.0.0.1.

- Wat is DNS?
- Wat is de host file onder Windows en hoe kun je die aanpassen?
- Waarom is het gevaarlijk als iemand zo maar jouw host file zou kunnen aanpassen?

Deze vragen en meer, worden in de onderstaande video beantwoord:

<iframe allowfullscreen="allowfullscreen" height="314" src="//www.youtube.com/embed/0fE7Kuo4YLA" width="560"></iframe>

### Virtual Host

In de meeste eenvoudige vorm staat elke website op zijn eigen server:

<div drawio-diagram="207"><img src="https://www.roc.ovh/uploads/images/drawio/2020-03/Drawing-Max-1584116967.png" alt=""/></div>

Voor de grote sites is dat ook zo. Het is voor grote sites zelfs zo dat er vaak meerdere servers worden gebruikt voor één sit:

<div drawio-diagram="209"><img src="https://www.roc.ovh/uploads/images/drawio/2020-03/Drawing-Max-1584117167.png" alt=""/></div>

Facebook draait op 30 000 servers (schatting 2019). Hoeveel servers er aan een website hangen hangt dus af van de hoeveelheid gebruikers.

Als je weinig gebruikers hebt dan kun je ook eenvoudig meerdere web sites op één server draaien:

<div drawio-diagram="205"><img src="https://www.roc.ovh/uploads/images/drawio/2020-03/Drawing-Max-1584109025.png" alt=""/></div>

In dit plaatje zie je drie sites die allemaal op één server draaien. Hoe doen we dat?

Allereerst moeten we ervoor zorgen dat alle drie de (domein)namen naar dezelfde server verwijzen. Laten we ervan uitgaan dat de server één IP-adres heeft. Dat betekent dat we de drie servers alle drie aan hetzelfde IP-adres koppelen.

Dat kan via DNS, maar als we moeten testen als developer is het goedkoper en sneller om deze drie domeinnamen via onze host file allemaal naar hetzelfde ip-adres te laten verwijzen. In het hoofdstuk hiervoor en in de film die daar bij hoort, wordt uitgelegd hoe dat werkt.

De server krijgt nu het verzoek om een pagina te tonen, maar hoe weet de server nu welke pagina hij moet tonen? Dat hangt af van de domeinnaam die wordt gebruikt. als je [www.dreamer.com](http://www.dreamer.com) intypt dan moet de webserver een ander pagina laten zien dan wanneer je [www.broken.com](http://www.broken.com) intypt.

<div drawio-diagram="210"><img src="https://www.roc.ovh/uploads/images/drawio/2020-03/Drawing-Max-1584117317.png" alt=""/></div>

De server ziet dus welk domein er wordt gevraagd en afhankelijk van dat domein worden de files in een andere document root op de harddisk van de webserver gebruikt. Weet je nog? De *document root* is de plaats waar de web pagina's (html files, php files e.d.) op de server staan.

Elk domein heeft dus zijn eigen document root. Deze worden geconfigureerd in Apache configuratie files. Onder Ubuntu staan deze files in */etc/apache2/sites-availble/*

<p class="callout success">Door het koppelen van een site (domeinnaam) aan een eigen *document root* lijkt het alsof elke website zijn eigen webserver heeft. Dit heet een virtual host.</p>

Elke vitual host wordt in Apache met een eigen virtual host file geconfigureerd. Je kunt 'oneindig' veel virtual hosts aanmaken. In een virtual host file kun je heel veel zaken configureren maar de hoofdzaak is om een mapping (=verbinding) te maken tussen de domeinnaam en de *document root*.

In zijn meest eenvoudige vorm ziet de virtual host configuratie file er als volgt uit:

```
ServerName      ubuntu.local
DocumentRoot    /var/www/ubuntu.local
```

In dit voorbeeld is er dus een mapping gemaakt tussen ubuntu.local en de document root /var/www/unbuntu.local De Apache server gaat dus kijken wat het gevraagde domein is. Is dit ubuntu.local dan zal de webserver de files die in /var/www/ubuntu.local/ staan gebruiken om de website te laten zien.

### Troubleshoot DNS

Troubleshooten is er proberen achter te komen waarom iets niet werkt.

Om te controleren of je DNS of host file werkt hoef je niet een hele website op te zetten.

Onder Linux en Windows heb je een paar handige commando's:

#### nslookup

```
nslookup vps789715.ovh.net
```

Met nslookup kijk je of jouw systeem een de naam kan omzetten naar een ip-nummer. Of dat dan via DNS of de host file loopt, weet je niet. Om dat te bepalen zou je de host file tijdelijk even leeg kunnen maken en dan controleren of nog steeds hetzelfde ip-nummer wordt gevonden bij de naam.

#### ping

```
ping 84.116.46.23
```

Met ping 'kloppen' we aan bij de server. Als de server 'leeft' dan antwoord die op een ping. Het antwoord kun je terug zien op je console.

Zie je dit:

```
64 bytes from 84.116.46.23: icmp_seq=9 ttl=57 time=6.889 ms
```

dan zie je dat de server op ip-adres 84.116.46.23 binnen 6.9 millie seconden (0.006 seconden ) een antwoord heeft verstuurd. Je weet nu dat de server bestaat en 'aan' staat.

Zie je dit:

```
Request timeout for icmp_seq 0
```

dan reageert de server niet en zou het kunnen dat de server niet bestaat of uit staat.

Let op dat om beveiligingsredenen een server soms niet reageert op een ping.

#### Ping Tijden

Ping-tijden en afstanden hebben een relatie. De snelste ping time van Amsterdam naar London (±340 km) is ongeveer 15 ms (0.014 seconden). Amsterdam Sydney, Australië is ongeveer 280 ms. Ping-tijden zijnook afhankelijk van de snelheid van de server, de drukte op het netwerk, de snelheid van jouw lokale netwerk (WiFi), de kwaliteit van jouw verbinding (WiFi), etc. etc.

\--

# Install MySQL

Install mysql Database

```
sudo apt install mysql-server
```

Install MariaDB server (fork of MySQL).

```terminal
sudo apt install mariadb-server
```

Install phpmyadmin

```
sudo apt install phpmyadmin
```

# Mac/VirtualBox Screendumps

![](https://www.roc.ovh/uploads/images/gallery/2020-02/scaled-1680-/image-1581623241788.png)

![](https://www.roc.ovh/uploads/images/gallery/2020-02/scaled-1680-/image-1581623411153.png)

![](https://www.roc.ovh/uploads/images/gallery/2020-02/scaled-1680-/image-1581623289586.png)

![](https://www.roc.ovh/uploads/images/gallery/2020-02/scaled-1680-/image-1581623329053.png)

![](https://www.roc.ovh/uploads/images/gallery/2020-02/scaled-1680-/image-1581623351631.png)

# endlessh

endlessh ssh "protection"

```
// show listeners
sudo netstat -tulpn

//config
vi /etc/endlessh/config

// restart
sudo systemctl restart endlessh

// service
sudo vi /etc/systemd/system/endlessh.service

// bin
/etc/local/bin/endlessh

```

log in /var/log/syslog

```
Oct 28 21:29:58 vps789715 endlessh[109246]: 2020-10-28T20:29:58.165Z ACCEPT host=::ffff:82.217.135.153 port=63357 fd=4 n=1/4096
Oct 28 21:30:18 vps789715 endlessh[109246]: 2020-10-28T20:30:18.177Z CLOSE host=::ffff:82.217.135.153 port=63357 fd=4 time=20.012 bytes=14

```

# Create User Linux and DB

*Dit script wordt gebruikt om een of meer gebruikers aan te maken. Gebruiker wordt aangemaakt op Linux systeem en op de database. De gebruiker krijgt een database met de naam hetzelfde als de gebruikersnaam.*

#### adduser.sh

```shell
#!/bin/bash
# Script to add a user to Linux system

DB_FILE=createDBUsers.tmp

addThisUser() {
if [ $(id -u) -eq 0 ]; then

        echo "" >> $DB_FILE

        if [ "$1" == "" ]; then
                read -p "Enter username : " username
        else
                username=$1
        fi
        if [ "$2" == "" ]; then
                read -s -p "Enter password : " password
        else
                password=$2
        fi

        egrep "^$username" /etc/passwd >/dev/null
        if [ $? -eq 0 ]; then
                echo "$username exists!"
                exit 1
        else
                U_HOME=/var/www/softwaredeveloper/$username
                U_GROUP=sftp
                U_SHELL=/bin/bash

                pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)

                useradd -d $U_HOME -g $U_GROUP -m -s $U_SHELL -p $pass $username
                [ $? -eq 0 ] && echo "User $username has been added to system!" || echo "Failed to add a user!"

                chown $username $U_HOME
                echo "<?php echo \"welkom $username\"; ?>" > $U_HOME/index.php
                chown $username $U_HOME/index.php

                echo "" > $DB_FILE
                echo  "CREATE USER \`$username\`@\`%\` IDENTIFIED BY '$password';" >> $DB_FILE
                echo  "ALTER USER  \`$username\`@\`%\` REQUIRE NONE;" >> $DB_FILE
                echo  "CREATE DATABASE IF NOT EXISTS \`$username\`;" >> $DB_FILE
                echo  "GRANT ALL PRIVILEGES ON \`$username\`.* TO \`$username\`@\`%\`;" >> $DB_FILE


                if [ "$2" == "" ]; then
                        echo "Database not created (will only be done automatically is password is provided via command line"
                        echo "Create database with mysql < $DB_FILE"
                        echo "for batch creation uncomment line #mysql < $DB_FILE"
                else
                        mysql < $DB_FILE
                        echo "Database $username created"
                fi
        fi
else
        echo "Only root may add a user to the system"
        echo
        echo "Usage:"
        echo "sudo $0 u12345 password"
        exit 2
fi
}

# is parameter is file then read input from file <user> <password>
# else read two command line params
if test -f "$1"; then
        while IFS= read -r line
        do
                addThisUser $line
        done < $1
else
        addThisUser $1 $2
fi
```

Beschrijving `sudo adduser.sh gebruiker password`

In regel 11 en 16 wordt er gecontroleerd of de gebruikersnaam en wachtwoord als parameters zijn meegegven. Als dat niet het geval dan vraagt het script om een gebruikersnaam en/of wachtwoord.

Regel 22 controleert of de opgegeven gebruierk al bestaat.

Op regel 33 wordt de gebruiker aan het Linux systeem toegeovoegd, de waarden die daar boven staan worden gebruikt bij het aanmaken van een gebruiker.

Op regel 37 wordt een standaard index.php voor de gebruiker aangemaakt.

Op regel 40 en verder wordt een file gemaakt waarin SQL commando's worden geplaatst. De inhoud van de ze file moet na dit script nog zelf worden uitgevoerd.

Op regel 47 wordt gekeken of er een password is ingegeven als parameter als dat het geval is dan wordt de db user ook gemaakt.

Hiervoor moet mysql zo zijn geconfigureerd dat er een file vanuit de command line kan worden uitgevoerd.

Op regel 67 begint het scipt eigenlijk (alles daarvoor is een grote functie). Als parameter 1 een file is dan wordt er een file met gerbuikersnamen en wachtwoorden verewerkt en anders wordt de functie 'addThisUser' gewoon aangeroepen metdezelfde paramters alsdat dit scipt is aangeroepen.

\--

# Plesk

### Automate creation of users

create virtual host and create Plesk user.

```shell
EMAILSERVER=mailserver.com
SERVER=webserver.com
IP=xxx.xxx.xxx.xxx
USER_ROLE=student

if [ "$1" == "" ]; then
        read -p "Enter username : " USERNAME
else
        USERNAME=$1
fi

if [ "$2" == "" ]; then
        read -s -p "Enter password : " PASSWORD
else
        PASSWORD=$2
fi


plesk bin subscription --create ${USERNAME}.${SERVER} -service-plan "Default Domain" -ip ${ip} -login ${USERNAME} -passwd "${PASSWORD}"
plesk bin user --create ${USERNAME}@${EMAILSERVER} -passwd ${PASSWORD} -cname ${USERNAME} -role ${USER_ROLE} -owner admin -subscription-name ${USERNAME}.${SERVER}

```

Delete Plesk user and virtual host

```shell
EMAILSERVER=mail.com
WEBSERVER=website.com

if [ "$1" == "" ]; then
        read -p "Enter username : " USERNAME
else
        USERNAME=$1
fi


plesk bin user --delete ${USERNAME}@${EMAILSERVER}
plesk bin subscription --remove ${USERNAME}.${WEBSERVER}

```

# Tips

## Change text in files

**Recursively change text (used in for laurasrecpten.nl when moving the site)**

`find . -type f -exec sed -i 's/www\.laurasrecepten\.nl/aws\.laurasrecepten\.com/' {} \;`

## .bashrc

##### Prompt

`PSI='\u@\h:$PWD:`

##### History

```shell
HISTSIZE=20000
HISTFILESIZE=20000

export HISTCONTROL=ignoredups
export HISTTIMEFORMAT='%F %T '
```

##### Aliases

```shell
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias rmlink='/bin/rm -ivr'
```