Gestiunea Serviciilor de Rețea

Laborator 06 - Servicii de securitate

IMPORTANT Dacă un pachet nu este instalat iar un exercițiu face referire la acesta, instalați-l.

IMPORTANT Exercițiile din laborator vor utiliza atat mașina fizică cât și mașina virtuală

1. ssh, scp (1.5p)

  • Comenzi/concepte/fișiere
    • ssh
    • ssh-keygen
    • ssh-copy-id
    • nmap
    • scp

Tutorial

  • N/A

Exerciții

  • [01]. Deschideți un terminal cu drepturi de root pe mașina fizică. Folosind netstat, aflați dacă rulează un serviciu de ssh și portul pe care acesta ascultă. Dacă nu este instalat nici un server ssh, instalați-l. (Hint: man netstat, /listening, /numeric, /tcp, /program, sshd openssh-server).
Rezolvare
root@mjolnir:~# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      860/rpcbind     
tcp        0      0 0.0.0.0:37042           0.0.0.0:*               LISTEN      875/rpc.statd   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1659/sshd       
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1630/cupsd      
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1499/exim4      
tcp6       0      0 :::111                  :::*                    LISTEN      860/rpcbind     
tcp6       0      0 :::22                   :::*                    LISTEN      1659/sshd       
tcp6       0      0 ::1:631                 :::*                    LISTEN      1630/cupsd      
tcp6       0      0 ::1:25                  :::*                    LISTEN      1499/exim4      
tcp6       0      0 :::41249                :::*                    LISTEN      875/rpc.statd    

root@mjolnir:~# dpkg -l | grep openssh-server
ii  openssh-server                       1:5.9p1-1                         secure shell (SSH) server, for secure access from remote machines
  • [02]. Porniți mașina virtuală. Folosind ssh, conectați-vă de pe mașina fizică pe mașina virtuală folosind portul standard 22 și contul student. Deconectați-vă.
Rezolvare
student@mjolnir:~$ ssh student@heimdall.local
Linux heimdall 3.0.0-1-686-pae #1 SMP Sat Aug 27 16:41:03 UTC 2011 i686

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Tue Oct 18 19:15:23 2011 from mjolnir-4.local

student@heimdall:~$ logout
Connection to heimdall.local closed.
  • [03]. De pe mașina fizică (contul student) rulați pe mașina virtuală (contul root), în mod neinteractiv, două comenzi succesive (va trebui să folosiți o singură conexiune ssh pentru ambele comenzi, conexiune corespunzătoare unei singure comenzi ssh):
  • [11].a. prima comandă afișează conținutul fișierului /etc/hostname
  • [11].b. a doua comanda afișează numele utilizatorului curent
  • [11].c. Hint: man ssh, /command
Rezolvare
student@mjolnir:~$ ssh root@heimdall.local "cat /etc/hostname; whoami"
heimdall
root
  • [04]. Pe mașina fizică creați în directorul home al utilizatorului student fișierul student.mjolnir.txt care să conțină textul “student@mjolnir: file created”
Rezolvare
student@mjolnir:~$ echo "student@mjolnir: file created" > student.mjolnir.txt
  • [05]. Copiați, folosind scp, fișierul student.mjolnir.txt de pe mașina fizică pe mașina virtuală în directorul home al utilizatorului root. (Hint: man scp)
Rezolvare
student@mjolnir:~$ scp student.mjolnir.txt root@heimdall.local:
student.mjolnir.txt                           100%   30     0.0KB/s   00:00
  • [06]. Conectați-vă pe mașina virtuală folosind contul de root de pe aceasta și:
  • [06].a. modificați numele fișierului student.mjolnir.txt în root.heimdall.txt
  • [06].b. adăugați în fișierul root.heimdall.txt o a doua linie cu textul “root@heimdall: file updated”
  • [06].c. deconectați-vă de pe mașina virtuală
Rezolvare
root@heimdall:~# mv student.mjolnir.txt root.heimdall.txt

root@heimdall:~# echo "root@heimdall: file updated" >> root.heimdall.txt 
  • [07]. Fiind conectați pe mașina fizică, copiați fișierul root.heimdall.txt din directorul home al utilizatorului root de pe mașina virtuală în directorul home al utilizatorului student de pe mașina fizică. Afișați conținutul fișierului copiat.
Rezolvare
student@mjolnir:~$ scp root@heimdall.local:root.heimdall.txt .
root.heimdall.txt                             100%   58     0.1KB/s   00:00    

student@mjolnir:~$ cat root.heimdall.txt 
student@mjolnir: file created
root@heimdall: file updated
  • [08]. Adăugați pe mașina virtuală utilizatorul nrush cu parola gsr (Hint: useradd, groupadd)
Rezolvare
root@heimdall:~# groupadd nrush

root@heimdall:~# useradd -d /home/nrush -m -g nrush -s /bin/bash nrush

root@heimdall:~# echo "nrush:gsr" | chpasswd
  • [09]. Adăugați pe mașina fizica utilizatorul eyoung cu parola gsr (Hint: useradd, groupadd)
Rezolvare
root@mjolnir:~# groupadd eyoung

root@mjolnir:~# useradd -d /home/eyoung -m -g eyoung -s /bin/bash eyoung

root@mjolnir:~# echo "eyoung:gsr" | chpasswd
  • [10]. Pe mașina fizică generați, în contul utilizatorului eyoung, o pereche de chei RSA fără passphrase. Salvați cheile în locația implicită (/home/eyoung/.ssh), cu numele implicit. (Hint: man ssh-keygen, /type)
Rezolvare
eyoung@mjolnir:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/eyoung/.ssh/id_rsa): 
Created directory '/home/eyoung/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/eyoung/.ssh/id_rsa.
Your public key has been saved in /home/eyoung/.ssh/id_rsa.pub.
The key fingerprint is:
1e:84:8c:3d:b1:1b:80:05:bb:12:0b:99:e4:17:2e:4a eyoung@mjolnir
The key's randomart image is:
+--[ RSA 2048]----+
| ..=o .          |
|ooo..= +         |
|=E.o. B .        |
|+oo.   =         |
|+ .   . S        |
| .     . .       |
|        .        |
|                 |
|                 |
+-----------------+
  • [11]. Copiați, de pe mașina fizică, cheia publica generată anterior pe mașina virtuală în home-ul utilizatorului nrush în așa fel încât eyoung@mjolnir să se poata conecta la nrush@heimdall fără a folosi parola lui nrush. (Hint: ssh-copy-id)
Rezolvare
eyoung@mjolnir:~$ ssh-copy-id nrush@heimdall.local
The authenticity of host 'heimdall.local (192.168.48.128)' can't be established.
ECDSA key fingerprint is e6:2e:9a:fa:b8:2c:8c:cb:08:85:0a:16:2a:82:30:07.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'heimdall.local,192.168.48.128' (ECDSA) to the list of known hosts.
nrush@heimdall.local's password: 
Now try logging into the machine, with "ssh 'nrush@heimdall.local'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

eyoung@mjolnir:~$ ssh nrush@heimdall.local
Linux heimdall 3.0.0-1-686-pae #1 SMP Sat Aug 27 16:41:03 UTC 2011 i686

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
nrush@heimdall:~$ logout
Connection to heimdall.local closed.
  • [12]. Pe mașina virtuală afișați conținutul directorului /home/nrush/.ssh. Ce fișiere conține?. Ce se află în fișierul authorized_keys ?
Rezolvare
nrush@heimdall:~$ ls -l .ssh/
total 4
-rw------- 1 nrush nrush 396 Nov 16 21:39 authorized_keys

nrush@heimdall:~$ cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4DkednxWkQatt7rTYbzdXzXmITYDXEcl425NPMunVhc8FiDDLMQZnuoCy8tOM6u3JV+wTjVQN4LXgTlprS4l6Hrc8BPMnOGNkfQy0RKXsilr3qVkIjwRK/Qs2mBOAZJJpY5Y3qFU+MBsVMRgW5Do0qR5ACS0gq14xNKwNV96WKxcWcHbP8acC+vsERrr60BqKrAOviKigF09yCgg5vzWoj3Dx2JsfydUqMo1Mhq7m0rtzrShOg0GTjMfHf4PBmtQGdOYvmAs9HHqD0yHPMWeSqGl9pIcrNb+/zJIrRP8FyvtFQjw0/O1eYypwwQEZt3OFiMiVNYagK9h3/0q9/3Z/ eyoung@mjolnir

Cheia publica a userului eyoung.

2. Configurari server ssh (2p)

  • Comenzi/concepte/fișiere
    • /etc/ssh/sshd_config

Tutorial

  • N/A

Exerciții

  • [01]. Pe mașina virtuală modificați fișierul de configurare al serverului ssh și modificați portul pe care ascultă sshd în 2854. (Hint: /etc/ssh/sshd_config)
Rezolvare
root@heimdall:~# cat /etc/ssh/sshd_config | grep Port
Port 2854
  • [02]. Pe mașina virtuală reporniți daemonul de ssh pentru ca schimbările anterioare să fie aplicate. (Hint: /etc/init.d/ssh)
Rezolvare
root@heimdall:~# /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.

root@heimdall:~# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1363/exim4      
tcp        0      0 0.0.0.0:2854            0.0.0.0:*               LISTEN      2047/sshd       
tcp        0      0 0.0.0.0:54118           0.0.0.0:*               LISTEN      751/rpc.statd   
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      736/rpcbind     
tcp6       0      0 ::1:25                  :::*                    LISTEN      1363/exim4      
tcp6       0      0 :::2854                 :::*                    LISTEN      2047/sshd       
tcp6       0      0 :::111                  :::*                    LISTEN      736/rpcbind     
tcp6       0      0 :::35092                :::*                    LISTEN      751/rpc.statd 
  • [03]. De pe mașina fizică scanați porturile active pe mașina virtuală (scanați porturile între 1-3096) (Hint: man nmap, /PORT SPECIFICATION, /determine service). Va trebui să instalați pachetul nmap. Pe ce port ascultă daemonul de ssh ?
Rezolvare
root@mjolnir:~# apt-get install nmap
[...]

root@mjolnir:~# nmap -sV -p1-3096 heimdall.local

Starting Nmap 5.21 ( http://nmap.org ) at 2011-11-16 21:44 EET
Nmap scan report for heimdall.local (192.168.48.128)
Host is up (0.00031s latency).
Not shown: 3094 closed ports
PORT     STATE SERVICE VERSION
111/tcp  open  rpcbind
2854/tcp open  ssh     OpenSSH 5.9p1 Debian 1 (protocol 2.0)
MAC Address: 00:0C:29:5A:9C:6C (VMware)
Service Info: OS: Linux

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.56 seconds
  • [04]. De pe mașina fizică conectați-vă pe mașina virtuală folosind contul student și noul port pe care ascultă sshd (Hint: man ssh). Deconectați-vă.
Rezolvare
student@mjolnir:~$ ssh student@heimdall.local -p 2854
Linux heimdall 3.0.0-1-686-pae #1 SMP Sat Aug 27 16:41:03 UTC 2011 i686

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Wed Nov 16 21:25:25 2011 from mjolnir.local

student@heimdall:~$ logout
Connection to heimdall.local closed.
  • [05]. Pe mașina virtuală modificați fișierul de configurare al serverului de SSH astfel încât să nu fie permisă autentificarea folosind parole (Hint: man sshd_config, /password).
Rezolvare
root@heimdall:~# cat /etc/ssh/sshd_config | grep PubkeyAuthentication
PubkeyAuthentication yes

root@heimdall:~# cat /etc/ssh/sshd_config | grep PasswordAuthentication | head -n 1
PasswordAuthentication no
  • [06]. Reporniți serverul de ssh și conectați-vă de pe student@mjolnir pe nrush@heimdall. S-a realizat autentificarea ?
Rezolvare
root@heimdall:~# /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.

student@mjolnir:~$ ssh nrush@heimdall.local -p 2854
Permission denied (publickey).
  • [07]. Pe mașina virtuală modificați fișierul de configurare al serverului de SSH astfel încât să nu fie permisă conectarea prin ssh în contul utilizatorului root (Hint: man sshd_config, /rootlogin). Testați.
Rezolvare
root@heimdall:~# cat /etc/ssh/sshd_config | grep PermitRootLogin | head -n 1
PermitRootLogin no

root@heimdall:~# /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.

student@mjolnir:~$ ssh root@heimdall.local -p 2854
Permission denied (publickey).
  • [08]. Pe mașina virtuală modificați fișierul de configurare al serverului de SSH astfel încât să fie permisă conectarea prin ssh doar în contul utilizatorului student. Reporniți serverul și testați folosind utilizatorii eyoung și nrush (Hint: man sshd_config, /user).
Rezolvare
root@heimdall:~# cat /etc/ssh/sshd_config | grep AllowUsers
AllowUsers student

root@heimdall:~# /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.

student@mjolnir:~$ ssh nrush@heimdall.local -p 2854
Permission denied (publickey).

eyoung@mjolnir:~$ ssh nrush@heimdall.local -p 2854
Permission denied (publickey).

student@mjolnir:~$ ssh student@heimdall.local -p 2854
Linux heimdall 3.0.0-1-686-pae #1 SMP Sat Aug 27 16:41:03 UTC 2011 i686

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Wed Nov 16 21:45:31 2011 from mjolnir.local

3. Tunelare (1p)

  • Comenzi/concepte/fișiere
    • N/A

Tutorial

  • N/A

Exerciții

  • [01]. Reconfigurați serverul ssh de pe mașina virtuală pentru a asculta conexiuni pe portul 22.
Rezolvare
root@heimdall:~# cat /etc/ssh/sshd_config | grep Port
Port 22

root@heimdall:~# /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.
  • [02]. Instalați în mașina virtuală serverul web apache (Hint: apt-cache search apache | grep ^apache).
Rezolvare
root@heimdall:~# apt-get update
[...]

root@heimdall:~# apt-get install apache2
[...]
  • [03]. Pe mașina virtuală instalați pachetul elinks.
Rezolvare
root@heimdall:~# apt-get install elinks
[...]
  • [04]. Pe mașina virtuală verificați că serverul apache rulează, folosind:
  • [04].a. netstat
Rezolvare
root@heimdall:~# netstat -tlnp | grep apache
tcp6       0      0 :::80                   :::*                    LISTEN      3095/apache2    
  • [04].b. comanda elinks 127.0.0.1
Rezolvare
root@heimdall:~# elinks 127.0.0.1

                                                             http://127.0.0.1/ 
                                   It works!                                   
                                                                               
   This is the default web page for this server.                               
                                                                               
   The web server software is running but no content has been added, yet.     
  • [05]. Editați conținutul fișierului /var/www/index.html și puteți în el textul: “heimdall web server is up”.
Rezolvare
root@heimdall:~# cat /var/www/index.html 
<html><body><h1>It works!</h1>
<p>heimdall web server is up.</p>
</body></html>
  • [06]. Verificați aplicarea modirficărilor anterioare folosind elinks
Rezolvare
root@heimdall:~# elinks 127.0.0.1

                                                             http://127.0.0.1/ 
                                   It works!                                   
                                                                               
   heimdall web server is up.
  • [07]. Pe mașina fizică creați un tunel SSH care să aibă un capat pe stația mjolnir pe portul 8181 și celălalt capăt pe stația heimdall pe portul 80. Testați funcționarea tunelului utilizând un browser și mergând la adresa localhost:8181.
Rezolvare
student@mjolnir:~$ ssh -f -N -L 8181:heimdall.local:80 student@heimdall.local

[se accesează http://localhost:8181 într-un browser]

4. PAM (2.5p)

  • Comenzi/concepte/fișiere
    • /etc/pam.d/common-password

Tutorial

  • N/A

Exerciții

Acest set de exerciții se desfășoară pe mașina virtuală

  • [01]. Instalați modulul de PAM cracklib (Hint: libpam-cracklib).
Rezolvare
root@heimdall:~# apt-get install libpam-cracklib
[...]
  • [02]. Configurați cracklib în așa fel încât (Hint: /etc/pam.d/common-password, man pam_cracklib, /examples):
  • [02].a. parolele utilizatorilor să aibă minim 12 caractere (Hint: man pam_cracklib, /minlen)
  • [02].b. parolele utilizatorilor să aibă minim 3 cifre (Hint: man pam_cracklib, /dcredit)
  • [02].c. parolele utilizatorilor să aibă minim 2 litere mari (Hint: man pam_cracklib, /ucredit)
  • [02].d. parolele utilizatorilor să aibă minim 4 litere mici (Hint: man pam_cracklib, /lcredit)
  • [02].e. parolele utilizatorilor să aibă minim 3 caractere speciale (Hint: man pam_cracklib, /ocredit)
Rezolvare
root@heimdall:~# cat /etc/pam.d/common-password | grep cracklib
password	requisite			pam_cracklib.so retry=3 difok=3 minlen=12 dcredit=-3 ucredit=-2 lcredit=-4 ocredit=-3
  • [03]. Autentificați-vă ca utilizator student și încercați să schimbați parola curentă cu:
  • [03].a. o parolă de 1 caracter
  • [03].b. o parolă care să nu corespundă cerințelor de mai sus
  • [03].c. o parolă care să corespundă cerințelor de mai sus
Rezolvare
student@heimdall:~$ passwd
Changing password for student.
(current) UNIX password: 
New password: 
BAD PASSWORD: it is WAY too short
New password: 
BAD PASSWORD: is too simple
New password: 
Retype new password: 
passwd: password updated successfully
  • [04]. Instalați modulul de PAM mkhomedir (Hint: libpam-modules).
Rezolvare
root@heimdall:~# apt-get install libpam-modules
[...]
Rezolvare
root@heimdall:~# cat /etc/pam.d/common-account | grep session
session    required   pam_mkhomedir.so skel=/etc/skel/ umask=0022
  • [06].a. Adăugați utilizatorul jonas.quinn fără a îi crea un director home.
  • [06].b. Autentificați-vă ca jonas.quinn. A fost creat directorul home al acestuia ?
Rezolvare
root@heimdall:~# groupadd jonas.quinn

root@heimdall:~# useradd -d /home/jonas.quinn -g jonas.quinn -s /bin/bash jonas.quinn

root@heimdall:~# ls -l /home
total 8
drwxr-xr-x 3 nrush   nrush   4096 Nov 16 21:53 nrush
drwxr-xr-x 3 student student 4096 Oct 18 19:15 student

root@heimdall:~# su - jonas.quinn
Creating directory '/home/jonas.quinn'.

jonas.quinn@heimdall:~$ pwd
/home/jonas.quinn

jonas.quinn@heimdall:~$ logout

root@heimdall:~# ls -l /home
total 12
drwxr-xr-x 2 jonas.quinn jonas.quinn 4096 Nov 16 22:13 jonas.quinn
drwxr-xr-x 3 nrush       nrush       4096 Nov 16 21:53 nrush
drwxr-xr-x 3 student     student     4096 Oct 18 19:15 student

5. Criptarea datelor. GNU Privacy Guard (GPG) (3p)

  • Comenzi/concepte/fișiere
    • GPG, PGP
    • cheie publică, cheie secretă
    • criptare, decriptare
    • semnare, verificare
    • ASCII armor
    • keyring

Tutorial

  • Folosiți gpg --list-keys pentru a lista cheile GPG curente ale utilizatorului student.
    • Dacă utilizatorul nu are chei GPG create, va fi generat directorul ~/.gnupg.
Rezolvare
student@mjolnir:~$ gpg --list-keys
gpg: directory `/home/student/.gnupg' created
gpg: new configuration file `/home/student/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/student/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/student/.gnupg/pubring.gpg' created
gpg: /home/student/.gnupg/trustdb.gpg: trustdb created

Breviar

Operații uzuale cu chei GPG:

  • generarea de chei
gpg --gen-key
  • editare de chei
gpg --edit-key <user-id>
  • ștergere de chei
gpg --delete-keys <user-id>
gpg --delete-secret-keys <user-id>
gpg --delete-secret-and-public-keys <user-id>
  • listare chei
gpg --list-keys
gpg --list-public-keys
gpg --list-secret-keys
  • exportare chei
gpg --export --armor --output my.pub <keyid>
gpg --export-secret-keys ...
  • importare chei
gpg --import my.pub
  • criptare (folosind cheia publică)
gpg --encrypt -r "Gogu <gogu@gogu.com>" --output info.dat.enc info.dat
gpg --encrypt -r "Gogu <gogu@gogu.com>" --armor --output info-armor.dat.enc info.dat
  • decriptare (folosind cheia privată)
gpg --decrypt -r "Gogu <gogu@gogu.com>" --output info.dat.dec info.dat.enc
  • semnare (folosind cheia privată)
gpg --sign -r "Gogu <gogu@gogu.com>" info.dat
gpg --sign --armor -r "Gogu <gogu@gogu.com>" info.dat
  • verificare (folosind cheia publică)
gpg --verify -r "Gogu <gogu@gogu.com>" info.dat.gpg
gpg --verify -r "Gogu <gogu@gogu.com>" info.dat.asc

Exerciții

Acest set de exerciții se desfășoară pe mașina fizică

  • [01]. Creați utilizatorii locali laurentiu și mihai.
Rezolvare
root@mjolnir:~# groupadd laurentiu

root@mjolnir:~# useradd -d /home/laurentiu -m -g laurentiu -s /bin/bash laurentiu

root@mjolnir:~# echo "laurentiu:gsr" | chpasswd

root@mjolnir:~# groupadd mihai

root@mjolnir:~# useradd -d /home/mihai -m -g mihai -s /bin/bash mihai

root@mjolnir:~# echo "mihai:gsr" | chpasswd
  • [02]. Autentificat ca laurentiu:
  • [02].a. Generați o pereche de chei de criptare (prima opțiune la --gen-key) cu opțiunile implicite (2048 biți, cheia nu expiră, un nume/e-mail la alegere, un passphrase la alegere). (Hint: gpg --gen-key)
Rezolvare
laurentiu@mjolnir:~$ gpg --gen-key
gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: directory `/home/laurentiu/.gnupg' created
gpg: new configuration file `/home/laurentiu/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/laurentiu/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/laurentiu/.gnupg/secring.gpg' created
gpg: keyring `/home/laurentiu/.gnupg/pubring.gpg' created
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Laurentiu
Email address: laurentiu@gsr.cs.pub.ro
Comment: 
You selected this USER-ID:
    "Laurentiu <laurentiu@gsr.cs.pub.ro>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 59 more bytes)
+++++
....+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
.......+++++
....+++++
gpg: /home/laurentiu/.gnupg/trustdb.gpg: trustdb created
gpg: key 6F2EB1B5 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/6F2EB1B5 2011-11-16
      Key fingerprint = E465 241F FBE9 36A2 4E8E  4E0D E73F 2C5A 6F2E B1B5
uid                  Laurentiu <laurentiu@gsr.cs.pub.ro>
sub   2048R/2DFDA0A8 2011-11-16
  • [02].b. Afișați cheile disponibile. (Hint: gpg --list-keys)
Rezolvare
laurentiu@mjolnir:~$ gpg --list-keys
/home/laurentiu/.gnupg/pubring.gpg
----------------------------------
pub   2048R/6F2EB1B5 2011-11-16
uid                  Laurentiu <laurentiu@gsr.cs.pub.ro>
sub   2048R/2DFDA0A8 2011-11-16
  • [02].c. Exportați cheia publică generată anterior în format armor în cadrul fișierului laur.pub. (Hint: gpg --export)
Rezolvare
laurentiu@mjolnir:~$ gpg --export --armor --output laur.pub 6F2EB1B5

laurentiu@mjolnir:~$ ls -l
total 4
-rw-r--r-- 1 laurentiu laurentiu 1723 Nov 16 22:21 laur.pub
  • [03]. Autentificat ca mihai:
  • [03].a. Copiați fișierul laur.pub din home-ul utilizatorului laurentiu în home-ul propriu.
Rezolvare
mihai@mjolnir:~$ cp /home/laurentiu/laur.pub .
  • [03].b. Importați cheia publică a utilizatorului laurentiu.
Rezolvare
mihai@mjolnir:~$ gpg --import laur.pub 
gpg: directory `/home/mihai/.gnupg' created
gpg: new configuration file `/home/mihai/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/mihai/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/mihai/.gnupg/secring.gpg' created
gpg: keyring `/home/mihai/.gnupg/pubring.gpg' created
gpg: /home/mihai/.gnupg/trustdb.gpg: trustdb created
gpg: key 6F2EB1B5: public key "Laurentiu <laurentiu@gsr.cs.pub.ro>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
  • [03].c. Listați cheile GPG proprii utilizatorului mihai.
Rezolvare
mihai@merlin:~$ gpg --list-keys
mihai@mjolnir:~$ gpg --list-keys
/home/mihai/.gnupg/pubring.gpg
------------------------------
pub   2048R/6F2EB1B5 2011-11-16
uid                  Laurentiu <laurentiu@gsr.cs.pub.ro>
sub   2048R/2DFDA0A8 2011-11-16
  • [03].d. Folosiți dd pentru a genera fișierul gpg-test.dat cu dimensiunea de 1KB. Folosiți /dev/urandom pentru input.
Rezolvare
mihai@mjolnir:~$ dd if=/dev/urandom of=gpg-test.dat bs=1K count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 0.000195263 s, 5.2 MB/s
  • [03].e. Folosiți GPG pentru a cripta fișierul gpg-test.dat în fișierul de ieșire gpg-test.enc. Folosiți cheia/UID-ul utilizatorului laurentiu.
Rezolvare
mihai@mjolnir:~$ gpg --encrypt -r "Laurentiu <laurentiu@gsr.cs.pub.ro>" --output gpg-test.enc gpg-test.dat
gpg: 2DFDA0A8: There is no assurance this key belongs to the named user

pub  2048R/2DFDA0A8 2011-11-16 Laurentiu <laurentiu@gsr.cs.pub.ro>
 Primary key fingerprint: E465 241F FBE9 36A2 4E8E  4E0D E73F 2C5A 6F2E B1B5
      Subkey fingerprint: FFF4 0D0A 97E8 46D6 7625  AC3F 4EEA 38B4 2DFD A0A8

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) y

mihai@mjolnir:~$ ls -l
total 12
-rw-r--r-- 1 mihai mihai 1024 Nov 16 22:25 gpg-test.dat
-rw-r--r-- 1 mihai mihai 1373 Nov 16 22:25 gpg-test.enc
-rw-r--r-- 1 mihai mihai 1723 Nov 16 22:23 laur.pub
  • [03].f. Folosiți GPG pentru a cripta fișierul în format armor cu ieșirea în gpg-test-armor.enc. Folosiți cheia/UID-ul utilizatorului laurentiu.
Rezolvare
mihai@mjolnir:~$ gpg --encrypt -r "Laurentiu <laurentiu@gsr.cs.pub.ro>" --armor --output gpg-test-armor.enc gpg-test.dat
gpg: 2DFDA0A8: There is no assurance this key belongs to the named user

pub  2048R/2DFDA0A8 2011-11-16 Laurentiu <laurentiu@gsr.cs.pub.ro>
 Primary key fingerprint: E465 241F FBE9 36A2 4E8E  4E0D E73F 2C5A 6F2E B1B5
      Subkey fingerprint: FFF4 0D0A 97E8 46D6 7625  AC3F 4EEA 38B4 2DFD A0A8

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) y

mihai@mjolnir:~$ ls -l
total 16
-rw-r--r-- 1 mihai mihai 1957 Nov 16 22:26 gpg-test-armor.enc
-rw-r--r-- 1 mihai mihai 1024 Nov 16 22:25 gpg-test.dat
-rw-r--r-- 1 mihai mihai 1373 Nov 16 22:25 gpg-test.enc
-rw-r--r-- 1 mihai mihai 1723 Nov 16 22:23 laur.pub
  • [04]. Autentificat ca laurentiu:
  • [04].a. Copiați fișierele gpg-test.dat, gpg-test.enc și gpg-test-armor.enc din home-ul utilizatorului mihai.
Rezolvare
laurentiu@mjolnir:~$ cp /home/mihai/gpg-test* .
  • [04].b. Folosiți GPG pentru a decripta fișierul gpg-test.enc în fișierul de ieșire gpg-test.dec folosind cheia/UID-ul creat. Comparați (folosind diff sau cmp) fișierul gpg-test.dec și gpg-test.dat.
Rezolvare
laurentiu@mjolnir:~$ gpg --decrypt -r "Laurentiu <laurentiu@gsr.cs.pub.ro>" --output gpg-test.dec gpg-test.enc

You need a passphrase to unlock the secret key for
user: "Laurentiu <laurentiu@gsr.cs.pub.ro>"
2048-bit RSA key, ID 2DFDA0A8, created 2011-11-16 (main key ID 6F2EB1B5)

gpg: encrypted with 2048-bit RSA key, ID 2DFDA0A8, created 2011-11-16
      "Laurentiu <laurentiu@gsr.cs.pub.ro>"

laurentiu@mjolnir:~$ ls -l
total 20
-rw-r--r-- 1 laurentiu laurentiu 1957 Nov 16 22:27 gpg-test-armor.enc
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 16 22:27 gpg-test.dat
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 16 22:28 gpg-test.dec
-rw-r--r-- 1 laurentiu laurentiu 1373 Nov 16 22:27 gpg-test.enc
-rw-r--r-- 1 laurentiu laurentiu 1723 Nov 16 22:21 laur.pub

laurentiu@mjolnir:~$ diff gpg-test.dat gpg-test.dec

laurentiu@mjolnir:~$ cmp gpg-test.dat gpg-test.dec
  • [04].c. Executați pasul anterior pentru fișierul gpg-test-armor.enc cu ieșirea în fișierul gpg-test-armor.dec.
Rezolvare
laurentiu@mjolnir:~$ gpg --decrypt -r "Laurentiu <laurentiu@gsr.cs.pub.ro>" --armor --output gpg-test-armor.dec gpg-test-armor.enc

You need a passphrase to unlock the secret key for
user: "Laurentiu <laurentiu@gsr.cs.pub.ro>"
2048-bit RSA key, ID 2DFDA0A8, created 2011-11-16 (main key ID 6F2EB1B5)

