Установка системы с шифрованием всего диска linux

Установка системы с шифрованием всего диска

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

Ноут:
HDD на 500GB.
Таблица разделов GPT.
Первый раздел: 2MB bios_grub
Второй раздел: все оставшееся место.
Второй раздел отформатировал в luksFormat , поверх него развернул lvm с тремя логическими томами: swap, root, home.

Desktop:
SSD на 120GB и HDD на 1TB.
На SSD: GPT и два раздела 2MB bios_grub и второй все оставшееся место.
На HDD: GPT и один раздел на весь диск.
В этом случае сделал уже luks поверх lvm.
Сначала в lvm объединил раздел с SSD и раздел с HDD в группу томов, затем разбил на три логических тома: swap, root, home.
При этом в lvcreate указал использовать для swap и root раздел на SSD (Спасибо KRoN73 за этот комментарий).
Далее каждый по отдельности отформатировал в luksFormat .
Чтобы три раза не вводить пароль, home и swap подключаю через key file в /etc/crypttab.

На оба компа установил kubuntu 16.04.

Пару дней все работает нормально, буду благодарен за любые рекомендации.

У меня схема такая efi раздел, остальное под luks, в котором lvm с boot, root, swap, home and etc. В grube прописан GRUB_ENABLE_CRYPTODISK=y.

Сначала в lvm объединил раздел с SSD и раздел с HDD в группу томов, затем разбил на три логических тома: swap, root, home.

Источник

Установка системы с шифрованием всего диска

Содержание

Описание руководства

Данная статья рассказывает, как создать надёжно зашифрованное хранилище данных на жестком диске компьютера и при этом не сломать спящий и ждущий режимы. Особенно актуально это для владельцев ноутбуков, т. к. в отличие от стационарных компьютеров шанс кражи/утери ноутбука выше и возникает обоснованное желание хранить информацию в зашифрованном виде. Однако, предлагаемая по-умолчанию опция шифрования домашней папки при помощи ecryptfs во-первых не шифрует корневой раздел системы 1) , а во-вторых ecryptfs шифрует раздел swap с применением случайно сгенерированного ключа, таким образом, перестает работать такая нужная в ноутбуках опция как спящий режим 2) 3) .

Предлагается же создать один большой зашифрованный раздел размером с весь диск компьютера 4) , поверх которого развернуть виртуальную группу LVM, в которой создать обычные (не шифрованные с точки зрения ОС) разделы /, /home и swap. При этом, пользователю придётся вводить пароль при каждом включении компьютера (даже при выходе из спящего режима), однако, за счёт смещения шифрования на более низкий уровень, ОС «не заметит» этого и все функции будут работать.

Установка

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

Загрузите систему с alternate — диска, выберите язык и приступите к установке:

Выберите ручной режим разметки диска:

Если у вас новый диск или, если вы хотите очистить на нем таблицу разделов, выберите строку с названием диска:

и создайте на нем новую таблицу разделов:

После этого, создайте на диске раздел /boot, выбрав указателем свободное место на диске:

Укажите небольшой объем, от 300 МБ до 1ГБ, т.к. для /boot этого будет вполне достаточно:

В списке «использовать как» укажите /boot, не забудьте сделать раздел загрузочным:

Далее, не размечая оставшееся место, переходим в пункт «Настроить шифрование для томов»:

Соглашаемся записать изменения:

Выбираем «Create encrypted volumes»:

Далее выбираем (при помощи кнопки Space ) свободное место на диске и жмём «Продолжить»:

Если у вас нет паранойи, можете просто нажать «Настройка раздела закончена», если есть — установите параметр «Стереть данные» в «Да»:

Снова соглашаемся на запись изменений на диск:

Далее выбираем «Finish»:

Далее установщик попросит вас ввести парольную фразу, которой он «закроет» диск:

После этого подтвердите пароль:

Если вы используете слишком простой пароль 5) , установщик попросит подтверждения:

После создания шифрованного тома, нужно настроить LVM:

Снова соглашаемся на запись изменений:

Создаем группу томов:

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

После этого создаем логические тома:

Пример для swap:

Аналогично создаем диски для root и home, выделяя им желаемый объем. Если у вас большой диск — можете оставить некоторый его объем свободным, позднее вы сможете добавить его к любому логическому тому 6) .

После этого выбирайте «Закончить»:

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

