OpenSSH

Hvad er SSH

SSH (Secure SHell) er en protokol der giver krypteret og sikker adgang til andre maskiner over netværk. Det som OpenSSH tilbyder er:

I denne guide vil der bliver gennemgået følgende:

  • OpenSSH er opensource. Koden ligger tilgængelig - for alle
  • Krypteret kommunikationen allerede før brugernavn og kodeord er anvendt.
  • Stærke godkendelsesprocedurer (Strong authentication) der bl.a. forhindrer IP- og DNS-spoofing - ved at det både er bruger og netværksenhed der anvendes til autentifikation..

Indhold

I dette materiale vil følgende blive gennemgået.

  1. Noget om sikkerhed
  2. SSH adgang ved hjælp af password
  3. SSH adgang ved hjælp af nøglefiler
  4. Kopiering af filer ved hjælp af SSH
  5. Kommandoer ved hjælp af SSH

Denne guide

Guiden tager udgangspunkt i to Linux computere på samme private netværk.

Computer 1 Computer 2
IP 192.168.0.52 192.168.0.61
Rolle SSH-server* SSH-klient
CIDR (netmaske) /24 (225.225.225.0) /24 (225.225.225.0)
Computernavn tj-Virtualbox tj-desktop

* SSH-server betyder at andre skal kunne tilgå denne maskine ved hjælp af SSH.

Du kan finde dine computeres IP-adresser med kommandoen IP

ip address

IP-adressen er markeret med rødt

tj@tj-VirtualBox:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:4c:dc:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.52/24 brd 192.168.0.255 scope global dynamic enp0s3
       valid_lft 3479sec preferred_lft 3479sec
    inet6 fe80::e1f9:b5a9:f659:fb46/64 scope link 
       valid_lft forever preferred_lft forever

SSH-klienter

Anvender du windows kan jeg på varmeste anbefale dig at installere Windows subsystem for Linux

Installation

Normalt vil man sørge for at OpenSSH-serveren er installeret fra start, men det skal tilvælges. Har du ikke gjort det kan du installere det med følgende kommando:

sudo apt-get install openssh-server -y

Vi tester om det virker ved at SSH fra tj-desktop til tj-Virtualbox (192.168.0.52), med kommandoen:

ssh tj@192.168.0.52

Kommandoen fortæller at vi skal SSH til brugeren tj på (@) 192.168.0.52 (maskinens IP-adresse).

Vi tester:

tj@tj-desktop:~$ ssh tj@192.168.0.52
The authenticity of host '192.168.0.52 (192.168.0.52)' can't be established.
ECDSA key fingerprint is SHA256:OCDOHsbLATzhobmq/BcaFHLHQDvATBweP4Rneo4CNAw.
Are you sure you want to continue connecting (yes/no)? 

Første gang vi skal skabe forbindelse spørger SSH om vi er sikre. Du skal skrive yes, hvorefter du bliver spurgt om password til brugeren tj på SSH-serveren.

tj@tj-desktop:~$ ssh tj@192.168.0.52
The authenticity of host '192.168.0.52 (192.168.0.52)' can't be established.
ECDSA key fingerprint is SHA256:OCDOHsbLATzhobmq/BcaFHLHQDvATBweP4Rneo4CNAw.
Are you sure you want to continue connecting (yes/no)? 
Warning: Permanently added '192.168.0.52' (ECDSA) to the list of known hosts.
tj@192.168.0.52's password: 
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.8.0-36-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 pakker kan opdateres.
0 opdateringer er sikkerhedsopdateringer.


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

tj@tj-Virtualbox:~$

Læg mærke til at du starter med at være på tj-desktop, men nu er på tj-Virtualbox

Du logger af med kommandoen exit

tj@tj-Virtualbox:~$ exit
log ud
Connection to 192.168.0.52 closed.
tj@tj-desktop:~$

Basale ændringer

Her vil vi vise hvordan vi kan lave de mest basale sikkerheds ændringer. Du bør som minimum ændre dem med røde stjerner.

  1. Fjern muligheden for root-login*
  2. Ændring af portnummer (fra 22 -> 222)*
  3. Specifier tilladte brugere
  4. Velkomst hilsen
  5. Hold liv i forbindelsen*

Alle ændringer herunder skal laves i filen /etc/ssh/sshd_config på SSH-serveren (192.168.0.52).

Åbn filen med nano:

sudo nano /etc/ssh/sshd_config

Fjern root-login

Root bør ikke have adgang til at logge på over SSH, da det giver evt. hackere direkte adgang til systemet. Skal en bruger kunne udføre administrationsarbejde på skal det være rettigheder der er givet lokalt på fjernmaskinen.