gpg: encrypted with 2048-bit RSA key, ID 2DFDA0A8, created 2011-11-16
      "Laurentiu <laurentiu@gsr.cs.pub.ro>"

laurentiu@mjolnir:~$ ls -l
total 24
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 16 22:30 gpg-test-armor.dec
-rw-r--r-- 1 laurentiu laurentiu 1957 Nov 16 22:27 gpg-test-armor.enc
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 16 22:27 gpg-test.dat
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 16 22:28 gpg-test.dec
-rw-r--r-- 1 laurentiu laurentiu 1373 Nov 16 22:27 gpg-test.enc
-rw-r--r-- 1 laurentiu laurentiu 1723 Nov 16 22:21 laur.pub

laurentiu@mjolnir:~$ diff gpg-test-armor.dec gpg-test.dat

laurentiu@mjolnir:~$ cmp gpg-test-armor.dec gpg-test.dat
  • [04].d. Semnați fișierul gpg-test.dat în format armor folosind cheia/UID-ul creat. Fișierul de ieșire va fi gpg-test.dat.asc.
Rezolvare
laurentiu@mjolnir:~$ gpg --sign -r "Laurentiu <laurentiu@gsr.cs.pub.ro>" --armor --output gpg-test.dat.asc gpg-test.dat
gpg: WARNING: recipients (-r) given without using public key encryption

You need a passphrase to unlock the secret key for
user: "Laurentiu <laurentiu@gsr.cs.pub.ro>"
2048-bit RSA key, ID 6F2EB1B5, created 2011-11-16

