Protonmail of gewoon PGP

Als je op zoek gaat naar een veilig E-mail adres heb je een aantal opties, Protonmail, een eigen mailserver, of gebruik maken van PGP. Ikzelf maak gebruik van PGP. Protonmail is echter een gratis oplossing die standaard versleutelde e-mail zou aanbieden, maar is het wel zo veilig als het lijkt?

Vorig jaar kwam ik terecht op een reddit thread waar er gesproken werd van een groote fout in protonmail. Deze thread ging er over dat iemand ineens een overvloed aan e-mail had en dat protonmail e-mail vertraagde/blokkeerde, en melde dat als het zo bleef dat het account gesloten zou worden, Nadat hij contact op nam met protonmail werd hem verteld dat de e-mail vals was, ondanks dat het ondertekend was door protonmail zelf (met een ster in de interface). Dus, In protonmail worden berichten die scam zijn van protonmail zelf toch aanzien als echt, zonder zo te zijn.

Bij PGP kan je zulke problemen niet voorhebben, want jij beheerd de sleutels en controleert zelf de echtheid van berichten daarmee, en als de signature niet klopt met de public-key die jij van de verzender hebt, dan weet je dat het bericht niet van de verzender is, maar van iemand die de verzender nabootst, iets wat je zelf niet in handen hebt bij protonmail.

Aan de slag met GPG

Ik ben een grote fan van encryptie, zo kan je mijn gpg sleutels vinden op deze pagina. Encryptie gebruiken zoals GPG lijkt moeilijk, maar dat is het niet.

GPG staat voor GNU Privacy Guard en is een implementatie van OpenPGP. GPG is een tool om eenvoudig versleuteling van tekst/bestanden te voorzien. Iedere gebruiker maakt met PGP een sleutelpaar aan, bestaande uit een private en een public key. De private key word gebruikt voor de ontsleuteling/ondertekening, waar de public key word gebruikt voor de versleuteling/controle van de ondertekening. Zoals de naam van de private en public key al vertellen, hou je de private key privé, en de public key maak je publiek beschikbaar (deze deel je bv op je website). Mensen die jou dan willen e-mail sturen kunnen dan gebruik maken van jouw public key om e-mail te versleutelen, die enkel jij met de private key kan ontsleutelen.

GPG installeren

Ik raad het gebruik van kleopatra als gui voor GPG aan. GPG en kleopatra is op Debian/Ubuntu te installeren met apt install gpg kleopatra -y en op Windows computers kan er gebruik gemaakt worden van gpg4win, GPG4Win installeert ook nog enkele extensies voor outlook.

Sleutelpaar maken

Zodra GPG en kleopa geïnstalleerd zijn kan je een nieuw sleutelpaar aanmaken.

Ik raad persoonlijk aan om een vervaldatum op een sleutel te zetten, bijvoorbeeld een jaar, of enkele jaren. Hierna maak je gewoon een nieuwe aan, die dan weer een jaar of enkele jaren geldig is. Als key gebruik je best RSA 4098 bits of een ECDSA key (ECDSA is veiliger als RSA, al is RSA 4098 ook voldoende sterk.), zoals je kan zien in de screenshot hieronder. Ik maak hier gebruik van RSA 4098 bits

Instellingen als de vervaldatum kunnen in theorie later gewijzigd worden, maar dat raad ik persoonlijk af.

Zodra jouw GPG sleutel gemaakt is zal je een wachtwoord van je public key moeten instellen, dit is een extra laag beveiliging moest jouw private key ooit gestolen worden. Zodra je klaar bent raad ik je aan om een back-up te maken van de private key (deze bevat automatisch ook de public key), en deze op een ander toestel (bv een usb-stick in een kluis, of bv een papieren backup) te bewaren.

GPG gebruiken

Om tekst te versleutelen kan je het klembord gebruiken, in Windows is er een tekstvak aanwezig die deze functionaliteit vervangt. Om bestanden te versleutelen klik je op de “versleutelen/ondertekenen” knop in de toolbar, en om te ontcijferen de “ontsleutelen/verifiëren” knop.

Zo, nu weet je hoe je veilig naar mij kan e-mailen. voel je vrij om het uit te testen door een mailtje te sturen naar mij {{site.email}} met mijn GPG sleutel.

Alles wat mis is met VPN Reclame

