One of my favourite things about Solarish operating systems is the deep integration of RBAC, and principle of least privilege. Briefly, the kernel knows about hundreds of distinct privileges, and a user has a privilege set. Root is the set of all privileges. A normal user has a set which makes it equivalent to the old concept of a non-root user. Roles and profiles make it easy for us to grant or remove privileges as they are required. (Or as they are not.)
I am playing around with a deployment model based on ZFS snapshots.
The first step, taking the snapshot traditionally would require
root
. Or, granting the user something like the ZFS File System
Management
profile and having it use pfexec
. Even the ZFS profile
is too loose: we don’t want to let the deployment user operate on
anything other than the one dataset it has too. What if the script
doing the job had a typo in a variable name or something, and we
deployed, or worse, removed the wrong thing?
One of, I think, the lesser-known zfs
commands is allow
. This
lets you grant any or all users the ability to perform a set of
options on any dataset(s).
I want my deploy
user to be able to snapshot my space/app_1
dataset, send that snapshot, then remove it. Watch:
$ id
uid=264(rob) gid=14(sysadmin)
$ zfs snapshot space/app_1@test
cannot create snapshot 'space/app_1@test': permission denied
# zfs allow rob snapshot,destroy,mount,send space/app_1
$ id
uid=264(rob) gid=14(sysadmin)
$ zfs snapshot space/app_1@test
$ zfs list space/app_1@test
NAME USED AVAIL REFER MOUNTPOINT
space/app_1@test 0 - 144K -
$ zfs send space/app_1@test | gpg2 -e -r recip@test.com >fs_img.gpg
Warning: using insecure memory!
$ ls -lh fs_img.gpg
-rw-r--r-- 1 rob sysadmin 3.2K Jul 5 22:18 fs_img.gpg
$ zfs destroy space/app_1@test
$ zfs list space/app_1@test
cannot open 'space/app_1@test': snapshot does not exist
My non-root user has created a GPG-encrypted snapshot of the
filesystem which I can ship around and receive
to my heart’s
content.
When the snapshot file is read back in with zfs recv
, the allow
property is blank: the grants are not carried over with the
snapshot.