Выбирайте разделы, находящиеся в блоках, начинающихся на LVM, они названы, согласно именам, данным им вами при создании логических томов, например, в данном случае, это LV home, LV swap и LV root. Стоит заметить, что раздел root 7) не нужно делать загрузочным, т.к. роль загрузочного у нас выполняет отдельный раздел /boot.

По окончании, выбирайте «Закончить разметку и записать изменения на диск»:

И снова соглашаемся с записью изменений на диск (заодно можно ещё раз проверить все ли вы правильно разметили):

Далее продолжайте установку системы как обычно. Когда установщик спросит вас, зашифровать ли домашний каталог — откажитесь, ведь ваш диск уже зашифрован.

После завершения установки и перезагрузки система предложит вам ввести пароль для разблокировки шифрованного диска. Введите пароль и нажмите Enter .

Изменение пароля

Работа с live-cd

Загрузитесь с live-cd 8) , выберите «Попробовать Ubuntu» и дождитесь полной загрузки системы. После этого, настройте подключение к интернету. Затем откройте терминал и выполните:

Читайте также:  Soft для windows iso

После успешной установки, переходите к этапу «Смена пароля».

Смена пароля

Описание

При установке диск шифруется при помощи связки LUKS и dm-crypt. LUKS использует в качестве идентификаторов доступа key slots, которые в данном случае выступают в виде пароля, однако могут быть и ключом. Всего доступно 8 слотов. По умолчанию (при создании шифрованного диска) используется слот 0.

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

Для операций со слотами — сначала нужно определиться с диском, на котором установлено шифрование. Выполните в терминале команду

Вывод будет примерно следующим:

Она даст вам список разделов на диске. Нужно найти тот раздел, на котором присутствует зашифрованный раздел. В данном случае это sda5.

Теперь можно просмотреть состояние слотов на этом разделе:

Видим, что слот 0 содержит пароль, а слоты 1-7 имеют статус DISABLED.

Устанавливаем новый ключ

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

Если теперь посмотреть слоты, то станет видно, что статус ENABLED стоит теперь уже у двух слотов:

Теперь можно удалить старый пароль, находящийся в слоте 0:

И видим, что слот 0 стал DISABLED.

Заключение

Вот и все. Информация на диске надёжно защищена. Однако, не стоит забывать, что существует большое количество различных угроз, и ваши данные все еще могут быть доступны злоумышленнику, в то время, пока компьютер включён, все диски «открыты». И конечно же, в случае кражи, шифрование спасет ваши данные от злоумышленника, но не вернет их вам, так что не забывайте делать резервные копии.

Ссылки

Статья написана по мотивам вот этой вот статьи.

Источник

Установка Ubuntu 16.04 на шифрованный диск

Сопутствующие статьи

Если вам оказалась полезна или просто понравилась эта статья, тогда не стесняйтесь — поддержите материально автора. Это легко сделать закинув денежек на Яндекс Кошелек № 410011416229354. Или на телефон +7 918-16-26-331.

Даже небольшая сумма может помочь написанию новых статей 🙂

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

Опубликовано: 3.12.2017 Последнее обновление этой статьи: 3.12.2017

В этой статье инструкция как выполнить шифрование всего диска Ubuntu. То есть как установить Ubuntu с шифрованием всего диска, включая шифрование системного раздела.

Важно! Эта статья для людей, которые разбираются в компьютерах на уровне выше среднего. Если вы не знаете что такое конфигурационные файлы, разделы диска, как работать с терминалом — тогда обращайтесь к специалисту. Чтобы не тратить свое время и нервы.

Для шифрования других версий Ubuntu читайте статьи

Казалось бы зачем эта статья, ведь Ubuntu 16.04 можно установить на шифрованный системный раздел через мастер установки, там есть такая опция. Опция есть, но она проблемная — нет никаких дополнительных настроек. Мастер установки тупо использует весь указанный диск целиком, создавая на нем три раздела — root, boot и swap. Разделы рут и swap как и положено зашифрованы, а раздел boot остается голый! И это главная проблема — незашифрованный раздел boot на том же самом диске.

Поэтому, несмотря на наличие опции в мастере установки, все равно приходится делать установку вручную. Эта статья описывает последовательность действий для ручной установки Ubuntu 16.04 на зашифрованный диск. Ручная установка позволяет еще и не шифровать весь диск. Если необходимо, можно оставить открытыми существующие разделы. Для Убунту добавить отдельный раздел и зашифровать только его.

Но для начала немного теории.

Для чего нужно шифрование данных на диске

