用户、组、文件权限

用户、组、文件权限

1~3 重点

  • 若对某个用户的所属组进行修改,
    相应权限变化不会立即生效,需要重新登录来更新自己的token!!!
  • 对某个文件的某一项权限修改,是立即生效的

1 Linux安全模型

资源分派:

  • Authentication:认证,验证用户身份
  • Authorization:授权,不同的用户设置不同权限
  • Accouting | Audition:审计

当用户登录时,系统会自动分配令牌token,包括用户标识和组成员等信息

1.1 用户 user

Linux中每个用户是通过User Id (UID)来唯一标识的

[root@CentOS8 ~]#id -u           #查看当前用户UID
0
[root@CentOS8 ~]#id -u jacklee   #查看指定用户UID
1000
  • 管理员:root, UID=0
  • 普通用户:1-60000 自动分配
    1. 系统用户:对进程获取资源进行权限分配
      1-499 (CentOS 6以前), 1-999 (CentOS7以后)
    2. 登录用户:给用户进行交互式登录使用
      500+ (CentOS6以前), 1000+(CentOS7以后)

1.2 用户组 group

Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的

GID与UID可使用相同的数字,是相互独立的部分(各自使用各自的1~999)

  • 管理员组:root, 0
  • 普通组
    1. 系统组:对进程获取资源进行权限分配
      1-499 (CentOS 6以前), 1-999 (CentOS7以后)
    2. 登录组:给用户进行交互式登录使用
      500+ (CentOS6以前), 1000+(CentOS7以后)

1.3 用户和组的关系

  • 用户的主要组(primary group):用户必须属于一个且只有一个主组
    1. 默认创建用户时会自动创建和用户名同名的组,做为用户的主要组
    2. 组中只有一个用户,称为私有组
  • 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组

组的存在是为了进行多个用户批量授权,提高效率

范例:查看指定ID的用户和组信息

[root@CentOS8 ~]#id jacklee
uid=1000(jacklee) gid=1000(jacklee) groups=1000(jacklee)

1.4 安全上下文

运行中的程序称之为进程 (process)
进程能够访问资源的权限取决于进程的 运行者的身份,与进程本身无关!!!

范例:root能访问/etc/shadow ,而用户jacklee不行

[root@CentOS8 ~]#cat /etc/shadow
root:$6$ogqukkz6XDmQP2c3$lYEMf.Fuf5sXr8Y4G4Upzc/ii6n2WszGq5Yfz6ImMbLY1QPY04a2JzyqVBYk9w4z5h/tSYxb3ymON0fYQbHlY1::0:99999:7:::
bin:*:18027:0:99999:7:::
daemon:*:18027:0:99999:7:::
adm:*:18027:0:99999:7:::
[jacklee@CentOS8 ~]$cat /etc/shadow
cat: /etc/shadow: Permission denied

2 配置文件

2.1 用户和组的主要配置文件

  • /etc/passwd: 用户及其属性信息(名称、UID、主组ID等)
  • /etc/shadow: 用户密码及其相关属性
  • /etc/group: 组及其属性信息
  • /etc/gshadow:组密码及其相关属性

查看上述文件,除了cat命令,还可使用getent更为方便!直接 getent + basename

[root@CentOS8/~]# getent 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
......

#也可以指定用户查看
[root@CentOS8/~]# getent shadow jacklee
jacklee:$6$ByWgJCxL2f/Afybr$wuxHkxi04SjJmsbQAGyO82K537ZR9vv/LwRjKMKC1lkyrmBEH/OHiuHbU8UcdUdmfgc4LcTpeO/DWNuJ07ncl1:18475:0:99999:7:::

2.2 passwd文件格式

用户名 密码 UID GID 描述信息 家目录 默认shell
root x(表示隐藏) 0 0 root /root bash

在不理解格式的情况下,应该主动使用帮助功能,对于passwd操作如下:

[root@CENTOS7 ~]#whatis passwd
sslpasswd (1ssl)     - compute password hashes
passwd (1)           - update user's authentication tokens
passwd (5)           - password file   
#此时是为了查看文件,应该查看第五章内容!
[root@CENTOS7 ~]#man 5 passwd    #进入文件后使用page翻页!
Each  line of the file describes a single user, and contains 
seven colon-separated fields:
name:password:UID:GID:GECOS:directory:shell  #七个项目的含义,用:号隔开
用户名:密码:UID:GID:描述信息:家目录:默认shell

实际操作查看:
[root@CentOS8 ~]#cat /etc/passwd
最后一行:jacklee:x:1000:1000:jacklee:/home/jacklee:/bin/bash

注意:

  1. 密码位置的字符 x 是为了兼容性留下的占位符,表示密码文件不在此处
    (实际存放在 /etc/shadow文件)
  2. shell类型为nologin表示此用户不需要登录,开机自启,用于程序的相关服务
  3. 在/etc/passwd文件中修改对应信息,即可实现对应功能,但一般不直接修改文本

2.3 shadow文件格式

shadow存放密码与其策略,因此只有root用户有权限查看!!!

[jacklee@CentOS8 ~]$cat /etc/shadow
cat: /etc/shadow: Permission denied   #无权限

同理,可使用 man 5 shadow查看格式

