Authentication:认证,验证用户身份
Authorization:授权,不同的用户设置不同权限
Accouting:审计,事后行为
在Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。
#查看日志 journalctl
[root@localhost ~]# journalctl -u sshd
-- Logs begin at Tue 2024-12-10 10:17:08 UTC, end at Tue 2024-12-10 10:32:19 UTC. --
Dec 10 10:17:29 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
Dec 10 10:17:29 localhost.localdomain sshd[831]: Server listening on 0.0.0.0 port 22.
Dec 10 10:17:29 localhost.localdomain sshd[831]: Server listening on :: port 22.
Dec 10 10:17:29 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
Dec 10 10:17:32 localhost.localdomain sshd[1074]: Accepted password for root from 10.0.0.1 port 49863 ssh2
Dec 10 10:17:33 localhost.localdomain sshd[1074]: pam_unix(sshd:session): session opened for user root by (uid=0)
Dec 10 10:32:18 localhost.localdomain sshd[1730]: Accepted password for root from 10.0.0.11 port 38510 ssh2
Dec 10 10:32:18 localhost.localdomain sshd[1730]: pam_unix(sshd:session): session opened for user root by (uid=0)
ubuntu@ubuntu:~$ ssh [email protected]
[email protected]'s password:
Connection closed by 10.0.0.10 port 22
ubuntu@ubuntu:~$ ssh [email protected]
[email protected]'s password:
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Tue Dec 10 10:17:33 2024 from 10.0.0.1
Linux系统是多用户系统,可以同时存在多个用户,每个用户是相互隔离的。每个用户是通过User Id(UID)来唯一标识的。
Linux用户:
超级管理员:root,0
普通用户:1-60000自动分配
系统用户:1-999,给后台程序使用,像nginx,mysql等
普通用户:1000+,给用户进行交互式登录
Linux系统中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组通过GroupId(GID)来唯一标识。
Linux用户组:
超级管理员组:root,0
普通用户组:1-60000自动分配
系统用户组:1-999,给后台用户使用
普通用户组:1000+,给登录用户使用
一个用户至少有一个组,也可以有多个组;
一个组至少有0个用户,也可以有多个用户;
用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,
默认会创建与其同名的组作为主组;
用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组;
使用组,可以对用户进行批量管理,比如对一个组授权,则该组下所有的用户能能继承这个组的权限;
[root@localhost ~]# id zhangsan
uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan)
[root@localhost ~]# id lisi
uid=1001(lisi) gid=1001(lisi) groups=1001(lisi)
[root@localhost ~]# id root
uid=0(root) gid=0(root) groups=0(root)
Linux系统中,运行中的程序(进程process),都是以进程发起者的身份运行的,该进程所能访问的资源权限也是由运行者的访问权限决定的。
每个程序,也不是每个用户都可以执行的,主要取决于该用户对于该程序有无执行权限。
比如,用户张三执行了某个程序,那么,张三就是该程序的发起者和运行者,该程序就是以张三的身份在运行。如果该程序要想读写某个文件,那要取决于张三这个用户是否有读写该文件的权限,跟进程本身是没有关系的
/etc/passwd:用户及其属性信息
/etc/shadow:用户密码及其相关属性信息
/etc/group:组及其属性信息
/etc/gshadow:组密码及其相关属性信息
[root@localhost ~]# head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# tail -n3 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
zhangsan:x:1000:1000::/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
#文件格式
#loginName(登录用户名):password(密码位,x只是一个占位符,可为空):UID(用户id):GID(所属组id):GECOS(用户全名或描述信息,可为空):directory(用户家目录):shell(用户默认shell,/sbin/nologin表示不可登录)
[root@localhost ~]# cat /etc/shadow
root:$6$UiT/Vz6mxEknFGSM$n5jgNfTal86eaZqawC3qXXcYrudKVqKRonwcSOYFARdGh4tnQ2hetXSDf1n16tESQ.9YCdu1lDslULhzEa90h/::0:99999:7:::
bin:*:19767:0:99999:7:::
daemon:*:19767:0:99999:7:::
adm:*:19767:0:99999:7:::
lp:*:19767:0:99999:7:::
sync:*:19767:0:99999:7:::
shutdown:*:19767:0:99999:7:::
halt:*:19767:0:99999:7:::
mail:*:19767:0:99999:7:::
operator:*:19767:0:99999:7:::
games:*:19767:0:99999:7:::
ftp:*:19767:0:99999:7:::
nobody:*:19767:0:99999:7:::
dbus:!!:20060::::::
systemd-coredump:!!:20060::::::
systemd-resolve:!!:20060::::::
tss:!!:20060::::::
polkitd:!!:20060::::::
libstoragemgmt:!!:20060::::::
sssd:!!:20060::::::
cockpit-ws:!!:20060::::::
cockpit-wsinstance:!!:20060::::::
chrony:!!:20060::::::
sshd:!!:20060::::::
zhangsan:$6$c86s1ONmBKrEl/cK$jBZTayE6n3keZIg2Y3tA5A0XpmQtVua8q.PtBr58en4BEdS1aLxjjo3cLW/onach6NCTMvx7kL1qCMTHClGlC.:20067:0:99999:7:::
lisi:!!:20067:0:99999:7:::
#文件格式
#(login name):(encrypted password):(date of last password change):(minimum password age):(maximum password age):(password warning period):(password inactivity period):(account expiration date):(reserved field)
#login name 登录用户名
#encrypted password 加密后的密码,一般用sha512加密,可为空,!表示该用户被锁定,不能登录系统
#date of last password change 上次修改密码的时间,自1970年开始,0表示下次登录之后就要改密码,为空表示密码时效功能无效
#minimum password age 最小时间间隔,当前密码最少能使用多少天,0表示随时可被变更
#maximum password age 最大时间间隔,当前密码最多能使用多少天,99999表示一直可以使用
#password warning period 警告时间,密码过期前几天开始提醒用户,默认为7
#password inactivity period 不活动时间,密码过期几天后帐号会被锁定,在此期间,用户仍然可以登录,为空表示不使用此规则
#account expiration date 失效时间,从1970年1月1日算起,多少天后帐号失效,为空表示永不过期
#reserved field 保留字段,无意义
所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的;
新建用户还没设密码时为!!;
禁用账号,可以直接在密码字段前加 !。
[root@rocky ~]# tail /etc/group
printadmin:x:995:
ssh_keys:x:994:
libstoragemgmt:x:993:
sssd:x:992:
cockpit-ws:x:991:
cockpit-wsinstance:x:990:
chrony:x:989:
sshd:x:74:
slocate:x:21:
zhangsan:x:1000:
#文件格式
#group_name(组名):password(组密码):GID(组ID):user_list(用户列表,多个用户用,隔开,此处的用户将当前组作为附加组)
[root@rocky ~]# tail /etc/gshadow
printadmin:!::
ssh_keys:!::
libstoragemgmt:!::
sssd:!::
cockpit-ws:!::
cockpit-wsinstance:!::
chrony:!::
sshd:!::
slocate:!::
zhangsan:!::
#文件格式
#group_name(组名):encrypted password(加密后的密码,!表示未设密码):administrators(组管理员):user_list(用户列表,多个用户用,隔开,此处的用户将当前组作为附加组)
可以直接用编辑工具来修改上述文件,但由于跟用户和权限有关的文件具有敏感性,所以系统提供了专用的工具来修改这几个文件。
#vipw|vigr
#编辑/etc/passwd,/etc/group,/etc/shadow,/etc/gshadow
#vipw 默认编辑 /etc/passwd 文件
#vigr 默认编辑 /etc/group 文件
-g|--group #编辑 group 文件
-p|--passwd #编辑 passwd 文件
-s|--shadow #编辑 /etc/shadow 或 /etc/gshadow 文件
#pwck [options] [passwd [shadow]]
#对用户相关配置文件进行检查,默认检查文件为 /etc/passwd
-q|--quiet #只报告错误,忽略警告
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot 到的目录
-s|--sort #通过 UID 排序项目
#grpck [options] [group [gshadow]]
#对用户组相关配置文件进行检查,默认检查文件为 /etc/group,/etc/gshadow
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot 到的目录
-s|--sort #通过 UID 排序项目
#getent 根据用户名查看配置项
getent passwd|shadow|group|gshadow uname [,...]
[root@rocky ~]# getent passwd root zhangsan
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000::/home/zhangsan:/bin/bash
用户管理命令
useradd
usermod
userdel
组管理命令
groupadd
groupmod
groupdel
useradd [options] LOGIN
useradd -D
useradd -D [options]
#常见选项
-u|--uid UID #指定UID
-g|--gid GID #指定用户组,-g groupname|--gid GID
-c|--comment COMMENT #新账户的 GECOS 字段
-d|--home-dir HOME_DIR #指定家目录,可以是不存在的,指定家目录,并不代表创建家目录
-s|--shell SHELL #指定 shell,可用shell在/etc/shells 中可以查看
-r|--system #创建系统用户,CentOS7 以后ID<1000,不会创建登录用户相关信息
-m|--create-home #创建家目录,一般用于登录用户
-M|--no-create-home #不创建家目录,一般用于不用登录的用户
-p|--password PASSWORD #设置密码,这里的密码是以明文的形式存在于/etc/shadow 文件中
-o|--non-unique #允许使用重复的 UID 创建用户
-G|--groups GROUP1[,GROUP2,...] #为用户指明附加组,组须事先存在
-N|--no-user-group #不创建同名的组,使用users组做主组
-D|--defaults #显示或更改默认的 useradd 配置,默认配置文件是/etc/default/useradd
-e|--expiredate EXPIRE_DATE #指定账户的过期日期 YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期后,账户被彻底禁用之前的天数,0表示密码过期立即禁用,-1表示不使用此功能
-k|--skel SKEL_DIR #指定家目录模板,创建家目录,会生成一些默认文件,如果指定,就从该目录复制
#文件,默认是/etc/skel/,要配合-m
-K|--key KEY=VALUE #不使用 /etc/login.defs 中的默认值,自己指定,比如-K UID_MIN=100
-l|--no-log-init #不将用户添加到最近登录和登录失败记录,前面讲到的3a认证审计,就在此处
#lastlog|lastb|cat /var/log/secure
新建用户的相关文件
/etc/default/useradd
/etc/skel/
/etc/login.defs
useradd 命令默认值设定由/etc/default/useradd定义
[root@rocky ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@rocky ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 #useradd不指定组,且/etc/login.defs中的USERGROUPS_ENAB为no或useradd -N时,group为100
HOME=/home #默认家目录父目录
INACTIVE=-1 #对应/etc/shadow文件第7列,即用户密码过期后的帐号锁定的宽限期,-1表示不锁定
EXPIRE= #对应/etc/shadow文件第8列,即用户帐号的有效期
SHELL=/bin/bash #默认bash
SKEL=/etc/skel #用于生成新建用户家目录的模版文件
CREATE_MAIL_SPOOL=yes #默认创建收件箱
家目录模板
#修改此目内的内容后,新创建用户的家目录的内容也将会发生变化
[root@rocky ~]# ls -a /etc/skel/
. .. .bash_logout .bash_profile .bashrc
[root@rocky ~]# touch /etc/skel/text.txt
[root@rocky ~]# ls -a /etc/skel/
. .. .bash_logout .bash_profile .bashrc text.txt
[root@rocky ~]# useradd wangwu
[root@rocky ~]# ls -a /home/wangwu/
. .. .bash_logout .bash_profile .bashrc text.txt
批量创建用户
#newusers file
[root@rocky ~]# cat users.txt
user1:123456:1088:1088::/home/user1:/bin/bash
user2:123456:1089:1089::/home/user2:/bin/bash
[root@rocky ~]# newusers users.txt
[root@rocky ~]# getent passwd user1 user2
user1:x:1088:1088::/home/user1:/bin/bash
user2:x:1089:1089::/home/user2:/bin/bash
[root@rocky ~]# tail -n 2 /etc/passwd
user1:x:1088:1088::/home/user1:/bin/bash
user2:x:1089:1089::/home/user2:/bin/bash
[root@rocky ~]# id user1
uid=1088(user1) gid=1088(user1) 组=1088(user1)
[root@rocky ~]# id user2
uid=1089(user2) gid=1089(user2) 组=1089(user2)
批量修改密码
#chpasswd
[root@rocky ~]# cat pwd.txt
user1:123456
user2:222222
[root@rocky ~]# cat pwd.txt | chpasswd
[root@rocky ~]# chpasswd << EOF
> user1:000000
> user2:999999
> EOF
[root@rocky ~]# echo "user1:888888" | chpasswd
root@ubuntu:~# chpasswd < pwd.txt
生成SHA512加密密码
[root@rocky ~]# openssl passwd -6 123456
$6$RcE7fqdEGv9B2aCb$8LvYuzOROaCpO1yz89yEt0Fx17/pPAP5kLcxForsEGdWhdcFX8XvZy4D/Eqj2KOqxSTzXWEDijVfdZZIfZs311
usermod [options] LOGIN
#常见选项
-c|--comment COMMENT #修改注释
-d|--home HOME_DIR #修改家目录
-e|--expiredate EXPIRE_DATE #修改过期的日期,YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁用,-1表示不使用此功能
-g|--gid GROUP #修改组
-G|--groups GROUPS #groupName|GID... 新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-a|--append GROUP #将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用户
-l|--login LOGIN #新的登录名称
-L|--lock #锁定用户帐号,在/etc/shadow 密码栏的增加 !
-m|--move-home #将家目录内容移至新位置,和 -d 一起使用
-o|--non-unique #允许使用重复的(非唯一的) UID
-p|--password PASSWORD #修改密码,这里是明文,如果要在此处修改密码,则要用加密后的字符串
-s|--shell SHELL #修改 shell
-u|--uid UID #修改 UID
-U|--unlock #解锁用户帐号,将 /etc/shadow 密码栏的!拿掉
userdel [options] LOGIN
#常见选项
-f|--force #强制删除,哪怕用户正在登录状态
-r|--remove #删除家目录和邮件目录
id [OPTION]... [USER]
#常见选项
-a #显示详细信息,默认选项
-Z|--context #仅显示安全上下文信息,要开启selinux 配置才有
-g|--group #仅显示GID,就是只显示主组ID
-G|--groups #显示主组和附加组ID,就是所有组ID
-n|--name #显示用户名或组名,要组合使用 -nu|-ng|-nG
-u|--user #仅显示UID
如果在当前登录终端中,要执行某条命令,但当前登录用户又没有可执行权限或没有某些资源权限;
则在此种情况下,我们可以:
让有权限的用户登录终端,再执行相应的操作;
在当前终端终,临时切换,以有权限的用户的身份去执行命令;
su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
su [options...] [-] [user [args...]]
#常见选项
-m|-p|--preserve-environment #不重置环境变量
-g|--group group #指定主组,只有root 切普通用户才能指定此参数
-|-l|--login #完全切换
-c|--command command #不切换用户,而是临时使用该用户权限和环境执行命令
--session-command command #使用上同 -c 选项,但不会创建会话
-f|--fast #向shell 传递 -f 选项(csh 或 tcsh)
-s|--shell shell #切换用户后,指定新环境的shell环境,必须在 /etc/shells中存在
-P|--pty #开一个新的终端
切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
说明:
root su至其他用户无须密码;非root用户切换时需要密码
注意:
su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
使用 /sbin/nologin shell的用户无法切换,ubnutn 中 使用/bin/false shell 的用户同样无法切换
passwd [OPTION...]
#常用选项
-k|--keep-tokens #保持身份验证令牌不过期
-d|--delete #删除用户密码,也删除密码锁,仅root有权限操作
-l|--lock #锁定用户密码,仅root有权限操作
-u|--unlock #解锁用户密码,仅root有权限操作
-e|--expire #终止用户密码,此操作完成后,用户下次登录成功后要立马修改,仅root有权限操作
-f|--force #强制执行操作
-x|--maximum=DAYS #指定用户密码最长有效期,仅root有权限操作
-n|--minimum=DAYS #指定用户密码最短有效期,仅root有权限操作
-w|--warning=DAYS #在密码过期前多少天开始提醒用户,仅root有权限操作
-i|--inactive=DAYS #当密码过期后经过多少天该用户账号会被禁用,仅root有权限操作
-S|--status #查询用户的密码状态,仅root有权限操作
--stdin #从标准输入接收密码,Ubuntu无此选项
chage [options] LOGIN
#常见选项
-d LAST_DAY #更改密码的时间
-m|--mindays MIN_DAYS
-M|--maxdays MAX_DAYS
-W|--warndays WARN_DAYS
-I|--inactive INACTIVE #密码过期后的宽限期
-E|--expiredate EXPIRE_DATE #用户的有效期
-l #显示密码策略
groupadd [options] GROUP
#常见选项
-f|--force #如果组已经存在则成功退出
-g|--gid GID #新建组时指定组ID,默认是系统分配,指定值不要超过[GID_MIN,GID_MAX]
-K|--key KEY=VALUE #不使用 /etc/login.defs 中的默认值,自己指定,比如 -K GID_MIN=100
-o|--non-unique #允许创建有重复 GID 的组
-p|--password PASSWORD #为新组使用此加密过的密码,这里要用加密后的密文,不然就是直接是明文在/etc/gshadow 里面
-r|--system #创建一个系统组 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
groupmod [options] GROUP
#常见选项
-g|--gid GID #将组 ID 改为 GID
-n|--new-name NEW_GROUP #改名为 NEW_GROUP
-o|--non-unique #允许使用重复的 GID
-p|--password PASSWORD #将密码更改为(加密过的) PASSWORD
groupdel [options] GROUP
#常见选项
-f|--force #强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录
删除组:如果该组下有用户将组作为主组,则不能删除
删除用户:会把与其同ID的主组也给删了,前提是该组下没有其它用户
gpasswd 命令,可以更改组密码,也可以修改附加组的成员关系,组没有密码的情况下,加组只能由root来操作
gpasswd [option] GROUP
#常见选项
-a|--add USER #向组中添加用户
-d|--delete USER #从组中移除用户
-r|--delete-password #删除组密码
-R|--restrict #向其成员限制访问组 GROUP
-M|--members USER,... #批量加组
-A|--administrators ADMIN,... #批量设组管理员
groupmems [options] [action]
#常见选项
-g|--group groupname #更改为指定组 (只有root)
-a|--add username #指定用户加入组
-d|--delete username #从组中删除用户
-p|--purge #从组中清除所有成员
-l|--list #显示组成员列表
#查看用户所属组列表
groups [OPTION]... [USERNAME]...
#临时切换用户组,这里就要用到上面gpasswd 给组设置的密码
#普通用户切组需要密码,root用户切组不需要密码
newgrp [-] [group]
对于文件来说,系统中的用户分为三类不同的角色:
属主:所有者,owner|OWNER|user,u
属组:属于哪个组,group|GROUP,g
其他用户:other|OTHER,o
对于每个角色来说,对于文件有三种不同的权限:
读权限:read|Readable,r,4
写权限:write|Writeable,w,2
执行权限:execute|eXcutable,x,1
程序访问文件时的权限,取决于此程序的发起者:
进程的发起者,同文件的属主:则应用文件属主权限
进程的发起者,属于文件属组;则应用文件属组权限
应用文件“其它”权限
chown 命令可以修改文件的属主,也可以修改文件属组
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#用法说明
#OWNER #只修改所有者
#OWNER:GROUP #同时修改所有者和属组
#:GROUP #只修改属组,冒号也可用 . 替换
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quient #不显示错误信息
-v|--verbose #显示过程
--dereference #修改的是符号链接指向的文件,而不是链接文件本身
-h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号 链接文件属性时,此项才有效)
--from=user:group #根据原属主属组来修改,相当于一个查询条件
--no-preserve-root #不特别对待“/”,意思就是将根目录当成普通目录来执行,默认如此,所以不要 对根目录进行操作
--preserve-root #不允许在"/"上递归操作 --reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件
-R|--recursive #递归操作
#下列选项配合 -R 使用
-H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录
注意:
使用UID来修改属主,UID不支持省略写法
chgrp 命令可以只修改文件的属组
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--dereference #修改的是符号链接指向的文件,而不是链接文件本身
-h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号 链接文件属性时,此项才有效)
--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以不要 对根目录进行操作
--preserve-root #不允许在"/"上递归操作 --reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件
-R|--recursive #递归
#下列选项配合 -R 使用,
-H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录
角色定义
owner------u------属主
group------g------属组
other-------o------其他用户
all------------a------所有人,包括属主和属组、其他用户
赋值写法
+:增加某些权限
-:删除某些权限
=:只保留某些权限,覆盖写
权限表示方法
Readable-----r-----4------读权限
Writeable----w-----2-----写权限
eXcutable----x-----1------执行权限
#常用写法
u+r #属主加读权限
g-x #属组去掉执行权限
ug=rx #属主属组权限改为读和执行
o= #other用户无任何权限
a=rwx #所有用户都有读写执行权限
u+r,g-x #同时指定
注意:
用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限
r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写
只要所有者,所属组或other三者之一有x权限,root就可以执行
对于文本类型的脚本,只有可执行权限也不能执行,还要有读权限,对于二进制文件,只要有执行权限即可执行
权限作用
r--------文件:可以查看文件内容----------------目录:可读取目录中的文件名,但文件的元数据无法查看
w-------文件:可以修改文件内容----------------目录:可以在目录中创建文件和删除文件
x--------文件:可执行,发起为一个进程-------目录:可进入目录,可查看文件元数据,可查看文件内容,属于目录最小权限
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
#MODE #who opt permisson
who # u|g|o|a
opt # +|-|=
permission # r|w|x
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以 不要对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的权限信息给指定文件
-R|--recursive #递归操作,大写X,只会给子目录加x权限
在Linux系统中,新建文件件或目录,都有一个默认权限;
umask 值间接影响新建文件和新建目录的权限:
新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1;
新建目录:777-umask;
#显示或设定文件模式掩码
umask [-p] [-S] [mode]
-p #如果省略 MODE 模式,以可重用为输入的格式输入
-S #以字符显示
root用户的umask为0022
普通用户的umask为0002
持久保存umask
全局设置: /etc/bashrc , /etc/bash.bashrc(ubuntu)
用户设置:~/.bashrc
在Linux系统中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是 SUID, SGID,Sticky;这三个特殊权限独⽴于rwx权限体系:
SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限
SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限;作用于目录上,此目录中新建的文件的所属组将自动从此目录继承
STICKY:作用于目录上,此目录中的文件只能由所有者自己来删除
前提:进程有属主和属组;文件有属主和属组
任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
进程访问文件时的权限,取决于进程的发起者
二进制的可执行文件上SUID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID只对二进制可执行程序有效
SUID设置在目录上无意义
#SUID权限设定
chmod u+s FILE...
chmod 4xxx FILE
chmod u-s FILE...
#普通用户访问/etc/shadow
[lisi@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
#设定SUID权限
[root@localhost ~]# chmod u+s /usr/bin/cat
[root@localhost ~]# su - lisi
Last login: Wed Dec 11 16:13:59 UTC 2024 on pts/0
[lisi@localhost ~]$ ll /usr/bin/{cat,passwd}
-rwsr-xr-x. 1 root root 38408 Jan 18 2023 /usr/bin/cat
-rwsr-xr-x. 1 root root 33424 Apr 19 2022 /usr/bin/passwd
[lisi@localhost ~]$ cat /etc/shadow
root:$6$UiT/Vz6mxEknFGSM$n5jgNfTal86eaZqawC3qXXcYrudKVqKRonwcSOYFARdGh4tnQ2hetXSDf1n16tESQ.9YCdu1lDslULhzEa90h/::0:99999:7:::
二进制的可执行文件上SGID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属组为原程序文件的属组
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
#SGID权限设定
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权,在目录设置Sticky 位,只有文件的所有者或 root 可以删除该文件,sticky 设置在文件上无意义
#Sticky权限设定
chmod o+t DIR...
chmod xxx DIR
chmod o-t DIR...
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
#设置文件属性
chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...
#常用选项
-p project #设置文件项目编号
-R #递归执行
-V #显示过程,并输出chattr 版本
-f #不输出错误信息
-v version #设置版本
#操作符
+attribute #添加该属性
-attribute #去掉该属性
=attribute #仅有该属性
#常用属性
a #对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修改文件,但不可删除文件
A #不更新atime,节省IO
c #文件会被压缩保存
i #对文件:不可被删除不可被修改不可重命名;对目录:可修改查看目录中的文件,不可新建文件,不可删除文件
s #彻底删除文件,用0填充原来的数据块
u #防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖
#显示文件属性
lsattr [-RVadlpv] [files...]