目录
1 Linux安全模型
1.1 用户
Linux中每个用户是通过User Id (UID)来唯一标识的
- 管理员:root,UID为0
- 普通用户:系统用户UID为1-999,登录用户UID为1000+
1.2 用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。
- 管理员:root,GID为0
- 普通用户:系统用户GID为1-999,对守护进程获取资源进行权限分配;登录用户UID为1000+,给用户使用。
1.3 用户和组的关系
- 用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建 和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组。
- 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组。
1.4 安全上下文
Linux安全上下文Context:运行中的程序,即进程 (process),以进程发起者的身份运行,进程所能够 访问资源的权限取决于进程的运行者的身份。
比如:分别以root 和wang 的身份运行 /bin/cat /etc/shadow ,得到的结果是不同的,资源能否能 被访问,是由运行者的身份决定,非程序本身。
2 用户和组的配置文件
2.1 用户和组的主要配置文件
- /etc/passwd:用户及其属性信息(名称、UID、主组ID等)
- /etc/shadow:用户密码及其相关属性
- /etc/group:组及其属性信息
- /etc/gshadow:组密码及其相关属性
2.2 passwd文件格式
- login name:登录用名(wang)
- passwd:密码 (x)
- UID:用户身份编号 (1000)
- GID:登录默认所在组编号 (1000)
- GECOS:用户全名或注释
- home directory:用户主目录 (/home/wang)
- shell:用户默认使用shell (/bin/bash)
2.3 shadow文件格式
- 登录用名
- 用户密码:一般用sha512加密
- 从1970年1月1日起到密码最近一次被更改的时间
- 密码再过几天可以被变更(0表示随时可被变更)
- 密码再过几天必须被变更(99999表示永不过期)
- 密码过期前几天系统提醒用户(默认为一周)
- 密码过期几天后帐号会被锁定
- 从1970年1月1日算起,多少天后帐号失效
更改密码的加密算法:
authconfig --passalgo=sha256 --update
范例:生成随机密码
3 用户和组的管理命令
3.1 用户的创建
useradd 命令可以创建新的Linux用户
- -c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
- -d<登入目录>:指定用户登入时的启始目录;
- -D:变更预设值;
- -e<有效期限>:指定帐号的有效期限;
- -f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
- -g<群组>:指定用户所属的群组;
- -G<群组>:指定用户所属的附加群组;
- -m:自动建立用户的登入目录;
- -M:不要自动建立用户的登入目录;
- -n:取消建立以用户名称为名的群组;
- -r:建立系统帐号;
- -s<shell>:指定用户登入后所使用的shell;
- -u<uid>:指定用户id。
范例:创建一个名为apache的系统用户,并指定uid为48,shell类型为nologin,家目录为/var/www
useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache
useradd 命令默认值设定由/etc/default/useradd定义
3.2 用户属性修改
usermod 命令可以修改用户属性
- -c<备注>:修改用户帐号的备注文字;
- -d<登入目录>:修改用户登入时的目录,只是修改/etc/passwd中用户的家目录配置信息,不会自动创建新的家目录,通常和-m一起使用;
- -m<移动用户家目录>:移动用户家目录到新的位置,不能单独使用,一般与-d一起使用。
- -e<有效期限>:修改帐号的有效期限;
- -f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
- -g<群组>:修改用户所属的群组;
- -G<群组>;修改用户所属的附加群组;
- -l<帐号名称>:修改用户帐号名称;
- -L:锁定用户密码,使密码无效;
- -s<shell>:修改用户登入后所使用的shell;
- -u<uid>:修改用户ID;
- -U:解除密码锁定。
3.3 删除用户
userdel命令用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
- -f:强制删除用户,即使用户当前已登录;
- -r:删除用户的同时,删除与用户相关的所有文件。
3.4 查看用户相关ID信息
id 命令可以查看用户的UID,GID等信息
- u: 显示UID
- -g: 显示GID
- -G: 显示用户所属的组的ID-
- n: 显示名称,需配合ugG使用
3.5 切换用户或以其他用户身份执行命令
su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
切换用户的方式:
- su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完 全切换;
- su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换。
注意:su 切换新用户后,使用 exit 退回至旧的用户,而不要再用 su 切换至旧用户,否则会生成很多的 bash子进程,环境可能会混乱。
换个身份执行命令:
- su [-] UserName -c 'COMMAND'
3.6 设置密码
passwd 可以修改用户密码
- -d:删除密码,仅有系统管理者才能使用;
- -f:强制执行;
- -k:设置只有在密码过期失效后,方能更新;
- -l:锁住密码;
- -s:列出密码的相关信息,仅有系统管理者才能使用;
- -u:解开已上锁的帐号。
- --stdin:从标准输入接收用户密码,Ubuntu无此选项
范例:
echo "PASSWORD" | passwd --stdin USERNAME
范例:设置用户下次必须更改密码
passwd -e UserName
3.7 修改用户密码策略
chage 可以修改用户密码策略
- -m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
- -M:密码保持有效的最大天数。
- -w:用户密码到期前,提前收到警告信息的天数。
- -E:帐号到期的日期。过了这天,此帐号将不可用。
- -d:上一次更改的日期。
- -i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
- -l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
范例:
chage -m 3 -M 42 -W 14 -I 7 -E 2020-10-10 yang
3.8 用户的其它相关命令
- chfn 指定个人信息
- chsh 指定shell,相当于usermod -s
- finger 可看用户个人信息
3.9 创建组
groupadd实现创建组
- -g:指定新建工作组的id;
- -r:创建系统工作组,系统工作组的组ID小于500;
- -K:覆盖配置文件“/ect/login.defs”;
- -o:允许添加组ID号不唯一的工作组。
范例:创建系统组apache,并指定gid为48
groupadd -g 48 -r apache
3.10 修改组
groupmod 组属性修改
- -g<群组识别码>:设置新的GID;
- -o:重复使用群组识别码;
- -n<新群组名称>:设置新的组名
3.11 组删除
groupdel命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
常见选项:
- -f, --force 强制删除,即使是用户的主组也强制删除组
3.11 更改组密码
gpasswd命令,可以更改组密码,也可以修改附加组的成员关系
- -a:添加用户到组;
- -d:从组删除用户;
- -A:指定管理员;
- -M:指定组成员和-A的用途差不多;
- -r:删除密码;
- -R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
3.12 临时切换主组
newgrp 命令可以临时切换主组, 如果用户本不属于此组,则需要组密码
如果使用 - 选项,可以初始化用户环境
4 文件权限管理
4.1 文件所有者和属组的属性操作
4.1.1 设置文件的所有者chown
chown 命令可以修改文件的属主,也可以修改文件属组
命令格式:
- chown [OPTION]... [OWNER][:[GROUP]] FILE...
- chown [OPTION]... --reference=RFILE FILE...
用法说明:
- OWNER #只修改所有者
- OWNER:GROUP #同时修改所有者和属组
- :GROUP #只修改属组,冒号也可用 . 替换
- --reference=RFILE #参考指定的的属性,来修改
- -R #递归,此选项慎用,非常危险!
4.1.2 设置文件的属组信息chgrp
chgrp 命令可以只修改文件的属组
4.2 文件权限
4.2.1 权限说明
Linux中对文件的权限:
- r 可使用文件查看类工具,比如:cat,可以获取其内容
- w 可修改其内容
- x 可以执行此文件,此文件的内容必须是可执行的
Linux中对目录的权限:
- r 可以使用ls查看此目录中文件列表
- w 可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关
- x 可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最小权限
4.2.2 修改文件权限
chmod命令可以修改文件权限
格式:
- chmod [OPTION]... MODE[,MODE]... FILE...
- chmod [OPTION]... OCTAL-MODE FILE...
- chmod [OPTION]... --reference=RFILE FILE...
选项:
- -c, --changes:当文件的权限更改时输出操作信息。
- --no-preserve-root:不将'/'特殊化处理,默认选项。
- --preserve-root:不能在根目录下递归操作。
- -f, --silent, --quiet:抑制多数错误消息的输出。
- -v, --verbose:无论文件是否更改了权限,一律输出操作信息。
- --reference=RFILE:使用参考文件或参考目录RFILE的权限来设置目标文件或目录的权限。
- -R, --recursive:对目录以及目录下的文件递归执行更改权限操作。
- --help:显示帮助信息并退出。
- --version:显示版本信息并退出。
范例:
# 添加组用户的写权限。
chmod g+w ./test.log
# 删除其他用户的所有权限。
chmod o= ./test.log
# 使得所有用户都没有写权限。
chmod a-w ./test.log
# 当前用户具有所有权限,组用户有读写权限,其他用户只有读权限。
chmod u=rwx, g=rw, o=r ./test.log
# 等价的八进制数表示:
chmod 754 ./test.log
# 将目录以及目录下的文件都设置为所有用户拥有读写权限。
# 注意,使用'-R'选项一定要保留当前用户的执行和读取权限,否则会报错!
chmod -R a=rw ./testdir/
# 根据其他文件的权限设置文件权限。
chmod --reference=./1.log ./test.log
面试题:执行命令 cp /etc/passwd /data 所需要的最小权限
- /bin/cp 需要x权限
- /etc 需要x权限
- /etc/passwd 需要r权限
- /data 需要wx权限
4.3 新建文件和目录的默认权限
umask 的值可以用来保留在创建文件权限
- 普通用户的umask默认是 002
- root的umask 默认是 022
实现方式:
- 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变。
- 新建目录的默认权限: 777-umask。
查看umask的值
临时修改umask的值
umask持久保存,写入到配置文件中
- 全局设置: /etc/bashrc
- 用户设置:~/.bashrc
4.4 文件的特殊权限
在Linux中除了r、w、x权限,还有SUID, SGID, Sticky三种特殊权限。
4.4.1 特殊权限SUID
说明:SUID一般都是设置在文件上,设置在目录上毫无意义
SUID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为原程序文件的属主(文件拥有者)
- SUID只对二进制可执行程序有效
- SUID设置在目录上毫无意义
SUID权限设定:
- chmod u+s FILE...
- chmod 6xxx FILE
- chmod u-s FILE...
范例:
4.4.2 特殊权限SGID
二进制的可执行文件上SGID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属组为原程序文件的属组(文件所属组)
SGID权限设定:
- chmod g+s FILE...
- chmod 2xxx FILE
- chmod g-s FILE...
目录上设置SGID权限的功能:
- 默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录。
4.4.3 特殊权限 Sticky 位
- 具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
- 在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
- sticky 设置在文件上无意义
Sticky权限设定:
- chmod o+t DIR...
- chmod 1xxx DIR
- chmod o-t DIR...
范例:
4.5 文件特殊属性
chattr 设置文件的特殊属性,可以防止 root 用户误操作删除或修改文件
设置文件不能删除,改名,更改
chattr +i FILE
设置文件只能追加内容,不能删除,改名
chattr +a FILE
查看文件特殊属性
lsattr FILE
4.6 访问控制列表ACL
ACL可以实现灵活的权限管理
ACL相关命令:
- setfacl 可以设置ACL权限
- getfacl 可查看设置的ACL权限
范例1:设置ACL权限
范例2:删除ACL权限
#清除所有ACL权限
setfacl -b FILE
#清除指定用户对该文件的ACL权限
setfacl -x u:USER FILE
范例3:setfacl的--set选项会把原有的ACL项都删除,用新的替代
setfacl --set u::rw,u:USER:rw,g::r,o::- FILE
mask权限:
- mask只影响除所有者和other的之外的人和组的最大权限
- mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
- 用户或组的设置必须存在于mask权限设定范围内才会生效
设置mask权限:
setfacl -m mask::rx FILE
范例: