В этой главе описывается делегирование администрирования ZFS, с помощью которого непривилегированные пользователи могут выполнять работы по администрированию ZFS.
Эта функциональная возможность позволяет раздавать уточненные разрешения конкретным пользователям, группам или всем. Поддерживаются два типа делегирования разрешений:
Индивидуальные разрешения – например create, destroy, mount, snapshot и т. п. – можно задавать в явном виде.
Можно определять группы разрешений, которые называются наборами разрешений. Набор разрешений можно впоследствии изменить, и все потребители этого набора автоматически получат это изменение. Наборы разрешений начинаются с символа @ и не могут быть длиннее 64 символов. Символы, идущие в имени набора после символа@, подчиняются тем же ограничениям, что и обычные имена файловой системы ZFS.
Делегированное администрирование в ZFS предоставляет функциональные возможности, подобные модели безопасности RBAC. Модель делегирования в ZFS предоставляет следующие преимущества для администрирования пулов устройств хранения данных и файловых систем:
Разрешения следуют за пулом устройств хранения ZFS при переходе пула.
Предоставляет динамическое наследование, позволяющее контролировать распространение разрешений по файловым системам.
Можно настроить их так, что только создатель файловой системы сможет удалить эту файловую систему.
Можно распространять разрешения на конкретные файловые системы. Вновь созданные файловые системы могут автоматически получать разрешения.
Такая модель обеспечивает простоту администрирования NFS. Например, пользователь с явными разрешениями может создать моментальный снимок содержимого NFS в соответствующем каталоге .zfs/snapshot .
Рассмотрите возможность использования делегированного администрирования для распределения задач ZFS. Дополнительную информацию об использовании RBAC для управления общими задачами администрирования Solaris приведено в разделе Часть III, Roles, Rights Profiles, and Privileges, в System Administration Guide: Security Services.
Можно разрешить или запретить делегирование администрирования с помощью настройки свойства пула delegation. Например:
# zpool get delegation users NAME PROPERTY VALUE SOURCE users delegation on default # zpool set delegation=off users # zpool get delegation users NAME PROPERTY VALUE SOURCE users delegation off local |
По умолчанию свойство delegation разрешает использовать эти функции.
Можно использовать команду zfs allow для предоставления разрешений на наборы данных ZFS пользователям, отличным от root, следующими способами:
Индивидуальные разрешения можно предоставлять пользователю, группе или всем.
Группы индивидуальных разрешений можно предоставлять как наборы разрешений пользователю, группе или всем.
Разрешения можно предоставлять локально, на текущий набор данных или на все дочерние наборы для текущего набора данных.
В приведенной ниже таблице описаны операции, которые можно делегировать, и все зависимые разрешения, необходимые для выполнения делегированных операций.
Разрешение (подкоманда) |
Описание |
Зависимости |
---|---|---|
allow |
Возможность предоставлять имеющиеся у вас разрешения другому пользователю. |
Вы должны также обладать разрешением, которое предоставляете. |
clone |
Возможность клонировать все моментальные снимки этого набора данных. |
Нужно также иметь разрешение на выполнение операций create и mount в исходной файловой системе. |
create |
Возможность создавать дочерние наборы данных. |
Нужно также иметь разрешение на выполнение операции монтирования mount. |
destroy |
Возможность удалить набор данных. |
Нужно также иметь разрешение на выполнение операции монтирования mount. |
mount |
Возможность монтировать и размонтировать набор данных, а также создавать и удалять ссылки на устройство тома. | |
promote |
Возможность заменить клон набором данных. |
Нужно также иметь разрешение на выполнение операций mount и promote в исходной файловой системе. |
receive |
Возможность создания дочерней файловой системы с помощью команды zfs receive. |
Необходимо также иметь возможность выполнения операций mount и create. |
rename |
Возможность переименовать набор данных. |
Нужно также иметь разрешение на выполнение операций create и mount в новом родительском наборе данных. |
rollback |
Возможность отката моментального снимка. |
Нужно также иметь разрешение на выполнение операции монтирования mount. |
send |
Возможность посылать потоковое представление моментального снимка. | |
share |
Возможность предоставлять и отключать общий доступ к набору данных. | |
snapshot |
Возможность создавать моментальный снимок набора данных. |
Пользователь может делегировать следующий набор разрешений (которые могут быть ограничены разрешением только для доступа, чтения или изменения):
groupquota
groupused
userprop
userquota
userused
Кроме того, можно делегировать следующие свойства ZFS пользователям, отличным от root:
aclinherit
aclmode
atime
canmount
casesensitivity
checksum
compression
copies
devices
exec
mountpoint
nbmand
normalization
primarycache
quota
readonly
recordsize
refreservation
reservation
secondarycache
setuid
shareiscsi
sharenfs
sharesmb
snapdir
utf8only
version
volblocksize
volsize
vscan
xattr
zoned
Некоторые из этих свойств можно указать только в момент создания набора данных. Описание этих свойств ZFS приведено в разделе Введение в свойства ZFS.
Команда zfs allow имеет следующий синтаксис:
# zfs allow -[ldugecs] everyone|user|group[,,...] perm|@setname,...] filesystem| volume |
Следующая команда zfs allow (выделено жирным шрифтом) показывает, кому делегированы разрешения:
zfs allow [-uge]|user|group|everyone [,...] filesystem | volume |
Несколько сущностей можно задавать в виде списка, разделенного запятыми. Если не указаны параметры -uge, аргумент интерпретируется по умолчанию как ключевое слово everyone, за которым следует имя пользователя, затем имя группы. Чтобы указать пользователя или группу с именем everyone, используйте параметр -u или -g. Чтобы указать имя группы, совпадающее с именем пользователя, воспользуйтесь параметром -g. Параметр -c предоставляет разрешения времени создания.
Следующая команда zfs allow (выделено жирным шрифтом) показывает, как задаются разрешения и наборы разрешений:
zfs allow [-s] ... perm|@setname [,...] filesystem | volume |
Несколько разрешений можно задавать в виде списка, разделенного запятыми. Имена разрешений совпадают с подкомандами и свойствами ZFS. Для получения дополнительной информации см. предыдущий раздел.
Разрешения можно объединять в наборы разрешений, признаком которых служит параметр -s. Наборы разрешений могут использоваться в других командах zfs allow для указанной файловой системы и ее потомков. Наборы разрешений проверяются динамически, так что внесенные в набор изменения немедленно обновляются. Наборы разрешений следуют тому же соглашению об именах, что и файловые системы ZFS, но имя должно начинаться с символа (@) и не может быть длиннее 64 символов.
Следующая команда zfs allow (выделено жирным шрифтом) показывает, как делегируются разрешения:
zfs allow [-ld] ... ... filesystem | volume |
Параметр -l означает, что разрешение предоставляется для указанного набора данных, но не для его дочерних наборов данных (если не указан также параметр -d). Параметр -d означает, что разрешение предоставляется для дочерних наборов данных, но не для этого набора данных (если не указан также параметр -l). Если ни один из параметров -ld не задан, разрешения предоставляются для файловой системы или тома и всех их потомков.
Можно удалить ранее предоставленные разрешения с помощью команды zfs unallow.
Предположим, разрешения create, destroy, mount и snapshot делегированы следующим образом:
# zfs allow cindys create,destroy,mount,snapshot tank/cindys # zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot ------------------------------------------------------------- |
Чтобы удалить эти разрешения, используйте команды, подобные следующим:
# zfs unallow cindys tank/cindys # zfs allow tank/cindys |
В данном разделе предоставлены примеры вывода и делегирования делегированных разрешений ZFS.
Для вывода разрешений можно использовать следующую команду:
# zfs allow dataset |
Эта команда выводит разрешения, которые установлены или разрешены в этом наборе данных. Выходные данные содержат следующие компоненты:
Наборы разрешений
Конкретные разрешения или разрешения времени создания
Локальный набор данных
Локальные и дочерние наборы данных
Только дочерние наборы данных
Следующие выходные данные в этом примере показывают, что пользователь cindys может удалять, монтировать и создавать моментальные снимки в файловой системе tank/cindys.
# zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot |
Выходные данные в этом примере указывают следующие разрешения по отношению к файловым системам pool/fred и pool.
Для файловой системы pool/fred:
Определены два набора разрешений:
@eng (create, destroy, snapshot, mount, clone, promote, rename)
@simple (create, mount)
Разрешения времени создания устанавливаются для набора разрешений @eng и свойства mountpoint. "Время создания" означает, что после создания набора данных предоставляются набор разрешений @eng и свойство mountpoint.
Пользователю tom предоставляется набор разрешений @eng, а пользователю joe – разрешения create, destroy и mount для локальных файловых систем.
Пользователю fred предоставляется набор разрешений @basic, а также разрешения share и rename для локальных и дочерних файловых систем.
Пользователю barney и группе staff предоставляется набор разрешений @basic только для дочерних файловых систем.
Для файловой системы pool:
Определяется набор разрешений @simple (create, destroy, mount).
Группе staff предоставляется набор разрешений @simple для локальной файловой системы.
Выходные данные для этого примера:
$ zfs allow pool/fred ------------------------------------------------------------------------------ Permission sets on (pool/fred) @eng create,destroy,snapshot,mount,clone,promote,rename @simple create,mount Create time permissions on (pool/fred) @eng,mountpoint Local permissions on (pool/fred) user tom @eng user joe create,destroy,mount Local+Descendent permissions on (pool/fred) user fred @basic,share,rename Descendent permissions on (pool/fred) user barney @basic group staff @basic ------------------------------------------------------------------------------ Permission sets on (pool) @simple create,destroy,mount Local permissions on (pool) group staff @simple ------------------------------------------------------------------------------ |
При предоставлении разрешений create и mount отдельному пользователю необходимо убедиться, что у этого пользователя есть разрешения на базовую точку монтирования.
Например, чтобы предоставить пользователю разрешения marks create и mount для tank, сначала следует установить следующие разрешения:
# chmod A+user:marks:add_subdirectory:fd:allow /tank |
Затем с помощью команды zfs allow предоставьте разрешения create , destroy и mount. Пример:
# zfs allow marks create,destroy,mount tank |
Теперь пользователь marks может создавать собственные файловые системы в файловой системе tank. Пример:
# su marks marks$ zfs create tank/marks marks$ ^D # su lp $ zfs create tank/lp cannot create 'tank/lp': permission denied |
Следующий пример иллюстрирует настройку файловой системы таким образом, чтобы каждый член группы staff мог создавать и монтировать файловые системы в файловой системе tank, а также мог удалять собственные файловые системы. Однако члены группы staff не могут удалять файловые системы других пользователей.
# zfs allow staff create,mount tank # zfs allow -c create,destroy tank # zfs allow tank ------------------------------------------------------------- Create time permissions on (tank) create,destroy Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- # su cindys cindys% zfs create tank/cindys cindys% exit # su marks marks% zfs create tank/marks/data marks% exit cindys% zfs destroy tank/marks/data cannot destroy 'tank/mark': permission denied |
Необходимо убедиться, что разрешения предоставляются пользователям на правильном уровне файловой системы. Например, пользователю marks предоставляются разрешения create, destroy и mount для локальных и дочерних файловых систем. Пользователю marks предоставляется локальное разрешение на создание снимков файловой системы tank, но ему не разрешается создавать снимки его собственной файловой системы. Таким образом, он не получил разрешение snapshot на правильном уровне файловой системы.
# zfs allow -l marks snapshot tank # zfs allow tank ------------------------------------------------------------- Local permissions on (tank) user marks snapshot Local+Descendent permissions on (tank) user marks create,destroy,mount ------------------------------------------------------------- # su marks marks$ zfs snapshot tank/@snap1 marks$ zfs snapshot tank/marks@snap1 cannot create snapshot 'mark/marks@snap1': permission denied |
Чтобы предоставить пользователю marks разрешение на дочернем уровне, воспользуйтесь командой zfs allow с параметром - d. Пример:
# zfs unallow -l marks snapshot tank # zfs allow -d marks snapshot tank # zfs allow tank ------------------------------------------------------------- Descendent permissions on (tank) user marks snapshot Local+Descendent permissions on (tank) user marks create,destroy,mount ------------------------------------------------------------- # su marks $ zfs snapshot tank@snap2 cannot create snapshot 'tank@snap2': permission denied $ zfs snapshot tank/marks@snappy |
Теперь пользователь marks может создавать снимки только на уровнях ниже уровня tank.
Можно предоставлять конкретные разрешения пользователям или группам. Например, следующая команда zfs allow предоставляет конкретные разрешения группе staff. Кроме того, разрешения destroy и snapshot предоставляются после создания файловых систем tank.
# zfs allow staff create,mount tank # zfs allow -c destroy,snapshot tank # zfs allow tank ------------------------------------------------------------- Create time permissions on (tank) destroy,snapshot Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- |
Поскольку пользователь marks является членом группы staff, он может создавать файловые системы в tank. Кроме того, пользователь marks может создавать моментальные снимки tank/marks2, поскольку у него есть конкретное разрешение на это. Пример:
# su marks $ zfs create tank/marks2 $ zfs allow tank/marks2 ------------------------------------------------------------- Local permissions on (tank/marks2) user marks destroy,snapshot ------------------------------------------------------------- Create time permissions on (tank) destroy,snapshot Local+Descendent permissions on (tank) group staff create everyone mount ------------------------------------------------------------- |
Однако он не может создать моментальный снимок в tank/marks, поскольку не имеет конкретного разрешения на это. Пример:
$ zfs snapshot tank/marks2@snap1 $ zfs snapshot tank/marks@snappp cannot create snapshot 'tank/marks@snappp': permission denied |
При наличии разрешения create в собственном домашнем каталоге пользователь может создавать свои собственные каталоги снимков. Этот случай может оказаться полезным, если пользовательская файловая система монтируется в NFS. Пример:
$ cd /tank/marks2 $ ls $ cd .zfs $ ls snapshot $ cd snapshot $ ls -l total 3 drwxr-xr-x 2 marks staff 2 Dec 15 13:53 snap1 $ pwd /tank/marks2/.zfs/snapshot $ mkdir snap2 $ zfs list NAME USED AVAIL REFER MOUNTPOINT tank 264K 33.2G 33.5K /tank tank/marks 24.5K 33.2G 24.5K /tank/marks tank/marks2 46K 33.2G 24.5K /tank/marks2 tank/marks2@snap1 21.5K - 24.5K - tank/marks2@snap2 0 - 24.5K - $ ls snap1 snap2 $ rmdir snap2 $ ls snap1 |
Следующий пример иллюстрирует создание набора разрешений @myset и предоставление этого набора разрешений и разрешения на переименование группе staff для файловой системы tank. Пользователь cindys, будучи членом группы staff, имеет разрешение на создание файловой системы в tank. Однако пользователь lp не имеет разрешения на создание файловой системы в tank.
# zfs allow -s @myset create,destroy,mount,snapshot,promote,clone,readonly tank # zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot ------------------------------------------------------------- # zfs allow staff @myset,rename tank # zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot Local+Descendent permissions on (tank) group staff @myset,rename # chmod A+group:staff:add_subdirectory:fd:allow tank # su cindys cindys% zfs create tank/data Cindys% zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot Local+Descendent permissions on (tank) group staff @myset,rename ------------------------------------------------------------- cindys% ls -l /tank total 15 drwxr-xr-x 2 cindys staff 2 Aug 8 14:10 data cindys% exit # su lp $ zfs create tank/lp cannot create 'tank/lp': permission denied |
Для удаления предоставленных разрешений можно использовать команду zfs unallow. Например, пользователь cindys имеет разрешения на создание, удаление, монтирование и создание моментального снимка в файловой системе tank/cindys.
# zfs allow cindys create,destroy,mount,snapshot tank/cindys # zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount,snapshot ------------------------------------------------------------- |
Следующая команда zfs unallow удаляет разрешение пользователя cindys на создание снимка из файловой системы tank/cindys:
# zfs unallow cindys snapshot tank/cindys # zfs allow tank/cindys ------------------------------------------------------------- Local+Descendent permissions on (tank/cindys) user cindys create,destroy,mount ------------------------------------------------------------- cindys% zfs create tank/cindys/data cindys% zfs snapshot tank/cindys@today cannot create snapshot 'tank/cindys@today': permission denied |
В другом примере пользователь marks имеет следующие разрешения в tank/marks:
# zfs allow tank/marks ------------------------------------------------------------- Local+Descendent permissions on (tank/marks) user marks create,destroy,mount ------------------------------------------------------------- |
В данном примере следующая команда zfs unallow удаляет все разрешения для пользователя marks из tank/marks:
# zfs unallow marks tank/marks |
Следующая команда·zfs unallow удаляет разрешения, заданные для файловой системы tank.
# zfs allow tank ------------------------------------------------------------- Permission sets on (tank) @myset clone,create,destroy,mount,promote,readonly,snapshot Create time permissions on (tank) create,destroy,mount Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- # zfs unallow -s @myset tank $ zfs allow tank ------------------------------------------------------------- Create time permissions on (tank) create,destroy,mount Local+Descendent permissions on (tank) group staff create,mount ------------------------------------------------------------- |