Кто-нибудь знает сценарий, программу и т. Д., Чтобы проверить права доступа к папке / файлу и исправить / восстановить?

Я не новичок. Я профессионал, умоляющий других профессионалов об их открытиях быстрого решения общей проблемы, и я знаю, что такое chmod -R .
Это ответ на оценку -1, мгновенно присвоенную моему вопросу, для тех, кто может игнорировать серьезность моего запроса или отрицать его обоснованность.


Эксперименты с sshfs между моим рабочим столом и удаленным сервером, на котором Kali linux работает от имени пользователя root (по умолчанию для Kali). Удалось сбить с толку все права / права собственности на файлы и папки в системе. Мне удалось восстановить некоторые с помощью простого chmod -R 0755 там, где это необходимо , но заметил, что многие из них до сих пор не исправлены.

Хотите знать, существует ли сценарий bash или другой сценарий или программа, которые могут помочь восстановить правильного владельца и права доступа?

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

Скрипт, ниже:

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  echo "Processing ..."
  find -H $(pwd) -type d -exec chmod 0755 {} \;
  # set dirs to 755
  find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
  # libs
  IFS=$'\n'
  for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
    tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
    if [ -z "$tstbin" ]; then
      tstbat=$(cat "$value" | head -c2 | grep -io '#!')
      if [ -n "$tstbat" ]; then
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "755" ]; then
          chmod 755 $value
          echo "Set script  755 $value"
          # set batch to 755
        fi
      else
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "644" ]; then
          chmod 644 $value
          echo "Set regular 644 $value"
          # set regular files to 644
        fi
      fi
      # above aren't elf binary
    else
      perm=$(stat -c '%a' "$value")
      if [ "$perm" != "755" ]; then
        chmod 755 $value
        echo "Set binary  755 $value"
        # set elf binaries to 755
      fi
    fi
  done
  unset IFS
  # process linux permissions for files and folders
else
  echo "Aborted."
fi

Кто-нибудь нашел что-нибудь более существенное, что может исправить разрешения и права собственности для файловой системы?


-> Обновление: <-

Не обнаружив желаемого решения, я решил модифицируя приведенный выше сценарий и сделав его способствующим моему желаемому разрешению:

permafix.sh - Gist on github

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'


# ====================================================================
# --> Documentation <--
# ---------------------
#
# 0755 21 root root  .
# 0755 21 root root  ..
# 0755  2 root root  bin
# 0755  4 root root  boot
# 0755 15 root root  dev
# 0755 53 root root  etc
# 0755  4 root root  home
# 0755  7 root root  lib
# 0700  2 root root  lost+found
# 0755  6 root root  media
# 0755  2 root root  mnt
# 0755  4 root root  opt
# dr-xr-xr-x 87 root root  proc # Not touching this.
# 0744  8 root root  root
# 0755  2 root root  sbin
# 0755  3 root root  share
# 0755  4 root root  srv
# 0755 12 root root  sys
# 1777  7 root root  tmp
# 0755 12 root root  usr
# 0755 13 root root  var
#
# ========================================================================

