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

здесь очень подробное объяснение того, почему использование Chroot все еще является очень жизнеспособным вариантом и почему полная операционная система или полная аппаратная виртуализация особенно излишни в определенных сценариях.

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

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

правила довольно просты: не помещайте в chroot ничего, что не является необходимым. не запускайте демон от имени пользователя root. не запускайте демон от имени любого пользователя, запускающего демон вне chroot.

Удалите все небезопасные приложения, двоичные файлы setuid, болтающиеся бесхозные символические / жесткие ссылки. перемонтируйте ненужные папки, используя nosuid, noexec и nodev. собрать последнюю стабильную версию работающего демона из исходников. и, самое главное, обезопасьте базовую систему!

2
07.12.2018, 22:16
5 ответов

Если вы хотите узнать, все ли файлы в вашей папке принадлежат пользователю 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"
6
27.01.2020, 21:49

Возможно, я бы сделал так

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, чтобы перехватывать файлы, начинающиеся с "."

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

0
27.01.2020, 21:49

Во-первых, вам не следует анализировать вывод 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`(и что делать вместо )?

5
27.01.2020, 21:49

Как насчет

[ 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
2
27.01.2020, 21:49

Вывод 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"
0
27.01.2020, 21:49

Теги

Похожие вопросы