laurentiu@merlin:~$ ls -l
total 28
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 17 22:19 gpg-test-armor.dec
-rw-r--r-- 1 laurentiu laurentiu 1957 Nov 17 22:15 gpg-test-armor.enc
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 17 22:15 gpg-test.dat
-rw-r--r-- 1 laurentiu laurentiu 1933 Nov 17 22:23 gpg-test.dat.asc
-rw-r--r-- 1 laurentiu laurentiu 1024 Nov 17 22:17 gpg-test.dec
-rw-r--r-- 1 laurentiu laurentiu 1373 Nov 17 22:15 gpg-test.enc
-rw-r--r-- 1 laurentiu laurentiu 1719 Nov 17 21:58 laur.pub
  • [05]. Autentificat ca mihai:
  • [05].a. Copiați fișierul gpg-test.dat.asc din home-ul utilizatorului laurentiu.
Rezolvare
mihai@mjolnir:~$ cp /home/laurentiu/gpg-test.dat.asc .
  • [05].b. Verificați fișierul de semnătură folosind cheia importată anterior.
Rezolvare
mihai@mjolnir:~$ gpg --verify -r "Laurentiu <laurentiu@gsr.cs.pub.ro>" --armor gpg-test.dat.asc
gpg: Signature made Wed 16 Nov 2011 10:31:09 PM EET using RSA key ID 6F2EB1B5
gpg: Good signature from "Laurentiu <laurentiu@gsr.cs.pub.ro>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: E465 241F FBE9 36A2 4E8E  4E0D E73F 2C5A 6F2E B1B5

6. Intrusion Prevention: Fail2ban (1p)

  • Comenzi/concepte/fișiere
    • /etc/fail2ban/jail.conf

Tutorial

  • N/A

Exerciții

  • [01]. Pe mașina virtuală instalați fail2ban.
Rezolvare
root@heimdall:~# apt-get install fail2ban
[...]
  • [02]. Pe mașina virtuală configurați fail2ban astfel încât (reporniți serviciul de fail2ban după realizarea configurărilor):
  • [02].a. să fie activ pentru autentificările încercate prin ssh
  • [02].b. să permită un număr maxim de 3 încercări
  • [02].c. să folosească un timp de ban de 300 de secunde
  • [02].d. Hint: /etc/fail2ban/jail.conf, bantime
Rezolvare
root@heimdall:~# cat /etc/fail2ban/jail.conf
[...]
[ssh]

enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 3
bantime  = 1200
[...]

root@heimdall:~# /etc/init.d/fail2ban restart
Restarting authentication failure monitor: fail2ban.
  • [03]. Pe mașina virtuală reconfigurați serverul de SSH astfel încât să fie permise autentificările pe bază de parolă. Eliminați restricția de autentificare doar în contul utilizatorului student.
Rezolvare
root@heimdall:~# cat /etc/ssh/sshd_config | grep PasswordAuthentication | head -n 1
PasswordAuthentication yes

root@heimdall:~# cat /etc/ssh/sshd_config | grep AllowUsers

root@heimdall:~# /etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.
  • [04]. De pe mașina fizică încercați să vă autentificați pe mașina virtuală prin ssh folosind contul nrush creat mai devreme. Introduceți de 3 ori la rând parola utilizatorului nrush in mod greșit.
  • [04].a. De ce credeți că s-a blocat conexiunea ssh după introducerea parolei a treia oară ?
Rezolvare
student@mjolnir:~$ ssh nrush@heimdall.local
nrush@heimdall.local's password: 
Permission denied, please try again.
nrush@heimdall.local's password: 
Permission denied, please try again.
nrush@heimdall.local's password: 
Permission denied (publickey,password).
  • [04]. Folosind ssh în mod verbose, încercați din nou să vă conectați de pe mașina fizică pe mașina virtuală folosind contul nrush. Ce observați ?
Rezolvare
student@mjolnir:~$ ssh nrush@heimdall.local -vvv
OpenSSH_5.9p1 Debian-1, OpenSSL 1.0.0e 6 Sep 2011
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to heimdall.local [192.168.48.128] port 22.
  • [05]. Conectați-vă la mașina virtuală în contul de root folosind interfața vmware. Afișați toate regulile iptables existente în acest moment. Hint: iptables -L.
Rezolvare
root@heimdall:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
fail2ban-ssh  tcp  --  anywhere             anywhere            multiport dports ssh 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain fail2ban-ssh (1 references)
target     prot opt source               destination         
DROP       all  --  mjolnir.local        anywhere            
RETURN     all  --  anywhere             anywhere 
  • [06]. Ștergeți din chain-ul fail2ban-ssh prima regulă care blochează accesul stației mjolnir.local. Hint: iptables -D fail2ban-ssh 1
Rezolvare
root@heimdall:~# iptables -D fail2ban-ssh 1
  • [07]. De pe mașina fizică încercați să vă autentificați din nou pe mașina virtuală folosind contul nrush. Introduceți parola în mod corespunzător.
Rezolvare
student@mjolnir:~$ ssh nrush@heimdall.local
nrush@heimdall.local's password: 
Linux heimdall 3.0.0-1-686-pae #1 SMP Sat Aug 27 16:41:03 UTC 2011 i686

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Nov 16 21:40:02 2011 from mjolnir.local

Bonus: sshfs, ssh-agent

  • [01]. Pe mașina virtuală instalați sshfs. Folosind sshfs, montați în directorul /tmp/student-home de pe mașina virtuală, directorul /home/student de pe mașina fizică. Creați un fișier numit “i-was-here” și demontați sshfs.
Rezolvare
root@heimdall:~# apt-get install sshfs
[...]