Это единственный надежный способ защиты информации, в условиях, когда возможен физический доступ посторонних людей к компьютеру. Пароль на запуск любой операционной системы — Windows, Linux или Mac OS, может спасти только от детей. Любой специалист обойдет парольную защиту за пару минут — примерно столько времени нужно для того, чтобы воткнуть в компьютер флешку и загрузить свою операционную систему с нее.

А вот зашифрованные данные вскрыть уже гораздо труднее. Или вообще невозможно без цифрового ключа или ключевой фразы. Конечно существуют разные алгоритмы шифрования и внутри этих алгоритмов существуют разные параметры — все это влияет на устойчивость к взлому. При использовании нестойких алгоритмов или уязвимых параметров можно получить доступ к зашифрованным фалам и папкам. Но в общем случае можно считать что шифрование это надежная защита данных.

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

Значит, действительно стойкая защита данных на диске это шифрование не отдельных файлов и папок, но и всей операционной системы. Для надежной защиты необходимо шифрование всего диска. «На поверхности» не должно оставаться ничего. В этой статье будет дана инструкция как создать шифрованный системный раздел и диск в ОС Linux Ubuntu 16.04.

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

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

  • Системная область — обозначается как root или /.
  • Загрузочная область — обозначается как /boot. Может располагаться на отдельном разделе или на разделе root в виде папки.
  • Область пользовательских данных — обозначается как /home. Может располагаться на отдельном разделе или на разделе root в виде папки.
  • Область виртуальной памяти — обозначается как swap. Чаще всего размещается на отдельном разделе, но может располагаться на разделе root в виде файла.
Читайте также:  Как обновить флеш плеер для windows 10

Защищать нужно все эти области.

В статье будет рассмотрена упрощенная конфигурация разделов диска — /boot на отдельном разделе и диске, а swap, root и /home совмещены на одном разделе одного диска. Но для более сложных случаев распределения разделов технология защиты будет такая же.

С шифрованием областей root, swap и home никаких трудностей нет, а вот с защитой /boot есть проблема. Дело в том, что из этой области системный загрузчик запускает initrd и ядро Linux. Если эту область зашифровать, тогда загрузчик не сможет запустить ядро и соответственно запуск ОС будет невозможен. То есть зашифровать /boot нельзя, но и оставлять открытой тоже нельзя, ведь в этом случае будет возможна подмена ядра, на другое, содержащее зловредный код, который перехватит пароль для расшифровки диска..

Выход в том, чтобы разместить раздел /boot на съемном носителе, на флешке. Флешка будет своего рода электронным ключом к системе. Без нее запуск ОС с зашифрованного диска будет невозможен. То есть защита раздела /boot осуществляется на физическом уровне — извлечением его из компьютера. И даже если злоумышленник воткнет в компьютер свою флешку с загрузчиком и ядром, запустить ОС он не сможет не зная пароля.

Таким образом общая схема защиты такова:

  • Разделы root, swap и /home размещаются на полностью зашифрованном жестком диске или на зашифрованном разделе диска.
  • Раздел /boot размещается на съемном носителе.

Установка шифрованной Убунты будет выполняться с использованием Ubuntu Live. Почему именно Live? Ведь дистрибутив Alternate позволяет сделать тоже самое без плясок с бубном, там опции шифрования есть в установщике. Лично мне не нравится то, что Alternate это исключительно установочный дистрибутив, больше его никак нельзя использовать — ни для диагностики, ни для работы. К тому, же установщик Alternate работает в консоли, а это как-то архаично в 21 веке. Так, что Live.

Шаг первый

Необходимо загрузиться с диска или флешки Ubuntu Desktop 16.04 Live. Соответственно должен к компьютеру быть подключен жесткий диск на который будет выполнена установка. А также нужно приготовить чистую флешку емкостью от 100 Мб и выше.

Шаг второй, подготовка жесткого диска и флешки

На жестком диске нужно создать один пустой, размеченный в файловую систему cleared или unformatted. Разметка диска может быть MS-DOS или GPT — это неважно. Однако нужно знать, что с диска GPT умеют загружаться только 64-битные ОС.

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

На флешке также нужно создать один раздел, но с файловой системой Ext2 или Ext3. Файловую систему Ext4 на флешке использовать не стоит, потому, что там больше операций записи (Ext4 журналируемая файловая система).

Шаг третий, шифрование системного диска

Шифрование всего раздела на жестком диске выполняется командой:

sudo cryptsetup —cipher aes-xts-plain —key-size 512 —verify-passphrase luksFormat /dev/sdaX

Вместо Х подставьте номер раздела на вашем диске!