[root@CentOS8 ~]#cat /etc/shadow
root:$6$ogqukkz6XDmQP2c3$lYEMf.Fuf5sXr8Y4G4Upzc/ii6n2WszGq5Yfz6ImMbLY1QPY04a2JzyqVBYk9w4z5h/tSYxb3ymON0fYQbHlY1::0:99999:7:::
bin:*:18027:0:99999:7:::
...
jacklee:$6$QlCPFppDpXzzYYRB$Zot.igaBz4y8VWcAOKVjEfo54fnvC9GKd2DwmxOTXFCES5UU0zolUzUduI/607qQW6iLV04QFjxheuva/3lyd0:18449:0:99999:7:::
#其中jacklee的 salt 为 QlCPFppDpXzzYYRB

所有信息依次表示:

  1. 登录名
  2. 密码:字符 ! ! 表示密码锁定;字符 * 表示兼容占位符,即无密码(多为系统用户)
    一长串乱码表示密码使用了 SHA512 加密,标志是以 和第3个$之间的字符)
  3. 上次改密码的时间:从1970年1月1日起 到密码最近一次被更改的时间(天)
    设置为0,下次登录必须修改(chage -d 0)
  4. 最短有效期:密码再过几天可以被变更(0表示随时可被变更)
  5. 最长有效期:密码再过几天必须被变更(99999表示永不过期)
  6. 密码过期前几天系统提醒用户(默认为一周)
  7. 宽限期:密码过期几天后帐号会被锁定!!!
  8. 从1970年1月1日算起,多少天后帐号失效不填写此项,表示永久
用户名 密码 上次修改 最短期限 最长期限 提前提醒 宽限期 有效期
jacklee sha512加密 18449天 0=随时可改 99999=不过期 7天 99999天 永久
#直接查看指定用户的密码策略
[root@CentOS8/~]# chage -l jacklee
Last password change                    : Aug 01, 2020
Password expires                    : never
Password inactive                   : never
Account expires                     : never
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7

#修改密码策略:
[root@CentOS8/~]# chage jacklee
Changing the aging information for jacklee
Enter the new value, or press ENTER for the default

    Minimum Password Age [0]:    #按格式依次输入设置值即可

注意:新建用户都无密码,默认使用 !! 锁定

  1. shadow文件中密码处的字符 ! ! 表示密码锁定(如Ubuntu的root)
    普通用户:将 !! 删除后直接保存,则为空口令,可直接登录
    nologin用户:删除 ! 也不能登录,因为本身就不需要登录

    shadow中字符 * 与passwd中的 x 一样,为兼容而留下的占位符

  2. 普通用户即使有密码,root也可以直接删除加密字符,成为空口令

  3. 为了允许Ubuntu远程ssh登录,需要修改/etc/ssh/sshd_config文件
    将#PermitRootLogin prohibit-password修改为 PermitRootLogin yes

  4. 快速生成一个12位随机密码

    [root@CentOS8/~]# tr -dc '[:alnum:]' < /dev/urandom | head -c 12 
    iQpKEMfMP1BZ
    
    [root@CentOS8/~]# openssl rand -base64 12 (可能带符号)
    Bf2goiJ9p7gfEWar
    
  5. 快速查看今天距离1970-1-1的天数:

    echo `date +%s`/86400 | bc 
    

2.4 group文件格式

[root@CentOS8 ~]#cat /etc/group
root:x:0:
bin:x:1:
jacklee:x:1000:
......
组名 组密码 GID 以当前组为 附加组的 用户列表
root x 0

组密码存在的意义:

  • 管理员添加组员,相当于赋予权限,需要验证密码
  • 用户主动加入组,验证密码通过即可

注意:

  1. 若有多个组员,使用逗号分隔
  2. 同理,x 表示密码储存在其他文件(gshadow)

2.5 gshadow文件格式

[root@CentOS8 ~]#cat /etc/gshadow
root:::
bin:::
jacklee:!::
组名 组密码 管理员列表 以当前组为附加组的用户列表
jacklee !锁定

注意:

  1. 空密码表示没有密码,因此普通用户不能自己加入
  2. 无管理员,则默认管理员为root
  3. 同理,!表示锁定

2.6 文件操作

  • getent直接查看文件,也可指定用户查看

    getent passwd
    getent shadow jacklee
    
  • vipw和vigr(vi + 文件名:编辑文件内容)

  • pwck和grpck(文件名+check:具有检查语法错误的功能)

    [root@CentOS8 ~]#pwck  检查passwd文件的语法错误
    user 'pulse': directory '/var/run/pulse' does not exist
    user 'gluster': directory '/run/gluster' does not exist
    user 'saslauth': directory '/run/saslauthd' does not exist
    user 'clevis': directory '/var/cache/clevis' does not exist
    user 'pipewire': directory '/var/run/pipewire' does not exist
    user 'gnome-initial-setup': directory '/run/gnome-initial-setup/' does not exist
    pwck: no changes
    

3 用户与组的管理

用户
新建 useradd groupadd
修改属性 usermod groupmod
修改密码 passwd gpasswd
修改密码策略 chage
删除 userdel groupdel
查看用户的属组 id user_name groups user_name
管理组员 gpasswd 或 groupmems

3.0 重点&易错点

  • 要求下次登录必须修改密码

    passwd -e jack
    chage -d 0 jack
    

3.1 用户创建@@@

useradd 命令可以创建新的Linux用户

useradd [options] NEWUSER

