2004.01_Loop-AES – szyfrowane systemy plików_[Bezpieczenstwo].pdf

(644 KB) Pobierz
332763707 UNPDF
bezpieczeństwo
Loop-AES – szyfrowane
systemy plików
komputera, zwłaszcza fizyczny, jest w stanie
poznać wszystkie tajemnice powierzone jego
dyskom twardym. Jak wobec tego zabezpie-
czyć się przed ujawnieniem poufnych danych firmy lub
prywatnych sekretów, np. w przypadku kradzieży notebo-
oka albo gdy dostęp do komputera mają osoby trzecie? Jest
na to rada.
Linux oferuje wiele mechanizmów ochrony danych
opartych na silnej kryptografii. Otwartość źródeł stanowi
gwarancję, że nikt nie zostawił w nich otwartej tylnej furtki.
To ważna zaleta. Nie bez znaczenia jest też możliwość
dostosowania konfiguracji do potrzeb użytkownika w stop-
niu znacznie większym niż w przypadku – często niezbyt
elastycznych – produktów komercyjnych.
W dalszej części artykułu przedstawię kilka modelo-
wych rozwiązań opartych na jednym z najwygodniejszych
narzędzi kryptograficznych w Linuksie – module jądra Loop-
AES z wbudowaną obsługą szyfrowania. W odróżnieniu od
takich programów, jak gpg , mcrypt lub ccat , nadających
się do szyfrowania pojedynczych plików lub archiwów,
Loop-AES pozwala na wygodne szyfrowanie dużych porcji
danych, np. całych partycji (zarówno podstawowych, jak
i logicznych) lub systemów plików utworzonych w zwy-
kłych plikach o niemal dowolnej wielkości. Dostęp do nich
uzyskujemy po wymagającym autoryzacji montowaniu za
pośrednictwem urządzenia loop . Do innych użytecznych
zastosowań modułu Loop-AES należą szyfrowanie partycji
wymiany ( swap ) oraz korzystanie z zabezpieczonych kryp-
tograficznie płyt CD.
Niewątpliwym atutem tego modułu jest stosunkowo
duża elastyczność i przenośność. Możemy go użyć w sys-
temach z jądrem z serii 2.0, 2.2, 2.4 oraz – choć czasami
nie bez kłopotów – 2.6. Nie ma przy tym znaczenia, czy
korzystamy z jądra dystybucyjnego czy samodzielnie zbu-
dowanego. Loop-AES nie wymaga także nakładania łat na
źródła jądra. Gdy obsługa urządzenia blokowego loopback
nie została wkompilowana w jądro lub sterownik tego urzą-
Rysunek 1. Strona NIST poświęcona AES
dzenia został umieszczony w module, obejdzie się nawet
bez jego rekonfiguracji i rekompilacji.
Praca z szyfrowanym systemem
plików
Z punktu widzenia użytkownika, praca z zaszyfrowanym
systemem plików – jeśli pominąć czynności związane z jego
przygotowaniem i montowaniem – nie różni się niczym od
pracy na zwykłej, niezabezpieczonej partycji. Proces szyfro-
wania danych jest "przezroczysty", odbywa się na poziomie
jądra i nie wymaga wykonywania dodatkowych czynno-
ści czy stosowania specjalnych narzędzi. Możemy więc
tworzyć lub usuwać katalogi i pliki przy użyciu zwykłych
poleceń systemowych ( touch , mkdir , rm itp.), zapisywać
w nich dowolne dane, przenosić je z innych, niezaszyfrowa-
nych partycji za pomocą standarowego polecenia cp albo
między panelami ulubionego menedżera plików. Dopiero
próba "podejrzenia" zawartości zabezpieczonej partycji po
odmontowaniu uświadomi nam, że wszystko to, co na niej
zapisaliśmy, prezentuje się jako zupełnie nieczytelny gąszcz
przypadkowych znaków.
O autorze:
Autor pracuje w Zakładzie Logiki i Semiotyki Uniwersytetu
Mikołaja Kopernika w Toruniu. Od kilku lat wykorzystuje
Linuksa, FreeBSD i Solaris w działalności zawodowej i poza-
zawodowej. Kontakt z autorem: autorzy@linux.com.pl.
30
styczeń 2004
Skarbimir Kwiatkowski
K ażdy, kto uzyska nieautoryzowany dostęp do
332763707.009.png 332763707.010.png
loop-aes
Co i jak szyfrować?
Zanim wybierzemy konkretny model zastosowania Loop-
AES , warto zastanowić się – biorąc pod uwagę różne
istotne okoliczności – nad szczegółami rozwiązania.
Jakie dane naprawdę potrzebują ochrony? Czy posiadamy
wolną część dysku, którą możemy przeznaczyć na party-
cję szyfrowaną, czy raczej zależy nam na zabezpieczeniu
partycji już istniejących i wykorzystywanych? Czy chcemy
mieć możliwość łatwego usuwania lub przenoszenia
całości zaszyfrowanych danych, np. na płytach CD? Czy
korzystamy z tej maszyny sami, czy wspólnie z innymi?
Ile spośród tych osób ma mieć dostęp do wrażliwych
danych? Czy wygodniej i bezpieczniej będzie podzielić
je na części dostępne z osobna dla każdego uprawnione-
go, czy może użyć wspólnej partycji chronionej hasłem
dostępu albo kluczami GnuPG ? Czy potrzebujemy szyfro-
wanej partycji wymiany?
Ochrona prywatności lub tajemnic firmy jest ważna,
ale starajmy się nie popadać w paranoję. Uczestnicy grup
dyskusyjnych czasem pytają: “czy mogę zaszyfrować całe
drzewo katalogów?”. Oczywiście można to zrobić, pyta-
Rysunek 2. Schemat działania algorytmu AES
nie tylko, czy rzeczywiście warto. Poufne dane zajmują na
ogół tylko pewną część dysku, reszta to m.in. powszech-
nie używane programy, których źródła są publicznie
dostępne. Szyfrując wszystko bez wyboru, najprawdopo-
dobniej zużyjemy niepotrzebnie część mocy obliczenio-
wej maszyny i przysporzymy sobie kłopotów związanych
z rekompilacją jądra, modyfikacją trybu uruchamiania
systemu itp. Z tego powodu odradzam ten pomysł. Uparci
eksperymentatorzy znajdą precyzyjną instrukcję w doku-
mentacji modułu Loop-AES .
AES
Moduł Loop-AES , autorstwa Fina Jariego Ruusu , implementuje
symetryczny szyfr blokowy Rijndael , który w 2000 r. został
wyłoniony w konkursie ogłoszonym przez National Institute of
Standards and Technology (NIST) jako nowy standard zaawan-
sowanej kryptografii. Z tego powodu Rijndael zwany jest najczę-
ściej po prostu AES ( Advanced Encryption Standard ).
Zwycięzca konkursu zastąpił wysłużony, zbyt powolny
i nie dość bezpieczny algorytm DES. Oprócz kryteriów tech-
nicznych, AES musiał spełnić warunki publicznej dostępności
specyfikacji, braku ograniczeń natury patentowo-licencyjnej
oraz zapewnić wysoką wydajność. W finałowej piątce, prócz
opracowanego przez Belgów Joana Daemen a i Vincenta Rijme-
na algorytmu Rijndael , znalazły się również algorytmy Serpent
i Twofish , stosowane w dodatkowych modułach z projektu
Loop-AES .
Algorytm AES użyty w module loop przetwarza niezaszyfro-
wany tekst na tekst zaszyfrowany o tej samej długości. Dane
szyfrowane są 128-, 192- lub 256-bitowym kluczem w 128-
bitowych blokach, co zapewnia bardzo silne rozproszenie,
a tym samym skuteczną ochronę przed rozszyfrowaniem (Ry-
sunek 2). Szyfrowanie bloków odbywa się w trybie CBC ( Cipher
Block Chaining ), a jako klucz służy skrót hasła podanego przez
użytkownika, obliczany funkcją skrótu SHA-256, SHA-384 lub
SHA-512.
Jak dotąd, nie są znane przypadki złamania AES. Atak
„siłowy”, polegający na sprawdzaniu wszystkich kluczy, jest
przy obecnych mocach obliczeniowych komputerów nieefek-
tywny, a możliwość ataku algebraicznego – dającego szansę
otrzymania rezultatów w rozsądnym czasie – stanowi w tej
chwili zaledwie przedmiot kontrowersji wśród specjalistów.
Zainteresowanym szczegółami polecam stronę domową
projektu Rijndael , a także stronę NIST, poświęconą tematyce
AES.
Przygotowanie narzędzi
Przed rozpoczęciem pracy z szyfrowanymi systemami
plików, musimy zaopatrzyć się w pliki źródłowe, które
posłużą do zbudowania niezbędnych binariów:
• źródła modułu Loop-AES ( loop-AES-latest.tar.bz2 );
Warto również zaopatrzyć się w Ciphers ( ciphers-
latest.tar.bz2 ), zawierające źródła dodatkowych modu-
łów kryptograficznych, współpracujących z Loop-AES
( loop_serpent.o , loop_twofish.o i loop_blowfish.o ),
oraz źródła pomocniczego narzędzia Aespipe ( aespi-
pe-latest.tar.bz2 ), służącego do szyfrowania danych
w potoku ( pipe ). Ten ostatni program przyda się
nam, gdy będziemy chcieli zaszyfrować już istniejącą
i wykorzystywaną partycję, na której przechowujemy
pliki wymagające ochrony. Aespipe i Ciphers stanowią
część tego samego projektu Loop-AES .
• źródła zestawu narzędzi Util-linux ( util-linux-2.12pre.
tar.bz2 );
Programy mount , umount , losetup , swapon , swapoff
muszą mieć zaimplementowaną obsługę kryptograficz-
ną, więc użyjemy odpowiednio połatanej wersji.
• źródła jądra lub co najmniej jego pliki nagłówkowe (w
wielu dystrybucjach dostępne w osobnych pakietach),
pliki nagłówkowe biblioteki glibc oraz kompilator
języka C ( gcc ).
www.linux.com.pl
31
332763707.011.png 332763707.012.png 332763707.001.png
bezpieczeństwo
block/loop.o , a następnie wydajemy polecenie depmod -a .
Powinno to umożliwić instalację Loop-AES.
Czas zbudować moduł. O ile pliki nagłówkowe jądra
są zlokalizowane w typowym miejscu ( /lib/modules/
`uname -r`/build , /usr/src/linux , /usr/src/linux-`uname
-r` lub /usr/src/kernel-source `uname -r` ), to po rozpa-
kowaniu archiwum wystarczy ograniczyć się do wyko-
nania polecenia make i zaktualizowania listy dostępnych
modułów:
tar jxvf loop-AES-latest.tar.bz2
cd loop-AES-v1.7e
su
make && depmod -a
Rysunek 3. Strona domowa projektu Loop-AES na serwerze
SourceForge
Jeśli lokalizacja źródeł jest inna, to komenda make wymaga
podania ścieżki do odpowiedniego katalogu: make
LINUX_SOURCE=/sciezka/do/katalogu/ze/zrodlami/jadra .
W katalogu /lib/modules/`uname -r` znajdziemy teraz nowy
podkatalog block , a w nim nowy plik loop.o .
Aby dodać moduły loop_serpent.o , loop_blowfish.o
i loop_twofish.o , w analogiczny sposób postępujemy
z archiwum ciphers-latest.tar.bz2 . Zyskamy w ten sposób
dodatkowe silne algorytmy Serpent , Blowfish i Twofish .
Każdy z nich może być używany z kluczem 128-, 192-
i 256-bitowym, a ponadto ostatni występuje również
w postaci Twofish160 .
Teraz przystępujemy do przygotowania narzędzi, które
pozwolą nam w pełni korzystać z nowego modułu (lub
modułów). Będziemy potrzebowali zmodyfikowanych pro-
gramów mount , umount i losetup , a także – jeśli planujemy
używać szyfrowanej partycji wymiany – swapon i swapoff .
Odpowiednia łata dołączona jest do archiwum loop-
AES-latest.tar.bz2 . W naszym przypadku jest to plik util-
linux2.12pre.diff . Przed instalacją warto zadbać o kopie
zapasowe. Możemy również, jeżeli np. zamierzamy ograni-
czyć się jedynie do testów, umieścić zbudowane programy
w innym katalogu. Pamiętajmy jednak, że skrypty startowe
systemu, o ile ich nie zmodyfikujemy, będą korzystały ze
starych wersji. Typową procedurę kompilacji i instalacji
potrzebnych narzędzi przedstawia Listing 1.
Przede wszystkim powinniśmy sprawdzić, czy używane
jądro systemu spełnia wspomniany wcześniej warunek, t.j.
nie posiada statycznie wkompilowanego urządzenia loop .
Jeśli konfigurowaliśmy je i kompilowaliśmy wcześniej,
wystarczy zajrzeć do pliku .config w katalogu ze źródłami.
Standardowe wersje jądra domyślnie nie włączają obsługi
loopback .
Jeżeli używamy jądra z dystrybucyjnego pakietu,
możemy poszukać jego konfiguracji (np. Debian umieszcza
stosowny plik z numerem jądra w katalogu /boot ) albo po
prostu spróbować załadować moduł loop i/lub zamontować
obraz dowolnej płyty CD z danymi.
Gdy wykonamy polecenie grep CONFIG_BLK_DEV_LOOP
/usr/src/linux/.config , odpowiedź " CONFIG_BLK_DEV_
LOOP is not set " oznacza, że możemy od razu zająć się
utworzeniem nowego modułu.
Gdy w konfiguracji znajdziemy " CONFIG_BLK_DEV_
LOOP=y ", to niestety będzie potrzebne nowe jądro syste-
mu. Po wydaniu polecenia make menuconfig , w katalogu
zawierającym źródła, w sekcji " Block devices " wyłączamy
opcję " Loopback device support ". W sekcji " Loadable module
support " zaznaczamy " Enable loadable module support ",
a dla wygody, choć nie jest to konieczne, " Kernel module
loader " (" CONFIG_KMOD=y ").
W przypadku, gdy jądro zostało wyposażone w ładowal-
ny moduł loop (" CONFIG_BLK_DEV_LOOP=m "), a z jakichś
powodów nie chcemy budować nowego jądra, możemy
spróbować obejść kłopot w mało elegancki, lecz skuteczny
sposób. Usuwamy lub kopiujemy w bezpieczne miejsce
istniejący moduł /lib/modules/`uname -r`/kernel/drivers/
Szyfrowanie partycji
Wreszcie nadeszła pora, aby wypróbować przygotowa-
ne oprogramowanie! Na początek przedstawię przykład
najbardziej oczywisty, a przy tym prosty. Wolną partycję
chcemy przeznaczyć na szyfrowane dane. Przyjmuję, że
partycja została już wcześniej założona, np. fdiskiem .
W pierwszym kroku przyłączamy partycję do urzą-
dzenia loop . Za pomocą flagi -e określamy szyfr (zamiast
AES256 może to być np. AES128 czy AES192 , a jeśli zbu-
dowaliśmy moduły z Ciphers , także np. serpent128 czy
twofish256 ). Nie musimy własnoręcznie ładować modułu
loop , gdyż zadba o to jądro systemu, o ile podczas kon-
figuracji zaznaczyliśmy " CONFIG_KMOD=y ". Natomiast
32
styczeń 2004
332763707.002.png 332763707.003.png
loop-aes
Rysunek 4. Zabezpieczenie dostępu do klucza AES szyfrem niesymetrycznym przy pomocy GnuPG
moduły loop_serpent czy loop_twofish powinniśmy
w razie potrzeby załadować poleceniem modprobe lub
insmod . Flaga -T informuje program, że ma dwukrotnie
pytać o hasło. Polecenie wygląda więc tak:
odpowiednio dostosować polecenia, wpisując /dev/loop/0 ,
/dev/loop/7 itp. Dodajmy, że domyślna liczba urządzeń
loop w systemie wynosi osiem. W razie potrzeby możemy
zwiększyć ją za pomocą mknod nawet do 256.
Program losetup nie pozwoli na użycie hasła krótszego
niż dwadzieścia znaków. To dużo, ale wybierzmy je sta-
rannie, tak aby maksymalnie utrudnić ewentualny atak
słownikowy.
Zakładamy na partycji system plików ext2 (z pewnymi
ograniczeniami może to być również system plików z księ-
gowaniem, np. ext3 ; w sprawie szczegółów odsyłam do
dokumentacji). Zwróćmy uwagę, że w tej operacji pośred-
niczy loop , dlatego jako argument polecenia podajemy
/dev/loopX . Jeśli wszystko przebiegło poprawnie, odłącza-
my urządzenie i zakładamy katalog, który posłuży nam do
montowania partycji. Opisane polecenia wyglądają tak:
losetup -e AES256 -T /dev/loopX /dev/hdaN
Tu i w dalszej części artykułu X oznacza numer urządzenia
loop , a N – numer partycji. Osoby używające devfs powinny
Listing 1. Kompilacja i instalacja narzędzi z Util-linux
$ tar jxvf util-linux-2.12pre.tar.bz2
$ cd util-linux-2.12pre
$ patch -p1 <../loop-AES-v1.7e/util-linux-2.12pre.diff
$ CFLAGS=-O2 ./configure
$ make SUBDIRS="lib mount"
$ cd mount
$ strip -s mount umount losetup swapon
$ su
# for prog in `which mount umount losetup swapon S
swapoff`
> do echo "Tworzę kopię zapasową $prog.sav"
> cp -p $prog $prog.sav
> done
# install -m 4755 -o root mount umount /bin
# install -m 755 losetup swapon /sbin
# rm -f /sbin/swapoff && ( cd /sbin && ln -s S
swapon swapoff )
# for item in /usr/share/man/man8/{mount,umount, S
losetup,swapon,swapoff}.8.gz \
> /usr/share/man/man5/fstab.5.gz
> do echo "Tworzę kopię zapasową $item"
> mv $item $item.sav
# install -m 644 mount.8 umount.8 losetup.8 swapon.8 \
> swapoff.8 /usr/share/man/man8
# install -m 644 fstab.5 /usr/share/man/man5
# mandb
mkfs -t ext2 /dev/loopX
losetup -d /dev/loopX
mkdir /mnt/crypto
Możemy teraz zamontować partycję:
mount -t ext2 /dev/hdaN /mnt/crypto S
-o loop=/dev/loopX,encryption=AES256
Zamiast loop=/dev/loopX wystarczy podać po prostu
loop . System sam wybierze wolne urządzenie. Polecenie
mount bez opcji powinno nam teraz pokazać m.in. coś
takiego:
/dev/hda7 on /mnt/crypto type ext2 S
(rw,loop=/dev/loop0,encryption=AES256)
Jeśli wolimy oszczędzić sobie wpisywania za każdym razem
długiej komendy, powinniśmy dopisać do /etc/fstab :
/dev/hdaN /mnt/crypto ext2 defaults,noauto, S
loop=/dev/loopX,encryption=AES256 0 0
www.linux.com.pl
33
332763707.004.png 332763707.005.png 332763707.006.png
bezpieczeństwo
Nie potrzeba niczego więcej. To już działa! Choć tego
w ogóle nie dostrzegamy, pliki zapisane w katalogu /mnt/
crypto są szyfrowane i po odmontowaniu partycji będą nie-
dostępne dla niepowołanych oczu.
Gdyby zależało nam na wzmocnieniu ochrony party-
cji przed atakiem słownikowym, moglibyśmy dodatkowo
użyć losowo wygenerowanego zarodka hasła oraz podać
liczbę powtórzeń klucza (flagi -S i -C programu losetup ).
Zarodek jest dodawany do wpisanego przez administra-
tora hasła, zanim zostanie ono potraktowane nieodwra-
calną funkcją haszującą (f. skrótu), natomiast na skutek
podania po fladze -C liczby N, utworzony skrót hasła szy-
frowany jest N tysięcy razy przy użyciu algorytmu AES-
256. Zabiegi te są dość skutecznym sposobem znacznego
spowolnienia ataku.
Losowy zarodek hasła możemy wybrać używając przy-
kładowo takiej kombinacji poleceń:
losetup -e AES256 -T -S 8bqMfh75PZnMu+wwjyVq S
-C 100 /dev/loopX /dev/hdaN
a do fstab wpisalibyśmy w takim przypadku:
/dev/hdaN /mnt/crypto ext2 defaults,noauto, S
loop=/dev/loopX,encryption=AES256,itercountk=100, S
pseed=8bqMfh75PZnMu+wwjyVq 0 0
Plik jak partycja
Zdarza się, że cały dysk jest już podzielony na sforma-
towane partycje, z których korzystamy, a wygospodaro-
wanie wolnej części wymagałoby dużo starań. W takim
przypadku nic nie stoi na przeszkodzie, abyśmy utworzy-
li zaszyfrowaną strukturę katalogów w zwykłym pliku,
który jak wiadomo, w Linuksie może „udawać” urządze-
nie blokowe, takie jak partycja na dysku twardym. Roz-
wiązanie to ma i tę dobrą stronę, że plik można w razie
potrzeby przenieść w inne miejsce na dysku albo nagrać
na płytę CD.
Tworzymy zatem plik o wielkości np. 700 MB,
a następnie poleceniem losetup podłączamy go do urzą-
dzenia loop - dzięki czemu będzie on traktowany jak
partycja – i wybieramy hasło. W dalszej kolejności forma-
tujemy go, tworząc strukturę systemu plików ext2. Jako
źródło, z którego czyta program dd , moglibyśmy wykorzy-
stać /dev/zero , ale lepiej użyć /dev/urandom dd zapisze
wtedy cały plik losowo wybranymi znakami, co spowo-
duje, że podglądając plik, nie będzie można zorientować
się, w którym miejscu zaczynają się i kończą zaszyfrowane
dane. Ostatecznie wygląda to tak:
head -c 15 /dev/urandom | uuencode -m - | S
awk 'NR == 2 {print}
Powinniśmy otrzymać coś w rodzaju: 8bqMfh75PZnMu+wwjy-
Vq . Oczywiście za każdym razem ten ciąg będzie inny. Wyj-
ściowe polecenie losetup , od którego zaczęliśmy procedurę
szyfrowania partycji, wyglądałoby zatem tak:
Listing 2. Przykładowy plik /etc/fstab z wpisami
dotyczącymi montowania szyfrowanych systemów plików
# /etc/fstab: statyczna informacja o systemach plików.
# <system plikow><punkt montowania><typ><opcje> <dump>
<pass>
/dev/hda2 / ext3 errors=remount-ro 0 1
# szyfrowany swap
/dev/hda5 none swap sw, S
loop=/dev/loop0,encryption=AES256 0 0
proc /proc proc defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
/dev/hda6 /usr ext3 defaults 0 0
/dev/hda7 /home reiserfs defaults 0 0
/dev/hda8 /scratch reiserfs defaults 0 0
/dev/fd0 /floppy auto user,noauto 0 0
/dev/cdrom /cdrom iso9660 ro,user,exec,noauto, S
iocharset=iso8859-2 0 0
/dev/scd1/mnt/cdrw iso9660 ro,user,noauto, S
iocharset=iso8859-2 0 0
# szyfrowane urządzenia
/dev/hda4 /mnt/crypto1 ext2 defaults,noauto, S
loop=/dev/loop1,encryption=AES256, S
gpgkey=/floppy/moj_klucz.gpg,gpghome=/floppy 0 0
/dev/hda9 /mnt/crypto2 ext2 defaults,user, S
noauto,encryption=AES256,loop=/dev/loop2, S
gpgkey=/etc/kluczepub-crypto.gpg 0 0
/home/self/crypto_fs /mnt/crypto3 ext2 defaults, S
noauto,user,loop,encryption=AES256 0 0
dd if=/dev/urandom of=/jakis_katalog/crypto_file bs=4k S
count=179200
losetup -e AES256 -T /dev/loopX /jakis_katalog/crypto_file
mkfs -t ext2 /dev/loopX
Oczywiście i tu znalazłyby zastosowanie flagi -S i -C pro-
gramu losetup (zarodek hasła i liczba iteracji). Pominąłem
je, aby nie komplikować przykładów.
Na koniec zakładamy katalog, którego będziemy
używać podczas montowania i ewentualnie dodajemy do
/etc/fstab odpowiedni wpis:
/jakis_katalog/crypto_file /mnt/crypto ext2 defaults, S
noauto,loop,encryption=AES256 0 0
Jeśli chcemy umożliwić zwykłym użytkownikom (znającym
hasło) montowanie szyfrowanego systemu plików, dopisu-
jemy ponadto do opcji montowania user . To samo dotyczy
poprzedniego przypadku szyfrowanej partycji.
Z kluczem GnuPG na dyskietce
Dostęp do szyfrowanego systemu plików możemy zabez-
pieczyć dodatkowo kluczem GnuPG . Ideę tę przedstawia
poglądowo Rysunek 4. Nie ma większego znaczenia, czy
34
styczeń 2004
332763707.007.png 332763707.008.png
Zgłoś jeśli naruszono regulamin