跳转至

权限

命令一览

用户管理

语法:

useradd [-mMnr] [option1] [parameter1] [option2] [parameter2] [用户名]
useradd -D [option1] [parameter1] [option2] [parameter2]

-D参数说明:

-D表示变更预设值, 而不是新建用户.

例子
useradd -D # 显示当前useradd的默认设置
sudo useradd -D -b /new/default/home/dir # 设置新用户默认主目录路径

[-mMnr]参数说明:

  • -m: 自动建立用户的登入目录
  • -M: 不要自动建立用户的登入目录
  • -n: 取消建立以用户名称为名的群组
  • -r: 建立系统账号

[options]参数说明:

  • -c: 备注, 会显示在备注栏中
  • -d: 用户登陆的起始目录
  • -e: 有效期限
  • -f: 密码过期后多少天即关闭账号
  • -g: 用户所在的群组
  • -G: 用户所属的附加群组
  • -s: 用户登陆后使用的shell
  • -u: 用户id

语法:

userdel [-r] [用户名]

[-r]参数说明:

-r表示删除用户登入目录以及目录中的所有文件

语法:

usermod [-LU] [option1] [parameter1] [option2] [parameter2] [用户名]

[-LU]参数说明:

  • -L: 锁定用户密码, 使密码无效
  • -U: 解除密码锁定

[option]参数说明:

  • -c: 备注, 会显示在备注栏中
  • -d: 用户登陆的起始目录
  • -e: 有效期限
  • -f: 密码过期后多少天即关闭账号
  • -g: 用户所在的群组
  • -G: 用户所属的附加群组
  • -s: 用户登陆后使用的shell
  • -u: 用户ID

语法:

groupadd [-r] [-g [gid] -of] [-K] [组名]

[-r]参数说明:

创建系统工作组.

[-g [gid] -of]参数说明:

  • -g: 指定新增用户组的组ID
  • -f: 当指定的用户组ID已经存在时, 会自动选择另外一个唯一的组ID, 取代指定的组ID, 成功返回
  • -o: 允许添加组ID号不唯一的工作组

    例子
    sudo groupadd -g 1001 -o newgroup
    

    表示创建一个名为newgroup的组, 并将其组ID设置为1001, 即使已经存在另一个组ID为1001的组

[-k]参数说明:

采用变量赋值的方式, 覆盖配置文件/etc/login.defs, 如-K [key1] = [value1], -k [key2] = [value2]

语法:

groupdel [组名]

语法:

groupmod [-g [gid] -o] [-n [新组名]] [组名]

[-g [gid] -o]参数说明:

  • -g: 指定新增用户组的组ID
  • -o: 允许改为组ID号不唯一的工作组

[-n [新组名]]参数说明:

设置想要使用的群组名称.

文件管理

语法:

chmod [-cfvR] mode file

mode参数说明:

用于权限设定字串, 格式如下:

[ugoa...][[+-=][rwx]...]

其中:

  • u表示该文件的拥有者, g表示与该文件的拥有者属于同一个组的用户, o表示其他的用户, a表示三者皆是
  • +表示增加权限, -表示取消权限, =表示唯一设定权限
  • r, w, x详情见下方

[-cvfR]参数说明:

  • -c: 显示权限并更的资料
  • -f: 若该文件权限无法更改, 不要显示错误信息
  • -v: 显示权限并更的详细资料
  • -R: 以递归的方式变更

语法:

chown [options] [owner][:[group]] file

[options]参数说明:

  • -h: 只会影响链接本身, 不会影响链接所链接的文件
  • -R: 递归地改变文件夹下所有文件的属主

[owner][:[group]]参数说明:

  • [user]: [user]变成了该文件的属主
  • [user]:: [user]变成了该文件的属主, [user]的登陆组变成了文件的属组
  • [user]:[group]: [user]变成了文件的属主, [group]变成了文件的属组
  • :[group]: [group]变成了文件的属组
  • :: 不会发生任何变化

语法:

chgrp [options] [group] file

[options]参数说明:

  • -h: 只会影响链接本身, 不会影响链接所链接的文件
  • -R: 递归地改变文件夹下所有文件的属组

