Ubuntu的用户、组、权限(ACL)管理

发布于:2024-04-23 ⋅ 阅读:(25) ⋅ 点赞:(0)

用户

创建用户

sudo adduser new_username

adduser --system [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID]
[--gecos GECOS] [--group | --ingroup GROUP | --gid ID] [--disabled-password]
[--disabled-login] [--add_extra_groups] USER

--ingroup 可以创建用户时指定组。

删除用户

sudo deluser username
这个命令会删除一个现有的用户账户。

  • --remove-home 移除home和邮件。
  • --remove-all-files 移除该用户为所有者的所有文件。
  • 其他参数可以用deluser -h查看。

查看用户

所有用户

cat /etc/passwd

自己创建的(因为一般在/home)

ls  /home | grep ""

查看所有组

cat /etc/group

创建组

sudo addgroup new_group_name

删除组

sudo delgroup group_name

改变用户所在组

usermod -g 组名 用户名

从组中移除用户

deluser 用户名 组名

将用户追加到其他组

adduser 用户名 组名 (更方便)
或者
usermod -a -G 组名 用户名
将用户追加到其他组,此时用户拥有多个组。
例如:
sudo usermod -a -G sudo testuser 使testuser追加到sudo组,所以可以使用sudo命令。

id

查看用户以及所属组名字和id

id 用户名

查看用户id

id -u 用户名

查看所属组

查看所属组id

id -G 用户名

查看所属组名字

id -Gn 用户名 等效于 groups 用户名

查看有效用户组(主组)

查看有效用户组(主组)id

id -g 用户名

查看有效用户组(主族)名字

id -gn 用户名

权限管理-setfacl

安装acl

apt install acl

查看权限

getfacl /home/tmp

ACL的权限规则如下:

  • 所有者权限owner:无论所有者在哪个组,它都有对当前文件的此权限。
  • 所属组权限:组内成员对当前文件的此权限。
  • other权限:其他成员对当前文件的此权限。
  • mask权限:不管是所有者、所属组还是other的有效权限都是与mask权限进行与操作后获得的权限。他限制了当前文件/目录能被分配到的最大权限。

例如:

# file: home/tmp      
这一行指出了ACL设置是针对哪个文件或目录的,这里是 /home/tmp
# owner: tmp          
指出文件或目录的所有者是 tmp 用户。
# group:tmp
指出文件或目录属于 tmp组。
user::rwx             
拥有者(owner: tmp)是rwx权限。
user:usertest:rwx                 #effective:r-x          
标明usertest用户是本来是rwx权限,但是由于mask权限所以真实权限就是r-x。
group::rwx                      #effective:r-x
标明tmp组内的成员本来是rwx权限,但是由于mask权限所以真实权限就是r-x。
group:normal:rwx                #effective:r-x
标明normal组内的成员本来是rwx权限,但是由于mask权限所以真实权限就是r-x。
mask::r-x
other::---
其他用户(other)没有任何权限(---),即他们不能读取、写入或执行这个文件或目录。

可以看到用户tmp既有user::rwx指定的权限,也有group::rwx 的权限(用户tmp在tmp组内),那具体是什么权限可以参考:多种权限并集为最终权限

增加组权限

sudo setfacl -R -m g:group_name:permissions file_or_directory
	-R:递归地对目标目录及其所有子目录和文件应用权限更改(Optional)-m 表示修改ACL条目。
	g:group_name 指定用户组。
	permissions 指定组的权限(例如 rwx 为读写执行三种权限)。
	file_or_directory 是目标文件或目录。
sudo setfacl -R -m g::permissions file_or_directory
	不指定具体组时,就是对当前文件本来所属组赋予permissions权限。

例如:sudo setfacl -R -m g:normal:rw /home/tmp
normal组增加对/home/tmp目录的读写操作。

删除组权限

sudo setfacl -x g:group_name file_or_directory
	-x 表示移除ACL条目。
	g:group_name 指定用户组。
	file_or_directory 是目标文件或目录。
	撤销所有扩展的ACL权限
sudo setfacl -b file_or_directory
	-b 表示删除所有基本ACL条目。
	file_or_directory 是目标文件或目录。

增加删除用户权限

sudo setfacl -m u:username:permissions file_or_directory

sudo setfacl -m u::permissions file_or_directory
owner权限修改。

sudo setfacl -x u:username file_or_directory

设置mask权限

setfacl -m m:rwx /path/to/directory

应用ACL的例子

假设我现在有一个用户叫user, 还有一个目录是/home/tmp, 我现在需要为改用户增加对/home/tmp的所有权限rwx,但是希望它对/home/tmp中的所有文件或者目录都是不可写(权限是rx),我们可以使用两步来实现这个。

  1. setfacl -m u:user:rwx /home/tmpuser创建/home/tmp目录的使用权限为rwx
  2. setfacl -m m:rx /home/tmp/** 为该目录下的所有文件或者目录指定最高的mask权限为rx

此时用户user可以在/home/tmp目录中自己创建文件,user创建了文件以后,它创建的文件就会属于useruser所在的组,因此它可以任意修改这些自己创建的文件
但是对于/home/tmp/中的本来已经有的文件(这些文件都被指定了mask权限是rx),用户user只可以读取和执行,而不能写入和修改。
相同道理,用户user创建的文件权限只属于它,所以其他用户对这些文件没有权限。

注意:多种权限并集为最终权限

ACL可以对一个文件给多个用户/组赋予不同权限,这时会产生一个现象:
假设用户tmp同时属于组normal和组tmp。我们现在给一个文件赋予了normal组的rw权限,又赋予了tmp组的rx权限,然后我们又又赋予tmp用户rw权限,同时我们又又又发现这个文件的owner就是tmp, 这时tmp本身对该文件就是rwx权限(没修改的话),那么tmp用户实际上是拥有哪个权限呢?

答案是rwx权限,它会在多个权限里取并集,获得最终的权限。

chmod

Linux chmod命令
不想搞了,感觉setfacl提供了比 chmod更高的灵活性,允许为不同的用户和组设置不同的权限。

不过一些特殊权限好像必须用chmod来搞:
linux suid,sgid,sticky-bit三种特殊权限简介
Linux特殊权限SUID/SGID/Sticky

这里简单说一下,正常来说我们是赋予一个用户使用什么权限来执行这个文件。
这里的特殊权限有点反过来,它是设置了一个文件给所有用户什么权限来执行它。

setuid - 4

当一个被设置了setuid位的可执行文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都是用文件所有者的特权来执行它的。
一般的su、passwd、sudo等这种普通用户需要提升到root权限的都是通过setuid

# 在root用户下执行
chmod 4755 /usr/bin/su
chmod 4755 /usr/bin/passwd
chmod 4755 /usr/bin/sudo
or
chmod u+s /usr/bin/su
...

这样设置了setuid,以后用户就可以在执行这些文件时具有文件所有者(root)的权限了。

如果要去除此特殊权限:

chmod u-s file

setgid - 2

当一个文件被设置了setgid时,该文件将以所属组的身份运行,
当一个目录被设置了setgid时,无论谁在这目录中创建文件,这个文件都属于父目录的所属组,而不是创建者所在的组。并且在创建的文件被自动添加setgid

chmod g+s file

如果要去除此特殊权限:

chmod g-s file

sticky - 1

对一个目录/文件设置了sticky之后,尽管其他用户有写权限,也必须由属主执行删除、移动等操作。
像/tmp这样的目录需要某个用户创建的文件不被其他用户所删除,就需要设置sticky

chmod 1777 /tmp
or
chmod o+t /tmp

如果要去除此特殊权限:

chmod o-t file