root@heimdall:~# mkdir /tmp/student-home

root@heimdall:~# sshfs student@mjolnir.local: /tmp/student-home/
The authenticity of host 'mjolnir.local (192.168.48.1)' can't be established.
ECDSA key fingerprint is 82:1f:77:71:74:c1:e7:98:ab:f0:a5:15:75:a9:cc:dc.
Are you sure you want to continue connecting (yes/no)? yes
student@mjolnir.local's password: 

root@heimdall:~# cd /tmp/student-home/

root@heimdall:/tmp/student-home# ls -l
total 48
drwxr-xr-x 1 student student 4096 Oct 18 17:17 Desktop
drwxr-xr-x 1 student student 4096 Oct 11 19:40 Documents
drwxr-xr-x 1 student student 4096 Oct 18 18:54 Downloads
drwxr-xr-x 1 student student 4096 Oct 11 19:40 Music
-rw-r--r-- 1 student student   80 Nov 16 21:59 out.html
drwxr-xr-x 1 student student 4096 Oct 11 19:40 Pictures
drwxr-xr-x 1 student student 4096 Oct 11 19:40 Public
-rw-r--r-- 1 student student   58 Nov 16 21:30 root.heimdall.txt
-rw-r--r-- 1 student student   30 Nov 16 21:27 student.mjolnir.txt
drwxr-xr-x 1 student student 4096 Oct 11 19:40 Templates
drwxr-xr-x 1 student student 4096 Oct 11 19:40 Videos
drwxr-xr-x 1 student student 4096 Oct 18 19:29 vmware

root@heimdall:/tmp/student-home# touch i-was-here

student@mjolnir:~$ ls -l
total 48
drwxr-xr-x 2 student student 4096 Oct 18 17:17 Desktop
drwxr-xr-x 2 student student 4096 Oct 11 19:40 Documents
drwxr-xr-x 2 student student 4096 Oct 18 18:54 Downloads
-rw-r--r-- 1 student student    0 Nov 16 23:16 i-was-here
drwxr-xr-x 2 student student 4096 Oct 11 19:40 Music
-rw-r--r-- 1 student student   80 Nov 16 21:59 out.html
drwxr-xr-x 2 student student 4096 Oct 11 19:40 Pictures
drwxr-xr-x 2 student student 4096 Oct 11 19:40 Public
-rw-r--r-- 1 student student   58 Nov 16 21:30 root.heimdall.txt
-rw-r--r-- 1 student student   30 Nov 16 21:27 student.mjolnir.txt
drwxr-xr-x 2 student student 4096 Oct 11 19:40 Templates
drwxr-xr-x 2 student student 4096 Oct 11 19:40 Videos
drwxr-xr-x 4 student student 4096 Oct 18 19:29 vmware

root@heimdall:/tmp/student-home# cd

root@heimdall:~# fusermount -z -u /tmp/student-home/
  • [02]. Pe mașina fizică generați, în contul utilizatorului student, o nouă pereche de chei RSA în /home/student/id.pass.rsa. Perechea de chei trebuie să aibă asociat un passphrase.
  • [02].a. adăugați cheia publică /home/student/id.pass.rsa.pub în contul utilizatorului nrush de pe mașina virtuală
  • [02].b. folosind ssh-agent permiteți autentificarea de pe student@mjolnir pe nrush@heimdall folosind cheile generate anterior, fără să fie introdus passphrase-ul
Rezolvare
student@mjolnir:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/student/.ssh/id_rsa): /home/student/.ssh/id.pass.rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/student/.ssh/id.pass.rsa.
Your public key has been saved in /home/student/.ssh/id.pass.rsa.pub.
The key fingerprint is:
59:f4:a8:9a:64:60:4e:22:a9:2c:62:86:1f:7a:7f:40 student@mjolnir
The key's randomart image is:
+--[ RSA 2048]----+
|          .      |
| .       . o     |
|o . +     o .    |
|+. =E.   +       |
|=+... o S        |
|=o ..o o         |
|. o  .o          |
| . .  .          |
|    ..           |
+-----------------+

student@mjolnir:~$ ls -l .ssh/
total 24
-rw-r--r-- 1 student student  397 Oct 12 15:55 authorized_keys
-rw------- 1 student student 1766 Nov 16 23:18 id.pass.rsa
-rw-r--r-- 1 student student  397 Nov 16 23:18 id.pass.rsa.pub
-rw------- 1 student student 1675 Oct 12 15:55 id_rsa
-rw-r--r-- 1 student student  397 Oct 12 15:55 id_rsa.pub
-rw-r--r-- 1 student student  444 Nov 16 21:23 known_hosts

student@mjolnir:~$ ssh-copy-id -i /home/student/.ssh/id.pass.rsa nrush@heimdall.local
nrush@heimdall.local's password: 
Now try logging into the machine, with "ssh 'nrush@heimdall.local'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.


student@mjolnir:~$ ssh-add /home/student/.ssh/id.pass.rsa
Enter passphrase for /home/student/.ssh/id.pass.rsa: 
Identity added: /home/student/.ssh/id.pass.rsa (/home/student/.ssh/id.pass.rsa)

student@mjolnir:~$ ssh nrush@heimdall.local
Linux heimdall 3.0.0-1-686-pae #1 SMP Sat Aug 27 16:41:03 UTC 2011 i686

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Nov 16 23:22:58 2011 from mjolnir.local
laboratoare/laborator-06.txt · Last modified: 2011/11/17 22:05 by george.milescu