Настройка ACL в TrueNAS: Пошаговое руководство для NFS и SMB | AdminWiki

ACL в TrueNAS: Полное руководство по настройке списков контроля доступа

30 января 2026 8 мин. чтения #acl #nas #nfs #permissions #smb #storage #truenas

Представь, что твоя команда разработчиков работает над проектом, и тебе нужно настроить сложные права доступа к общим папкам на TrueNAS. Один отдел должен иметь полный доступ, другой — только чтение, а третий — доступ к определенным подпапкам. Именно для таких сценариев существуют списки контроля доступа (ACL). Давай разберем, как правильно настроить ACL в TrueNAS для разных протоколов.

Что такое ACL в TrueNAS и зачем они нужны

ACL (Access Control Lists) — это расширенная система разрешений, которая позволяет задавать права доступа с гораздо большей гибкостью, чем стандартные Unix-права (755, 644 и т.д.). В TrueNAS реализованы два основных типа ACL:

  • NFSv4 ACL — современный стандарт для Unix/Linux систем
  • Windows ACL — для совместимости с SMB/CIFS протоколами
Важно: TrueNAS использует единую систему ACL, которая работает поверх ZFS. Это означает, что права корректно сохраняются при миграции данных и работают одинаково для разных протоколов доступа.

Настройка ACL через веб-интерфейс TrueNAS

Давай начнем с самого простого способа — настройки через графический интерфейс.

Шаг 1: Создание набора данных с поддержкой ACL

Сначала создадим новый набор данных с правильными настройками:

web-interface
1. Storage → Datasets → Add Dataset
2. Имя: project_data
3. Share Type: SMB
4. ACL Type: NFSv4
5. Apply Permissions: ✓
6. Create

Шаг 2: Настройка ACL для конкретной папки

После создания набора данных переходим к настройке прав:

web-interface
1. Storage → Datasets → project_data → Permissions
2. Нажать "Edit ACL"
3. Добавить записи ACL для разных пользователей/групп
4. Сохранить и применить рекурсивно (если нужно)
Внимание: При рекурсивном применении ACL все файлы и подпапки получат те же права. Убедись, что это действительно нужно, особенно на больших наборах данных.

Настройка ACL через командную строку

Для автоматизации и тонкой настройки часто удобнее использовать CLI. TrueNAS использует стандартные утилиты для работы с ACL.

Работа с NFSv4 ACL через setfacl/getfacl

Пример настройки сложных прав для команды разработки:

bash
# Просмотр текущих ACL
getfacl /mnt/tank/project_data

# Добавление прав для группы developers
getfacl /mnt/tank/project_data | setfacl -M - /mnt/tank/project_data

# Создание файла с правилами ACL
cat > acl_rules.txt << EOF
# file: /mnt/tank/project_data
# owner: root
# group: wheel
user::rwx
group::r-x
group:developers:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:developers:rwx
default:mask::rwx
default:other::r-x
EOF

# Применение правил
setfacl -M acl_rules.txt /mnt/tank/project_data

Пример: Настройка ACL для веб-сервера

Рассмотрим практический пример настройки прав для веб-сервера Nginx:

bash
#!/bin/bash
# Настройка ACL для веб-директории
WEB_DIR="/mnt/tank/web_data"

# Создаем директорию
mkdir -p $WEB_DIR

# Устанавливаем базовые права
chown www:www $WEB_DIR
chmod 755 $WEB_DIR

# Настраиваем ACL для разных групп
setfacl -R -m u:www:rwx $WEB_DIR
setfacl -R -m g:developers:rwx $WEB_DIR/logs
setfacl -R -m g:qa:r-x $WEB_DIR
setfacl -R -m g:managers:r-- $WEB_DIR/reports

# Добавляем наследуемые правила для новых файлов
setfacl -R -d -m u:www:rwx $WEB_DIR
setfacl -R -d -m g:developers:rwx $WEB_DIR/logs

Совместимость ACL между NFS и SMB

Одна из ключевых особенностей TrueNAS — возможность работы с одними и теми же ACL через разные протоколы. Давай разберем, как это работает.

Протокол Тип ACL Особенности Рекомендации
NFSv4 NFSv4 ACL Нативные права Unix, поддержка всех флагов Использовать для Linux/Unix клиентов
SMB/CIFS Windows ACL Автоматическая конвертация, поддержка AD Для Windows-клиентов и доменов Active Directory

Настройка SMB-шары с поддержкой ACL

Для правильной работы ACL через SMB нужно правильно настроить общий доступ:

config
# /etc/local/smb4.conf
[project_data]
  path = /mnt/tank/project_data
  comment = Project Data with ACL
  valid users = @developers, @managers
  read only = no
  inherit acls = yes
  nt acl support = yes
  ea support = yes
  store dos attributes = yes
  vfs objects = zfsacl streams_xattr
  zfsacl:acesort = dontcare

Типичные проблемы и их решения

Проблема 1: ACL не применяются рекурсивно

Решение: Используйте флаг -R и убедитесь, что у вас есть права на изменение всех файлов:

bash
setfacl -R -b /mnt/tank/dataset  # Очистить все ACL
setfacl -R -m u:user:rwx /mnt/tank/dataset  # Применить рекурсивно