Эта команда выдаст запрос и на его подтверждение нужно ввести слово YES, именно так, заглавными буквами. Этот запрос сделан для того, чтобы убедиться в том, что у вас на клавиатуре включен именно английский язык и выключен Caps Lock! После этого нужно будет дважды ввести ключевую фразу. Эта фраза должна быть длиннее чем 6-8 символов и не должна содержать часто повторяющихся знаков. В идеале это должен быть произвольный набор букв и цифр. Эту фразу лучше придумать заранее, еще до начала работы по созданию системы.

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

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

sudo cryptsetup open /dev/sdaX crypted

Эта команда выдаст запрос на ключевую фразу, которая была введена в предыдущей команде.

Шаг четвертый, создание шифрованных разделов

Следующий этап это создание шифрованных разделов внутри криптоконтейнера LUKS. Для создания этих разделов используется механизм LVM.

sudo pvcreate /dev/mapper/crypted
sudo vgcreate ubuntu /dev/mapper/crypted
sudo lvcreate -L 2600M -n swap ubuntu
sudo lvcreate -l 100%FREE -n root ubuntu
sudo mkswap /dev/mapper/ubuntu-swap
sudo mkfs.ext4 /dev/mapper/ubuntu-root

Размер swap раздела должен быть примерно на 10-20% больше чем размер оперативной памяти. Раздел root не менее 7-10 Гигабайт.

В итоге у вас терминал должен выглядеть примерно так:

Шаг пятый, установка Ubuntu на шифрованный диск

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

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

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

И далее вот таким образом подключить разделы. Разделы root и swap:

Раздел boot и диск для установки загрузчика (boot loader) GRUB

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

Перезагружать нельзя! Нужно остаться в Live Ubuntu, чтобы завершить настройку загрузки.

Впрочем это некритично. Даже если вы по ошибке сделаете перезагрузку можно будет снова загрузиться в Ubuntu Live.

Шаг шестой, подключение криптоконтейнера

Сначала нужно выполнить следующие команды:

sudo swapoff -a
sudo dmsetup remove_all

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

Примечание. Этот шаг пропускается если вы сделали перезагрузку после завершения установки!

Читайте также:  Remote desktop manager ��� mac os

Теперь нужно заново открыть криптоконтейнер. Это можно сделать двумя способами:

Способ первый, через графический интерфейс

Кликните на кнопке диска в панели быстрого запуска:

Далее будет запрос ключевой фразы:

Способ второй, через терминал:

Нужно выполнить команду:

echo «luks-$(ls -la /dev/disk/by-uuid | grep $(basename /dev/sdaХ) | cut -d ‘ ‘ -f 11)»

Нужно понимать, что в этой команде вы должны подставить правильный раздел диска (/dev/sdaХ).

Вывод должен быть таким (конечно идентификатор будет другой): luks-b224aaf0-774a-4548-a256-b11c5a657902

Примечание. Если вывод команды не содержит такую строку, значит пробуйте другой параметр -f : 10, 12 и смотрите на результат. От версии к версии формат команды ls -la меняется. И вывод UUID диска может быть не на 11 позиции. Например в версии 16.04.3 он на 10 позиции! Можно просто выполнить команду ls -la /dev/disk/by-uuid и посмотреть все диски и все UUID. А затем вручную составить строку luks-UUID.

Нужно скопировать эту строку и вставить в следующую команду:

sudo cryptsetup open /dev/sdaX luks-b224aaf0-774a-4548-a256-b11c5a657902

Для чего все это? Дело в том, что в отличии от предыдущих версий, Ubuntu 16.04 не берет имя подключаемого криптоконтейнера из файла /etc/crypttab. Она автоматически формирует его из префикса luks- и UUID разздела где размещен криптоконтейнер. То есть нельзя в /etc/crypttab написать какое-то имя типа crypted как в предыдущих версиях. Нужно чтобы это имя соответствовало имени по умолчанию. На самом деле в настройках dm-crypt можно указать использование пользовательского имени криптоконтейнера. Но лучше делать так чтобы все работало «из коробки».

Для проверки можно выполнить команду:

sudo cryptsetup status /dev/mapper/luks-b224aaf0-774a-4548-a256-b11c5a657902

Чтобы убедится что все в порядке.

Шаг седьмой, настройка загрузки с шифрованного диска.

Нужно выполнить вот эти команды:

  1. sudo mount /dev/mapper/ubuntu-root /mnt
  2. sudo mount /dev/sdb1 /mnt/boot
  3. sudo mount -o bind /dev /mnt/dev
  4. sudo mount -t proc proc /mnt/proc
  5. sudo mount -t sysfs sys /mnt/sys