Het is moeilijk om naar techcontent te kijken op het internet zonder reclame tegen te komen van VPN-providers. Even voor de duidelijkheid, ik heb niets tegen het gebruik van een vpn, maar eerder tegen de manier dat er reclame voor gemaakt word.

De reclame is meestal hetzelfde, “Browse securely and anonymously” of “Stop your ISP from spying on you”. Als je gebruik maakt van een HTTPS verbinding, kan je ISP niets zien buiten de sites die je bezoekt, maar niet welke pagina’s/inhoud op die site. Eigenlijk verleg je het probleem van de mogelijke spionage van de ISP naar de VPN-provider, want je verkeer verlaat daar de vpn-tunnel, waardoor zij weer alles zien. Het “Browse anonymously” klopt nog tot een bepaald niveau, want vaak kan je kiezen in welk land je vpn-tunnel uitkomt, dus kan je dat verbergen, maar als je alsnog inlogt met een account gaat het anonieme er af, want een account heeft een naam, en een naam is niet meer zo anoniem. Als je echt anoniem wilt surfen raad ik je aan om gebruik te maken van TOR, en natuurlijk niet in te loggen met accounts.

Nu zou het je misschien verbazen dat ik zelf een VPN gebruik, wel niet een vpn van vpn-providers, maar eerder een die ik enkel gebruik om van buitenshuis toch te kunnen verbinden met mijn thuisnetwerk, om zo dan weer verbinding te maken naar mijn pc of raspberrypi’s. Ik gebruik een VPN namelijk waar het voor bestaat, als “Virtual Private Network”.

Aan de slag met Docker

Docker is een manier om een server of computer op de telen in kleine stukjes, containers genaamd. Het Idee van docker is om een programma te maken dat overal op draait, ongeacht de onderligende omgeving (doordat alles in een container verwerkt zit). Docker is ook zeer schaalbaar, omdat je bv bepaalde software over meerdere servers of nodes kan laten draaiten.

Als docker is geïnstalleerd dan kan je beginnen met het aanmaken van containers. Ik gebruik docker zelf vooral om een soort van “virtuele machine” te kunnen draaien op zwakke hosts zoals mijn raspberrypi’s. als je in een terminal het commando docker info uitvoert dan zie je hoeveel containers en images je hebt.

Images zijn de basissystemen. Je hebt er van besturingssystemen (zoals Debian of Ubuntu), maar ook van software (denk aan apache, mysql, php). Hierdoor kan je een applicatie maken die gebruik maakt van meerdere containers (voor elke service een andere container). Hierdoor is docker zeer veilig. Images kan je downloaden met docker pull <imagename>, om bv ubuntu te downloaden gebruik je docker pull ubuntu.

Om een docker container te maken gebruik je docker run <image> <parameters>. Ik maak mijn containers meestal met ubuntu, en ik geef er de mogelijkheid aan toe om een console te openen (-it), en ik open enkele poorten. Dit doe ik met -p <hostpoort>:<containerpoort>. Deze kan je herhalen om meerdere poorten open te zetten.

Docker heeft ook volumes. Met volumes kan je bv met meerdere containers aan dezelfde data. Hiermee kan je ook aan de data van buitenaf de container. Dit doe je met -v <hostpad>:<containerpad>.

Met deze informatie kan je hoogstwaarschijnlijk al aan de slag met docker. Docker is zeer interessant en het is dus zeer handig om er meer over te weten.

Kleine docker cluster

Ik heb onlangs een kleine docker cluster gemaakt van mijn 2 raspberrypi’s. Ik gebruik docker hierop voor het hosten van enkele services (welke gerepliceerd zijn over de 2 pi’s) en enkele ubuntu-containers die gebruikt worden als vm. Zodra ik docker meer heb ontdekt zal ik hier nog wat over posten.

Linux map met quota

Ik wou onlangs een map beperken in grote (bv max 500mb), aangezien het hier om een container ging kon ik niet in /etc/fstab quota’s gaan instellen, dus moest ik op zoek naar een andere manier. Toen vond ik na even zoeken het bash-script mklimdir. Dit script maakt een loopback-device die een beperkte grote heeft en gemount word in een bepaalde map. Dit is zeer handig als je een map wilt beperken in grote, zonder quota’s te moeten gaan opzetten.

Ubuntu mate wifi disconection fix

Ik had problemen met mijn laptop zijn wifi na het instellen van ubuntu mate 18.04, ik vond echter al snel de oplossing die te maken had met de ahavi-daemon die ik met volgende fixes kon oplossen:

