Вводные данные:
smb.rpn.int
- файловый сервер Sambaotd1
- первое подразделение компанииotd2
- второе подразделение компанииunit1
- папка первого подразделенияunit2
- папка второго подразделенияshare
- общая папка всех подразделений.
Задача: организовать доступ к папкам таким образом:
- Пользователи из otd1 имели полный доступ к папке unit1, но не имели доступ к папке unit2
- Пользователи из otd2 имели полный доступ к папке unit2, но не имели доступ к папке unit1
- Все пользователи имеют полный доступ к папке share
- Все пользователи имеют право просматривать структуру корневой папки
В предыдущей статье рассказывалось о том, как организовать такой доступ, используя стандартные настройки Samba. Сейчас же рассмотрим более "продвинутый" метод - ACL.
Стандартные команды работы с ACL - setfacl
и getfacl
- подробно описаны в руководстве, поэтому здесь мы ограничимся примерами.
Для работы ACL необходимо включить поддержку этого функционала при монтировании файловой системы. Когда мы подключали кластерную файловую систему к кластеру, мы это предусмотрели:
# pcs resource create fs_smb_cluster ocf:heartbeat:Filesystem device="/dev/vg_samba/lv_samba" directory="/opt/smb_fs" fstype="gfs2" options="acl,noatime" --clone
Т.е. в параметре монтирования указываем опцию acl
. Если мы не используем кластерную файловую систему, а работаем с выделенным сервером, то эта опция указывается в файле, описывающим смонтированные устройства (/etc/fstab). Например:
# /dev/sda5
UUID=95b26917-535e-46ac-8d72-443d46184bb5 /media/Profil ext3 grpquota,acl
,suid,dev,usrquota,relatime,exec 0 2
Проверить поддерживает ли раздел работу с ACL можно попыткой установить список доступа на этот раздел. Например:
# setfacl -m u:testuser:rw-,g:root:rw- qqq setfacl: qqq: Operation not supported
Operation not supported говорит о том, что поддержка ACL не была включена и необходимо ее задействовать.
Т.к. сервер в данном примере работает в домене FreeIPA, то в первую очередь создаем несколько групп:
fs_users
- в данную группу будут входить все пользователи, имеющие право заходить на файловый сервер, и которым будет доступен листинг корневых папок ресурсаfs_admins
- группа пользователей, которым будут доступны все папки на сервере и которые смогут редактировать (настраивать) ACL непосредственно из файлового менеджера без доступа в консоль сервера.otd1
- пользователи первого подразделенияotd2
- пользователи второго подразделения
Далее на диске, который будет использоваться для файлового сервера создаем структуру папок:
# mkdir /opt/smb_fs/FS_Share # mkdir /opt/smb_fs/FS_Share/unit1 # mkdir /opt/smb_fs/FS_Share/unit2
Где FS_Share - точка монтирования диска. Далее назначаем хозяина папок и раздаем права:
# chown -R root:fs_admins /opt/smb_fs/FS_Share # chmod -R 2770 /opt/smb_fs/FS_Share
Т.е. мы назначаем группу владельца файлов и папок fs_admins
и разрешаем доступ с правом чтения-записи всем пользователям, принадлежащим этой группе.
Права 2770 гарантируют, что все файлы и подпапки, находящиеся в них, будут всегда создаваться с соответствующими подгруппами этих родительских папок. Немного изменим права доступа на корневую папку:
# chmod 2775 /opt/smb_fs/FS_Share
Далее настраиваем доступ к корневой общей папке и включаем ACL в конфигурации Samba:
[SHARE] comment = Корневая общая папка path = /opt/smb_fs/FS_Share map acl inherit = Yes # Включаем наследование политик доступа admin users = @fs_admins # Группа с полными правами в том числе и с редактированием ACL create mask = 0660 directory mask = 0770 force create mode = 0110 force group = +fs_admins inherit acls = Yes # Включаем наследование настроек по умолчанию acls родительского каталога inherit owner = Yes # Включаем наследование владельца от родительской папки inherit permissions = Yes # Включаем наследование разрешений от родительской папки read only = No valid users = @fs_users # Разрешаем группе fs_users из домена FreeIPA доступ к ресурсу write list = @admins # Разрешаем группе admins из домена FreeIPA доступ с правом записи к ресурсу
Перезапускаем сервер Samba с новыми настройками:
# systemctl restart smb
В итоге на сервере появилась общая папка SHARE
, в которую имеют доступ пользователи, входящие в группу fs_admins
.
Остается настроить права доступа на все папки общего ресурса. Для этого переходим в консоль сервера и начинаем настройку.
Устанавливаем права просмотра содержимого корневого каталога для всех пользователей, входящих в группу fs_users
(в отличии от групп Samba в группы домена FreeIPA могут входить другие группы. Т.е. в нашем случае в группу fs_admins
входят группы подразделений otd1
и otd2
):
# setfacl -m g:fs_users:rx /opt/smb_fs/FS_Share
Устанавливаем полный доступ для пользователей группы otd1
на папку и все последующие папки unit1
:
# setfacl -R -m g:otd1:rwx /opt/smb_fs/FS_Share/unit1
Устанавливаем полный доступ для пользователей группы otd2
на папку и все последующие папки unit2
:
# setfacl -R -m g:otd2:rwx /opt/smb_fs/FS_Share/unit2
Посмотреть права доступа можно выполнив следующую команду:
# getfacl /opt/smb_fs/FS_Share/unit2 getfacl: Removing leading '/' from absolute path names # file: opt/smb_fs/FS_Share/unit2/ # owner: root # group: fs_admins # flags: -s- user::rwx group::rwx group:otd2:rwx mask::rwx other::---
Т.е. мы видим, что в данную папку разрешен полный доступ группе otd2. Всем остальным доступ запрещен.
То же самое можно посмотреть для остальных папок.
В итоге мы добились поставленной цели: все пользователи могут читать структуру корневого каталога. Пользователь имеет полный доступ в папку своего подразделения. Доступ пользователю в папку чужого подразделения запрещен.
Особенности и ограничения.
-
При перемещении (mv) никаких дополнительных параметров ненужно;
-
При копировании (cp), необходимо использовать ключ -p, в противном случае ACL права будут потеряны;
По умолчанию графический интерфейс при копировании не учитывает ACL права!
-
При архивировании или распаковке вместо
tar
используйте утилитуstar
(устанавливается из стандартных репозитариев)
Наиболее часто встречающиеся опции star
:
Пример для архивирования утилитой star с сжатием:
star -czv -Hexustar -acl -f /tmp/homedir.tgz /media/Profil/home
Пример для разархивирования в текущий каталог:
star -xv -Hexustar -acl -f homedir.tgz