← Назад к вопросам

Как работать с доступам к файлу в Linux?

2.0 Middle🔥 192 комментариев
#CI/CD и DevOps#Linux

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Управление правами доступа к файлам в Linux

В Linux система разграничения доступа к файлам основана на правах доступа (permissions), владении (ownership) и атрибутах файлов. Это фундаментальный аспект безопасности и многопользовательской работы системы.

Базовые компоненты системы прав

Владелец (owner) и группа (group) — каждый файл принадлежит конкретному пользователю и группе. Права определяются отдельно для:

  • Владельца (user)
  • Членов группы (group)
  • Всех остальных (others)

Типы прав:

  • r (read) — чтение файла или списка файлов в каталоге
  • w (write) — запись/изменение файла или создание/удаление файлов в каталоге
  • x (execute) — выполнение файла как программы или вход в каталог

Команды для работы с правами

1. Просмотр прав (ls -l)

$ ls -l script.sh
-rwxr-xr-- 1 alex devteam 2048 Jun 10 14:30 script.sh

Здесь: -rwxr-xr-- — права, alex — владелец, devteam — группа.

2. Изменение прав (chmod)

Используется символьный или числовой (восьмеричный) формат.

Символьный формат:

$ chmod u+x script.sh        # Добавить выполнение владельцу
$ chmod g-w script.sh        # Запретить запись группе
$ chmod o=r script.sh        # Установить только чтение для остальных
$ chmod a+x script.sh        # Добавить выполнение всем (a = all)

Числовой формат (от 0 до 7):

$ chmod 755 script.sh        # rwxr-xr-x
$ chmod 640 config.txt       # rw-r-----

Расшифровка: 7 (4+2+1 = rwx), 5 (4+1 = r-x), 0 (---).

3. Изменение владельца (chown) и группы (chgrp)

$ sudo chown alex:devteam file.txt    # Изменить и владельца, и группу
$ sudo chown alex file.txt           # Изменить только владельца
$ sudo chgrp devteam file.txt        # Изменить только группу

Специальные биты прав

SUID (Set User ID) — s в правах владельца

$ chmod u+s /usr/bin/passwd
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Dec 15  2023 /usr/bin/passwd

Программа выполняется с правами владельца файла, а не запустившего пользователя.

SGID (Set Group ID) — s в правах группы

$ chmod g+s /shared_directory/

Для каталога: новые файлы наследуют группу каталога, а не создающего пользователя.

Sticky Bit — t в правах остальных

$ chmod +t /tmp/
$ ls -ld /tmp/
drwxrwxrwt 15 root root 4096 Jun 10 15:00 /tmp

В каталоге с sticky bit пользователи могут удалять только свои файлы (важно для /tmp).

Расширенные атрибуты (ACL — Access Control Lists)

ACL позволяют задавать права для конкретных пользователей/групп поверх базовых прав.

# Установка ACL
$ setfacl -m u:guest:rw- file.txt    # Дать гостю права rw
$ setfacl -m g:contractors:r-x dir/  # Дать группе contractors r-x

# Просмотр ACL
$ getfacl file.txt
# file: file.txt
# owner: alex
# group: devteam
user::rw-
user:guest:rw-
group::r--
mask::rw-
other::r--

# Удаление ACL
$ setfacl -x u:guest file.txt        # Удалить запись для guest

Практические примеры для автоматизации тестирования

1. Настройка окружения для тестов

#!/bin/bash
# Подготовка тестового окружения с правильными правами
TEST_DIR="/opt/test_app"
LOG_FILE="/var/log/test_app.log"

# Создание директории с правами для команды разработки
mkdir -p $TEST_DIR
chown -R tester:qa $TEST_DIR
chmod 775 $TEST_DIR            # rwxrwxr-x

# Лог-файл должен быть доступен для записи приложению и чтения мониторингу
touch $LOG_FILE
chown appuser:monitoring $LOG_FILE
chmod 664 $LOG_FILE           # rw-rw-r--

# Исполняемые скрипты тестов
chmod +x $TEST_DIR/run_tests.sh

2. Проверка прав в тестах безопасности

import os
import stat
import pytest

def test_file_permissions():
    """Тест на корректность прав конфигурационных файлов"""
    
    sensitive_files = [
        ('/etc/passwd', 0o644),     # rw-r--r--
        ('/etc/shadow', 0o640),     # rw-r-----
        ('/etc/ssh/sshd_config', 0o600),  # rw-------
    ]
    
    for file_path, expected_mode in sensitive_files:
        assert os.path.exists(file_path), f"Файл {file_path} не существует"
        
        # Получаем текущие права
        current_mode = stat.S_IMODE(os.stat(file_path).st_mode)
        
        # Проверяем соответствие
        assert current_mode == expected_mode, \
            f"Некорректные права {oct(current_mode)} для {file_path}. Ожидалось {oct(expected_mode)}"
        
        # Проверяем владельца для критичных файлов
        if 'shadow' in file_path:
            stat_info = os.stat(file_path)
            assert stat_info.st_uid == 0, f"Файл {file_path} должен принадлежать root"

if __name__ == "__main__":
    test_file_permissions()

3. Временное повышение прав для тестов

#!/bin/bash
# Пример безопасного выполнения тестов с повышенными привилегиями

# Проверяем, запущен ли скрипт с sudo
if [[ $EUID -ne 0 ]]; then
    echo "Этот тест требует прав root. Перезапустите с sudo."
    exit 1
fi

# Выполняем тесты, требующие повышенных прав
echo "Запуск тестов с привилегиями root..."

# ВАЖНО: минимизируем область действия повышенных прав
sudo -u nobody ./run_privileged_test_part.sh  # Переключаемся на непривилегированного пользователя

# Возвращаем обычные права
echo "Тесты завершены, возвращаем обычные права..."

Рекомендации для автоматизаторов

  1. Принцип минимальных привилегий — давайте ровно те права, которые необходимы
  2. Автоматизируйте проверку прав в CI/CD пайплайнах
  3. Используйте ACL для сложных сценариев вместо создания множества групп
  4. Проверяйте SUID/SGID файлы на предмет угроз безопасности
  5. Логируйте изменения критичных прав для аудита

Правильная настройка прав доступа — критически важный навык для QA Automation, особенно при тестировании безопасности, развертывании и отладке многопользовательских систем.

Как работать с доступам к файлу в Linux? | PrepBro