目录
1 Linux安全模型
资源分派:
-
Authentication: 认证:验证用户身份
-
Authorization: 授权:不同的用户设置不同权限
-
Accouting|Audition: 审计
当用户成功登录时,系统会自动分配令牌token,包括用户标识和组成员等信息
1.1 用户
Linux中每个用户是通过User Id (UID)来唯一标识的。
-
管理员: root,0
-
普通用户: 1-60000 自动分配
-
系统用户: 1-499 (C6以前),1-999 (C7以后)
对守护进程获取资源进行权限分配
-
登录用户: 500+ (C6以前),1000+ (C7以后)
给用户进行交互式登录使用
1.2 用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID (GID) 来唯一标识的。
-
管理员组: root,0
-
普通组:
系统组: 1-499 (C6以前),1-999 (C7以后),对守护进程获取资源进行权限分配
普通组: 500+ (C6以前),1000+ (C7以后),给用户使用
1.3用户和组的关系
-
用户的主要组(primary group): 用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
-
用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组
-
Linux里允许组和用户同名
1.3 安全上下文
Linux安全上下文Context: 运行中的程序,即进程(process),以进程发起者的身份运行,进程所能够访问资源的权限取决于进程的运行者的身份
比如:分别以root和个人用户joyce的身份运行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 --passa1go=sha256 --update
密码的安全策略
-
足够长
-
使用数字、大写字母、小写字母及特殊字符中至少3种
-
使用随机密码
-
定期更换,不要使用最近曾经使用过的密码
生成随机密码
tr -dc '[:alnum:]' < /dev/urandom | head -c 12 在urandom中取前12位 openssl rand -base64 9 生成9位随机数
2.4 group文件格式
-
群组名称: 就是群组名称
-
群组密码: 通常不需要设定,密码是被记录在/etc/gshadow
-
GID: 就是群组的ID
-
以当前组为附加组的用户列表(分隔符为逗号)
2.5 gshdow文件格式
-
群组名称: 就是群的名称
-
群组密码:
-
组管理员列表: 组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:多个用户间用逗号分隔
2.6 文件操作
vipw和vigr pwck和grpck
3 用户和组管理命令
用户管理命令 useradd usermod userdel
组帐号维护命令 groupadd groupmod groupdel
3.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
显示或更改默认设置
useradd -D useradd -D -s SHELL useradd -D -b BASE_DIR useradd -D -g GROUP
新建用户的相关文件
/etc/default/useradd /etc/skel/* /etc/login.defs
批量创建用户
newusers passwd格式文件
批量修改用户口令,可以将前面保存成文件直接管道
echo username:passwd | chpasswd
3.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.3 删除用户
userdel可删除Linux 用户
格式:
userdel [OPTION]... Login
常见选项:
-f --force 强制 -r --remove 删除用户家目录和邮箱
3.4 查看用户相关的ID信息
id 命令可以查看用户的UID,GID等信息
id [OPTION]... [USER]
常见选项:
-u 显示UID -g 显示GID -G 显示用户所属的组的ID -n 显示名称,需配合ugG使用
3.5 切换用户或以其他用户身份执行命令
su: 即switch user,命令可以切换用户身份,并且以指定用户的身份执行命令 格式:
su [options...] [-] [user [args...]]
切换用户的方式:
su UserName: 非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录 su-UserName: 登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
说明: root su至其他用户无须密码;非root用户切换时需要密码
换个身份执行命令:
su [-] UserName -c 'COMMAND'
范例:
[wang@centos8 ~]$su - root -c "getent shadow"
常见选项
-l --login su -l UserName 相当于su-UserName
3.6 设置密码
passwd可以修改用户密码 格式:
passwd [OPTIONS] UserName
常用选项:
-d 删除指定用户密码 -l 锁定指定用户 -u 解锁指定用户 -e 强制用户下次登录修改密码 -f 强制操作 -n mindays 指定最短使用期限 -x maxdays 最大使用期限 -w warndays提前多少天开始警告 -i inactivedays 非活动期限 --stdin 从标准输入接收用户密码
如:
echo "PASSWORD" | passwd --stdin USERNAME
3.7 修改用户密码策略
chage可以修改用户密码策略
格式:
chage [OPTION]... LOGIN
常见选项:
-d LAST_DAY -m --mindays MIN_DAYS -M --maxdays MAX_DAYS -W--warndays WARN_DAYS -I--inactiveINACTIVE 密码过期后的宽限期 -E--expiredate EXPIRE_DATE 用户的有效期 -l 显示密码策略
3.8 用户相关的其它命令
chfn 指定个人信息 chsh 指定shell finger 可看用户个人信息
3.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
3.10 修改组
组属性修改: groupmod
格式:
groupmod [OPTION]... group
常见选项:
-n group_name:新名字 -g GID: 新的GID
3.11组删除
groupdel 可以删除组
格式:
groupdel [options] GROUP
常见选项:
-f,--force 强制删除,即使是用户的主组也强制删除组
3.11 临时切换主组
su命令可以切换主组
su 用户
4 文件权限管理
4.1 文件所有者和属组属性操作
4.1.1 设置文件的所有者chown
chown 命令可以修改文件的属主,也可以修改文件属组 格式:
chown [OPTION]...[OWNER][:[GROUP]] FILE... chown [OPTION]...--reference=RFILE FILE..
用法说明:
OWNER 只修改所有者 OWNER:GROUP 同时修改所有者和属组 :GROUP 只修改属组,冒号也可用.替换 -R: 递归,修改文件夹及文件夹中文件,慎用 --reference=FILE1 FILE2 参考指定的FILE1的属性,来修改FILE2的属性
例:先修改所有者,再修改所属组
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权限,不给无执行权限的文件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的值可以用来保留在创建文件权限 实现方式:
-
新建文件的默认权限:666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
-
新建目录的默认权限:777-umask
非特权用户umask默认是002 root的umask 默认是022
umask 查看当前umask值 umask -S 模式方式显示 umask -p 数字方式显示 umask # 修改umask为# 仅对某个生成的文件改用特殊的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...
-
任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
-
启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
-
进程访问文件时的权限,取决于进程的发起者
-
进程的发起者,同文件的属主: 则应用文件属主权限
-
进程的发起者,属于文件属组;则应用文件属组权限
-
应用文件其它”权限
-
二进制的可执行文件上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
权限位映射
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 删除i的功能:-a即可 chattr -a filename 显示带有的特定属性 lsattr
4.6 访问控制列表
我们目前有3种身份的用户:所有者、属组、other
当我们想要给某个用户单独设置一些特殊的不属于以上3种身份权限的用户时,传统Linux无法实现,未来实现这种功能,可以使用ACL
4.6.1ACL权限功能
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.2ACL相关命令
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权限
一般情况下,ACL比chmod更加方便安全,因为chmod修改后如果我们不记得原来的权限,则很难恢复;还容易给文件增加执行权限。而ACL是单独设置,修改后如果想修改也很简单,更加安全