Проверьте, чтобы правильный диск был примонтирован в /mnt/boot! Это должна быть флешка с разделом boot.

Теперь нужно изменить настройки LVM , заменить значение параметра use_lvmetad.

sudo gedit /mnt/etc/lvm/lvm.conf

В этом файле нужно найти параметр use_lvmetad=1 и заменить 1 на 0, use_lvmetad=0. Если не изменить параметр use_lvmetad,, тогда следующие команды (команда 4) будет выдавать ошибки.

Далее выполнить следующие команды:

  1. sudo chroot /mnt /bin/bash
  2. echo «luks-$(ls -la /dev/disk/by-uuid | grep $(basename /dev/sdaX) | cut -d ‘ ‘ -f 11) UUID=$(ls -la /dev/disk/by-uuid | grep $(basename /dev/sda1) | cut -d ‘ ‘ -f 11) none luks,discard» > /etc/crypttab
  3. update-initramfs -u
  4. update-grub
  5. exit

Примечание 1. Если не изменить параметр use_lvmetad, в команде 3, тогда команда 5 будет выдавать ошибки. Команду 3 нужно выполнять в другом окне терминала, а не в том, где у вас выполнен chroot! В терминале chroot не получится запустить gedit. И путь к файлу там другой будет. В терминале chroot нужно использовать консольный редактор и другой путь к файлу.

Примечание 2. После второй команды лучше выполнить проверочную команду cat /etc/crypttab чтобы посмотреть строку которая записана в crypttab. Строка должна быть примерно такой

«luks-0eac1061-1dca-4a66-8497-7f3dda2b843a UUID=0eac1061-1dca-4a66-8497-7f3dda2b843a none luks,discard«:

Вы можете изучить формат файла /etc/crypttab и сделать запись вручную, без использования команды echo (команда № 2). Особенно в том случае, если вы используете эту инструкцию для другого дистрибутива.

Или, перед выполнением полной команды echo, выполнить ее в усеченном формате, с выводом только в терминал. Чтобы убедиться в том, что строка формируется правильно.

Теперь можно пользоваться установленной зашифрованной Ubuntu. Конечно в BIOS необходимо указать загрузку с той флешки, где установлен раздел /boot!

Примечание 1

Важно понимать, что даже при таком тотальном шифровании сохраняются уязвимости.

  • Во-первых нужно сохранять в тайне ключевую фразу. Если вы ее запишите на стикер и приклеите на монитор это не хорошо. Если злоумышленник получит ключевую фразу, он сможет открыть ваш зашифрованный диск используя какой-либо Live дистрибутив Linux.
  • Во-вторых нужно на физическом уровне защищать загрузочную флешку. Не оставляйте ее без присмотра. Выключили компьютер — извлеките флешку и поместите ее в надежное место. Если ваша загрузочная флешка будет в свободном доступе, злоумышленник может установить на нее свой код для перехвата пароля.
  • В-третьих нельзя оставлять без присмотра включенный компьютер. Когда компьютер включен, доступен и зашифрованный диск и загрузочная флешка.

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

Поэтому важно принимать и другие меры защиты. Не «шарахаться» где попало в Интернет. Не устанавливать непроверенные программы. Использовать брандмауэр. А при более серьезных требованиях к безопасности нужно использовать другие средства, например tcb, SELinux, iptables.

Примечание 2

Сделайте копию загрузочной флешки, проще всего командой dd. Запишите этот образ на другую флешку или на лазерный диск. Копия на другую флешку удобнее поскольку при необходимости вы сразу ее сможете использовать. Но в любом случае эту копию, на чем бы она ни была, нужно будет хранить в защищенном месте. А после обновления ядра или загрузчика необходимо будет обновлять копию флешки.

Простое копирование файлов с флешки на флешку не даст полную копию, потому, что в этом случае не будут скопированы MBR сектора загрузчика GRUB.

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

Иван Сухов, 2017, 2019 г

При написании этой статьи была использована информация из публикации в блоге Андреаса Хёртера.

Если вам оказалась полезна или просто понравилась эта статья, тогда не стесняйтесь — поддержите материально автора. Это легко сделать закинув денежек на Яндекс Кошелек № 410011416229354. Или на телефон +7 918-16-26-331.

Даже небольшая сумма может помочь написанию новых статей 🙂

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

Источник

Оцените статью