语法:

getfacl [options] [filename]

输出:

0 1 2
user/group/other/mask/default [user_name]/[group_name]/[none] [permission]
例子

输入:

getfacl /var/log/dpkg.log

输出:

# file: dpkg.log
# owner: root
# group: root
user::rw-
group::r--
other::r--

输入:

getfacl file

输出:

# file: file
# owner: root
# group: root
user::rw-
user:wenzexu:rwx                #effective:r--
group::r--
mask::r--
other::r--

输入:

getfacl dir

输出:

# file: dir
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:wenzexu:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

语法:

setfacl [options1] [options2] [parameter] [filename]

[parameter]参数说明:

0 1 2
u/g/o/m [user_name]/[group_name]/[none] [permission]
  • u: 作用对象为用户
  • g: 作用对象为组
  • o: 作用对象为其他人
  • m: 作用对象为掩码

[options1]参数说明:

  • -b: 移除所有的ACL条目, 只保留传统的文件权限
  • -k: 移除默认的ACL条目, 影响将来创建的文件和子目录(仅用于目录)
  • -n: 在修改权限时, 不会自动调整掩码
  • -R: 递归地设置ACL, 立即影响当前目录以及所有子目录和文件(仅用于目录)
  • -d: 设置默认ACL条目, 影响将来新创建的文件和子目录(仅用于目录)
  • -L: 会遵循符号链接并对链接的目标文件/文件夹应用ACL条目
  • -P: 设置不会遵循符号链接, 只会对符号链接本身应用ACL条目

[options2]参数说明:

  • -m: 添加或者修改特定权限
  • -M: 从指定文件中读取ACL条目并应用到目标文件或者目录
  • -x: 移除指定的ACL条目
  • -X: 从指定文件中读取ACL条目并应用到目标文件或者目录
例子
setfacl -m u:john:rw file.txt # 修改john的权限
setfacl -d -m g:staff:r example_dir # 修改staff组在example_dir的默认权限
setfacl -m m::r filename # 修改文件的掩码为只读
setfacl -n -m u:wenzexu:rw- filename # 若原来的掩码是r--, 则修改后还是r--, 不会自动更新
setfacl -R -m u:wenzexu:rwx dir # 将操作应用到目录及其所有的子文件夹上
setfacl -M acl_entries.txt file # 从acl_entries.txt中读取ACL条目并应用到file
setfacl -x u:wenzexu file # 移除ACL条目
setfacl -X acl_entries.txt file # 从acl_entries.txt中读取ACL条目并从file中移除这些条目
setfacl -L -m u:wenzexu:rwx symlink # 对符号链接symlink链接的文件应用ACL条目
setfacl -P -m u:wenzexu:rwx symlink # 对符号链接symlink本身应用ACL条目

安全模型

Linux系统上最初的安全模型为DAC, Discretionary Access Control. 后来又增加了一个新的安全模型为MAC, Mandatory Access Control.

DAC和MAC不是互斥的, DAC是最基本的安全模型, 是我们最常用到的访问控制机制, 而MAC是构建在DAC之上的可选的加强安全机制. 访问前, Linux系统通常都是先做DAC检查, 如果没有通过则操作直接失败; 如果通过DAC检查并且系统支持MAC模块, 再做MAC权限检查.

为了区分两者, 我们将支持MAC的Linux系统称为SELinux, 表示它是针对Linux的安全加强系统.

DAC安全模型

用户管理

DAC安全模型的核心内容是: 进程理论上所拥有的权限和执行它的用户的权限相同.

用户、组、口令信息

通过/etc/passwd/etc/group保存用户和组信息, 通过/etc/shadow保存密码口令及其变动信息, 每行一条记录.

用户和组分别用UID和GID表示, 一个用户可以同时属于多个组, 默认每个用户必须属于一个与之UID同值的GID.

/etc/passwd
0 1 2 3 4 5 6
用户名 口令 UID GID 注释 用户目录 默认shell
/etc/group
0 1 2 3
组名 口令 GID 组成员用户列表
/etc/shadow
0 1 2 3 4 5
登录名 最后一次修改时间 最小时间间隔 最大时间间隔 警告时间 不活动时间

文件管理

传统
文件类型
  • 普通文件(-), 包括文本文件和二进制文件, 可以用touch创建
  • 目录文件(d)
  • 套接字文件(s), 用于进程间通信(可以跨网络), 一般由应用程序在执行中间创建
  • 管道文件(p), 也用于进程之间的通信, 一般分为无名管道(有亲缘关系的进程通信)和有名管道(无亲缘关系的进程通信), 可以用mkfifo创建
  • 字符文件(c)和块文件(b), 均为设备文件, 可以用mknod创建
  • 链接文件(l), 是软链接文件, 而不是硬连接文件
访问权限控制组

分为三组进行控制: user包含对文件属主设定的权限, group包含对文件属组设定的权限, others包含对其他者设定的权限. 可设定的权限为:

  • r: 表示具有读权限
  • w: 表示具有写权限
  • x: 表示具有执行/搜索权限, 一般针对可执行文件/目录
  • s: 表示用户在执行该文件时, 将临时拥有属主/属组的权限, 一般针对可执行文件/目录
  • t: 表示只有目录的所有者才能删除或者重命名该目录下的文件, 一般针对目录

此外, 权限还可以用个数字来表示, 这些数字表示每种权限的组合, 每个权限都有对应的数值:

  • r: 4
  • w: 2
  • x: 1
  • s: 4
  • t: 1

数字结构通常分为4部分:

  1. 特殊权限位
    • 属主s(SUID): 4
    • 属组s(SGID): 2
    • t(SBIT): 1
  2. 所有者权限位
  3. 所属组权限位
  4. 其他用户权限位
例子
  1. 组合rwxrwxrwt:
    • 特殊权限: t = 1
    • 所有者权限: rwx = 7
    • 组权限: rwx = 7
    • 其他用户权限: rwt = 7 所以可以表示为1777
  2. 组合rwsr-xr-x:
    • 特殊权限: 属主s = 4
    • 所有者权限: rws = 7
    • 组权限: r-x = 5
    • 其他用户权限: r-x = 5 所以可以表示为4755
  3. 组合rwsrwsr-t:
    • 特殊权限: 属主s + 属组s + t = 7
    • 所有者权限: rws = 7
    • 组权限: rws = 7
    • 其他用户权限: r-t = 5 所以可以表示为7775
umask

当创建一个文件的时候, umask命令控制着文件的默认权限.

Tip

我们可以通过umask命令查看默认值

Ubuntu默认的umask时0022, 二进制表示为000 000 010 010, 当我们创建文件或者目录的时候, 如果没有umask, 也就是umask为0000的时候, 文件或者目录的权限是rw-rw-rw-, 这个权限被称为原始权限, 二进制表示为000 110 110 110(前3个0为特殊权限位). 当umask为0022的时候, 这个时候在原始权限的基础上去掉umask为1上的权限, 去掉后就变成了000 110 100 100, 也就是-rw-r--r--.

ACL
ACL是什么

访问控制列表(Access Control List, ACL)是由一条或者多条规则组成的集合, 它在各种系统和应用中都有广泛的应用, 通过灵活使用ACL, 可以实现细粒度的访问控制, 比如说:

  1. 文件系统: 最常见的ACL应用场景
  2. 网络设备: 在路由器或者交换机中, ACL用于控制流量如定义允许或者拒绝特定IP地址或网络段的访问规则
  3. 数据库系统: 用于管理用户对数据库对象的访问权限
  4. Web: 控制用户对特定API端点的访问权限
  5. 云计算和虚拟环境: 用于控制对虚拟机, 存储资源和网络资源的访问权限
  6. VCS: 用于控制用户对代码库的访问权限
  7. ...
为什么需要ACL
  1. 更细粒度的控制: 可以为不同的用户和组设置不同的权限
  2. 继承: 目录的ACL可以配置为自动应用到新创建的文件和子目录
掩码

