- A+
Linux中的文件访问控制
在Unix系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用【SUID,SGID,SBIT】,再搭配拥有者与所属群组管理权限范围。
SUID:
1、只对二进制可执行程序有效,不能为普通文件;
2、对程序文件必须拥有执行权限;
3、启动为进程之后,其进程的宿主为原程序文件的宿主;
4、SUID设置在目录上无意义。
权限设定: chmodu +s FILE... chmodu -s FILE...
SGID:
可以应用在二进制文件和作用在文件夹下,当作用在二进制文件下时,作用和SUID相似,只不过SUID是把发起者临时变为文件的所有者,
而SGID是把进程的发起者变成源程序文件的属组
默认情况下,用户创建文件时,其属组为此用户所属的主组,当SGID作用在目录下时,则对此目录有写权限的用户在此目录中创建的文件所属的组
为此目录的属组,通常用于创建一个协作目录。
权限设定: chmodg +s FILE... chmodg -s FILE...
Sticky【SBIT】:
默认情况下用户可以删除具有写权限的目录中的任何文件,无论该文件的权限或拥有权,如果在目录设置Sticky位,只有文件的所有者或root可以删除该文件,Sticky位是作用在文件夹的,设置在文件上毫无意义。
权限设定: chmodo +t DIR... chmodo -t DIR...
可以使用chmod命令、setfacl命令变更文件或目录的权限,设置时采用文字或数字代号皆可。
可以使用chown命令变更文件或目录的拥有者及所属群组。
注意:符号链接的权限无法变更,如果对符号链接修改权限,其改变会作用在被链接的原始文件
权限位映射
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
用户user
令牌 | token,identity |
Linux用户 | Username/UID |
管理员 | root / 0 |
普通用户 | 1-60000 自动分配 |
系统用户 | 1-499, 1-999 (CentOS7) |
对守护进程获取资源进行权限分配 | |
登录用户 | 500+, 1000+(CentOS7) |
组group
Linux组:Groupname/GID
管理员组:root, 0
普通组:
系统组:1-499, 1-999(CENTOS7)
普通组:500+, 1000+(CENTOS7)
Linux安全上下文
运行中的程序:进程 (process)
以进程发起者的身份运行:
root: /bin/cat
mage: /bin/cat
进程所能够访问资源的权限取决于进程的运行者的身份
用户和组的配置文件
Linux用户和组的主要配置文件:
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/group:组及其属性信息
/etc/shadow:用户密码及其相关属性
/etc/gshadow:组密码及其相关属性
passwd文件格式
login name:登录用名(wang)
passwd:密码 (x)
UID:用户身份编号 (1000)
GID:登录默认所在组编号 (1000)
GECOS:用户全名或注释
home directory:用户主目录 (/home/wang)
shell:用户默认使用shell (/bin/bash)
shadow文件格式
登录用名
用户密码:一般用sha512加密
从1970年1月1日起到密码最近一次被更改的时间
密码再过几天可以被变更(0表示随时可被变更)
密码再过几天必须被变更(99999表示永不过期)
密码过期前几天系统提醒用户(默认为一周)
密码过期几天后帐号会被锁定
从1970年1月1日算起,多少天后帐号失效
【更改加密算法: authconfig --passalgo=sha256 --update】
group文件格式
群组名称:就是群组名称
群组密码:通常不需要设定,密码是被记录在 /etc/gshadow
GID:就是群组的 ID
以当前组为附加组的用户列表(分隔符为逗号)
gshadow文件格式
群组名称:就是群组名称
群组密码:xxxxx
组管理员列表:组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:(分隔符为逗号)
用户和组管理命令
用户管理命令
useradd
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 不创建家目录,用于非系统用户
usermod
usermod [OPTION] login -u UID: 新UID -g GID: 新主组 -G GROUP1[,GROUP2,...[,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: 设定非活动期限
userdel
userdel [OPTION]... login -r: 删除用户家目录 -f:强制删除用户
组帐号维护命令
groupadd
groupadd [OPTION]... group_name -g GID: 指明GID号;[GID_MIN, GID_MAX] -r: 创建系统组 CentOS 6: ID<500 CentOS 7: ID<1000
groupmod
组属性修改:groupmod groupmod [OPTION]... group -n group_name: 新名字 -g GID: 新的GID
groupdel
组删除:groupdel groupdel GROUP
查看用户相关的ID信息
id [OPTION]... [USER] -u: 显示UID -g: 显示GID -G: 显示用户所属的组的ID -n: 显示名称,需配合ugG使用
切换用户或以其他用户身份执行命令
su [options...] [-] [user [args...]] 切换用户的方式: su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录 su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换 root su至其他用户无须密码;非root用户切换时需要密码 换个身份执行命令: su [-] UserName -c 'COMMAND' 选项:-l --login su -l UserName 相当于 su - UserName
设置密码
passwd [OPTIONS] UserName: 修改指定用户的密码 常用选项: -d:删除指定用户密码 -l:锁定指定用户 -u:解锁指定用户 -e:强制用户下次登录修改密码 -f:强制操作 -n mindays:指定最短使用期限 -x maxdays:最大使用期限 -w warndays:提前多少天开始警告 -i inactivedays:非活动期限 --stdin:从标准输入接收用户密码 echo "PASSWORD" | passwd --stdin USERNAME
修改用户密码策略
chage [OPTION]... LOGIN -d LAST_DAY 上一次更改的日期 -E --expiredate EXPIRE_DATE 账号到期的日期 -I --inactive INACTIVE 停滞时期 -m --mindays MIN_DAYS 密码可更改的最小天数 -M --maxdays MAX_DAYS 密码保持有效期的最大天数 -W --warndays WARN_DAYS –l 显示密码策略 ##示例: chage -d 0 tom # 下一次登录强制重设密码 chage -m 0 –M 42 –W 14 –I 7 tom chage -E 2016-09-10 tom
更改组密码
组密码:gpasswd gpasswd [OPTION] GROUP -a user 将user添加至指定组中 -d user 从指定组中移除用户user -A user1,user2,... 设置有管理权限的用户列表 newgrp命令:临时切换主组 如果用户本不属于此组,则需要组密码
更改和查看组成员
groupmems [options] [action] options: -g, --group groupname 更改为指定组 (只有root) Actions: -a, --add username 指定用户加入组 -d, --delete username 从组中删除用户 -p, --purge 从组中清除所有成员 -l, --list 显示组成员列表 groups [OPTION].[USERNAME]... 查看用户所属组列表
文件权限
文件属性操作
chown 设置文件的所有者
chgrp 设置文件的属组信息
修改文件的属主和属组
修改文件的属主【所属用户】:chown chown [OPTION]... [OWNER][:[GROUP]] FILE... 用法: OWNER OWNER:GROUP :GROUP 命令中的冒号可用.替换 ·-R: 递归 ·chown [OPTION]... --reference=RFILE FILE... 修改文件的属组:chgrp ·chgrp [OPTION]... GROUP FILE... ·chgrp [OPTION]... --reference=RFILE FILE... -R 递归
文件权限
文件的权限主要针对三类对象进行定义 ·owner: 属主, u ·group: 属组, g ·other: 其他, o 每个文件针对每类访问者都定义了三种权限 r:-->Readable w:--> Writable x: -->eXcutable
文件:
r: 可使用文件查看类工具获取其内容
w: 可修改其内容
x: 可以把此文件提请内核启动为一个进程
目录:
r: 可以使用ls查看此目录中文件列表
w: 可在此目录中创建文件,也可删除此目录中的文件
x: 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录
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
例如:
640: rw-r-----
755: rwxr-xr-x
修改文件权限
`chmod` [OPTION]... OCTAL-MODE FILE... -R: 递归修改权限 chmod [OPTION]... MODE[,MODE]... FILE... MODE: 修改一类用户的所有权限: u= g= o= ug= a= u=,g= 修改一类用户某位或某些位权限 u+ u- g+ g- o+ o- a+ a- + - chmod [OPTION]... --reference=RFILE FILE... 参考RFILE文件的权限,将FILE的修改为同RFILE
权限设置示例
chgrp sales testfile # chgrp:变更用户或目录的所属组群 这里是将testfile目录的属主改为sales
chown root:admins testfile # chown:修改文件权限 这里是将testfile文件属主改为root 组改为 admin
chmod u+wx,g-r,o=rx file # chmod 该权限,这里将属主【+wx】权限,组【-r】权限,其他【rx】权限
chmod -R g+rwX /testdir
chmod 600 file
chown mage testfile
权限位映射
SUID: user,占据属主的执行权限位
- s:属主拥有x权限
- S:属主没有x权限
SGID: group,占据属组的执行权限位
- s: group拥有x权限
- S:group没有x权限
Sticky: other,占据other的执行权限位
- t:other拥有x权限
- T:other没有x权限
设定文件特定属性
chattr +i # 不能删除,改名,更改 chattr +a # 只能追加内容 lsattr # 显示特定属性
访问控制列表ACL
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:所有者,自定义用户,自定义组,其他人
为多用户或者组的文件和目录赋予访问权限rwx
mount -o acl /directory getfacl file |directory setfacl -m u:wang:rwx file|directory setfacl -Rm g:sales:rwX directory setfacl -M file.acl file|directory setfacl -m g:salesgroup:rw file| directory setfacl -m d:u:wang:rx directory setfacl -x u:wang file |directory setfacl -X file.acl directory
mount:挂载Linux系统之外的文件
-v:显示版本
getfacl:查看文件的访问控制列表
- setfacl:设置文件的访问控制列表
- etfacl u:用户名:权限 指定目录或文件
取消制定用户的acl权限
- setfacl -x u:用户名 制定目录或文件
移除指定目录全部的acl权限
- setfacl -b test/
ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限
getfacl 可看到特殊权限:flags
通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
base ACL 不能删除
setfacl -k dir 删除默认ACL权限
setfacl –b file1清除所有ACL权限
getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
mask只影响除所有者和other的之外的人和组的最大权限
Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)用户或组的设置必须存在于mask权限设定范围内才会生效 setfacl -m mask::rx file
--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
备份和恢复ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt
getfacl -R /tmp/dir1