Как работать с доступам к файлу в Linux?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Управление правами доступа к файлам в 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 "Тесты завершены, возвращаем обычные права..."
Рекомендации для автоматизаторов
- Принцип минимальных привилегий — давайте ровно те права, которые необходимы
- Автоматизируйте проверку прав в CI/CD пайплайнах
- Используйте ACL для сложных сценариев вместо создания множества групп
- Проверяйте SUID/SGID файлы на предмет угроз безопасности
- Логируйте изменения критичных прав для аудита
Правильная настройка прав доступа — критически важный навык для QA Automation, особенно при тестировании безопасности, развертывании и отладке многопользовательских систем.