本文介绍在使用NFS v3协议挂载的文件系统上,如何设置POSIX ACL来进行文件和目录权限管理。
前提条件
已使用NFS v3协议挂载文件系统。具体操作,请参见挂载NFS协议文件系统。
命令说明
在设置POSIX ACL前,请先熟悉相关操作命令。
命令  | 说明  | 
getfacl <filename>  | 查看文件当前的ACL。  | 
setfacl -m g::w <filename>  | 给GROUP设置写权限。  | 
setfacl -m u:player:w <filename>  | 给用户player设置写权限。  | 
setfacl -m g:players:rwx <filename>  | 给用户组players设置读写执行权限。  | 
setfacl -x g:players <filename>  | 删除用户组players的权限。  | 
getfacl file1 | setfacl --set-file=- file2  | 将文件file1的ACL复制到文件file2上。  | 
setfacl -b file1  | 删除文件file1上的所有非mode的ACE。  | 
setfacl -k file1  | 删除文件file1上的所有default的ACE。  | 
setfacl -R -m g:players:rw dir  | 对目录树dir下的文件和目录增加用户组players读写的权限。  | 
setfacl -d -m g:players:rw dir1  | 用户组players对目录dir1下新创建的文件和目录都有读写权限。  | 
操作步骤
您可以参考以下步骤,为目录或文件设置NFS ACL实现权限管理。
创建用户和群组。
本示例假设创建普通用户player,属于普通用户群组players;管理员admini,属于管理员群组adminis;另外再创建一个用户anonym。
sudo useradd player sudo groupadd players sudo usermod -g players player sudo useradd admini sudo groupadd adminis sudo usermod -g adminis admini sudo useradd anonym对目录和文件设置POSIX ACL实现权限管理。
本示例假设创建目录dir0,针对目录dir0中的所有文件,授予players只读权限,授予adminis读写执行权限,不授予其他用户权限。
sudo umask 777 sudo mkdir dir0 sudo setfacl -m g:players:r-x dir0 sudo setfacl -m g:adminis:rwx dir0 sudo setfacl -m u::--- dir0 sudo setfacl -m g::--x dir0 sudo setfacl -m o::--- dir0 sudo setfacl -d -m g:players:r-x dir0 sudo setfacl -d -m g:adminis:rwx dir0 sudo setfacl -d -m u::--- dir0 sudo setfacl -d -m g::--x dir0 sudo setfacl -d -m o::--- dir0设置完成后,可执行
sudo getfacl dir0查看设置结果。# file: dir0 # owner: root # group: root user::--- group::--x group:players:r-x group:adminis:rwx mask::rwx other::--- default:user::--- default:group::--x default:group:players:r-x default:group:adminis:rwx default:mask::rwx default:other::---验证ACL设置结果。
验证用户admini具有读写权限。
sudo su admini -c 'touch dir0/file'sudo su admini -c 'echo 123 > dir0/file'验证用户player具有只读权限。
验证无创建file文件的权限。
例如,在dir0目录下创建file文件。
执行命令
sudo su player -c 'touch dir0/file'如果返回如下类似信息,则表示用户player无创建file文件的权限。
touch: cannot touch ‘dir0/file’: Permission denied
验证查看dir0/file文件内容。
执行命令
sudo su player -c 'cat dir0/file'如果返回如下信息,则表示用户player具有查看dir0/file文件内容的权限。
123
验证写权限。
执行命令
sudo su player -c 'echo 456 >> dir0/file'如果返回如下信息,则表示用户player无写权限。
bash: dir0/file: Permission denied
您还可以通过执行
sudo su player -c 'getfacl dir0/file'命令,查看用户player对dir0/file的权限。# file: dir0/file # owner: admini # group: adminis user::--- group::--- group:players:r-x group:adminis:rwx mask::rwx other::---
验证用户anonym无权限。
验证无权限查看dir0目录下的文件。
执行命令
sudo su anonym -c 'ls dir0'如果返回如下信息,则表示用户anonym无权限访问。
ls: cannot open directory dir0: Permission denied
验证无权限查看file文件的内容。
执行命令
sudo su anonym -c 'cat dir0/file'如果返回如下信息,则表示用户anonym无权限查看file文件的内容。
cat: dir0/file: Permission denied
验证无权限访问file文件。
执行命令
sudo su anonym -c 'getfacl dir0/file'如果返回如下信息,则表示用户anonym无权限访问file文件。
getfacl: dir0/file: Permission denied
相关操作
如果您要移除用户权限,可参见以下方法。
建议在使用NFS v4 ACL时,尽量把每个用户归类到群组中。在设置NFS v4 ACL时直接设置群组权限而不用设置单个用户的权限。这样在移除用户权限时只需把用户移出某个群组即可。例如:见以下命令将用户admini移出群组adminis,移入群组adminis2。
创建adminis2群组。
sudo groupadd adminis2将用户admini移出群组adminis,移入群组adminis2。
sudo usermod -g adminis2 admini查询用户ID权限。
执行命令
id admini返回信息
uid=1057(admini) gid=1057(admini) groups=1061(adminis2)
验证用户admini具备的权限。
验证无权限访问dir0目录。
执行命令
sudo su admini -c 'ls dir0'如果返回以下信息,则表示用户admini无权限访问dir0目录。
ls: cannot open directory dir0: Permission denied
验证用户admini无权限查看dir0/file文件的内容。
执行命令
sudo su admini -c 'cat dir0/file'如果返回以下信息,表示用户admini无权限查看dir0/file文件的内容。
cat: dir0/file: Permission denied
验证用户admini无权限访问dir0/file。
执行命令
sudo su admini -c 'getfacl dir0/file'如果返回以下信息,表示用户admini无权限访问dir0/file。
getfacl: dir0/file: Permission denied