-r  创建系统用户  CentOS 6之前: ID<500,CentOS 7以后: ID<1000
-u  UID(指定想要的UID,不可重复)
-o  不检查UID唯一性 '因此 -uo 相当于对用户创建硬链接!!!一个UID两个name
-g  GID 指明用户所属基本组,'输入时可指定组名或GID
-s  SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
    '在Ubuntu中创建新用户默认使用sh而不是bash(可修改配置)
-d  DIR 以指定的路径为家目录  '必须是不存在的目录
-m  指定UID小于1000时,加上 -m 可将其视为普通用户,并创建家目录 
-c  COMMENT 用户的注释信息

-p  指定密码 '要求输入的内容为加密后的结果!!!

典型应用:

  • 创建指定信息用户
useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache
#创建一个系统用户,UID=48,属于主组apache,shell类型nologin,指定家目录为/var/www,注释信息为Apache,用户名为apache
  • 批量创建用户

    newuser passwd 格式文件
    
  • 批量修改密码(一键修改密码)

    echo username:passwd | chpasswd
    

注意

  1. 普通用户默认会创建家目录,系统用户无家目录
  1. 各个系统生成加密密码的方式

    • Centos8 生成sha512加密密码

      #选项-6表示SHA512加密算法,centos8特有
      [root@CentOS8/~]# openssl passwd -6 mimamima
      $6$nPam4qhiviJsajFj$VPu0EHBZ4kVc1rJNyRWkg76aZUwPrkcXHDX3v7RebfKMVPD6Pw3j5dSHKPyj9azStLuKbTeG4inmVV3mTlCpc1
      
    • Centos7 使用Python 生成sha512加密密码

      python -c 'import crypt,getpass;pw="jacklee";print(crypt.crypt(pw))'
      
      [root@CentOS7/~]# python -c 'import crypt,getpass;pw="jacklee";print(crypt.crypt(pw))'
      $6$X3QI12Kgouk0r.VN$yTQDu9kxetQ3H1X2W8paI.4TnpIGN2YorprSub3XLAKWEaA0UGZ/iA0zPRN2X6kXIpXwl50SUFFJGN.JgBc4r1
      
    • Centos6 生成sha512加密密码

      [root@CentOS6/~]# grub-crypt --sha-512
      Password:       #需要手动输入
      Retype password: 
      $6$bQkDf7TFR/YkAfRD$XfxboLIuWxcauEwuLKGOCe4FiN4952XzbBciKXq0.sBPXIfuB0ejTKVpIP3viVma8dbDOCIhA4O7pZO2zWQSh0
      
      #使用加密结果创建新用户,名为jacky
      [root@CentOS6/~]# useradd -p '$6$bQkDf7TFR/YkAfRD$XfxboLIuWxcauEwuLKGOCe4FiN4952XzbBciKXq0.sBPXIfuB0ejTKVpIP3viVma8dbDOCIhA4O7pZO2zWQSh0' jacky
      [root@CentOS6/~]# id  jacky
      uid=500(jacky) gid=500(jacky) groups=500(jacky)
      
  1. useradd命令的默认设置,在文件/etc/defalut/useradd

    #使用useradd  -D可查看当前设置
       [root@CentOS8/~]# useradd -D
       GROUP=100        系统默认组users的GID
       HOME=/home       默认家目录
       INACTIVE=-1      密码过期的宽限期
       EXPIRE=          账户有效期(从1970开始算)
       SHELL=/bin/bash  默认shell类型
       SKEL=/etc/skel/  新用户的家目录中'默认创建的文件的模板
       CREATE_MAIL_SPOOL=yes  是否创建邮箱
       
    #编辑默认设置
    useradd -D            显示默认设置
    useradd -D -s shell   修改默认值
    useradd -D -b 家目录   修改默认值
    useradd -D -g group   修改默认值
    
  1. adduser命令在centos中与useradd等效,在Ubuntu中有所不同

    [root@CentOS8 ~]#which adduser
    /usr/sbin/adduser
    [root@CentOS8 ~]#which useradd
    /usr/sbin/useradd
    [root@CentOS8 ~]#ll /usr/sbin/adduser
    lrwxrwxrwx. 1 root root 7 May 11  2019 /usr/sbin/adduser -> useradd
    

3.2 用户属性修改(少用)

usermod 命令可以修改用户属性

usermod [OPTION] user
-u UID: 新UID
-l login_name: '设置新的名字
-g GID: 新GID或新组名
-G GROUP1[,GROUP2,...[,GROUPN]]]:
   设置新的附加组,原来的附加组将会被覆盖;
   若想保留原有的附加组,则要同时使用 -a选项
-s 新的默认SHELL
-c 新的注释信息
-d newdir 修改家目录为newdir
   新指定的家目录不会自动创建,若要'创建新家目录并移动原家数据,同时使用-m选项

-L lock指定一个用户,在/etc/shadow 密码栏的增加 ! '表示进行锁定,禁止登录
-U unlock指定一个用户,将 /etc/shadow 密码栏的!拿掉,'表示解锁
   若提示禁止解锁,同时 -p 设置新密码即可
   
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限

3.3 删除用户

userdel 可删除Linux 用户

userdel [OPTION]... user

-f, --force  强制删除
-r, --remove 删除用户家目录和邮箱

注意:若不加选项直接删除,无法删除用户的配置文件

3.4 查看用户相关的ID信息

id [OPTION]... [USER]