Ændr:

PermitRootLogin prohibit-password

til

PermitRootLogin no

Genindlæs konfigurationsfilerne, så dine ændringer slår igennem.

sudo service ssh reload

Ændring af portnummer

Ved at ændre portnummeret gør man det sværere for hackere at bryde ind. Derfor ændrer vi port-nummeret.

Som standard er OpenSSH sat til port 22. I mange guides ændres det til 222, hvilket reelt må anses for en lige så dårlig ide. Der er i alt 16 bit numre (2¹⁶ = 65536) så du kan teoretisk vælge et tal mellem 1 og 65536. Visse numre er dog afsat til konkrete protokoller (se liste her).

Ændr # What ports, IPs and protocols we listen for

# What ports, IPs and protocols we listen for
Port 22 ← Ændr dette tal til 222

Genstart ssh og test ved at logge ind igen med det nye portnummer.

sudo service ssh reload

Test

Hvis vi nu prøver at logge ind som før sker der følgende:

tj@tj-desktop:~$ ssh tj@192.168.0.52
ssh: connect to host 192.168.0.52 port 22: Connection refused
tj@tj-desktop:~$

Det skyldes at vi har ændret portnummeret, så det ikke mere er standardporten 22. Vi skal ændre vores kommando, så vi med -p angiver portnummeret:

ssh -p 222 tj@192.168.0.52
tj@tj-desktop:~$ ssh -p 222 tj@192.168.0.52
tj@192.168.0.52's password: 
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.8.0-36-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 pakker kan opdateres.
0 opdateringer er sikkerhedsopdateringer.

Last login: Sun May 28 12:31:22 2017 from 192.168.0.61

tj@tj-Virtualbox:~$

Tilladte brugere

En anden effektiv måde at begrænse brugerne på systemer er, at indføre en positiv- eller negativliste over brugere. Tilføj linierne AllowUsers eller DenyUsers i bunden af filen. Hvilen man anvender må være en overvejelse over de brugere man har. Er der få der skal have adgang vil AllowUsers være simplest at administrere. Er der få der ikke skal have vil det være lettest at anvende DenyUsers.

Tilføj de brugere der må anvende SSH til Allowusers f.eks:

Allowusers thoj anne

Tilføj de brugere der ikke må anvende SSH til DenyUsers f.eks:

Denyusers wipe asti

Du kan senere prøve at sætte dig selv på positiv og negativlisterne og teste det.

Genindlæs konfigurationsfilerne, så dine ændringer slår igennem.

sudo service ssh reload

Velkomst hilsen

Hvis du vil have at brugeren får nogle informationer ved login, kan det gøres gennem filen /etc/issue.net. For at gøre det skal du fjerne hash foran linien #Banner /etc/issue.net i konfigurationsfilen /etc/ssh/sshd_config.

Vær opmærksom på at tegntabellen er begrænset (ASCII), så ingen æ, ø og å

Genindlæse konfigurationsfilerne, så dine ændringer slår igennem.

sudo service ssh reload

Nogle guides foreslår at man laver en advarsel om at misbrug vil blive meldt til myndighederne, ligesom når man skal se en film. Jeg tvivler på at det virker, så jeg anvender blot: Behave!.

Rediger /etc/issue.net. Skriv f.eks:


**************************************************
***                                            ***
***    Welcome to 192.168.0.51/24 - Behave!    ***
***                                            ***
**************************************************

Du skal ikke genindlæse konfigurationsfilerne her, da denne fil bliver hentet direkte af SSH. Nu vil enhver der logger ind ved hjælp af SSH på serveren se følgende:

tj@tj-desktop:~$ ssh -p 222 tj@192.168.0.52

**************************************************
***                                            ***
***    Welcome to 192.168.0.51/24 - Behave!    ***
***                                            ***
**************************************************

tj@192.168.0.52's password:

Hvis du ønsker at lave noget acscii art kan du anvender banner, figlet eller toilet til at lave dine værker. Alle tre programmer skal installeres særskilt. Læs mere her: http://askubuntu.com/questions/282715/how-can-i-make-ascii-banners-from-the-command-line.

tj@tj-Virtualbox:~$ banner Behave!
######                                            ###
#     #  ######  #    #    ##    #    #  ######   ###
#     #  #       #    #   #  #   #    #  #        ###
######   #####   ######  #    #  #    #  #####     #
#     #  #       #    #  ######  #    #  #
#     #  #       #    #  #    #   #  #   #        ###
######   ######  #    #  #    #    ##    ######   ###