in /etc/avahi/avahi-deamon.conf, zoek je de regel domain-name = .local, verander deze naar  domain-name = .alocal (of iets gelijkaardig, ik heb het gecomment, wat ook werkte)

Dan in /etc/default/avahi-deamon, verander AVAHI_DAEMON_DETECT_LOCAL=1 naar AVAHI_DAEMON_DETECT_LOCAL=0 (op line 4).

Dan moet je je systeem herstarten en daarna zou je verbonden moeten blijven. Ik moest ook nog een vast-ip instellen, aangezien ik mijn pc altijd laat aanstaan, 24/7, maar dat kan je doen in de instellingen van je router/modem.

Soms werkt het volgende ook:

nmcli c up <netwerknaam>

Edit 2020-01-18: Nadat ik ubuntu 18.04 heb geherinstalleerd, heb ik geen last meer van dat probleem, mogenlijks door kernel-updates.

SSH Server Beveiligen

SSH is de eenvoudigste methode om met een linux server te verbinden, maar een login mogenlijkheid openstellen maakt jouw systeem ook vatbaar voor verschillende aanvallen.

Verander de SSH poort

Het eenvoudigste is om de SSH poort aan te passen. Dit is geen waterdichte oplossing, maar is eerder “security by obscurity”. Deze kan je dan veranderen naar een vrije poort op jouw systeem (vb: 2022 or 4422). Hiervoor kan je het ssh-configuratie bestand aanpassen:

sudo nano /etc/ssh/sshd_config

Dan zoek je naar de volgende regel

#Port 22

Un⁻comment deze regel, en verander 22 naar de poort die je wenst te gebruiken, herstart dan SSH

sudo service ssh restart

SSH-keys gebruiken

Om de mogelijkheid van zwakke paswoorden te verwijderen, kan je SSH-sleutels verplichten.

Op een linux client, typ volgend commando:

ssh-keygen

Dit zal een paar vragen stellen, en daarna moet je jouw sleutel naar de server verplaatsen. vervang met het pad naar jouw sleutel (meestal ~/.ssh/id_rsa.pub)

ssh-copy-id -i <PATH_TO_YOUR_KEY> user@server.domain.tld

Nu moet je dit nog aanzetten in de SSH-server, dit kan je doen door in de configuratie van ssh (zie hiervoor hoe je deze kan aanpassen) volgende regels op te zoeken, en te un-commenten.

#PubkeyAuthentication yes

#AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2

Je kan ook passwoord-logins uitzetten door het volgende op “no” te zetten maar test wel eerst of jouw keys werken!

# PasswordAuthentication yes

Nu kan je jouw ssh-server herstarten (zie hervoor).

Zo, nu kan je jouw ssh-server op het internet openzetten, zonder risico’s.

RPI Assembler tutorial 7

De ARM architectuur is vooral gericht op embedded systeemen. Deze zijn vaak gebruikt in massaproductie-producten. In deze context zijn de marges klein, dus zal de ontwerper zo min mogenlijk componenten willen gebruiken. Een relatief duur component is geheugen, hoewel het elke dag een stukje goedkoper word. In zulke situaties wordt geheugen als bespaard door de ARM instructieset. Deze is ontworpen met dat doel. Ik zal een paar delen nodig hebben om alles uit te leggen, maar we zullen beginnen met ‘Shifted operand’.

Indexeermodes

We hebben gezien dat voor alles behalve load store and branches, ARM instructies als operators ofwel registers ofwel de waarde zelf gebruiken. We hebben ook gezien dat de eerste operator vaak het doelregister is. De instructie mov heeft nog een andere operator: een register of een waarde. Instructies zoals ADD en AND hebben vaak nog meer bronregisters. De eerste is altijd een register en de 2e kan een register zijn, maar ook een andere waarde.

Dit maakt het mogenlijk voor operators in instructies om collectief te zijn. Dit worden indexing modes genoemd. Dit idee kan een beetje ‘off-topic’ lijken omdat we niets zullen indexeren. De naam Indexing heeft wel nut voor geheugen operators. ARM instructies buiten load en store hebben geen geheugen operators.

De syntax van de meeste ARM instructies is als volgt:

instruction Rdest, Rsource1, source2

Er zijn een paar uitzonderingen: mov, b en bxx, ldr en str.