-u: 显示UID
-g: 显示GID
-G: 显示用户的所属组的ID(主+附加)
-n: 显示名称'需配合ugG使用
[root@CentOS8/~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@CentOS8/~]# id -u
0
[root@CentOS8/~]# id -u jacklee
1000
[root@CentOS8/~]# id jacky
uid=1001(jacky) gid=1001(jacky) groups=1001(jacky)

3.5 切换用户@@@

su: 即switch user

可以切换用户身份

切换用户的两种方式:

  • su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
  • su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换

说明:

  1. root 切换至其他用户无须密码;其他用户切换时需要密码
  2. 使用 su 切换之后,exit 返回原用户,避免重复 su 导致bash子进程环境混乱

以指定用户的身份执行命令

普通用户想要执行高级命令:

su [-] UserName -c 'COMMAND'

#用户jacklee查看shadow文件
[jacklee@CentOS8 ~]$su - root -c "getent shadow"
Password:    #需要输入密码
root:$6$zPRAwzA.VZmVBIZ0$z5mVDGTn7jdDUBUINVr2at9kI45e9ScHQGaLjPqIFKnOVEv51Fq6feVhrJH33MEz/.m/XXvk/o6ro0kj22Jva1::0:99999:7:::
bin:*:18027:0:99999:7:::
daemon:*:18027:0:99999:7:::
adm:*:18027:0:99999:7:::
......

禁止普通用户登录

su -s /sbin/nologin user    

3.6 设置用户密码@@@

新建用户useradd命令默认不设置密码

passwd 可以修改用户密码

passwd [OPTIONS] UserName

-d 删除指定用户密码
-l 锁定指定用户
-u 解锁
-e 强制用户下次登录修改密码!!!!!!!!!!!同   chage -d 0 jack
-f 强制操作

-n 指定最短使用期限
-x 指定最长使用期限
-w 指定提醒期限
--stdin:从标准输入接收用户密码,'ubuntu没有此选项

对密码策略各种时间期限的图解:

  • passwd expiration date —— 密码到期日期
  • inactive days —— 到期后的宽限期
  • inactive dte —— 密码失效日期

常用功能:一键修改密码

#适用各种Linux版本:
[root@CentOS8/~]# echo -e '123456\n123456' | passwd jacky
Changing password for user jacky.
New password: BAD PASSWORD: The password is shorter than 8 characters
Retype new password: passwd: all authentication tokens updated successfully.

#适用红帽系列:
[root@CentOS8/~]# echo 'jacklee' | passwd --stdin jacky
Changing password for user jacky.
passwd: all authentication tokens updated successfully.

3.7 修改密码策略

chage 可以修改用户密码策略

chage [OPTION]... LOGIN

选项:

-l  显示密码策略
-d   LAST_DAY   -d 0 表示下次登录必须修改密码
-m --mindays MIN_DAYS
-M --maxdays MAX_DAYS
-W --warndays WARN_DAYS
-I --inactive INACTIVE 密码过期后的宽限期
-E --expiredate EXPIRE_DATE 用户的有效期

范例:

[root@CentOS8 ~]#chage -m 3 -M 42 -W 14 -I 7 -E 2020-10-10 jacklee
#将用户jacklee的密码策略进行重新定义
[root@CentOS8 ~]#chage -l jacklee 
Last password change                    : Jul 06, 2020
Password expires                    : Aug 17, 2020
Password inactive                   : Aug 24, 2020
Account expires                     : Oct 10, 2020
Minimum number of days between password change      : 3
Maximum number of days between password change      : 42
Number of days of warning before password expires   : 14
[root@CentOS8 ~]#getent shadow jacklee 
jacklee:$6$QlCPFppDpXzzYYRB$Zot.igaBz4y8VWcAOKVjEfo54fnvC9GKd2DwmxOTXFCES5UU0zolUzUduI/607qQW6iLV04QFjxheuva/3lyd0:18449:3:42:14:7:18545:

#下一次登录强制重设密码
[root@CentOS8 ~]#chage -d 0 jacklee 
[root@CentOS8 ~]#getent shadow jacklee 
jacklee:$6$QlCPFppDpXzzYYRB$Zot.igaBz4y8VWcAOKVjEfo54fnvC9GKd2DwmxOTXFCES5UU0zolUzUduI/607qQW6iLV04QFjxheuva/3lyd0:0:3:42:14:7:18545:
[root@CentOS8 ~]#chage -l jacklee 
Last password change                : password must be changed
Password expires                    : password must be changed
Password inactive                   : password must be changed
Account expires                     : Oct 10, 2020
Minimum number of days between password change      : 3
Maximum number of days between password change      : 42
Number of days of warning before password expires   : 14

3.8 用户相关的其它命令

  • chfn 指定个人信息
  • chsh 指定shell( 等于命令usermod -s )
  • finger 可看用户个人信息
[root@CentOS8 ~]#chfn jacklee    #手动输入相关信息
Changing finger information for jacklee.
Name [jacklee]: abb     #将会在开机界面显示!!!!!!!
Office []: bba
Office Phone []: 110
Home Phone []: 120
Finger information changed.

[root@CentOS8 ~]#chsh -s /bin/sh jacklee 
Changing shell for jacklee.
Shell changed.
[root@CentOS8 ~]#getent passwd jacklee 
jacklee:x:1000:1000:abb,bba,110,120,:/home/jacklee:/bin/sh

注意:若修改普通用户的shell类型为nologin,将导致用户无法登录


3.9 管理组

组没有"管理员组"的说法,root组就是一个名为root的普通组

3.9.1 创建组

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
#表示创建组名为apache、GID为48的系统组

3.9.2 修改组

groupmod [OPTION]... group

-n group_name: 新名字
-g GID: 新的GID

3.9.3 删除组

groupdel [options] GROUP  #此操作只能删除空组

-f, --force 强制删除,即使是用户的主组也强制删除组

[root@CentOS8/~]# id jacky
uid=1001(jacky) gid=1001(jacky) groups=1001(jacky)
[root@CentOS8/~]# groupdel -f jacky
[root@CentOS8/~]# id jacky
uid=1001(jacky) gid=1001 groups=1001

3.9.4 管理组成员

  • gpasswd命令

    • 修改组密码

      gpasswd GROUP
      [root@CentOS8/~]# gpasswd jacklee
      Changing the password for group jacklee
      New Password:   #手动输入密码
      Re-enter new password: 
      
    • 修改组的成员关系

      gpasswd [OPTION] GROUP
      
      常见选项:
      -a user    将user添加至指定组中
      -d user    从指定组中移除用户user
      -A user1,user2,... 批量设置管理员
      
      [root@CentOS8/~]# id jacky
      uid=1001(jacky) gid=1003(jacky) groups=1003(jacky)
      [root@CentOS8/~]# gpasswd -a jacky admin
      Adding user jacky to group admin
      [root@CentOS8/~]# id jacky
      uid=1001(jacky) gid=1003(jacky) groups=1003(jacky),1002(admin)
      [root@CentOS8/~]# groups jacky
      jacky : jacky admin
      [root@CentOS8/~]# getent group admin
      admin:x:1002:jacky
      
      [root@CentOS8/~]# gpasswd -d jacky admin 
      Removing user jacky from group admin
      [root@CentOS8/~]# groups jacky
      jacky : jacky
      [root@CentOS8/~]# id jacky
      uid=1001(jacky) gid=1003(jacky) groups=1003(jacky)
      [root@CentOS8/~]# getent group admin
      admin:x:1002:
      
  • groupmems命令可以显示、管理组成员关系(格式与gpasswd不同: -g group)

    groupmems [options] [action]
    
    -g groupname 更改为指定组 (只有root可用)
    
    -a 指定用户加入组  格式:groupmems -a user -g group
    -d 从组中删除用户  格式:groupmems -d user -g group
    
    -p 从组中清除所有成员
    -l 显示组成员列表
    
  • groups命令 可查看用户的属组

    #查看用户所属组列表
    groups  [USERNAME]...
    [root@CentOS8/~]# groupmems -a jacky -g root
    [root@CentOS8/~]# groups jacky
    jacky : jacky root
    [root@CentOS8/~]# id jacky
    uid=1001(jacky) gid=1003(jacky) groups=1003(jacky),0(root)
    

3.9.5 临时切换主组

newgrp命令可以临时切换主组, 如果用户本不属于此组,则需要组密码

newgrp [-] [group]

如果使用 - 选项,可以初始化用户环境

如果用户不属于此组,则需要组密码


4 文件权限管理

4.0 重点

讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限

讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限

讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限

4.1 所有者和所属组

4.1.1 设置文件的所有者chown@@@

chown 命令可以修改文件的属主,也可以修改文件所属组

chown [OPTION]... [OWNER][:[GROUP]] FILE...   #冒号也可用 . 替换
chown [OPTION]... --reference=RFILE FILE...

用法说明:
OWNER 只修改所有者
OWNER:GROUP 同时修改所有者和属组
:GROUP 只修改属组
-R: 递归
--reference=RFILE 参考指定的的属性,来修改

[root@CentOS8 data]#cp /etc/fstab f1.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 root root 709 Jul  8 16:08 f1.txt
[root@CentOS8 data]#chown jacklee f1.txt 
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee root 709 Jul  8 16:08 f1.txt
[root@CentOS8 data]#chown :jacklee f1.txt 
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee jacklee 709 Jul  8 16:08 f1.txt
[root@CentOS8 data]#chown root:bin f1.txt 
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 root bin 709 Jul  8 16:08 f1.txt
[root@CentOS8 data]#chown jacklee.root f1.txt   #用.代替:
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee root 709 Jul  8 16:08 f1.txt

[root@CentOS8 data]#touch f2.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee bin  709 Jul  8 16:08 f1.txt
-rw-r--r-- 1 root    root   0 Jul  8 16:12 f2.txt
[root@CentOS8 data]#chown --reference=f1.txt  f2.txt 
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee bin 709 Jul  8 16:08 f1.txt
-rw-r--r-- 1 jacklee bin   0 Jul  8 16:12 f2.txt

4.1.2 设置文件的属组信息 chgrp

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

-R 递归

此命令也可由 chown :GROUP完成

4.2 文件权限@@@

4.2.0 重要原则

讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限

讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限

讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限


并不是每个文件系统都支持设置权限

例如,Linux也支持FAT文件系统,但是此系统不能设置权限


4.2.1 文件权限说明

  • 文件的权限主要针对三类对象进行定义(ACL权限设置第四类)
    owner 属主, u
    group 属组, g
    other 其他, o
    用户的最终权限,根据ugo的顺序从左往右进行匹配!一旦匹配到,权限立即生效
  • 每个文件针对每类访问者都定义了三种权限
    r Readable
    w Writable
    x eXcutable

