一、Linux安全模型
资源分派:
- Authentication: 认证:验证用户身份
- Authorization: 授权:不同的用户设置不同权限
- Accouting|Audition: 审计
当用户成功登录时,系统会自动分配令牌token,包括:用户标识UID和组成员等信息
1 用户
Linux中每个用户是通过User Id (UID)来唯一标识的。
-
管理员: root,0(不一定是root)
- 普通用户: 1-60000 自动分配
- 系统用户:1-499 (C6以前),1-999 (C7以后),对守护进程获取资源进行权限分配
- 登录用户: 500+ (C6以前),1000+ (C7以后), 给用户进行交互式登录使用
2 用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID (GID) 来唯一标识的。
- 管理员组:root,0(不一定是root)
- 普通组:
- 系统组:1-499 (C6以前),1-999 (C7以后),对守护进程获取资源进行权限分配
- 普通组:500+ (C6以前),1000+ (C7以后),给用户使用
3 用户和组的关系
-
用户的主要组(primary group): 用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组(必要的)
-
用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组
-
Linux里允许组和用户同名
前面是主要组,后面是附加组
4 安全上下文
Linux安全上下文Context: 运行中的程序,即进程(process),以进程发起者的身份运行,进程所能够访问资源的
权限取决于进程的运行者的身份
比如: 分别以root和个人用户joyce的身份运行bin/cat/etc/shadow ,得到的结果是不同的,资源/文件能否能被访问,是由运行者的身份决定,非程序本身
二、用户和组的配置文件
1 用户和组的主要配置文件
- /etc/passwd: 用户及其属性信息(名称、UID、主组ID等)
- /etc/shadow: 用户密码及其相关属性
- /etc/group: 组及其属性信息
- /etc/gshadow: 组密码及其相关属性
2 passwd文件格式
- login name: 登录用名 (wang)
- passwd: 密码(x)
- UID: 用户身份编号(1000)
- GID: 登录默认所在组编号(1000)
- GECOS: 用户全名或注释
- home directory:用户主目录(/home/wang)
- shell: 用户默认使用shell(/bin/bash)
3 shadow文件格式
以下均用::分割每个属性
- 登录用名
- 用户密码:一般用sha512加密
- 从1970年1月1日起到密码最近一次被更改的时间
- 密码再过几天可以被变更
- (0表示随时可被变更)
- (99999表示永不过期)
- 密码再过几天必须被变更
- 密码过期前几天系统提醒用户(默认为一周)
- 密码过期几天后帐号会被锁定
- 从1970年1月1日算起,多少天后帐号失效
更改密码加密算法
authconfig --passa1go=sha256 --update
密码的安全策略
- 足够长
- 使用数字、大写字母、小写字母及特殊字符中至少3种
- 使用随机密码
- 定期更换,不要使用最近曾经使用过的密码
生成随机密码
tr -dc '[:alnum:]' < /dev/urandom | head -c 12 :在urandom中取前12位
openssl rand -base64 9 :生成9位随机数
4 group文件格式
- 群组名称: 就是群组名称
- 群组密码: 通常不需要设定,密码是被记录在/etc/gshadow
- GID: 就是群组的ID
- 以当前组为附加组的用户列表(分隔符为逗号)
5 gshdow文件格式
- 群组名称: 就是群的名称
- 群组密码:
- 组管理员列表: 组管理员的列表,更改组密码和成员
- 以当前组为附加组的用户列表:多个用户间用逗号分隔
6 文件操作
- vipw和vigr
- pwck和grpck
三、用户和组管理命令
用户管理命令
- useradd
- usermod
- userdel
组帐号维护命令
- groupadd
- groupmod
- groupdel
1 用户创建
useradd 命令可以创建新的Linux用户
useradd [options] LOGIN
常见选项:
- -U UID
- -o 配合 -u 选项,不检查UID的唯一性
- -g GID 指明用户所属基本组,可为组名,也可以GID
- -c “COMMENT” 用户的注释信息
- -d HOME_DIR 以指定的路径(不存在)为家目录
- -S SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
- -G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
- -N 不创建私用组做主组,使用users组做主组
- -r 创建系统用户 Centos 6之前:ID<500,Centos 7以后:ID<1000
- -m 创建家目录,用于系统用户
- -M 不创建家目录,用于非系统用户
useradd 命令默认值设定由/etc/default/useradd定义
[11:16:25 root@CentOS8]#cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1 对应/etc/shadow文件第7列,即用户密码过期的宽限期
EXPIRE= 对应/etc/shadow文件第8列,即用户账号的有效期
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
新建用户的相关文件
/etc/default/useradd 新建账号时的默认设置文件
/etc/skel/* 新建账号都配置有的文件目录
/etc/login.defs 存放口令相关配置
批量创建用户
newusers passwd格式文件
批量修改用户口令,,可以将前面保存成文件直接管道
echo username:passwd | chpasswd
2 用户属性修改
usermod 命令可以修改用户属性
usermod [OPTION] ogin
常见选项:
- -u UID: 新UID
- -g GID: 新主组
- -G GROUP1LGROUP2..[GROUPN]: 新附加组,原来的附加组将会被覆盖,若保留原有,则要同时使用-a选项
- -S SHELL: 新的默认SHELL
- -c 'COMMENT:新的注释信息
- -d HOME: 新家目录不会自动创建,若要创建新家目录并移动原家数据,同时使用-m选项
- -l login_name:新的名字
- -L lock 指定用户,在/etc/shadow 密码栏增加!
- -U unlock 指定用户将 /etc/shadow 密码栏的!拿掉
- -e YYYY-MM-DD:指明用户账号过期日期
- -f INACTIVE 设定非活动期限,宽限期
3 删除用户
userdel可删除Linux 用户
userdel [OPTION]... Login
常见选项:
-f --force 强制
-r --remove 删除用户家目录和邮箱 (慎用,数据比较重要)
4 查看用户相关的ID信息
id 命令可以查看用户的UID,GID等信息
id [OPTION]... [USER]
常见选项:
- -u 显示UID
- -g 显示GID
- -G 显示用户所属的组的ID
- -n 显示名称,需配合ugG使用
5 切换用户或以其他用户身份执行命令
su: 即switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
su [options...] [-] [user [args...]]
切换用户的方式:
- su UserName: 非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
- su-UserName: 登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
说明: root su至其他用户无须密码;非root用户切换时需要密码
换个身份执行命令:
su [-] UserName -c 'COMMAND'
常见选项:
-l --login su -l UserName 相当于su-UserName
6 设置密码
passwd可以修改用户密码
passwd [OPTIONS] UserName
常用选项:
- -d 删除指定用户密码
- -l 锁定指定用户
- -u 解锁指定用户
- -e 强制用户下次登录修改密码
- -f 强制操作
- -n mindays 指定最短使用期限
- -x maxdays 最大使用期限
- -w warndays 提前多少天开始警告
- -i inactivedays 非活动期限
- --stdin 从标准输入接收用户密码
如:
echo "PASSWORD" | passwd --stdin USERNAME
7 修改用户密码策略
chage可以修改用户密码策略
chage [OPTION]... LOGIN
常见选项:
- -d LAST_DAY
- -m --mindays MIN_DAYS
- -M --maxdays MAX_DAYS
- -W --warndays WARN_DAYS
- -I --inactive INACTIVE 密码过期后的宽限期
- -E --expiredate EXPIRE_DATE 用户的有效期
- -l 显示密码策略
8 用户相关的其它命令
chfn 指定个人信息
chsh 指定shell
finger 可看用户个人信息
9 创建组
groupadd实现创建组
groupadd [OPTIoN]... group_name
常见选项:
- -g GID 指明GID号;[GID_MIN,GID_MAX]
- -r 创建系统组,Centos 6之前:ID<500,CentOs 7以后:ID<1000
范例:
groupadd -g 48 -r apache
10 修改组
组属性修改: groupmod
groupmod [OPTION]... group
常见选项:
- -n group_name:新名字
- -g GID: 新的GID
11 组删除
groupdel 可以删除组
groupde1 [options] GROUP
常见选项:
- -f,--force 强制删除,即使是用户的主组也强制删除组
12 临时切换主组
su命令可以切换主组
su 用户
四、文件权限管理
4.1 文件所有者和属组属性操作
- 如果用户属于所有者,即有前3个权限。
- 如果用户属于所属组,则有中间3个权限
- 如果都不属于,则有最后3个权限
- 从左到右顺序匹配,如果是所有者,权限立即生效,不再匹配后面2个
4.1.1 设置文件的所有者chown
chown 命令可以修改文件的属主,也可以修改文件属组
chown [OPTION]...[OWNER][:[GROUP]] FILE...
chown [OPTION]...--reference=RFILE FILE..
用法说明:
- OWNER 只修改所有者
- OWNER:GROUP 同时修改所有者和属组
- :GROUP 只修改属组,冒号也可用.替换
- -R: 递归,修改文件夹及文件夹中文件,慎用
- --reference=RFILE 参考指定的的属性,来修改
范例:我先修改所有者,再修改属组
也可同时修改,:前写所有者后写属组即可
4.1.2 设置文件的属组信息chgrp
chgrp 命令可以只修改文件的属组
chgrp [OPTION]...GROUP FILE.
chgrp [OPTION]...--reference=RFILE FILE...
-R递归
4.2 文件权限
4.2.1 文件权限说明
文件的权限主要针对三类对象进行定义
每个文件针对每类访问者都定义了三种权限
- owner 属主,u
- group 属组,g
- other 其他,o
每个文件针对每类访问者都定义了三种常用权限
- r ReadabTe
- w Writable
- x eXcutabTe
对文件的权限:
- r 可使用文件查看类工具,比如: cat,可以获取其内容
- w 可修改其内容
- x 可以把此文件提请内核启动为一个进程,即可以执行(运行) 此文件(此文件的内容必须是可执行)
对目录的权限:
- r 可以使用ls查看此目录中文件列表
- w 可在此目录中创建文件,也可删除此目录中的文件
- x 可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最小权限
- X 只给目录x权限,不给3个用户都无执行权限的文件x权限
八进制数字:
--- 000 0
--x 001 1
-W- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
如:
755 rwx r-x r-x
640 rw- r-- ---
4.2.2 修改文件权限chmod
chmod [OPTION]... MODE[,MODE]... FILE... 模式法
chmod [OPTION]... OCTAL-MODE FILE... 数字法
#参考RFILE文件的权限,将FILE的修改为同RFILE
chmod [OPTION]... --reference=RFILE FILE...
说明:
MODE:who opt permission
who:u, g, o, a
opt:+, -, =
permission:r , w, x
修改一类用户的所有权限
- u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限
- u+ u- g+ g- 0+ 0- a+ a- + -
- -R: 递归修改权限
范例:
chmod u+wx,g-r,o=rx filename
对于文件夹:
- 只有 wx 权限,不能列出文件夹中文件,如果事先知道,则可以修改与访问文件
- 只有 rw 权限,不能进去文件夹,能读出文件夹中文件,但不能删除文件
所以一般文件夹的权限: rwx / rx / ---
4.3 新建文件和目录的默认权限
umask的值可以用来保留在创建文件权限
umask 查看当前umask值
umask -S 模式方式显示
umask -p 数字方式显示
umask # 修改umask为#(临时)
实现方式:
新建文件的默认权限:666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
新建目录的默认权限:777-umask
- 非特权用户umask默认是002
- root的umask 默认是022
仅对某个生成的文件改用特殊的umask,而不影响系统当前的umask,即一次性使用
( umask 666; touch /data/f1.txt )
持久保存umask
- 全局设置:/etc/bashrc
- 用户设置:~/.bashrc
注意:修改文件系统权限需要文件系统支持,而和操作系统无关
4.4 Linux文件系统上的特殊权限
前面介绍了三种常见的权限: r,w,x 还有三种特殊权限:SUID,SGID,sticky
4.4.1 特殊权限SUID
前提:进程有属主和属组,文件有属主和属组SUID权限的设置:
chmod u+s file...
chmod 6### file...
chmod u-s file...
- 1.任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 2.启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 3.进程访问文件时的权限,取决于进程的发起者
- (a)进程的发起者,同文件的属主: 则应用文件属主权限
- (b)进程的发起者,属于文件属组;则应用文件属组权限
- (c)应用文件其它”权限
二进制的可执行文件上SUID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为原程序文件的属主
- SUID只对二进制可执行程序有效
- SUID设置在目录上无意义
4.4.2 特殊权限SGID
二进制的可执行文件上SGID权限功能
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属组为原程序文件的属组
SGID权限设定:
chmod g+s FILE..
chmod 2### FILE
chmod g-s FILE...
目录上的SGID权限功能
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的
用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
4.4.3 特殊权限 Sticky 位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
Sticky权限设定:
chmod o+t DIR..
chmod 1### DIR
chmod o-t DIR...
4.4.4 特殊权限数字法
SUID SGID STICKY
4 2 1
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
范例:
chmod 4777 /tmp/a.txt 给a.txt文件以suid权限,相当于u+s
chmod 6777 /tmp/a.txt 给a.txt文件以suid和sgid权限,相当于u+s,g+s
chmod 7777 /tmp/a.txt 给a.txt文件以suid和sgid权限和sticky,相当于u+s,g+s,o+t
权限位映射
suID: user,占据属主的执行权限位
s: 属主拥有x权限
S: 属主没有x权限
SGID: group,占据属组的执行权限位
s:group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
4.5 设定文件特殊属性
设置文件的特殊属性,可以防止 root 用户误操作删除或修改文件
不能删除,改名,更改
chattr +i filename
删除i的功能:-i即可
chattr -i filename
只能追加内容,不能删除和改名
chattr +a filename
删除a的功能:-a即可
chattr -a filename
显示带有的特定属性
lsattr
4.6 访问控制列表
我们目前有3种身份的用户:所有者、属组、other
当我们想要给某个用户单独设置一些特殊的不属于以上3种身份权限的用户时,传统Linux无法实现
未来实现这种功能,可以使用ACL
4.6.1 ACL权限功能
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
Centos7默认创建的xfs和ext4文件系统具有ACL功能
Centos7之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs -o ac1 /dev/sdb1
mount -o ac1 /dev/sdb1 /mnt/test
ACL生效顺序:
所有者,自定义用户,所属组|自定义组,其他人
4.6.2 ACL相关命令
setfacl可以设置ACL权限
setfacl -m u:joyce:0/rx filename 设置ACL权限
setfacl -b u:joyce filename 取消ACL权限
getfacl可查看设置的ACL权限
mask权限
- mask使所有者和other之外的人和组的权限有一个最大值,不可超过这个值
- mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
- 用户或组的设置必须存在于mask权限设定范围内才会生效
- 一旦有了ACL:chmod g=rx filename这种的g不再代表属组,而是mask,而文件--- --- --- 中间的三条也不是组而是mask
范例:
setfac1 -m mask::rx filename 或 chmod g=rx filename
--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
范例:
setfac1 --set u::rw,u:wang:rw,g::r,o::- filel
4.6.3 备份和还原ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p参数。但是tar等常见的备份工具是不会保留目录
和文件的ACL信息
getfacl -R /tmp/dir > acl.txt #备份ACL权限到acl.txt里
setfacl -R -b /tmp/dir #消除ACL权限
setfacl -R --set-file=acl.txt tmp/dir #还原ACL权限
setfacl --restore acl.txt #还原ACL权限
getfacl -R /tmp/dir #查看ACL权限