Полнодисковое шифрование с luks2

Removing LUKS Encryption in-place

Overview

Although not as safe as backing up your data and restoring it on to a reformatted device,
cryptsetup does allow the user to permanently remove the LUKS encryption from a device in-place. For example, if you have an ext4 filesystem living inside a LUKS-encrypted partition,
performing in-place decryption will remove the LUKS signature, and place the ext4 filesystem
directly on the partition, so that you can mount it directly. Unless something goes wrong,
the files in the filesystem will remain intact. The terms used by cryptsetup’s documentation for this is «decryption.»

Support for non-destructive offline decryption of LUKS1 devices has been available starting with version 1.5.0, which was released in 2012. LUKS1 decryption only supported offline mode decryption.

For LUKS2 devices, both offline and online (i.e. unmount not required) decryption are supported.

Warning: The procedures which follow are inherently risky and may cause catastrophic data loss. You should always backup your drive and LUKS headers before proceeding, to protect your data from accidents during decryption.

Decrypting LUKS1 devices in-place

Decryption is done in offline mode, using the (noq legacy) command.
The steps are:

  1. Verify that your block device has a LUKS1 header (and not LUKS2) using
  2. reboot into a live environment using a USB stick.
  3. Identify your block device using , , etc’
  4. Make sure that the block device to be decrypted has not been opened by cryptsetup (there is no entry under `/dev/mapper/`, let alone mounted. If it has been, unmount and use to close it.
  5. Use the legacy command :
cryptsetup-reencrypt --decrypt <device_path>

The process might take a while. If no problems occur, the contents of the encrypted block device should not be accessible directly from the block device. i.e., you should be able to mount it directly.

Decrypting LUKS2 devices in-place

Decryption can be done in either offline or online mode, using the command.

Warning: As of 2020, and version 2.3.3, when using cryptsetup to decrypt a LUKS2 block device the program requires you to provide a LUKS file. If you do not use the «detached header» feature of LUKS, and naively try to pass the block device itself (which contains a LUKS2 header) as the subject of the , cryptsetup will accept this and go ahead with alleged decryption. Afterwards the block device will show up as a LUKS2 device with no key-slots, and your data will be lost. If you try to use as the header file used with , your data will be lost. If you try to restore a backed-up header after this faulty decryption, your data will still be lost.

Given the data loss risk just noted, you should avoid in-place decryption of LUKS2
devices unless you use detached header. I have tested offline LUKS2 decryption for a device with a detached header file and the procedure went smoothly. This functionality is also part of the tests included in the cryptsetup source.

If you do not use a detached header, your safest course is to use the safer backup-format-restore procedure described below. Alternatively, you can choose to convert your LUKS2 device to a LUKS1 device, and then proceed with the LUKS1 decryption procedure.

The conversion with take a significant amount of time, the system should be connected to mains power and extreme care should be taken to avoid any event that may lead to a system crash or loss of power. Data loss may occur if interrupted.

Steps:

  1. Verify that your block device has a LUKS2 header (and not LUKS1) using
  2. Note what key slots are in use using
  3. Reboot into a live environment using a USB stick.
  4. Identify your block device using or .
  5. Make sure that the block device to be decrypted has not been opened by (there is no entry under , let alone mounted). If it has been, unmount and use to close it.
  6. Before converting the device, you must convert the Password-Based Key Derivation Function (PBKDF) for all key-slots to be LUKS1 compatible. Use the following command for each key slot:
  7. Verify that all key slots PBKDFs are convert to pbkdf2:
  8. Convert the device from LUKS2 to LUKS1:
  9. Decrypt the (now) LUKS1 device:

If successful, you should now be able to mount whatever filesystem was previously inside the LUKS device, by mounting the block device directly.

Hopefully, the project will address these usability and data loss issues in a future release (written August 2020).

Cleaning up system files

Device names and UUIDs may change due to decryption, and you will likely need to update relevant configuration files. The files most likely to need updating are , and, if your recently decrypted device appeared on the kernel command line, your bootloader’s configuration (e.g, ). If you edit the latter, remember to regenerate the grub configuration as described in GRUB.

Шифрование диска Linux

Теория пройдена, все инструменты готовы. Теперь рассмотрим шифрование раздела Linux. Перейдем к настройке жесткого диска

Обратите внимание, что это удалит все данные из диска или раздела, который вы собираетесь зашифровать. Так что если там есть важные данные, лучше скопируйте их в более надежное место

1. Создание раздела

В этом примере мы будем шифровать раздел /dev/sda6, но вместо него вы можете использовать целый жесткий диск или просто один файл, заполненный нулями. Создаем шифрованный раздел:

Эта команда выполнит инициализацию раздела, установит ключ инициализации и пароль. Сначала надо подтвердить создание виртуального шифрованного диска набрав YES, затем нужно указать пароль. Указывайте такой пароль, чтобы его потом не забыть.

Выполните такую команду чтобы открыть только что созданный раздел с помощью модуля dm-crypt в /dev/mapper, для этого понадобится ввести пароль, с которым выполнялось шифрование luks linux:

Теперь вы можете увидеть новое виртуальное устройство /dev/mapper/backup2 созданное с помощью команды luksFormat:

Чтобы посмотреть состояние устройства выполните:

А с помощью следующей команды вы можете сделать резервную копию заголовков LUKS на всякий случай:

Ну, можно сказать, раздел готов. И что самое интересное, теперь вы можете им пользоваться так же, как и любым другим обычным разделом в каталоге /dev. Его можно форматировать с помощью стандартных утилит, записывать на него данные, изменять или проверять файловую систему и т д. Нельзя только изменить размер. То есть все полностью прозрачно, как и сказано в начале статьи.

2. Форматирование раздела

Давайте для начала отформатируем диск. Для надежности, чтобы стереть все данные, которые были в этом месте раньше, перезапишем наш шифрованный раздел linux нулями. Это уменьшит вероятность взлома шифрования, через увеличение количества случайной информации. Для этого выполните:

Работа утилиты может занять несколько часов, чтобы иметь возможность наблюдать за процессом, используйте pv:

Когда процесс завершится мы можем отформатировать устройство в любую файловую систему. Например, отформатируем в ext4:

Как видите, все команды cryptsetup применяются к физическому разделу, в то время как остальные команды для работы с дисками — к нашему виртуальному.

Теперь можно примонтировать только, что созданную файловую систему:

5. Повторное монтирование

Чтобы снова получить возможность работать с зашифрованным разделом с помощью LUKS linux необходимо опять его открыть:

Теперь можем монтировать:

6. Проверить файловую систему luks

Поскольку после открытия раздела с помощью luks linux, этот раздел воспринимается системой, как и все другие, вы можете просто использовать утилиту fsck:

7. Изменить парольную фразу luks

Шифрование дисков Linux выполняется с определенной парольной фразой, но вы можете ее изменить. Даже больше, вы можете создать до восьми разных парольных фраз. Для изменения выполнив следующие команды. Сначала сделаем резервную копию заголовков LUKS:

Затем создадим новый ключ:

И удалим старый:

Сейчас вам придется ввести еще старый пароль.

Настроить шифрование LUKS в уже установленной системе без предварительного шифрования

В этом разделе руководства мы увидим, как мы можем зашифровать разделы, когда они уже созданы, и даже как мы можем зашифровать любой файл с помощью LUKS, который у нас есть в операционной системе. Мы проведем эти тесты с системой Debian 10, не имеющей ничего зашифрованного по умолчанию, без системного раздела, данных или чего-либо еще.

Первое, что нам нужно сделать, это установить LUKS в операционную систему, потому что он не устанавливается по умолчанию, если мы не использовали его в мастере установки. Установка выполняется прямо из официального репозитория Debian следующим образом:

После установки мы можем использовать его для шифрования содержимого жестких дисков, разделов или любых съемных запоминающих устройств.

Перед запуском он всегда желательно полностью отформатировать раздел и перезаписать данные , чтобы обеспечить максимальную безопасность, таким образом, весь раздел или диск будет перезаписан случайной информацией, так что восстановить информацию будет очень сложно или почти невозможно. В настоящее время LUKS не позволяет шифрование диска или раздела, когда они используются, поэтому нам придется делать это с другого компьютера. Кроме того, вы должны использовать » cryptsetup-reencrypt », Который поможет нам полностью повторно зашифровать раздел без потери данных, хотя настоятельно рекомендуется перед этим сделать резервную копию важных файлов. Этот инструмент позволяет вам зашифровать данные на локальном устройстве LUKS, но раздел не должен использоваться.

Зашифровать любой диск или раздел (с потерей данных)

Первое, что нам нужно сделать, это создать новый раздел на диске, чтобы впоследствии использовать его. Выполняем следующую команду:

И мы продолжаем ставить «n», чтобы создать новый раздел, мы помещаем «p», чтобы сделать его основным, и мы принимаем значения, которые указывают, что у нас есть раздел всего жесткого диска, если мы хотим сделать его меньше, мы Придется доработать сектора именно для этого раздела.

Как только мы это сделали, мы должны поместить вновь созданный раздел sdb1 с форматом LUKS, для этого мы выполняем следующую команду:

Мы пишем с заглавной буквы «ДА», вводим желаемый пароль и ждем, пока он будет готов.

Если мы выполним команду:

Мы сможем увидеть все жесткие диски, разделы и файловую систему, которые мы используем. Мы должны увидеть, что на sdb1 у нас есть «crypto_LUKS», как показано здесь:

Как только мы это сделаем, нам нужно будет открыть этот раздел с помощью LUKS, который мы только что создали, для этого мы помещаем команду:

Мы вводим пароль, а затем повторно выполняем «lsblk -f», и появится «encrypted partition», которое является идентификатором, который мы дали, но мы можем изменить его в любое время.

Теперь мы должны указать формат файла для этого раздела, нормальным было бы сделать это и с EXT4, для этого мы вводим следующую команду:

И на этом зашифрованном разделе у нас уже будет файловая система EXT4.

Теперь мы должны смонтировать раздел в каталог, для этого мы должны создать в / home или где угодно точку монтирования:

И теперь нам нужно его смонтировать:

А если мы получим доступ к каталогу «/ home / bron / partition encryption / files», мы сможем записать все данные, которые захотим, шифрование происходит на лету и полностью прозрачно.

Если мы перезагрузим компьютер, устройство не будет смонтировано, и мы не будем открывать раздел с помощью LUKS, поэтому каждый раз, когда мы перезагружаемся и хотим получить доступ к этому разделу, нам придется делать следующее:

Вводим пароль по запросу, и снова монтируем блок:

Если мы хотим, чтобы он открывался и монтировался автоматически в начале операционной системы, нам придется отредактировать файлы / etc / crypttab и / etc / fstab, чтобы поместить этот раздел, но мы рекомендуем монтировать модуль вручную и попросите пароль для безопасности, потому что в противном случае вам придется хранить ключ в виде открытого текста в разделе / ​​boot /.

Теперь мы знаем все, что нам нужно знать, чтобы иметь возможность шифровать полные диски или разделы с помощью LUKS и делать это непосредственно из Linux, даже когда система уже работает, нам придется быть осторожными с нашими паролями, но мы будем говорить о Чрезвычайно безопасная система с шифрованием данных.

Установим необходимые пакеты для работы

Pacman — это отличный пакетный менеджер, который намного удобнее apt-get из семейства Debian систем. Начнем с того что он безо всяких aptitude может самостоятельно заниматься поиском, установкой, удалением пакетов, удовлетворением зависимостей, синхронизацией репозиториев и обновлением системы, имея при этом довольно простой и логичны консольный интерфейс. Пример нескольких команд:

# установить пакет # установить пакет как зависимость # синхронизировать репозитории # обновить систему # синхронизировать репозитории и обновить систему. # синхронизировать репозитории, обновить систему и установить пакет

Для Archlinux вы можете найти любой софт, который вы можете найти вообще для linux. Если вы не найдете какой-то пакет в официальном репозитории, вы наверняка это сделаете в Arch User Repository. Там находятся пакеты опубликованные и сопровождаемые пользователями Archlinux. Там находятся 53 тысячи пакетов против 37,5 тысяч у Debian.

Пакет, с помощью которого GRUB сможет определять все установленные ОС при генерации конфига:

sudo pacman -S os-prober

Браузеры:

sudo pacman -S firefox firefox-i18n-ru chromium opera

Мессенджеры:

sudo pacman -S pidgin skype

Торрент-клиент:

sudo pacman -S transmission-gtk transmission-cli

Графика:

sudo pacman -S gimp pinta gpicview djview4

Офис:

sudo pacman -S libreoffice libreoffice-ru

Мультимедиа:

sudo pacman -S audacity deadbeef smplayer

FTP-клиент:

sudo pacman -S filezilla

Разработка:

sudo pacman -S geany apache mariadb phpmyadmin php php-apache php-pgsql php-sqlite php-mcrypt php-gd

Система:

sudo pacman -S gparted unetbootin

Инструменты:

sudo pacman -S p7zip unrar

Игры:

sudo pacman -S steam mari0

Мышь в терминале

Иногда приходится работать в терминале, а не его эмуляторе. И с некоторыми программами, например Midnight Commander, там будет удобнее работать с мышью. Чтобы использовать мышь в терминале достаточно установить пакет .

sudo pacman -S gpm

Автодополнение

Автодополнение — это очень удобная фича терминала bash. Кнопкой Tab можно существенно облегчить и ускорить ввод команд. Однако такая возможность не предоставляется для таких программ как sudo, pacman и некоторых других. Чтобы исправить эту несправедливость достаточно установить пакет .

sudo pacman -S bash-completion

Шифрование диска с помощью LUKS в Linux

Прежде чем идти дальше, вы должны знать, что во время шифрование LUKS удалит все данные на диске.

Теперь, когда у вас есть путь к диску, полученный в предыдущем шаге. Вы можете зашифровать диск с помощью LUKS, для этого выполните команду ниже. Обязательно замените путь к диску, который вы узнали в предыдущем шаге “/dev/sdc”.

Следуйте инструкциям на экране и введите пароль суперпользователя.


Шифрование диска с помощью LUKS в Linux

В конце вы должны получить сообщение “Команда выполнена успешно” (Command successful), указывающее, что шифрование прошло успешно.

Вы также можете сбросить метаданные шифрования и убедиться, что диск успешно зашифрован. Выполните приведенную ниже команду (при необходимости замените “/dev/sdc”).:

Расшифровка и подключение зашифрованного диска LUKS в Linux

Чтобы расшифровать диск, который был зашифрован с помощью LUKS. Требуется выполнить приведенную ниже команду, указав путь к зашифрованному диску, подключенному к вашей системе. Вы можете заменить “drivedata” любым другим именем, оно будет выступать в качестве идентификатора расшифрованного устройства.


Расшифровка и подключение зашифрованного диска LUKS в Linux

Сообщение “Команда выполнена успешно” (Command successful) указывает, что диск был расшифрован. И сопоставлен в вашей системе как новое устройство хранения данных под названием “drivedata”. Если вы выполните команду “lsblk”, то подключенный диск будет отображаться как новый накопитель, который подключен к вашей системе Linux.


Расшифровка и подключение зашифрованного диска LUKS в Linux

Зашифрованный диск LUKS был расшифрован и отображен как устройство, но пока не смонтирован. Вы можете проверить информацию о подключенном диске, выполнив приведенную ниже команду (при необходимости замените “drivedata”).:

Подключенный диск действует как запоминающее устройство, подключенное к вашей системе. Но он еще не содержит разделов с файловыми системами. Для чтения и записи файлов на подключенном диске вам потребуется создать раздел. Чтобы создать раздел EXT4, выполните следующую команду, указав путь к подключенному диску.

Дождитесь завершения процесса. Этот шаг необходимо выполнить только один раз или когда вам нужно отформатировать раздел.

Чтобы управлять файлами на подключенном диске, отформатированном как  EXT4, вам потребуется его смонтировать. Для этого последовательно выполните следующие две команды.

Первая команда создает новую точку монтирования для подключенного диска. Вы можете указать любой путь к нему. Следующая команда монтирует подключенный диск, чтобы вы могли получить к нему доступ по пути, указанному в предыдущей команде.

После подключения вы сможете получить доступ к подключенному диску из графического файлового менеджера или из командной строки. Чтобы размонтировать, выполните следующую команду, указав полный путь к точке монтирования.

1. Проверка и исправление диска LVM без шифрования с помощью fdisk

Для проверки LVM используйте следующие шаги.

Для начала проверяем разметку дисков с lsblk:

lsblk

Пример вывода:

NAME                 MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                    8:0    0    20G  0 disk  
└─sda1                 8:1    0    20G  0 part  
  └─xubuntu--vg-root 253:0    0    19G  0 lvm   / 
sr0                   11:0    1  1024M  0 rom   

Как можно увидеть, LVM назван xubuntu—vg-root, но мы не можем запустить fsck на это имя, так как команда не найдёт его. Нам нужно получить полное имя, для этого нужно запустить команду lvm lvscan для получения LV имени с которым мы можем запустить fsck на LVM.

Следующая команда должна запускаться с повышенными правами (с sudo или как root):

lvscan

Пример вывода:

  inactive          '/dev/xubuntu-vg/root' [

Как можно увидеть, имя диска который нужно проврить на ошибки это /dev/xubuntu-vg/root, оно должно подойти для запуска fsck на этом имя.

Если /dev/xubuntu-vg/root не ACTIVE, нужно сделать его активным чтобы мы могли запустить его проверку.

lvchange -ay /dev/xubuntu-vg/root

Теперь это должно выглядеть примерно так:

sudo lvscan
  ACTIVE            '/dev/xubuntu-vg/root' [

Теперь можно запустить fsck для проверку тома LVM:

fsck /dev/xubuntu-vg/root

или запустить форсированную проверку с автоматическим исправлением ошибок:

fsck -fy /dev/xubuntu-vg/root

2. Исправление LVM с шифрованием

Может так быть, что действия из предыдущего примера возможны только при нормальной загрузке системы, когда доступны все возможные утилиты. Соответственно, в Emergency mode указанные операции не удастся выполнить.

Поэтому рассмотрим пример восстановления системы с Live образа. Причина анализируемой проблемы в том, что apt autoremove удалила пакет cryptsetup и другие важные для расшифровки и нормальной работы раздела утилиты. Это привело к тому, что система перестала загружаться (из-за того, что корневой раздел не может быть смонтирован и расшифрован используя LVM).

Если вы не используете LVM и полнодисковое шифрование, то дальнейшее возможно вам не подходит.

В данном примере удалось исправить систему и переустановить cryptsetup и lvm2 в окружении chroot: для этого понадобилось загрузиться с флешки Live USB, запустить последующие команды в терминале и перезагрузиться

Поиск корневого раздела:

sudo fdisk -l

Расшифровываем раздел.

sudo cryptsetup open --type luks /dev/nvme0n1p3 nvme0n1p3_crypt

Внимание:

  • замените /dev/nvme0n1p3 на ваш собственный диск
  • замените «nvme0n1p3_crypt» на корректное имя раздела для вашей установки, вы можете его узнать запустив следующее в chroot:
cat /etc/crypttab | cut -f1 -d " "

Пример вывода:

nvme0n1p3_crypt

Монтирование корневого раздела

sudo vgscan
sudo vgchange -ay
sudo mount /dev/mapper/xubuntu--vg-root /mnt

Подготовка окружения chroot:

sudo mount /dev/nvme0n1p2 /mnt/boot/ # замените nvme0n1p2 на ваш загрузочный раздел!
sudo mount -o rbind /dev/ /mnt/dev/
sudo mount -t proc proc /mnt/proc/
sudo mount -t sysfs sys /mnt/sys/

Делаем так, чтобы в chroot работал DNS:

sudo cp /etc/resolv.conf /mnt/etc/resolv.conf

Входим в chroot:

sudo chroot /mnt /bin/bash

Переустанавливаем отсутствующие пакеты:

apt install cryptsetup lvm2

Заново генерируем (это может быть выполнено командой apt на предыдущем шаге — если это уже было сделано, то пропустите):

update-initramfs -u -k all

Покидаем среду chroot:

exit

Записываем буфер на диск:

sudo sync
sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt/boot

Создание зашифрованных разделов

При помощи cryptsetyp-luks можно шифровать различные виды разделов: целые диски, разделы LVM/LVM2, разделы находящиеся в файлах и тд. Здесь я не буду углубляться в частные случаи и рассмотрю на примере целого диска. Итак имеем диск /dev/sdb, который нужно зашифровать.

Форматируем диск LUKS. По умолчанию выбирается алгоритм шифрования AES с длинной ключа 256 бит, однако при необходимости можно задать другие алгоритмы шифрования и длину ключа. Формат команды:

cryptsetup  luksFormat /dev/sdb

<cypher> – Модуль используемый для шифрования диска, может использоваться des, aes, blowfish, serpent, twofish, список загруженных модулей можно просмотреть в /proc/crypto

<key-size> – Длинна ключа шифрования

# cryptsetup luksFormat /dev/sdb
WARNING!
========
This will overwrite data on /dev/sdb irrevocably.
Are you sure? (Type uppercase yes): YES    # Вводим крупными буквами YES
Enter LUKS passphrase:                     # Вводим парольную фразу
Verify passphrase:                         # Повторяем ввод парольной фразы
Command successful.

Подключаем зашифрованный диск:

# cryptsetup luksOpen /dev/sdb myfs
Enter LUKS passphrase for /dev/sdb:        # Вводим парольную фразу
key slot 0 unlocked.
Command successful.

Создаем файловую систему на подключенном диске:

# mkfs.ext3 /dev/mapper/myfs

Монтируем зашифрованный раздел

# mkdir /mnt/myfs
# mount /dev/mapper/myfs /mnt/myfs

Поиск подключенных накопителей в системе Linux

Чтобы зашифровать диск с помощью LUKS, для начала нужно будет найти нужный диск (узнать его правильный путь). Вы можете выполнить приведенную ниже команду, чтобы просмотреть список всех накопителей (дисков), установленных в вашей системе Linux.

 (list block devices) используется для просмотра информации обо всех доступных блочных устройствах, таких как жесткий диск и флэш-накопители.

Вы увидите в терминале список аналогичный этому:

Просмотр всех накопителей для шифрования

Если вы посмотрите на полученные данные и метаданные диска, тогда вы можете легко узнать путь подключенных дисков (указан в столбце “PATH”). Например, я подключил USB флешку, изготовленную компанией Transcend. Глядя на скриншот, можно сделать вывод, что путь к моей флешке (накопителю) — “/dev/sdb”.

Вы так же можете выполнить и такую команду, чтобы узнать правильный путь до накопителя.

Вы получите результаты, подобные этим:


Результаты команды lshw -short -C disk

Каким бы ни был путь к диску в вашем случае, запишите его, так как он будет использоваться во время шифрования LUKS.

Значимость и проблема FDE

Дела с шифрованием запоминающих устройств обстоят забавным образом: оно повсюду и нигде одновременно. Начиная от мобильных устройств, где оно играет особо важную роль (причем большинство пользователей об этом даже не догадываются), и заканчивая большими дата-центрами. В то же время исследования, проведенные за последние десять лет в разных странах, включая Великобританию, Германию и США, показывают, что не только обычные пользователи, но и корпорации не сильно пекутся о личных данных.

К сожалению, на этом проблемы не заканчиваются. Большинство нынешних систем полнодискового шифрования (Full Disk Encryption — FDE) обеспечивают конфиденциальность данных, но не их целостность. Это означает, что злоумышленник может физически изменить байт информации на диске и пользователь не сможет обнаружить, что и где изменилось и откуда сбои. Все потому, что сектор открытого текста равняется сектору шифротекста, а метаинформацию хранить негде.

Искажение данных может произойти не только в результате прямого воздействия злоумышленником, но и по чистой случайности: неплотно воткнутый кабель, перезапись данных утилитой, которая не распознает формат LUKS, и так далее.

Проблему целостности данных решает аутентифицированное шифрование (Authenticated Encryption with Associated Data — AEAD). Это не новая тема, и активные исследования вместе с конкурсами на лучший алгоритм (см. CAESAR) ведутся десятки лет. Но для реализации AEAD в полнодисковом шифровании нужно придумать, где хранить дополнительные данные (те самые AD).

Зачем шифровать

Если вы еще сомневаетесь, что полнодисковое шифрование — нужная штука, то подумайте вот о чем: оно не только помогает сохранить в тайне вашу очень важную инфу и пикантные фоточки, защищая вас от разного рода мошенничества и шантажа, но и предохраняет диск от изменений. Например, вас могут на какое-то время разлучить с вашим компьютером, и речь не только о «маски-шоу», но и, например, о дотошном погранконтроле. Как в таких случаях убедиться, что на диске не появилось чего-то нового? Ну и последний, чисто эмоциональный аргумент: просто представьте, какой неистовый баттхерт будет у кого-то, когда он не сможет получить доступ к вашим данным, — даже если там нет ничего интересного!

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: