Изменение корневой системы. Команда chroot

Thank you for reading this post, don't forget to subscribe!

При обслу­жи­ва­нии систем на базе Linux, неред­ко воз­ни­ка­ют ситу­а­ции, когда необ­хо­ди­мо полу­чить доступ к кор­не­вой фай­ло­вой систе­ме (ФС) из внеш­ней систем­ной сре­ды или про­сто вре­мен­но, напри­мер, на вре­мя обслу­жи­ва­ния, изме­нить путь кор­не­вой ФС для выпол­не­ния в ней про­цес­сов систе­мы. Для это­го в Linux-систе­мах суще­ству­ет коман­да chroot. Она доволь­но про­ста, одна­ко исполь­зу­ет­ся она в очень ответ­ствен­ных и тех­ни­че­ски доволь­но слож­ных ситуациях.

В каких случаях удобно использование chroot?

Итак, коман­да chroot поз­во­ля­ет изме­нить систем­ное окру­же­ние для выпол­ня­е­мых про­цес­сов. Таким обра­зом, они не могут полу­чить доступ к ресур­сам вне ново­го окру­же­ния. Исхо­дя из это­го, исполь­зо­ва­ние croot очень прак­тич­но, напри­мер в сле­ду­ю­щих ситуациях:

  • сброс паро­лей супер­поль­зо­ва­те­ля root;
  • обнов­ле­ние или созда­ние обра­зов initramfs для ядра;
  • вос­ста­нов­ле­ние состо­я­ния паке­тов приложений;
  • вос­ста­нов­ле­ние или обнов­ле­ние рабо­ты загруз­чи­ка, напри­мер, GRUB – это самая рас­про­стра­нён­ная ситуация.

Как мож­но видеть, номен­кла­ту­ра при­ме­не­ния для chroot доволь­но широ­ка. При том, что сами выше­пе­ре­чис­лен­ные зада­чи тре­бу­ют хоро­ше­го опы­та при рабо­те и/или адми­ни­стри­ро­ва­нии UNIX/Linux-систем.

Особ­ня­ком сто­ит вопрос без­опас­но­сти. Ведь в дан­ном слу­чае даже с помо­щью «без­обид­но­го» Live-CD/DVD/USB абсо­лют­но скрыт­но мож­но ском­про­ме­ти­ро­вать систе­му и сде­лать с систе­мой всё что угод­но. Но сле­ду­ет заме­тить, что это уже в боль­шей сте­пе­ни вопрос об уровне физи­че­ско­го досту­па к самой системе.

Синтаксис и основные опции

Соглас­но офи­ци­аль­ной доку­мен­та­ции, син­так­сис коман­ды chroot следующий:

Как вид­но, в каче­стве NEWROOT ука­зы­ва­ет­ся новый путь в фай­ло­вой систе­ме, далее может сле­до­вать, соб­ствен­но, коман­да со сво­и­ми аргу­мен­та­ми. В сле­ду­ю­щей таб­ли­це пере­чис­ле­ны опции chroot, кото­рых не так много:

Опция Зна­че­ние
—groups=G_LIST Зада­ёт спи­сок групп поль­зо­ва­те­лей пере­чис­ле­ни­ем в фор­ма­те g1,g2,…gn.
—userspec=USER:GROUP Зада­ёт поль­зо­ва­те­ля и груп­пу в фор­ма­те ПОЛЬЗОВАТЕЛЬ:ГРУППА
—skip-chdir Запре­ща­ет изме­не­ние рабо­че­го ката­ло­га на корневой «/».

Подготовка системной среды для режима Chroot

Для того, что­бы обес­пе­чить пол­но­цен­ное исполь­зо­ва­ние Chroot-сре­ды, необ­хо­ди­мо пред­ва­ри­тель­но соблю­сти ряд усло­вий, а так­же под­го­то­вить для неё соот­вет­ству­ю­щее окружение.
Во-пер­вых:

  • вычис­ли­тель­ные архи­тек­ту­ры двух окру­же­ний долж­ны быть иден­тич­ны, т. е. если сре­да, из кото­рой про­ис­хо­дит загруз­ка явля­ет­ся amd64-архи­тек­ту­рой, то и сре­да, в кото­рой про­из­во­дит­ся изме­не­ние кор­не­вой ФС долж­на быть так­же amd64;
  • для сре­ды Chroot долж­ны быть под­клю­че­ны моду­ли ядра, кото­рые ей нуж­ны, в соот­вет­ствии с выпол­ня­е­мы­ми зада­ча­ми, напри­мер, долж­ны быть под­клю­че­ны моду­ли для обес­пе­че­ния рабо­ты с раз­ны­ми типа­ми ФС;
  • Нали­чие воз­мож­но­сти загруз­ки из Live-обра­зов: CD/DVD/USB-носи­тель;
  • при­ви­ле­гии супер­поль­зо­ва­те­ля root.