Проблема 2: Конфликт между Unix правами и ACL

Решение: ACL имеют приоритет над стандартными Unix правами. Убедитесь, что mask в ACL установлена правильно:

bash
# Проверить mask
getfacl /path/to/dir | grep mask

# Установить правильную mask
setfacl -m mask::rwx /path/to/dir

Проблема 3: ACL не работают через SMB

Решение: Проверьте настройки SMB-шары и убедитесь, что включена поддержка ACL:

bash
# Проверить параметры шары
midclt call smb.shareshare_get [id]

# Включить поддержку ACL через API
midclt call smb.shareshare_update [id] {"acl": true, "abe": true}

Автоматизация управления ACL

Для управления ACL в production-среде рекомендуется использовать автоматизацию. Вот пример скрипта для массового применения ACL:

python
#!/usr/bin/env python3
import subprocess
import yaml
import sys

class ACLManager:
    def __init__(self, config_file):
        with open(config_file, 'r') as f:
            self.config = yaml.safe_load(f)
    
    def apply_acls(self):
        for dataset in self.config['datasets']:
            path = dataset['path']
            print(f"Processing {path}")
            
            # Очищаем существующие ACL
            self.run_command(['setfacl', '-R', '-b', path])
            
            # Применяем новые ACL
            for acl in dataset['acls']:
                if acl['type'] == 'user':
                    cmd = ['setfacl', '-R', '-m', 
                           f"u:{acl['name']}:{acl['perms']}", path]
                elif acl['type'] == 'group':
                    cmd = ['setfacl', '-R', '-m', 
                           f"g:{acl['name']}:{acl['perms']}", path]
                
                if acl.get('default', False):
                    cmd.insert(4, '-d')
                
                self.run_command(cmd)
    
    def run_command(self, cmd):
        try:
            result = subprocess.run(cmd, check=True, 
                                  capture_output=True, text=True)
            print(f"Success: {' '.join(cmd)}")
        except subprocess.CalledProcessError as e:
            print(f"Error: {e.stderr}")
            sys.exit(1)

if __name__ == "__main__":
    manager = ACLManager("/etc/truenas/acl_config.yaml")
    manager.apply_acls()
Совет: Всегда тестируйте изменения ACL на тестовой копии данных перед применением в production. Используйте команду `getfacl --omit-header` для сравнения ACL до и после изменений.

Мониторинг и аудит ACL

Для поддержания безопасности важно регулярно проверять ACL. Вот несколько полезных команд:

bash
# Поиск файлов с определенными ACL
find /mnt/tank -exec getfacl {} \; 2>/dev/null | \
  grep -B 10 "user:special_user" | \
  grep "^# file:"

# Проверка ACL на наличие аномалий
for file in $(find /mnt/tank -type f); do
    acl=$(getfacl "$file" 2>/dev/null)
    if echo "$acl" | grep -q "^other::rwx"; then
        echo "WARNING: World-writable file: $file"
    fi
done

# Экспорт всех ACL для документации
getfacl -R /mnt/tank/project_data > acl_backup_$(date +%Y%m%d).txt

Интеграция с Active Directory

При работе в корпоративной среде часто требуется интеграция ACL с Active Directory. TrueNAS отлично справляется с этой задачей:

bash
# Настройка подключения к AD через веб-интерфейс
1. Directory Services → Active Directory
2. Ввести доменное имя и учетные данные
3. Enable: ✓
4. Advanced Options →
   - Allow Trusted Domains: ✓
   - Use Default Domain: ✓
   - Allow DNS Updates: ✓
5. Save

# После подключения можно использовать AD-группы в ACL
setfacl -m g:"DOMAIN\\Developers":rwx /mnt/tank/project_data
setfacl -m g:"DOMAIN\\Managers":r-x /mnt/tank/project_data/reports
Важно: При работе с AD убедитесь, что время на TrueNAS синхронизировано с доменом. Разница во времени более 5 минут может вызвать проблемы с аутентификацией.

Резервное копирование и восстановление ACL

ACL — это важная часть конфигурации системы. Вот как их правильно бэкапить:

bash
#!/bin/bash
# Скрипт для бэкапа ACL
BACKUP_DIR="/mnt/tank/backups/acl"
DATASETS=("/mnt/tank/project_data" "/mnt/tank/web_data")
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

for dataset in "${DATASETS[@]}"; do
    # Получаем базовое имя датасета
    ds_name=$(basename "$dataset")
    
    # Экспортируем ACL
    getfacl -R "$dataset" > "$BACKUP_DIR/${ds_name}_acl_$DATE.txt"
    
    # Архивируем
    gzip "$BACKUP_DIR/${ds_name}_acl_$DATE.txt"
    
    echo "Backed up ACL for $dataset"
done

# Очистка старых бэкапов (храним 30 дней)
find "$BACKUP_DIR" -name "*.gz" -mtime +30 -delete

Восстановление ACL из бэкапа:

bash
# Восстановление ACL
zcat backup_acl.txt.gz | setfacl --restore=-

# Или для конкретного файла
setfacl -M backup_acl.txt /mnt/tank/project_data

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

Поделиться:
Сохранить гайд? В закладки браузера