In een volgend deel zal ik de indexeermodes van ldr en str overlopen. Voor Branches is het echter zeer simpel. Hier is het enkel een label in ons programma.

Shift operaties

Wat raar is aan source2 in de instructies hierboven is dat source2 zowel een register als een waarde kan zijn. Dit hebben we al gebruikt in vorige delen bv:

mov r0, #1
mov r1, r0
add r2, r1, r0
add r2, r3, #4

Source2 kan veel meer zijn dan een waarde of een register. We kunnen het zelf combineren met een shift operatie. In deel 6 zagen we er al een, maar nu is het tijd om ze allemaal te laten zien.

  • LSL #n
    Logical Shift Left. Shifts bits n keer naar links. De n de linkse bits zijn weg en de n de rechtse bits zijn 0.
  • LSL Rsource3
    Zoals de voorige maar met de waarde van een register.
  • LSR #n
    Logical Shift Right. Zelfde van de eerste,  maar dan langs rechts,
  • LSR Rsource3
    Zelfde van de vorige, maar dan met een register.
  • ASR #n
    Arithmetic Shift Right. Zoals LSR Maar de meest linkse bit voor het shiften is gebruikt in plaats van 0 in de  n meest linkse.
  • ASR Rsource3
    Zoals de vorige, maar met een register.
  • ROR #n
    Rotate Right. Zoals LSR maar de n meest rechtste bits zijn niet weg maar worden de  n  meest linkse bits.
  • ROR Rsource3
    Zoals ROR, maar dan met een register.

In bovenstaande lijst is n een nummer van 1 tot 31. Arm heeft geen shift right en shift left instructie, dus moet je de mov instructie gebruiken:

mov r1, r2, LSL #1

Als je je afvraagt waarom je een register naar links of naar rechts wilt sturen, maar als je in deel 6 hebt gezien dat LSL een waarde geeft die hetzelfde doet als x2, dan geeft ASR een waarde die gedeeld door 2 is. Aangezien een shift van n hetzelfde is als n shifts van 1. Shifts zijn eigenlijk maal of gedeeld door een waarde van 2^n.

mov r1, r2, LSL #1      /* r1 ← (r2*2) */
mov r1, r2, LSL #2      /* r1 ← (r2*4) */
mov r1, r3, ASR #3      /* r1 ← (r3/8) */
mov r3, #4
mov r1, r2, LSL r3      /* r1 ← (r2*16) */

We kunnen dit combineren voor zeer handige gevallen:

add r1, r2, r2, LSL #1   /* r1 ← r2 + (r2*2) equivalent to r1 ← r2*3 */
add r1, r2, r2, LSL #2   /* r1 ← r2 + (r2*4) equivalent to r1 ← r2*5 */

Je kan ook zoiets doen met sub

sub r1, r2, r2, LSL #3  /* r1 ← r2 - (r2*8) equivalent to r1 ← r2*(-7)

Arm komt met een handige rsb functie (reverse subtract) instructie, deze doet het omgekeerde van de sub instructie

rsb r1, r2, r2, LSL #3      /* r1 ← (r2*8) - r2 equivalent to r1 ← r2*7 */

Een voorbeeld:

* Complicated way to multiply the initial value of r1 by 42 = 7*3*2 */
rsb r1, r1, r1, LSL #3  /* r1 ← (r1*8) - r1 equivalent to r1 ← 7*r1 */
add r1, r1, r1, LSL #1  /* r1 ← r1 + (2*r1) equivalent to r1 ← 3*r1 */
add r1, r1, r1          /* r1 ← r1 + r1     equivalent to r1 ← 2*r1 */

Je zult je afvragen waarom we deze functies willen gebruiken, maar omdat de standaard vermenigvuldigingsinstructie veel meer werk is voor de cpu, dus langer duurt, is het voor bepaalde gevallen handig (zeker als het kleinere bewerkingen zijn) om het zo te doen.

Rotaties zijn minder handig dan shifts in het werkelijke gebruik. Deze zijn dan ook vooral gebruikt voor het versleutelen van bits. ARM heeft geen functie om naar links te roteren, maar we kunnen wel iets anders doen:

/* Assume r1 is 0x12345678 */
mov r1, r1, ROR #1   /* r1 ← r1 ror 1. This is r1 ← 0x91a2b3c */
mov r1, r1, ROR #31  /* r1 ← r1 ror 31. This is r1 ← 0x12345678 */