LVM — это просто!
Собственно, хочется просто и доступно рассказать про такую замечательную вещь как Logical Volume Management или Управление Логическими Томами.
Поскольку уже давно пользуюсь LVM-ом, расскажу что он значит именно для меня, не подглядывая в мануалы и не выдёргивая цитаты из wiki, своими словами, чтобы было понятно именно тем кто ничего о нем не знает. Постараюсь сразу не рассказывать о всяческих «продвинутых» функциях типа страйпов, снапшотов и т.п.
LVM — это дополнительный слой абстракции от железа, позволяющий собрать кучи разнородных дисков в один, и затем снова разбить этот один именно так как нам хочется.
есть 3 уровня абстракции:
1. PV (Physical Volume) — физические тома (это могут быть разделы или целые «неразбитые» диски)
2. VG (Volume Group) — группа томов (объединяем физические тома (PV) в группу, создаём единый диск, который будем дальше разбивать так, как нам хочется)
3. LV (Logical Volume) — логические разделы, собственно раздел нашего нового «единого диска» ака Группы Томов, который мы потом форматируем и используем как обычный раздел, обычного жёсткого диска.
это пожалуй вся теория. теперь практика:
для работы нужны пакеты lvm2 и возможность работать с привелегиями root поэтому:
$ sudo bash
# apt-get install lvm2
допустим у нас в компе есть жёсткий диск на 40Гб и нам удалось наскрести немного денег и наконец-то купить себе ТЕРАБАЙТНИК! :))) Система уже стоит и работает, и первый диск разбит одним разделом (/dev/sda1 как / ), второй — самый большой, который мы только подключили — вообще не разбит /dev/sdb…
Предлагаю немножко разгрузить корневой диск, а заодно ускорить (новый диск работает быстрее старого) и «обезопасить» систему с помощью lvm.
Можно делать на втором диске разделы и добавлять их в группы томов (если нам нужно несколько групп томов),
а можно вообще не делать на диске разделы и всё устройство сделать физическим разделом (PV)
# pvcreate /dev/sdb
Physical volume «/dev/sdb» successfully created
Создаём группу томов с говорящим названием, например по имени машины «ws», чтобы когда мы перетащим данный диск на другую машину небыло конфликтов с именами групп томов:
# vgcreate ws /dev/sdb
Volume group «vg0» successfully created
желательно внести с корневого раздела такие папки как /usr /var /tmp /home, чтобы не дефрагментировать лишний раз корневой раздел и ни в коем случае его не переполнить, поэтому создаём разделы:
# vgdisplay
информацию по созданным логическим томам
root@ws:
# lvdisplay
информацию по физическим томам
root@ws:
дальше lvm уже почти кончается… форматируем наши разделы в любимые файловые системы:
root@ws:
кстати, не плохо было бы сделать раздел подкачки:
root@ws:
создаём папку и подключая по очереди новообразовавшиеся тома, копируем в них нужное содержимое:
root@ws:
# mkdir /mnt/target
root@ws:
# mount /dev/ws/home /mnt/target
копируем туда всё из папки /home своим любимым файловым менеджером (с сохранением прав доступа), например так ;):
root@ws:
# umount /mnt/target/
кстати, для папки temp необходимо только поправить права, копировать туда что-либо необязательно:
root@ws:
На вкусное, хочу предложить более продвинутую штуку:
допустим у нас есть система с разделом на LVM, а жёсткий диск начал сбоить, тогда мы можем без перезагрузки переместить всю систему на другой жёсткий диск/раздел:
# On-line добавление/удаление жёстких дисков с помощью LVM (пример)
# pvcreate /dev/sda1 # наш эмулятор сбойного диска
Physical volume «/dev/sda1» successfully created
# pvcreate /dev/sdb1 # наш эмулятор спасательного диска
Physical volume «/dev/sdb1» successfully created
# vgcreate vg0 /dev/sda1 # создаю группу томов vg0
Volume group «vg0» successfully created
# mkfs.ext2 /dev/vg0/test # создаю файловую систему на разделе
root@ws:
# mount /dev/mapper/vg0-test /mnt/tmp/ #монтирую раздел
… # заполняю его информацией, открываю на нем несколько файлов и т.п.
# vgextend vg0 /dev/sdb1 # расширяю нашу групу томов на «спасательный» диск
Volume group «vg0» successfully extended
# pvmove /dev/sda1 /dev/sdb1 #передвигаю содержимое с «умирающего» диска на «спасательный»
/dev/sda1: Moved: 0.9%
/dev/sda1: Moved: 1.8%
…
/dev/sda1: Moved: 99.7%
/dev/sda1: Moved: 100.0%
# vgreduce vg0 /dev/sda1 # убираю «умирающий» диск из группы томов.
Removed «/dev/sda1» from volume group «vg0»
Итого:
Я создал логический раздел, отформатировал его, примонтировал и заполнил нужными данными, затем переместил его с одного устройства на другое, при этом раздел остался примонтирован и данные всё время оставались доступны!
Подобным образом мне удавалось без перезагрузки перенести всю систему с умирающего диска на рэид-массив.
Шифрование: как защитить данные от доступа со стороны третьих лиц
В последнее время участились случаи взлома серверов и несанкционированного доступа злоумышленников к конфиденциальной информации организаций, а также хищения персональных данных пользователей. Если происходит кража корпоративных данных, то мы имеем дело со значительными материальными и репутационными издержками для компаний. При этом использование ОС Linux не является панацеей и не убережет Вас от хищения Вашей информации или несанкционированного доступа к ней.
Нужно отметить, что для обеспечения безопасности данных одного шифрования не достаточно, необходимо также грамотно настроить программное обеспечение сервера и соблюдать хотя бы элементарные требования политики безопасности. Все методы шифрования не позволяют прочитать данные только до момента входа пользователя в систему, таким образом, шифрование способно эффективно защитить ваши данные от физической кражи носителя, от доступа к данным со стороны хостинг-провайдера, государственных служб или других третьих лиц извне операционной системы, однако шифрование не убережет вас, если злоумышленник сумеет подобрать или иным образом завладеет не достаточно надежным паролем суперпользователя и сумеет удаленно подключиться к уже запущенному серверу.
Методы шифрования в Linux
Шифрование на уровне файловой системы
Этот способ шифрования предполагает наличие какой-то системы-прослойки, которая расположена поверх основной файловой системы и которая защищает файлы пользователя без вмешательства в нижележащие разделы. Рассмотрим, какие же утилиты шифрования этого типа нам предлагает ОС Ubuntu:
Блочное шифрование на уровне устройства
В случае шифрования на уровне устройства используется блочный шифр, который преобразует последовательность блоков открытых данных в последовательность зашифрованных данных. В Linux-системах используются следующие методы блочного шифрования:
Мы кратко ознакомили Вас с принципами шифрования в операционных системах семейства Linux, теперь время перейти от теории к практике. Покажем на примере установки и настройки сервера Ubuntu 16.04, каким образом можно зашифровать данные в данной операционной системе.
Шифрование домашнего каталога пользователя при установке системы
Если Вы собираетесь устанавливать Ubuntu сервер впервые и задумались о шифровании домашней папки пользователя, то проще всего сделать это сразу при установке системы. Мы поэтапно покажем на примерах, как произвести установку и настройку быстро и правильно. Все примеры и скриншоты в данной статье будут приведены на примере нашего хостинга. Если же вы пользуетесь услугами других хостинговых компаний, то интерфейс Вашей панели может отличаться, однако, алгоритм работы будет таким же.
Для начала зайдем в панель управления нашим виртуальным сервером и проделаем небольшие подготовительные работы:
На вкладке Settings изменим порядок загрузки Boot Order на «(1) CDROM (2) Hard Disk», чтобы сервер в первую очередь пытался загрузиться с подключенного ISO-образа:
Заходим во вкладку Network, нажимаем на ссылку с IP-адресом вашего сервера, нам откроется окно с параметрами нашей сети, эта информация крайне важна для дальнейшей установки:
Затем нажимаем на кнопку Reboot и ждем, когда виртуальный сервер перезагрузится.
Теперь необходимо подключиться к серверу по VNC и приступить к установке дистрибутива Ubuntu Server 16.04. Нажмите на кнопку VNC на главном экране панели управления, затем HTML5 VNC Client SSL. В новом окне браузера откроется VNC-консоль. Вы должны увидеть начальный экран установочного диска Ubuntu:
Далее, после указания имени пользователя и пароля для нового пользователя системы, программа установки предложит Вам зашифровать домашний каталог. Система будет монтировать его каждый раз при входе в систему и размонтировать при выходе, это будет совершенно незаметно для пользователя, но в тоже время данные будут зашифрованы. При таком варианте установки, swap-раздел также будет зашифрован автоматически. Обязательно соглашаемся, выбираем ответ Yes:
Далее продолжаем инсталляцию в штатном режиме, производим разметку дисков и завершаем установку.
После окончания установки важно не забыть вернуть в исходное положение настройки в панели управления сервером:
При первом подключении к серверу система потребует ввести логин и пароль, которые мы задали при установке.
Вот и все, Ваша домашняя папка зашифрована, чтобы посмотреть ключ восстановления данных, выполните в терминале следующую команду:
Этот ключ необходимо сохранить в надежном месте, он нужен для восстановления данных вручную, если «что-то пойдет не так».
Шифрование домашнего каталога после установки Ubuntu
Рассмотрим случай, когда операционная система уже установлена, но возникла необходимость зашифровать свой домашний каталог. Неужели в этом случае, нужно переустанавливать систему заново? К счатью, в этом нет необходимости. В Ubuntu есть возможность зашифровать домашний каталог пользователя методом eCryptfs на уже установленной системе, всего лишь при помощи нескольких команд в консоли. Для начала обновим индекс репозиториев нашей системы:
Перед тем, как приступить к шифрованию домашней папки пользователя необходимо выполнить некоторые подготовительные этапы. Для начала сделайте резервную копию своей домашней папки и других данных на случай непредвиденных обстоятельств. Вообще-то, система при шифровании создаст бэкап автоматически, но лишняя перестраховка в данном случае не будет лишней.
Теперь установим утилиты для шифрования:
Под своей учетной записью Вы не сможете зашифровать свою же домашнюю директорию, поэтому необходимо создать нового пользователя с возможностью выполнения команд sudo. Вводим в консоли команду, чтобы создать новую учетную запись пользователя “exampleuser”:
Теперь не перезагружая систему, выйдем из учетной записи текущего пользователя с помощью команды logout и войдем в учетную запись нового пользователя exampleuser, сейчас все наши действия мы будем выполнять под этой учетной записью. Для шифрования домашней папки нашего основного пользователя нужно задать следующую команду:
Вводим пароль указанного пользователя и готово, домашняя папка будет зашифрована.
Для того, чтобы зашифровать swap-раздел, необходимо выполнить следующую команду:
Выйдем из учетной записи exampleuser и снова войдем в учетную запись основного пользователя. Вновь выведем ключ восстановления системы, который необходимо сохранить:
На этом все, шифрование домашней директории завершено.
Шифрование всего жесткого диска
В предыдущих разделах мы рассмотрели методы шифрования домашней папки пользователя в Ubuntu с использованием утилиты ecryptfs и применили шифрование на уровне файловой системы. Этот метод, конечно же, имеет свои преимущества, но иногда этого бывает недостаточно. Дело в том, что корневой раздел все-таки не шифруется, и квалифицированный злоумышленник может получить список файлов из домашней папки пользователя, даже учитывая, что сам домашний каталог зашифрован. Для более надежной защиты можно применить методы блочного шифрования, т.е. зашифровать весь диск на более низком уровне. Далее мы покажем, как создать один большой зашифрованный раздел, поверх которого мы смонтируем обычные разделы /home, /swap (они образуют виртуальную группу LVM), оставив только один маленький незашифрованный раздел /boot. Пользователь должен будет вводить пароль при каждой загрузке сервера. Начиная с версии Ubuntu 12.10 данная опция присутсвует в стандартном инсталляторе операционной системы.
И так, вновь вернемся к пошаговой инсталляции операционной системы с установочного образа, как было описано в первом разделе. Домашний каталог в этом случае можно не шифровать, ведь у Вас будет зашифрован уже весь диск. В момент, когда инсталлятор предложит выбрать вариант разметки диска, необходимо выбрать опцию «Авто – использовать весь диск с шифрованным LVM» (“Guided – use entire disk and set up encrypted LVM”):
Далее выберем диск для разметки и выполним разметку. Затем идет очень важный этап, на котором нужно выбрать ключевую фразу для шифрования. Рекомендуем выбирать фразу из 20 знаков и более c использыванием цифр, букв и специальных символов.
Далее система сообщает, какие разделы будут отформатированы, соглашаемся с внесением изменений и заканчиваем установку как обычно. На этом шифрование всего диска завершено.
После окончания установки перезагрузим наш виртуальный сервер и введем ключевую фразу для шифрования, указанную при установке, после чего мы можем войти в учетную запись пользователя, как обычно.
На реальных примерах мы показали, как можно шифровать пользовательские данные в операционной системе Ubuntu Server различными способами, надеемся, что данный материал поможет пользователям сохранить свою конфиденциальную информацию от несанкционированного доступа.
Установка Archlinux c полным шифрованием системы и LVM на LUKS
В данном посте вы прочитаете немного о моих странных изыскания во время вынужденного отпуска по болезни. Речь пойдёт сразу о нескольких вещах, которые не являются «best practice», но так же тоже можно! Итак, здесь будет туториал о том, как установить Archlinux(мой любимый дистр) так, чтобы:
Если заинтересовались, — добро пожаловать под кат!
Сначала я настроил это всё на моём ноутбуке Lenovo X240, потом для написания статьи пользовался уже виртуальной машиной с OVMF в Proxmox.
Настройка тестового стенда:
Создаётся всё достаточно стандартно. Образом используется мой любимый арч, который можно всегда загрузить с яндекса.
Далее несколько моментов по виртуалке в Proxmox относительно UEFI. Чтобы протестировать работу стенда с UEFI(иначе не будет так интересно), нужно в свойствах виртуальной машины выставить OVMF вместо SeaBIOS:
Далее соответственно добавить UEFI-диск, чтобы получилось примерно так:
Теперь можем стартовать виртуальную машину и начинать процесс установки. В консоли виртуальной машины сразу стартуем сервис sshd, задаём пароль root и узнаём dhcp-адрес виртуальной машины:
Далее мы можем продолжить работу по ssh чтобы было удобнее.
Разметка дисков
Итак, уже подключившись по ssh мы для начала устанавливаем время, чтобы потом не оказалось, что файловые системы созданы в будущем:
Проверяем, что всё верно:
Теперь можем приступать к разметке диска. На данном этапе у меня есть диск /dev/vda, т.к. контроллер Virtio и это просто пустой диск без таблицы разделов:
Разбивать его будем на 2 партиции:
Далее создаём первую партицию для EFI с типом EF00 (EFI System Partition):
Теперь создаём партицию для LUKS, где даже не будем заморачиваться с типом и оставим как есть:
Запишем изменения и закончим с разметкой партиций:
Создание LUKS-контейнера и файловых систем
C первым разделом(vda1) всё достаточно просто. Нам нужно его просто отформатировать и пока на этом всё:
Вторая партиция это контейнер, который нужно сначала подготовить. Форматируем партицию через cryptsetup и задаём парольную фразу:
*** я не стал заморачиваться с выбором шифров, с затиранием рандомом урандомом и прочим, а просто создал контейнер по умолчанию.
Далее открываем контейнер указывая ту же парольную фразу:
Теперь у нас есть открытый контейнер, доступной через device mapper:
Теперь мы можем продолжить с lvm(напишу по-быстрому, так как это не сабж):
Далее создадим файловые системы на наших lv:
Теперь это всё можно примонтировать для установки базовой системы. Точкой установки будет /mnt, где будет начинаться корень нашей будущей системы:
*** /boot/efi я создаю, чтобы сам /boot остался на /dev/mapper/rootvg-root, а папка efi уже для монтирования в неё /dev/vda1(fat32 efi partition):
Проверим текуoие точки монтирования(всегда полезно):
Как мы видим, всё честно и теперь время ставить сам арч.
Установка базовой системы
Устанавливаем базовые пакеты из наборов base и base-devel используя пакет pacstrap( им можно поставить всё, что вы хотите и кроме этого):
Всё прекрасно загрузилось, базовая система готова. Вывод я, естественно, убрал. Теперь мы можем настроить эту самую систему, чтобы она загрузилась и работала.
Из базовых вещей сразу сгенерируем fstab:
Далее сделаем arch-chroot в эту новую систему:
*** arch-chroot очень даже годная утилита, потому как она делает всё сама. Хотя вы всегда можете воспользоваться стандартным chroot, перед этим выполнив всё по инструкции gentoo-handbook wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Base раздел «Mounting the necessary filesystems»
Cразу настроим системное время и hostname:
Зададим пароль root:
Раскомментируем нужные локали в /etc/locale.gen:
Сразу их настроим для системы и консоли:
Теперь настроим файл /etc/mkinitcpio.conf, который у нас отвечает за опции, хуки и прочее при генерации initramfs:
Самое главное здесь хуки и их порядок:
*** хук resume для загрузки системы после гибернации из swap. На виртуалке он не нужен. Скопировал его с бука.
Теперь мы можем сгенерировать initramfs:
Теперь, когда у нас есть система, нам нужно установить сам загрузчик. Мой выбор пал на grub(2), потому как он как-то роднее и достаточно легко умеет загружать ядро с зашифрованного раздела(ну или я особо не искал другие).
Установим пакет grub:
Перед генерацией конфига отредактируем дефолтные опции grub:
здесь нужно раскомментить одну важную строчку(без коммента, естественно):
и добавить(там пусто по умолчанию) в GRUB_CMDLINE_LINUX:
UUID я взял из blkid:
Генерируем конфиг для grub:
Далее устанавливаем сам grub на диск:
Теперь отредактируем /etc/crypttab, чтобы сама система знала, что при загрузке надо расшифровывать LUKS раздел. Добавим строчку:
Которая означает, что надо запрашивать пароль(none) для раздела /dev/vda2 и представлять его уже как container через device mapper.
Теперь мы готовы выйти из chroot и перезагрузить систему:
Теперь обратимся к консоли виртуальной машины чтобы увидеть результат:
На данном этапе у нас запустилось EFI-приложение /boot/efi/EFI/arch/grubx64.efi с /dev/vda1, которое запрашивает у нас пароль, чтобы расшифровать наш контейнер.
Далее, после ввода пароля:
Здесь уже привычное окно grub с нашими опциями загрузки из /boot/grub/grub.cfg.
На данном этапе grub расшифровал наш контейнер и получил доступ к этом самому файлу (/boot/grub/grub.cfg), ядру и initramfs. После выбора опции по умолчанию загрузится ядро, initramfs:
Активно, ядро и дело дошло до хука encrypt, который заново спрашивает нас пароль для расшифровки контейнера( вообще влом 2 раза вводить пароль, но может быть так, что вы от излишка паранойи сделаете 2 контейнера для boot и root
И далее уже после полной загрузки системы:
PS: для повышения уровня шизофрении здесь не хватает только secure boot, чтобы подписать наш загрузчик grubx64.efi.
Просто положить ядро и initramfs на /dev/vda1 я счёл безыинтересным, так как 100 раз так уже делал. Другие загрузчики типа SHIM, bootctl и прочее не умеют вытворять подобного(ну и ли я не в курсе — расскажите в комментах )
Arch-linux на lvm, приправленный EFI и шифрованием.
Месье знает толк в извращениях, поэтому сегодня мы будем готовить Arch Linux с lvm, EFI и luks. Это безопасно, я сотню раз так делал… прежде чем оно получилось.
Итак, для начала нам понадобиться образ дистрибутива (спасибо, Кэп). Идём на https://www.archlinux.org/download/ и качаем заветный iso’шник. Записываем сиё чудо на флешку. Я не буду останавливаться на этом моменте. Если вы докатились до такой жизни до установки Arch с разделами и шифрованием, то, скорее всего, создавать загрузочную флешку уже умеете.
Если вы устанавливаете данную конструкция на VirtualBox, убедитесь, что в настройках машины включена поддержка EFI. Разумеется, если установка происходит на железо, то поддержка EFI тоже должна присутствовать.
Запускаемся с образа. Проверяем наличие Интернета (оно нам понадобиться в процессе установки) и доступность диска, над которым планируем поработать.
Далее, нам нужно разметить диск. Я использую cfdisk. Просто потому, что как true-нуб, я хорошо работаю только с этой утилитой.
Выбираем gpt (у нас же uefi 💪)
Первый раздел — EFI sytem Partition, я выделяю под него 256Mb
Второй раздел — boot, 512 Mb
Третий раздел будет зашифрован (нет, boot мы шифровать не будем, ибо запускаться и получать возможность ввода пароля на расшифровку нам как-то надо).
Для первого раздела выбираем тип EFI system, для остальных оставляем по умолчанию Linux filesystem.
Примечание, для тех, кто не использовал cfdisk, но очень хочет попробовать: что бы разметить новый раздел выбираем “Free spase” стрелочками вверх/вниз, затем выбираем “New” в меню внизу стрелочками право/лево. После выбора New появиться предложение ввести желаемый размер раздела. Что бы изменить тип, выделите требуемый раздел и выберите пункт “Type”.
Весь оставшийся размер диска размечаем под третью часть (на разделы мы его разобьём чуть позже). Выбираем внизу “ Write” (это запишет изменения на диск), а затем “ Quit”.
Переходем к шифрованию. Для начала подгрузим необходимые модули ядра (не пугайтесь, это не больно). В этом нам поможет утилита modprobe.
Устанавливаем шифрование на наш раздел
Нас попросят подтвердить наше намерение заглавными буквами (то есть YES, а не yes или y), а далее ввести и подтвердить пароль. Во избежание проблем крайне не рекомендую этот пароль забывать.
Всё! Ловкость рук — и наш раздел зашифрован.
Открываем его (запросит установленный пароль):
cryptsetup open /dev/sda3 luks_lvm
И теперь разбиваем.
Создаём логические тома в меру своей испорченности
Разумеется, количество и размеры разделов зависят от ваших пожеланий и возможностей используемого “железа”.
Форматируем разделы. Я использую файловую систему ext4, но ничего не мешает вам использовать то, что больше по вкусу. Обратите внимание, что раздел EFI должен быть отформатирован в fat32 (. 11адын!адын!)
Монтируем то, что получилось
mount /dev/sda2 /mnt/boot
mount /dev/sda1 /mnt/boot/efi
mount /dev/mapper/arch-home /mnt/home
mount /dev/mapper/arch-var /mnt/var
mount /dev/mapper/arch-tmp /mnt/tmp
Если на данном этапе выполнить lsblk, мы увидим список наших созданных разделов.
Приступаем к установке Arch на наш свежеразделанный диск:
pacstrap /mnt base base-devel efibootmgr vim grub mkinitcpio linux linux-firmware lvm2 — noconfirm
Если вы всё ещё гуглите “ Как выйти из vim”, то можно заменить vim на nano.
После запуска указанной команды можно идти пить чай.
Если враги не оборвали Интернет и всё прошло хорошо с установкой, генерируем fstab
И заходим внутрь нашей новенькой системы
Конфигурируем mkinitcpio (что это такое и с чем это едят можно подглядеть на ArchWiki https://wiki.archlinux.org/index.php/Mkinitcpio_(Русский) )
*для тех кто не умеет в vim — замените команду на nano /etc…
Находим строчку HOOKS и дописываем encrypt, lvm2 и другие необходимые параметры. Мой HOOKS выглядит, обычно, так:
HOOKS=(base udev autodetect keyboard keymap modconf block encrypt lvm2 filesystems fsck)
Обратите внимание — порядок имеет значение!
В приведённой мной конфигурации в MODULES я добавляю ext4 и, как счастливый обладатель NVIDIA, на случай установки X’ов — nouveau.
Получается нечто подобное:
GRUB_CMDLINE_LINUX=”resume=/dev/mapper/arch-swap cryptdevice=/dev/sda3:luks_lvm root=/dev/mapper/arch-root”
Настраиваем привычный вам минимум: локали, часовой пояс, профиль пользователя, настройки сети, драйвера и т.п.
Генерируем конфигурацию загрузчика
Устанавливаем, при необходимости, X’ы и желаемое DE
systemctl enable lightdm
Выходим обратно в загрузочную флешку
Перезагружаемся, скрестив пальцы, что б взлетело (держим бубен на готове)
Если у вас возникли вопросы по установке которые вы не можете решить с помощью вики арча, а также загуглив, вы можете обратиться в наш чат телеграмм *nix для самых маленьких (ссылка)