здесь очень подробное объяснение того, почему использование Chroot все еще является очень жизнеспособным вариантом и почему полная операционная система или полная аппаратная виртуализация особенно излишни в определенных сценариях.
это не более чем миф о том, что Chroot не является функцией безопасности.есть инструменты, которые автоматически построят файловую систему chroot для вас, и Chroot встроен во многие основные приложения как целенаправленная функция безопасности.
вопреки распространенному мнению, не каждая ситуация требует полной виртуализации операционной системы или полного моделирования оборудования. на самом деле это может означать, что у вас будет больше атакующей поверхности, чтобы попытаться укрыться. в свою очередь, это означает менее безопасную систему . (предположительно для менее осведомленных системных администраторов)
правила довольно просты: не помещайте в chroot ничего, что не является необходимым. не запускайте демон от имени пользователя root. не запускайте демон от имени любого пользователя, запускающего демон вне chroot.
Удалите все небезопасные приложения, двоичные файлы setuid, болтающиеся бесхозные символические / жесткие ссылки. перемонтируйте ненужные папки, используя nosuid, noexec и nodev. собрать последнюю стабильную версию работающего демона из исходников. и, самое главное, обезопасьте базовую систему!
Если вы хотите узнать, все ли файлы в вашей папке принадлежат пользователю root и принадлежат ли они корневой группе, используйте команду find:
find <path to files> ! -user root -or ! -group root -print
Если что-либо возвращается, то этот файл либо не принадлежит пользователю root,или не принадлежит к корню группы. Затем вы можете поместить это в условное предложение, чтобы распечатать Pass или Fail.
[[ "$(find <path to files> ! -user root -or ! -group root -print)" == "" ]] && echo "Pass" || echo "Fail"
Возможно, я бы сделал так
found=$(find <path to files> -maxdepth 1 -not \( -user root -group root \) -printf "x")
found=${found:+Fail}
echo ${found:=Pass}
Однако самый простой способ изменить сценарий —:
found="Pass"
for x in $(ls -llA <path to files> | awk 'FNR>2{ print $3,$4 }' )
do
if [ "${x}" != "root" ]
then
found="Fail"
break
fi
done
echo $found
Здесь я добавил флаг A, чтобы перехватывать файлы, начинающиеся с "."
Однако делать это таким образом не рекомендуется, так как имена файлов, содержащие новую строку, приведут к неожиданным результатам.
Во-первых, вам не следует анализировать вывод ls
и его вариантов. Вы можете сделать это, используяstat
:
$ stat -c%U-%G./*
tomasz-tomasz
tomasz-tomasz
tomasz-tomasz
Как видите, результатом является надежный список из двух соединенных слов, с которым вы можете работать, чтобы получить желаемый результат. Поместите его в петлю, и все готово:
PASS=true
for i in $(stat -c%U-%G./*); do
if ! [[ "$i" == root-root ]]; then
PASS=false; break
fi
done
if "$PASS"; then
echo Pass
else
echo Fail
fi
Значение i
должно быть равно root-root
, чтобы цикл дошел до своего конца с неизмененным переключателем.
Замените ./*
на the_dir/*
, чтобы проверить другое местоположение.
Разделитель -
необходим, потому что, как заметил Grump в комментариях, Сравнение строк может завершиться ошибкой, если файл принадлежит 'roo' и находится в группе 'troot', поэтому разделитель все равно будет быть хорошей вещью.
Ознакомьтесь с этим:Почему *не *parse `ls`(и что делать вместо )?
Как насчет
[ 1 = $({ echo root:root; stat -c"%U:%G" *; } | sort -u | wc -l) ] && echo PASS || echo FAIL
РЕДАКТИРОВАТЬ:или
[ -z $(stat -c"%U:%G" * | grep -vm1 root:root) ] && echo PASS || echo FAIL
Вывод ls
опасен в командных строках. Я предлагаю использовать для этой цели find
в сценарии оболочки.
find -printf
описаны в man find
. grep
, а статус выхода сохраняется в norootfile
. numfile
(количестве найденных файлов ). -v
'verbose', чтобы получить более подробную информацию в выводе сценария оболочки. Если вы хотите найти также скрытые файлы, используйте find.
вместоfind *
Если вы не хотите искать в подкаталогах, используйте -maxdepth 1
в командной строке поиска.
#!/bin/bash
if [ "$1" == "-h" ]
then
echo "Usage: $0 -h # this help text"
echo " $0 -v # verbose output"
exit
fi
tmpfil=$(mktemp)
find * -xtype f -printf "%u:%g %p\n" | tee "$tmpfil" | grep -v '^root:root' > /dev/null
norootsfile=$?
numfile=$(wc -l "$tmpfil")
#cat "$tmpfil"
if [ ${numfile%% *} -eq 0 ]
then
echo "No file found; check the current directory"
elif [ $norootsfile -eq 0 ]
then
echo "Fail"
if [ "$1" == "-v" ]
then
echo "----- Found some file(s) not owned or grouped by root"
echo "user:group file-name --------------------------------"
grep -v '^root:root' "$tmpfil"
fi
else
echo "Pass"
if [ "$1" == "-v" ]
then
echo "----- Found only files owned or grouped by root"
fi
fi
rm "$tmpfil"