掩码(mask)在ACL中是一个重要的概念, 用于设置文件或者目录的最大权限.

Tip
  1. 对当前文件/目录执行setfacl -m m::r filename之后, 所有在影响范围内的条目的最高权限是r--.
  2. 当对一个条目授予高于掩码的权限时, 掩码会自动更新, 如原来掩码是r--, 执行setfacl -m u:wenzexu:rwx filename之后, 掩码会变成rwx; 如果低于或者等于, 掩码保持不变. 如果你想避免掩码自动更新, 在修改该条目时, 加入-n选项.
  3. 当你添加第一个条目的时候, 掩码会被自动创建, 掩码的权限为当前影响范围内条目中的最高权限. 同样的如果这个条目有-n选项, 那么应该是影响范围中不包括当前条目的最高权限.

掩码的执行对象: [none], 设置掩码的时候, 中间那位可以省略, 如setfacl -m u:r-- filename.

掩码的影响范围:

  • 所有非文件所有者的用户条目
  • 所有组条目和默认条目

当使用setfacl命令添加第一个条目后, 掩码默认会自动创建, 默认最大权限为rwx.

默认条目

默认条目定义了对新创建的文件或者子目录应用的默认ACL权限. 这只能作用于文件夹. 默认条目里面也有默认用户条目, 默认组条目, 默认掩码, 默认其他权限. 默认条目的存在可以确保新创建的文件或者子目录继承了所在目录的权限规则, 从而确保了一致性和安全性.

例子

输入:

setfacl -nd -m u:wenzexu:rwx dir_do_not_update_mask
getfacl dir_do_not_update_mask

输出:

# file: dir_do_not_update_mask/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:wenzexu:rwx        #effective:r-x
default:group::r-x
default:mask::r-x
default:other::r-x

输入:

setfacl -d -m u:wenzexu:rwx dir
getfacl dir

输出:

# file: dir
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:wenzexu:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

  1. "262588213843476". (n.d.). Linux权限控制的基本原理. Gist. Retrieved June 9, 2024, from https://gist.github.com/baymaxium/45ad3b68bcd392c3c3feebf935f1618f 

  2. Linux chmod 命令 | 菜鸟教程. (n.d.). Retrieved June 11, 2024, from https://www.runoob.com/linux/linux-comm-chmod.html 

  3. Linux ACL (访问控制列表)权限管理举例详解(含默认权限)_linux访问控制列表应用案例-CSDN博客. (n.d.). Retrieved June 11, 2024, from https://blog.csdn.net/Zheng__Huang/article/details/107743768 

  4. 【Linux】解密ACL(文件访问控制列表)的神奇力量_linux acl-CSDN博客. (n.d.). Retrieved June 12, 2024, from https://blog.csdn.net/m0_60511809/article/details/132230996 

  5. Chown Command in Linux (File Ownership). (2018, December 4). https://linuxize.com/post/linux-chown-command/ 

  6. useradd命令_Linux useradd 命令用法详解:创建的新的系统用户. (n.d.). Retrieved June 12, 2024, from https://man.niaoge.com/useradd 

  7. Linux userdel命令 | 菜鸟教程. (n.d.). Retrieved June 12, 2024, from https://www.runoob.com/linux/linux-comm-userdel.html 

  8. Linux usermod命令 | 菜鸟教程. (n.d.). Retrieved June 12, 2024, from https://www.runoob.com/linux/linux-comm-usermod.html 

  9. Linux groupadd 命令 | 菜鸟教程. (n.d.). Retrieved June 12, 2024, from https://www.runoob.com/linux/linux-comm-groupadd.html 

  10. Linux groupdel命令 | 菜鸟教程. (n.d.). Retrieved June 12, 2024, from https://www.runoob.com/linux/linux-comm-groupdel.html 

  11. Linux groupmod命令 | 菜鸟教程. (n.d.). Retrieved June 12, 2024, from https://www.runoob.com/linux/linux-comm-groupmod.html 

  12. Linux 权限管理. (n.d.). 知乎专栏. Retrieved June 12, 2024, from https://zhuanlan.zhihu.com/p/61196860 

评论