Представь, что твоя команда разработчиков работает над проектом, и тебе нужно настроить сложные права доступа к общим папкам на TrueNAS. Один отдел должен иметь полный доступ, другой — только чтение, а третий — доступ к определенным подпапкам. Именно для таких сценариев существуют списки контроля доступа (ACL). Давай разберем, как правильно настроить ACL в TrueNAS для разных протоколов.
Что такое ACL в TrueNAS и зачем они нужны
ACL (Access Control Lists) — это расширенная система разрешений, которая позволяет задавать права доступа с гораздо большей гибкостью, чем стандартные Unix-права (755, 644 и т.д.). В TrueNAS реализованы два основных типа ACL:
- NFSv4 ACL — современный стандарт для Unix/Linux систем
- Windows ACL — для совместимости с SMB/CIFS протоколами
Настройка ACL через веб-интерфейс TrueNAS
Давай начнем с самого простого способа — настройки через графический интерфейс.
Шаг 1: Создание набора данных с поддержкой ACL
Сначала создадим новый набор данных с правильными настройками:
1. Storage → Datasets → Add Dataset
2. Имя: project_data
3. Share Type: SMB
4. ACL Type: NFSv4
5. Apply Permissions: ✓
6. Create
Шаг 2: Настройка ACL для конкретной папки
После создания набора данных переходим к настройке прав:
1. Storage → Datasets → project_data → Permissions
2. Нажать "Edit ACL"
3. Добавить записи ACL для разных пользователей/групп
4. Сохранить и применить рекурсивно (если нужно)
Настройка ACL через командную строку
Для автоматизации и тонкой настройки часто удобнее использовать CLI. TrueNAS использует стандартные утилиты для работы с ACL.
Работа с NFSv4 ACL через setfacl/getfacl
Пример настройки сложных прав для команды разработки:
# Просмотр текущих 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:
#!/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 нужно правильно настроить общий доступ:
# /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 и убедитесь, что у вас есть права на изменение всех файлов:
setfacl -R -b /mnt/tank/dataset # Очистить все ACL
setfacl -R -m u:user:rwx /mnt/tank/dataset # Применить рекурсивно
Проблема 2: Конфликт между Unix правами и ACL
Решение: ACL имеют приоритет над стандартными Unix правами. Убедитесь, что mask в ACL установлена правильно:
# Проверить mask
getfacl /path/to/dir | grep mask
# Установить правильную mask
setfacl -m mask::rwx /path/to/dir
Проблема 3: ACL не работают через SMB
Решение: Проверьте настройки SMB-шары и убедитесь, что включена поддержка ACL:
# Проверить параметры шары
midclt call smb.shareshare_get [id]
# Включить поддержку ACL через API
midclt call smb.shareshare_update [id] {"acl": true, "abe": true}
Автоматизация управления ACL
Для управления ACL в production-среде рекомендуется использовать автоматизацию. Вот пример скрипта для массового применения ACL:
#!/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
Для поддержания безопасности важно регулярно проверять ACL. Вот несколько полезных команд:
# Поиск файлов с определенными 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 отлично справляется с этой задачей:
# Настройка подключения к 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
Резервное копирование и восстановление ACL
ACL — это важная часть конфигурации системы. Вот как их правильно бэкапить:
#!/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 из бэкапа:
# Восстановление ACL
zcat backup_acl.txt.gz | setfacl --restore=-
# Или для конкретного файла
setfacl -M backup_acl.txt /mnt/tank/project_data
Правильная настройка ACL в TrueNAS — это мощный инструмент для управления доступом в сложных средах. Начни с простых правил, тестируй изменения и постепенно усложняй конфигурацию по мере необходимости. Помни, что лучшая практика — минимальные необходимые права для каждой задачи.