read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
    echo "Processing ..."
    #################
    # Special Cases #
    #################
    
    SDIR=("/lost+found" "/root" "/tmp")
    for sd in ${SDIR[-1]}; do
        perm=$(stat -c '%a' "$sd")
        user=$(stat -c '%U' "$sd")
        group=$(stat -c '%G' "$sd")
        if [ $sd = "/tmp" ]; then
            if [ "$perm" != 1777 ]; then
                chmod 1777 $sd
                echo "Set directory to 177 $sd"
            fi
        elif [ $sd = "/lost+found" ]; then
            if [ "$perm" != 0700 ]; then
                chmod 0700 $sd
                echo "Set directory to 0700 $sd"
            fi
        elif [ $sd = "/root" ]; then
            if [ "$perm" != 744 ];then
                chmod 744 $sd
                echo "Set directory to 744 $sd"
            fi
        else
            echo "Abort!"
        fi
        # Do change in ownership
        if [ "$user" != root ]; then
            chown root $sd
            echo "Set user to root $sd"
        fi
        if [ "$group" != root ]; then
            chgrp root $sd
            echo "Set group to root $sd"
        fi
    done
    ###############
    # Directories #
    ###############
    DIR=("/bin" "/boot" "/dev" "/etc" "/home" "/lib" "/media" "/mnt" "/opt" "/sbin" "/share" "/srv" "/sys" "/usr" "/var")
    for pd in ${DIR[-1]}; do
        perm=$(stat -c '%a' "$pd")
        user=$(stat -c '%U' "$pd")
        group=$(stat -c '%G' "$pd")
        if [ "$perm" != 755 ]; then
            chmod 755 $pd
            echo "Set directory to 755 $pd"
        fi
        if [ "$user" != root ]; then
            chown root $pd
            echo "Set user to root $pd"
        fi
        if [ "$group" != root ]; then
            chgrp root $pd
            echo "Set group to root $pd"
        fi

        ############################
        # Subdirectories and files #
        ############################
        # chmod directories to 755
        find -H $pd -type d -exec chmod 0755 {} \;
        # Check library files
        find -H $pd -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
    done
        
    #------#
    # libs #
    #------#
    # Assign Variables
    LIBFILES=$(find -H "$(pwd)" -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n')
    # Now do the hustle
    for PLF in $LIBFILES; do
        tstbin=$(readelf -l "$PLF" 2>/dev/null | grep -Pio 'executable|shared')
        if [ -z "$tstbin" ]; then
            tstbat=$(cat "$PLF" | head -c2 | grep -io '#!')
            if [ -n "$tstbat" ]; then
                perm=$(stat -c '%a' "$PLF")
                if [ "$perm" != "755" ]; then
                    chmod 755 $PLF
                    echo "Set script 755 $PLF"
                    # set batch to 755
                fi
            else
                perm=$(stat -c '%a' "$PLF")
                if [ "$perm" != "644" ]; then
                    chmod 644 $PLF
                    echo "Set regular 644 $PLF"
                    # set regular files to 644
                fi
            fi
            # above aren't elf binary
        else
            perm=$(stat -c '%a' "$PLF")
            if [ "$perm" != "755" ]; then
                chmod 755 $PLF
                echo "Set binary 755 $PLF"
                # set elf binaries to 755
            fi
        fi
    done
    unset IFS
    # process linux permissions for files and folders
else
    # When shit goes pear shaped
    echo "Aborted."
fi

Есть другие способы сделать это, а также лучшие способы написания кода. Но пока это работает.

---> Еще одно обновление <---

Я исправил неосторожную ошибку в скрипте, правильно изменив положение нескольких переменных, которые ранее были недоступны из-за структуры скрипта.

Воспользуйтесь этой ссылкой, чтобы получить самую последнюю версию этого скрипта.

2
задан 1 June 2021 в 11:16
1 ответ

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

Сначала определите, как были нарушены разрешения, например, команды chmod chown setfacl или chcon. Если право собственности неверно, вам нужно будет исправить это, например, вернуть файл в домашнем каталоге его владельцу. Имейте в виду, что здесь есть тонкие моменты, например, chown снимет флаги setuid. Например, /usr/bin/ping может не работать, если он потеряет setuid root. Знаете ли вы, какие еще ваши программы нуждаются в setuid? Более сложные ACL или ярлыки selinux не входят в ваше решение, но могут усложнить ситуацию, если они также ошибочны.

Вы можете попытаться исправить разрешения на те, которые были при установке пакета. В системах на базе Debian вы можете передать вывод dpkg --contents в сценарий chmod chown. Загрузка .debs для всех установленных пакетов для запроса dpkg - это упражнение для читателя. Это ничего не даст для пользовательских данных или программ, не установленных через deb.

Выявление конфиденциальной информации, ранее защищенной правами доступа к файлам. Включая, но не ограничиваясь, закрытые ключи ssh и gpg. Рассмотрите возможность изменения этих учетных данных из осторожности.

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

Резервные копии должны восстанавливаться с правильными разрешениями, если они существовали.

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

2
ответ дан 28 July 2021 в 12:19

Теги

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