Hold liv i forbindelsen

SSH serveren forventer at der er aktivitet på forbindelsen, og hvis den udebliver afsluttes forbindelsen. Da det er noget klienten skal udføre skal der ændres/tilføjes i /etc/ssh/ssh_config. Tilføj følgende i afslutningen af filen, så "vækkes" forbindelsen hvert 20' sekund.

ServerAliveInterval 20

På den måde vil din forbindelse blive fornyet hver 20 sekund

Nøglefiler

Nøglefiler hæver sikkerhedsniveauet på SSH adgang betragteligt. I stedet for at verificere brugeren ud fra et indtastet password, så bliver "genkender" SSH-serveren brugeren ud fra om to filer passer sammen.

Disse filer er som standard 2048-bit, hvilket svarer til 2048 0'er og 1-taller, men kan også sættes til 2096-bit, hvis man er lidt ekstra paranoid. Hvorom alt er - de er langt mere sikre end "menneske"-kodeord.

Hele processen foregår i 4 trin:

  1. Konfigurer SSH så man kan logge ind med nøglefilerne (SSH-server)
  2. Opret en offentlig og en privat nøgle på din klient (SSH-klient)
  3. Tilføj din nøgle til din konto på SSH-værten (SSH-klient)
  4. Fjern muligheden for at logge på ved hjælp af passwords (SSH-server)

Sikkerheden opnås det ovenstående ved, at brugeren bliver "trusted". Så længe SSH-brugeren har sine credentials har han adgang til serveren. Vi vil her oprette nøgler til en bruger, kopiere dem over på serveren og herefter fjerne muligheden for at logge på serveren ved hjælp af passwords.

Konfigurer SSH-serveren

Rediger /etc/ssh/sshd_config på SSH-serveren.

Fjern # foran AuthorizedKeysFile

AuthorizedKeysFile     %h/.ssh/authorized_keys

Genindlæse konfigurationsfilerne, så dine ændringer slår igennem.

sudo service ssh reload

Opret nøgler på klienten

Alle SSH nøgler skal lægges i mappen ~/.ssh. Så først tjekker vi om mappen findes.

ls -al ~ | grep ssh
tj@tj-VirtualBox:~$ ls -al ~ | grep ssh
drwx------  2 tj   tj    4096 apr 12 14:51 .ssh

Hvis mappen ikke findes oprettes den på følgende måde:

mkdir ~/.ssh chmod 700 ~/.ssh

Opret nøglen med kommandoen:

ssh-keygen -t rsa

Vær opmærksom på at du ikke kan se din indtastning ved "passfrase". Standard krypteringen er sat til 2048 bit, men du kan sætte den til 4096 bit ved at sætte -b 4096 bagerst i kommandoen.

Du får også muligheden for at indtaste et kodeord passphrase. Dette kodeord gælder kun lokalt og bliver aldrig sendt over nettet. Det er designet til at beskytte din nøgle på din computer. Så hvis du mister din computer har du tid og mulighed for at lave de nødvendige ændringer på serveren, så nøglefilen bliver ugyldig.

tj@tj-desktop:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tj/.ssh/id_rsa):   ← Tast Enter
Enter passphrase (empty for no passphrase): ← indtast kodeord
Enter same passphrase again: ← indtast kodeord igen
Your identification has been saved in /home/tj/.ssh/id_rsa.
Your public key has been saved in /home/tj/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FQwQYpdm71A87M01/8eumQ382UXEU96l7XJR1aAeMJc tj@tj-desktop
The key's randomart image is:
+---[RSA 2048]----+
|    o +*.o+ ....B|
|   . o+ = .=E. =*|
|     o + +..oo.o*|
|      . o.o. ..oo|
|       oS   . .o+|
|        .    . ++|
|              o.o|
|               *=|
|              +o+|
+----[SHA256]-----+
tj@tj-desktop:~$

Tjek at filerne er blevet oprettet

tj@tj-desktop:~$ ls -al ~/.ssh
totalt 20
drwx------  2 tj tj 4096 maj 29 00:29 .
drwxr-xr-x 45 tj tj 4096 maj 29 00:18 ..
-rw-------  1 tj tj 1766 maj 29 00:29 id_rsa
-rw-r--r--  1 tj tj  395 maj 29 00:29 id_rsa.pub
-rw-r--r--  1 tj tj  444 maj 28 12:03 known_hosts

Registrer din nøglefil på serveren

Registrer den offentlige nøgle på din bruger på serveren:

ssh-copy-id tj@192.168.0.52 -p 222
tj@tj-desktop:~$ ssh-copy-id tj@192.168.0.52 -p 222
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

**************************************************
***                                            ***
***    Welcome to 192.168.0.51/24 - Behave!    ***
***                                            ***
**************************************************

tj@192.168.0.52's password: 

Efter du har indtastet dit password får du følgende output.

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh -p '222' 'tj@192.168.0.52'"
and check to make sure that only the key(s) you wanted were added.

tj@tj-VirtualBox:~$

Læg mærke til at du ikke er logget ind på serveren, men stadig er på din lokale maskine. Vi har kun overført vores offentlige nøgle. Vi logger ind igen:

ssh tj@192.168.0.52 -p 222
tj@tj-VirtualBox:~$ ssh thoj@10.0.2.10 -p 222

***************************************************
***                                             ***
***  Welcome to mainsrv 10.0.2.10/24 - Behave!  ***
***                                             ***
***************************************************

Her stopper programmet for at du kan bekræftige den "passphrase" du lavede din nøgle med.

Hvis du tilgår serveren fra en Ubuntu klient, så vil du få nedestående vindue frem. Det skyldes at GUI'en anvender et program til at administrere dine nøgler på systemet. Nøgleringskoden er den samme kode som du angav, da du oprettede SSH nøglen.

Ved at aktivere "Lås automatisk denne nøgle ..." gemmer din computer kodeordet til din SSH nøgle. Når du efterfølgende anvender SSH til denne server vil du ikke blive spurgt om dit password, men på en GUI kan du blive afkrævet din kode til "nøgleringsprogrammet".

tj@tj-desktop:~$ ssh tj@192.168.0.52 -p 222

**************************************************
***                                            ***
***    Welcome to 192.168.0.51/24 - Behave!    ***
***                                            ***
**************************************************

Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.8.0-36-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 pakker kan opdateres.
0 opdateringer er sikkerhedsopdateringer.

Last login: Sun May 28 12:38:43 2017 from 192.168.0.61

tj@tj-VirtualBox:~$ 

Fremover logger du ind ved hjælp af dine nøglefiler.

Fjern password adgang

Når SSH-serveren har fået tilføjet alle de offentlige nøgler den skal bruge, kan vi låse den. Det gør vi ved at redigere i filen /etc/ssh/sshd_config

sudo nano /etc/ssh/sshd_config

Ændr:

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

til ...

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no 

Genindlæse konfigurationsfilerne, så dine ændringer slår igennem.

sudo service ssh reload

Filkopiering

Til at kopiere anvender vi scp - Secure CoPy. Programmet fungerer på følgende måde:

scp *Kildefil* *Destinationsfil*

Den lokale fil angives som normalt f.eks. ~/testfil. Fjernfilen adresseres som ovenfor ved ssh, blot med den undtagelse at det skal være -P til at angive portnummeret:*brugernavn*@*IP*:*filnavn* -P 222.

Hvis jeg f.eks. vil kopiere filen testfil over til en fjerncomputeren med port 222:

scp -P 222 ~/testfil thoj@10.0.2.10:/home/thoj
thoj@thoj-VirtualBox:~$ scp -P 222 ~/testfil thoj@10.0.2.10:/home/thoj

*******************************************************
***                                                 ***
***    Welcome to mainsrv 10.0.2.10/24 - Behave!    ***
***                                                 ***
*******************************************************

testfil                                       100%    0     0.0KB/s   00:00    
thoj@thoj-VirtualBox:~$ 

Kommandoer

Man kan sende kommandoer (tekststrenge) med SSH ved at tilføje dem i anførselstegn f.eks.

ssh -p 222 thoj@10.0.2.10 "touch testfil1"
thoj@thoj-VirtualBox:~$ ssh -p 222 thoj@10.0.2.10 "touch testfil1"

*******************************************************
***                                                 ***
***    Welcome to mainsrv 10.0.2.10/24 - Behave!    ***
***                                                 ***
*******************************************************

thoj@thoj-VirtualBox:~$

Læg mærke til at der ikke kommer noget output fra serveren, men at du vender tilbage til din egen kommandolinie. Det eneste "tegn" der er på at du faktisk har haft kontakt med serveren er banneret.

Hvis en kommando har et output vil det blive vist før du vender tilbage din egen kommandolinie:

ssh -p 222 thoj@10.0.2.10 "ls -al | grep testfil"
thoj@thoj-VirtualBox:~$ ssh -p 222 thoj@10.0.2.10 "ls -al | grep testfil"

