they only work if /var/mychroot is a mount point, so they fail if /var/mychroot is just a subdirectory within the / filesystem.
Вы можете сделать любой каталог точкой монтирования:
mount --rbind /var/mychoot /var/mychoot
.Этот шаг -и другие, которые вам понадобятся -, описаны здесь:
Как выполнить chroot с пространствами имен Linux?
In fact I want to prevent all kinds of chroot escapes
Объедините вышеуказанное с пространствами имен пользователей.
В качестве альтернативы,
seccomp
. Вот как Docker предотвращает вызов содержащихся процессов, например,mount()
. (Когда вы монтируете блочное устройство во второй раз, вы получаете второе представление этой файловой системы, что более или менее считается побегом ). В списке разрешенных системных вызовов Docker -root есть множество различных способов экранирования.https://docs.docker.com/engine/security/seccomp/
https://github.com/moby/moby/blob/master/profiles/seccomp/default.json
Формат напоминаетmtree
формат конфигурации (см. здесь для примера этого ).
Следующая awk
программа переформатирует данные в новый формат, который вы упомянули. Предполагается, что каждый раздел имеет отступ, кратный четырем пробелам, но вы должны иметь возможность изменить переменную FS
с " {4}"
на "\t"
, чтобы вместо этого использовать отдельные табуляции.
BEGIN { FS = " {4}" }
$NF == "exit" { next }
NF > nf {
section[++nf] = $NF
next
}
function output() {
$0 = ""
for (i = 1; i <= nf; ++i)
$i = section[i]
print
}
{
hold = $NF
hold_nf = NF
output()
nf = hold_nf
section[nf] = hold
}
END { output() }
Переменная nf
— это количество полей в текущем разделе, что означает количество «сегментов» в строке конфигурации. Массив section
содержит текущее nf
количество полей.
Это блоки в коде:
BEGIN
:Этот блок просто инициализирует разделитель полей ввода FS
расширенным регулярным выражением, соответствующим ровно четырем пробелам.
$NF == "exit"
:Этот блок пропускает строки, которые просто говорят «выход». Оказывается, эти (нам не нужны, раздел заканчивается меньшим отступом, чем предыдущий ).
NF > nf
:Этот блок увеличивает nf
и добавляет данные в конце текущей входной строки к последнему полю нашего массива section
. Мы вызываем next
в конце блока, чтобы пропустить дальнейшую обработку этой строки ввода.
function output()
:Это функция, которая выводит текущий раздел, когда мы его вызываем. Мы вызываем его из следующих двух блоков.
Безусловный блок :Если мы попадаем сюда, то текущий раздел должен быть выведен (текущий раздел закончился или, по крайней мере, не подразделяется дальше ). Мы делаем это, вызывая нашу функцию output()
. Поскольку нам по-прежнему нужно собирать и сохранять данные в этой строке ввода, а также поскольку output()
сбрасывает текущую входную запись ($0
), мы сохраняем данные, которые хотели бы сохранить, в hold
. То же самое делаем со значением NF
, которое может быть ниже нашего nf
.
END
:В конце ввода последний раздел конфигурации еще не выведен.Это можно сделать здесь, позвонив по номеру output()
.
Проверка на данных, указанных в вопросе:
$ awk -f script file
config system security tacacs server 1.1.1.1 port 88
config system security tacacs profile "default"
config system security user "one" profile "admin" "reports"
config system security user "one" password "E$OITGJ@vf2m92;l3j1"
config system security user "one" home /home/one
config system logs log 1 data foo
config system logs log 1 data bar