Во-вто­рых:

Дол­жен быть при­мон­ти­ро­ван кор­не­вой раз­дел той Linux-систе­мы, в кото­рую необ­хо­ди­мо выпол­нить chroot. Что­бы лег­че сори­ен­ти­ро­вать­ся в наиме­но­ва­нии раз­де­лов и опре­де­лить нуж­ный, мож­но вос­поль­зо­вать­ся коман­дой lsblk – она выве­дет наиме­но­ва­ния всех доступ­ных в систе­ме раз­де­лов с соот­вет­ству­ю­щи­ми им точ­ка­ми монтирования:

В дан­ном слу­чае это sda2. Теперь нуж­но создать ката­лог для мон­ти­ро­ва­ния это­го раз­де­ла и при­мон­ти­ро­вать его коман­дой mount:

$ sudo mkdir /mnt/test
$ sudo mount /dev/sda2 /mnt/test

В слу­чае, когда дру­гие обя­за­тель­ные систем­ные ката­ло­ги (/home, /boot) выне­се­ны в отдель­ные раз­де­лы, то их так­же необ­хо­ди­мо примонтировать:

В-тре­тьих:

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

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

Теперь мож­но под­клю­чить команд­ную обо­лоч­ку (напри­мер Bash) к ново­му кор­ню и, соб­ствен­но, создать новую сре­ду Chroot:

С это­го момен­та всё систем­ное окру­же­ние пере­ори­ен­ти­ро­ва­но на рабо­ту с кор­не­вой ФС раз­де­ла sda2 и свя­зан­ны­ми с ним дру­ги­ми систем­ны­ми и слу­жеб­ны­ми каталогами.
Полез­ным будет так­же выпол­нить ини­ци­а­ли­за­цию систем­ных и сеан­со­вых (поль­зо­ва­тель­ских) пере­мен­ных окружения:

По завер­ше­нии рабо­ты в сре­де Chroot, выы­ход из неё осу­ществ­ля­ет­ся командой:

После это­го необ­хо­ди­мо отмон­ти­ро­вать кор­не­вую и все осталь­ные ФС, кото­рые были при­мон­ти­ро­ва­ны ранее:

Вопросы безопасности

При пер­вом зна­ком­стве с коман­дой chroot, да и вооб­ще с рабо­той Chroot-сре­ды, вполне зако­но­мер­но может пока­зать­ся, что эту тех­ни­ку мож­но исполь­зо­вать для защи­ты систе­мы. И это дей­стви­тель­но так и есть, но лишь отча­сти, посколь­ку chroot допу­сти­мо исполь­зо­вать как допол­ни­тель­ный уро­вень защи­ты, сужа­ю­щий направ­ле­ния и вари­ан­ты атак.
На самом же деле, вый­ти из Chroot-окру­же­ния доста­точ­но лег­ко. Это свя­за­но, в первую оче­редь с несо­вер­шен­ством меха­низ­ма рабо­ты chroot, посколь­ку он созда­вал­ся изна­чаль­но для быст­ро­го и отно­си­тель­но про­сто­го досту­па к ресур­сам систе­мы «из вне». Без­опас­но­сти как тако­вой, вни­ма­ния прак­ти­че­ски не уде­ля­лось, посколь­ку опять же, пред­по­ла­га­лось исполь­зо­ва­ние chroot толь­ко в слу­ча­ях согла­со­ван­но­го и дове­рен­но­го досту­па к системе.

Меха­низ­мы обхо­да chroot доста­точ­но про­сты. Напри­мер, один из них заклю­ча­ет­ся в созда­нии в Chroot-сре­де фай­ла-устрой­ства для устрой­ства хра­не­ния с после­ду­ю­щим обра­ще­ни­ем к это­му устрой­ству с помо­щью это­го файла.