***************************************************
***                                             ***
***  Welcome to mainsrv 10.0.2.10/24 - Behave!  ***
***                                             ***
***************************************************

-rw-rw-r-- 1 thoj thoj    0 okt  4 20:02 testfil
-rw-rw-r-- 1 thoj thoj    0 okt  4 20:19 testfil1
thoj@thoj-VirtualBox:~$

Superbruger kommandoer

Her overfor har vi kun arbejdet med brugerens egne kommandoer, men man kan have brug for at sende sudo kommandoer afsted. Lad os prøve at oprette brugeren test1 på serveren:

thoj@thoj-VirtualBox:~$ ssh -p 222 thoj@10.0.2.10 "sudo adduser test1"

***************************************************
***                                             ***
***  Welcome to mainsrv 10.0.2.10/24 - Behave!  ***
***                                             ***
***************************************************

sudo: ingen tty til stede og intet askpass-program angivet ← Fejlmeddelse
thoj@thoj-VirtualBox:~$ 

Hvis kommandoen kræver at brugeren skal indtaste noget (f.eks. et password) skal man sætte -t på, for at SSH kan åbne en tty (teletypewriter) eller i daglig tale en kommandoprompt :

ssh -t -p 222 thoj@10.0.2.10 "sudo adduser test1"
thoj@thoj-VirtualBox:~$ ssh -t -p 222 thoj@10.0.2.10 "sudo adduser test1"

*******************************************************
***                                                 ***
***    Welcome to mainsrv 10.0.2.10/24 - Behave!    ***
***                                                 ***
*******************************************************

[sudo] adgangskode for thoj: 
Tilføjer bruger »test1«...
Tilføjer ny gruppe »test1« (1001)...
Tilføjer ny bruger »test1« (1001) med gruppe »test1«...
Opretter hjemmemappe »/home/test1«...
Kopierer filer fra »/etc/skel«...
Indtast ny UNIX-adgangskode: 
Genindtast ny UNIX-adgangskode: 
passwd: password updated successfully
Changing the user information for test1
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Er informationerne korrekte? [J/n] 
Connection to 10.0.2.10 closed.
thoj@thoj-VirtualBox:~$

Generelt bør man ikke udføre superbruger kommandoer på denne måde. Der bør man oprette en ren SSH forbindelse til serveren. Men det kan være meget anvendeligt i scripts.

Drevmontering

Installer SSHFS

Installer med kommandoen:

sudo apt-get install sshfs -y

Tilføj din bruger til fuse gruppen

Vi vil oprette en mappe på SSH-serveren med navnet ssh_drive. Denne mappe biver så monteret lokalt i vores homedirectory i en mappe ved samme navn

Oprette mapper

Opret lokal mappe

mkdir ~/ssh_drive

Opret fjernmappe og kontroller at den er oprettet

ssh -p 222 thoj@10.0.2.10 "mkdir ~/ssh_drive" ssh -p 222 thoj@10.0.2.10 "ls -al ~ | grep ssh_drive"
thoj@thoj-VirtualBox:~$ ssh -p 222 thoj@10.0.2.10 "ls -al ~ | grep ssh_drive"

*******************************************************
***                                                 ***
***    Welcome to mainsrv 10.0.2.10/24 - Behave!    ***
***                                                 ***
*******************************************************

drwxrwxr-x 2 thoj thoj 4096 maj 29 08:53 ssh_drive

Monter drevet ved hjælp af SSHFS

Brug nedestående kommando

sshfs -p 222 thoj@10.0.2.10:/home/thoj/ssh_drive ~/ssh_drive

Læg mærke til at man ikke kan anvende ~ til at betegne hjemmemappen på fjernsystemet. Det skal gøres med den fulde sti (/home/thoj/ssh_drive)

Tjek at drevet er monteret:

df | grep ssh_drive
thoj@thoj-VirtualBox:~$ df | grep ssh_drive
thoj@10.0.2.10:/home/thoj/ssh_drive  19092180    45136 18054176    1% /home/thoj/ssh_drive
thoj@thoj-VirtualBox:~$ 

Drevet afmonteres med:

fusermount -u ~/ssh_drive

Læs mere

SSH/OpenSSH/Configuring https://help.ubuntu.com/community/SSH/OpenSSH/Configuring

SSH/OpenSSH/keys https://help.ubuntu.com/community/SSH/OpenSSH/Keys

Proper way to sudo over SSH http://stackoverflow.com/questions/10310299/proper-way-to-sudo-over-ssh

SSHFS https://help.ubuntu.com/community/SSHFS