对root来说,只有 x 权限可能会受到限制!!!!!!!!!!!!

  • 文件的权限的意义(能否删除文件是由文件夹权限决定的
    1. 读 r ——能访问文件
    2. 写 w ——能修改文件内容
    3. 执行 x ——能运行此程序
  • 目录的权限的意义(一般情况下目录同时给 r-x
    1. 读 r ——可以在外面使用ls查看此目录中文件列表
    2. 写 w——可在此目录新建或删除文件
      与 被删除的文件具有什么权限 无关!!!
    3. 执行 x——可cd进入此目录(最小权限)
    4. 特别 X——递归设置时只给目录x权限,避开文件
other对目录的权限: r - - - - x r - x
不在目录中 ls 可看到文件列表 Permission denied
不在目录中 ll 可看到文件列表 Permission denied
能否 cd 进入目录 Permission denied 能进入
cd 进入目录中 ls —— Permission denied
已知文件名能否查看文件 Permission denied 可查看文件属性及内容

[jacklee@centos8/~]$ ll -d /data/
drwxr-xr--. 3 root root 45 Aug  2 20:26 /data/      o=r的情况(ls成功,cd失败)
[jacklee@centos8/~]$ ls /data/
ls: cannot access '/data/f1.txt': Permission denied
ls: cannot access '/data/f2.txt': Permission denied
ls: cannot access '/data/dir': Permission denied
dir  f1.txt  f2.txt
[jacklee@centos8/~]$ cd /data/
-bash: cd: /data/: Permission denied

[jacklee@centos8/~]$ ll -d /data/
drwxr-x--x. 3 root root 45 Aug  2 20:26 /data/      o=x的情况(ls失败,cd成功)
[jacklee@centos8/~]$ ls /data/
ls: cannot open directory '/data/': Permission denied
[jacklee@centos8/~]$ cd /data/
[jacklee@centos8/data]$ ls
ls: cannot open directory '.': Permission denied

权限还可用数字代替字母表示

因此总共存在8种不同的权限搭配方式:

--- --x -w- -wx r-- r-x rw- rwx
000 001 010 011 100 101 110 111
0 1 2 3 4 5 6 7

范例 :

  • 640 rw- r-- ---
  • 755 rwx r-x r-x

4.2.2 修改文件权限 chmod

格式: 
chmod who opt mod file
who= u,g,o,a
opt= +,-,=     '修改某个权限使用 +,-   修改全部权限使用 =
mod= r,w,x 

-R 递归修改权限(用于多级目录) 
#参考RFILE文件的权限,将FILE的修改为与RFILE一致
chmod opt --reference=RFILE FILE...

#清空所有类型用户权限
chmod a=  file或/dir  

使用格式举例:

chmod u+wx,g-r,o=rx file
chmod -R g+rwX /dir
chmod 644 file

实操范例:

[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 root root 709 Jul  8 16:08 f1.txt
-rw-r--r-- 1 root root   0 Jul  8 16:12 f2.txt
[root@CentOS8 data]#chmod u-w,g+w,o-r f1.txt 
[root@CentOS8 data]#ll
total 4
-r--rw---- 1 root root 709 Jul  8 16:08 f1.txt   #对应权限已修改
-rw-r--r-- 1 root root   0 Jul  8 16:12 f2.txt

[root@CentOS8 data]#chmod u=rwx,g=rw f2.txt 
[root@CentOS8 data]#ll
total 4
-r--rw---- 1 root root 709 Jul  8 16:08 f1.txt
-rwxrw-r-- 1 root root   0 Jul  8 16:12 f2.txt   #对应权限已修改(有x权限变绿)

[root@CentOS8 data]#chmod 666 f1.txt             #直接输入八进制权限
[root@CentOS8 data]#ll
total 4
-rw-rw-rw- 1 root root 709 Jul  8 16:08 f1.txt   #对应权限已修改为666
-rwxrw-r-- 1 root root   0 Jul  8 16:12 f2.txt

子目录权限递归范例:

[root@CentOS8 data]# ll
total 0
drwxr-xr-x 3 root root 16 Jul  8 19:40 a1   #原始属性
[root@CentOS8 data]# ll a1 
total 0
drwxr-xr-x 3 root root 16 Jul  8 19:40 a2   #a2的原始属性
[root@CentOS8 data]# ll a1/a2
total 0
drwxr-xr-x 2 root root 6 Jul  8 19:40 a3    #a3的原始属性
[root@CentOS8 data]# chmod a-x a1       #不使用递归  
[root@CentOS8 data]# ll
total 0
drw-r--r-- 3 root root 16 Jul  8 19:40 a1   #a1属性修改成功
[root@CentOS8 data]# ll a1
total 0
drwxr-xr-x 3 root root 16 Jul  8 19:40 a2   #a2无变化
[root@CentOS8 data]# ll a1/a2
total 0
drwxr-xr-x 2 root root 6 Jul  8 19:40 a3    #a3无变化

[root@CentOS8 data]# chmod -R a-x a1    #使用递归
[root@CentOS8 data]# ll a1
total 0
drw-r--r-- 3 root root 16 Jul  8 19:40 a2   #a2修改成功
[root@CentOS8 data]# ll a1/a2
total 0
drw-r--r-- 2 root root 6 Jul  8 19:40 a3    #a3修改成功

4.2.3 新建文件和目录的默认权限

umask的值可以用来设置创建新文件的权限

  • 新建文件的默认权限为 666-umask的计算结果
    • root默认umask=022,新建文件权限为644=rw-r--r--
    • 普通用户默认umask=002,新建文件权限为664=rw-rw-r--
    • 当umask被修改时,所得结果有可能出现奇数(表示文件有执行权限),
      此时应将其权限+1(消除x权限),防止执行病毒**;若为偶数则不变
  • 新建目录的默认权限为 777-umask的计算结果目录的执行权限不存在风险
    • root新建目录的权限为755
    • 普通用户新建目录的权限为775

临时修改 uamsk

umask #  (#即为想要的设置)

持久保存umask,应该修改配置文件

  • 全局设置: /etc/bashrc
  • 用户设置:~/.bashrc

为了更直观显示出umask的数值表达的意思,可使用 -S 选项

[root@CentOS8 data]#umask
0022
[root@CentOS8 data]#umask -S
u=rwx,g=rx,o=rx
#此即为当前的默认设置

4.4 Linux文件系统上的特殊权限

  • 三种常见的权限:r, w, x
  • 三种特殊权限:SUID, SGID, Sticky
权限名称 SUID SGID Sticky
功能说明 继承所有者权限 继承所属组权限 防止外人删除文件
适用范围 只对bin文件设置 文件和目录 只对目录设置
添加权限的操作 u+s 或 4xxx g+s 或 2xxx o+t 或 1xxx
删除权限的操作 u-s g-s o-t
添加权限之后的显示 rwS 或 rws rwS 或 rws r - T 或 r - t
特别说明 设置在目录用于协作

关于添加权限之后的显示:rwS表示没有 x 权限 ,rws 表示 rwxs 权限全部都有

删除权限的操作:也可以 chmod xxx file/dir 直接覆盖


4.4.1 特殊权限SUID—继承own

SUID只对二进制可执行程序有效,设置在目录上无意义

设置此权限的前提:进程有属主和属组;文件有属主和属组

chmod u+s FILE...
chmod 4xxx FILE
chmod u-s FILE...

SUID权限的功能(u+s): 任何用户运行此程序,都可继承 ‘ 此程序的所有者 ’ 的权限

#若给nano设置 s 权限,则nano可修改任意文件,因为nano的所有者为root,任意用户运行都相当于root
[root@CentOS8 ~]# ll /bin/nano
-rwxr-xr-x. 1 root root 260848 May 11  2019 /bin/nano(绿色,表示可执行)
[root@CentOS8 ~]# chmod u+s /bin/nano
[root@CentOS8 ~]# ll /bin/nano
-rwsr-xr-x. 1 root root 260848 May 11  2019 /bin/nano(红色,表示危险权限)
[root@CentOS8 ~]# chmod u-s /bin/nano  # u-s取消

执行程序的基本原则:
任何一个可执行程序文件能不能启动为进程,取决于 发起者对程序文件是否拥有执行权限
即:程序能否执行,与程序文件本身无关,与谁来运行相关

  • 启动为进程之后,其进程的属主为原程序文件的属主,属组为原程序文件的属组
  • 同时,进程访问文件时的权限,取决于进程的发起者
#普通用户不能访问/etc/shadow文件的原因
[root@CentOS8 data]# su jacklee
[jacklee@CentOS8 data]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[jacklee@CentOS8 data]$ ll /etc/shadow
----------. 1 root root 1423 Jul  7 18:13 /etc/shadow  #没有给出任何权限
[root@CentOS8 ~]# ll /bin/cat
-rwxr-xr-x. 1 root root 51856 May 12  2019 /bin/cat   #而cat程序本身权限无问题

4.4.2 特殊权限SGID—继承grp

即可对文件设置,也可对目录设置

  • 对二进制文件:(g+s)表示任何人运行此程序,都可继承 ‘ 此程序的所属组 ’ 的权限
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
  • 与SUID不同,目录上的SGID权限功能(使新建文件属组继承为dir的属组):
    默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户 在此目录中创建的文件 所属的组 都为此目录的属组(而不是创建者的),通常用于创建一个协作目录
chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...

4.4.3 特殊权限 Sticky —防止删除

sticky 设置在文件上无意义,只针对目录设置

在目录设置Sticky 位(o+t),只有文件的所有者 或root可以删除该文件

而一般情况下,具有写权限的目录,普通用户可以任意删除文件

chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...

4.4.4 特殊权限数字法

根据三者对应的作用位置,恰好也可分为4.2.1,并独立计算放在第一位

[root@CentOS8 data]# ll abc1.log 
-rw-r--r-- 1 root root 0 Jul  8 19:33 abc1.log
[root@CentOS8 data]# chmod 4644 abc1.log      #第一位4表示u+s
[root@CentOS8 data]# ll abc1.log 
-rwSr--r-- 1 root root 0 Jul  8 19:33 abc1.log
[root@CentOS8 data]# chmod 2644 abc1.log      #第一位2表示g+s
[root@CentOS8 data]# ll abc1.log 
-rw-r-Sr-- 1 root root 0 Jul  8 19:33 abc1.log
[root@CentOS8 data]# chmod 1644 abc1.log      #第一位1表示o+t 
[root@CentOS8 data]# ll abc1.log 
-rw-r--r-T 1 root root 0 Jul  8 19:33 abc1.log
[root@CentOS8 data]# chmod 7644 abc1.log      #第一位7表示全部加上 
[root@CentOS8 data]# ll abc1.log 
-rwSr-Sr-T 1 root root 0 Jul  8 19:33 abc1.log
###此处全部是大写ST,因为源文件本身没有执行权限x,若有则为小写

#取消特殊权限,输入三位数即可:
[root@CentOS8 data]# chmod 555 abc1.log 
[root@CentOS8 data]# ll abc1.log 
-r-xr-xr-x 1 root root 0 Jul  8 19:33 abc1.log

4.5 设定文件特殊属性约束root

可以防止 root 用户误操作删除或修改文件

若发现某文件或目录 除了查看 无法进行任何操作,使用lsattr查看是否设置了特殊属性!!!
也有可能是此目录下存在某个文件被设置了attr属性

  • 设置为不能编辑内容、删除、改名
    若对目录设置,目录下的文件是可以被编辑的,但不能删除

    chattr +i  file或dir
    
  • 设置为只能追加内容,不能删除、改名

    chattr +a  file或dir
    
  • 显示已经设置的特定属性

    lsattr   file或dir
    [root@centos8/data]# chattr +a f2.txt 
    [root@centos8/data]# ll
    total 8
    drw-r--r--. 2 root root    17 Aug  2 20:32 dir
    -rw-r--r--. 1 jack admins 709 Aug  2 19:52 f1.txt  #普通权限界面看不到
    -rwxr-xr-x. 1 jack root    23 Aug  2 19:53 f2.txt
    [root@centos8/data]# lsattr 
    ------------------ ./f1.txt
    -----a------------ ./f2.txt   #必须使用命令lasttr查看
    ------------------ ./dir
    

4.6 访问控制列表

4.6.1 ACL权限功能

ACL:Access Control List,实现灵活的权限管理

作用:除了文件的所有者,所属组和其它人,可以对更多的用户设置权限(第四类用户)

要点:

  • 文件一旦设置了ACL权限,中间3位表示mask权限,而不是group!!!
  • ACL权限的生效顺序优先于other

CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加

tune2fs –o acl /dev/sda2   
#查看结果中的Default mount options ,若有acl表示ext4文件系统支持此功能

4.6.2 ACL相关命令

  • setfacl 可以设置ACL权限(作用:指定某个特定的用户对文件的权限
    设置成功之后,权限末尾有 + 号(表示第四种用户)
  • getfacl 可查看设置的ACL权限
setfacl -m u:jacklee:MODE FILE   #添加权限:设置用户jacklee对文件FILE的权限为MODE
setfacl -m g:admins:MODE FILE    #添加权限:设置admins组对文件FILE的权限为MODE

setfacl -x u:jacklee FILE        #删除权限:删除用户jacklee对文件FILE的特殊权限
setfacl -b FILE                  #清除 对文件FILE设置的所有ACL权限

setfacl --set 把原有的ACL权限全部删除,用新的覆盖,'但是必须连同ugo的权限一起指定
如:setfacl --set u::rw,g::r,o::-,u:jacklee:rw file
getfacl FILE  #查看文件对 所有用户类型 的权限
getfacl file1 | setfacl --set-file=-  file2    #复制file1的acl权限给file2
[root@CentOS8 data]# setfacl -m u:jacklee:x abc2.log
[root@CentOS8 data]# ll abc2.log 
-rw-r-xr--+ 1 root root 0 Jul  8 19:33 abc2.log   #设置成功之后,权限末尾有+号

[root@CentOS8 data]# setfacl -m u:jacklee:x abc2.log
[root@CentOS8 data]# getfacl abc2.log 
# file: abc2.log
# owner: root
# group: root
user::rw-
user:jacklee:--x        #权限添加成功
group::r--
mask::r-x         #同时ll中间三位权限表示mask!!而不是group!!!
other::r--

[root@CentOS8 data]# setfacl -b abc2.log 
[root@CentOS8 data]# ll abc2.log 
-rw-r--r-- 1 root root 0 Jul  8 19:33 abc2.log   #+号消失
[root@CentOS8 data]# getfacl abc2.log   
# file: abc2.log
# owner: root
# group: root
user::rw-
group::r--
other::r--       #正常三种用户的权限

mask 权限(限高杆)

  • mask只影响除所有者和other之外的人和组的最大权限
  • mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
  • 用户或组的设置必须在mask权限设定范围内才会生效(逻辑与运算,取权限较小值)
setfacl -m mask::MODE file   #设置mask权限

文件权限生效优先级顺序:

所有者 >> 自定义用户 >> 所属组 | 自定义组 >> other

mask权限 最多针对中间三者进行限制!!!


4.6.3 备份和还原ACL

主要的文件操作命令cp和mv都支持ACL,cp命令加上 -p 选项即可复制权限信息

但是tar等常见的备份工具不会保留目录和文件的ACL信息
为了防止权限丢失,应使用ACL备份功能

#备份ACL
getfacl -R /tmp/dir > acl.txt #保存设置过的ACL权限信息

#还原ACL
setfacl --restore acl.txt  (正常还原)

#将每一个文件的ACL权限 递归还原到所有文件!!!
setfacl -R --set-file=acl.txt  /tem/dir

你可能感兴趣的:(用户、组、文件权限)