首页 > 技术文章 > 5.用户和权限管理

bestvae 2020-12-21 23:41 原文

1.系统中用户

1.1 用户

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

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

1.2用户组

用户组是通过Group ID(GID) 来唯一标识的。

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

1.3 用户和组的关系

用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建 和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组

用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组

2.用户和组的配置文件

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

  • /etc/passwd
  • /etc/shadow
  • /etc/group
  • /etc/gshadow

2.2 passwd文件格式

[root@Centos7 data]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

从左至右依次表示用户名、密码、UID、GID、用户全名或信息、用户主目录、用户默认使用shell

2.3 shadow文件格式

[root@Centos7 data]# cat /etc/shadow
user:$6$h1C.cePewZU.s9pw$Nxq5eAgSWeAJ5POU55DBI.awbioC4I12Y1zj9IJpZ2EY4SttRQakRxgN.GUz8wH6BYZbtc9AOT98WtOqW1Z43/::0:99999:7:::

从左至右依次表示

用户名

用户密码:一般用sha512加密

从1970年1月1日起到密码最近一次被更改的时间

密码再过几天可以被变更(0表示随时可被变更)

密码再过几天必须被变更(99999表示永不过期)

密码过期前几天系统提醒用户(默认为一周)

密码过期几天后帐号会被锁定

从1970年1月1日算起,多少天后帐号失效

范例

#使用tr命令配合/dev/urandom生成随机密码
[root@Centos7 ~]# tr -dc [:alnum:] < /dev/urandom | head -c 9
HSSb6TIwv
[root@Centos7 ~]# openssl rand -base64 9
VrRy07H0KQK4

2.4 group文件格式

[root@Centos7 ~]# cat /etc/group
root:x:0:
bin:x:1:

群组名称:就是群组名称

群组密码:通常不需要设定,密码是被记录在 /etc/gshadow

GID:就是群组的 ID

以当前组为附加组的用户列表(分隔符为逗号)

2.5 gshdow文件格式

[root@Centos7 ~]# cat /etc/gshadow
root:::

群组名称:就是群的名称

群组密码:

组管理员列表:组管理员的列表,更改组密码和成员

以当前组为附加组的用户列表:多个用户间用逗号分隔

3 用户和组管理命令

3.1 useradd

useradd:创建或更改用户信息

useradd [options] LOGIN

常用选项

  • -r 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
  • -s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
  • -c "COMMENT“ 用户的注释信息
  • -u 指定用户的UID
  • -o 配合-u 选项,不检查UID的唯一性
  • -d HOME_DIR 以指定的路径(不存在)为家目录
  • -D display the current default values(显示useradd默认值)

范例

#创建apache系统用户
[root@Centos7 ~]# useradd -r -s /sbin/nologin -d /var/www -c 'apache' apache

useradd 命令默认值设定由/etc/default/useradd定义

[root@Centos7 ~]# 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

#修改默认值
[root@centos8 ~]# useradd -D -s /sbin/nologin
[root@centos8 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/sbin/nologin
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#更多配置可以在帮助中Changing the default values小节查看

用户的配置相关文件

/etc/default/useradd

/etc/skel

/etc/login.defs

批量创建用户修改口令

#批量创建用户
newusers passwd 格式文件  
#批量修改密码
echo username:passwd | chpasswd 

3.2 usermod

usermod:修改用户账户属性

usermod [options] 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: 设定非活动期限,即宽限期

3.3 userdel

userdel:删除用户

userdel [options] LOGIN

常用选项

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

3.4 id

id:查看用户相关的id信息

id [OPTION]... [USER]

常用选项

  • -u: 显示UID
  • -g: 显示GID
  • -G: 显示用户所有所属的组的ID
  • -n: 显示名称而不是数字,需配合ugG使用

3.5 su、getent

getent:getent - get entries from Name Service Switch libraries

getent [option]... database key...

su:命令可以切换用户身份,并且以指定用户的身份执行命令

su [options...] [-] [user [args...]]

常用选项

  • -l --login su -l UserName 相当于 su - UserName
  • -c, --command pass a single command to the shell with -c
  • -s 使用指定的shell类型进行切换

加-和不加-的区别

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

​ su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

​ 注意:su 切换新用户后,使用 exit 退回至旧的用户,而不要再用 su 切换至旧用户,否则会生成很多的 bash子进程,环境可能会混乱。

范例

#/sbin/nologin和/bin/false这两种shell类型都不能登陆
[root@Centos7 ~]# su user
[user@Centos7 root]$ pwd
/root
[user@Centos7 root]$ exit
exit

[root@Centos7 ~]# su - user
Last login: Mon Dec 21 02:49:38 CST 2020 on pts/0
[user@Centos7 ~]$ pwd
/home/user

[user@Centos7 root]$ getent passwd user
user:x:1000:1000:user:/home/user:/bin/bash

3.6 passwd

passwd:设置修改用户密码

passwd  [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warn‐
       days] [-i inactivedays] [-S] [--stdin] [username]

常用选项

  • --stdin:从标准输入接收用户密码,Ubuntu无此选项
  • -e:强制用户下次登录修改密码
  • -d:删除指定用户密码
  • -l:锁定指定用户
  • -u:解锁指定用户

范例

#使用标准输出修改密码
[root@Centos7 ~]# echo 'qwe123' | passwd --stdin user

#限定用户下次登陆必须改密码
[root@Centos7 ~]# passwd -e user
Expiring password for user user.
passwd: Success

3.7 chage

chage:修改密码策略

chage [options] LOGIN

常见选项

  • -d LAST_DAY #更改密码的时间(可以强制用户下次登陆必须改密码)
  • -I --inactive INACTIVE #密码过期后的宽限期
  • -E --expiredate EXPIRE_DATE #用户的有效期

3.8 用户相关的其它命令

chfn :指定个人信息

chfn  [-f  full-name]  [-o office] ,RB [ -p office-phone] [-h home-phone]
       -u] [-v] [username]
       
[root@Centos7 ~]# chfn user
Changing finger information for user.
Name [user]: user
Office []: it
Office Phone []: 10000
Home Phone []: 111111
[root@Centos7 ~]# cat /etc/passwd
user:x:1000:1000:user,it,10000,111111:/home/user:/bin/bash

chsh:指定shell,相当于usermod -s

chsh [-s shell] [-l] [-u] [-v] [username]
[root@centos7 ~]#chsh -s /bin/csh user
[root@Centos7 ~]# chsh -s /bin/sh user
Changing shell for user.
Shell changed.
[root@Centos7 ~]# getent passwd user
user:x:1000:1000:user,it,10000,111111:/home/user:/bin/sh

finger:可看用户个人信息

chsh [username]

3.9 groupadd

groupadd:创建组

groupadd [options] group

常见选项

  • -g 指定GID
  • -r 创建系统组

范例

[root@Centos7 ~]# groupadd -r mysql
[root@Centos7 ~]# getent group mysql
mysql:x:995:

3.10 groupmod

groupmod:修改组属性

groupmod [OPTION]... group

常用选项

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

3.11 groupdel

groupdel:删除组

groupdel [options] GROUP

常见选项

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

3.12 gpasswd

gpasswd:可以更改组密码,也可以修改附加组的成员关系

gpasswd [OPTION] GROUP

常见选项

  • -a user 将user添加至指定组中
  • -d user 从指定附加组中移除用户user
  • -A user1,user2,... 设置有管理权限的用户列表

范例

#添加组成员
[root@Centos7 ~]# gpasswd -a user mysql
Adding user user to group mysql
[root@Centos7 ~]# groups user
user : user user1 mysql
#删除组成员
[root@Centos7 ~]# gpasswd -d user mysql
Removing user user from group mysql

3.13 groupmems

groupmems:管理附加组的成员关系

groupmems [options] [action]

常见选项

  • -g, --group groupname #指定组 (只有root)
  • -a, --add username #指定用户加入组
  • -d, --delete username #从组中删除用户
  • -p, --purge #从组中清除所有成员
  • -l, --list #显示附加组成员列表

4.文件权限管理

4.1 chown

chown:修改文件的属主,也可以修改文件属组

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#--reference=RFILE  参考指定的的属性,来修改  
#-R 递归,此选项不建议使用,非常危险!

范例

[root@Centos7 tmp]# ll
total 0
-rw-rw-r--. 1 user user 0 Dec 21 07:44 user.tx
[root@Centos7 tmp]# chown user2:user2 user.txt 
[root@Centos7 tmp]# ll
total 0
-rw-rw-r--. 1 user2 user2 0 Dec 21 07:44 user.tx

4.2 chgrp

chgrp:修改文件属组

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

范例

[root@centos8 data]# ll
total 0
-rw-rw-r-- 1 user user 0 Dec 21 11:43 user.txt
[root@centos8 data]# chgrp user1 user.txt 
[root@centos8 data]# ll
total 0
-rw-rw-r-- 1 user user1 0 Dec 21 11:43 user.txt

4.3 文件权限

对文件的权限

r 可使用文件查看类工具,比如:cat,可以获取其内容
w 可修改其内容
x 可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行)

对目录的权限

r 可以使用ls查看此目录中文件列表

w 可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关

x 可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最 小权限

X 只给目录x权限,不给无执行权限的文件x权限

4.4 chmod

chmod:更改文件权限

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
#MODE:who opt permission
#who:u,g,o,a
#opt:+,-,=
#permission:r,w,x

范例

#两种方式修改权限
[root@centos8 data]# chmod o+w user.txt 
[root@centos8 data]# ll
total 0
-rw-rw-rw- 1 user user1 0 Dec 21 11:43 user.txt

[root@centos8 data]# chmod 755 user.txt 
[root@centos8 data]# ll
total 0
-rwxr-xr-x 1 user user1 0 Dec 21 11:43 user.txt

4.5 umask

umask:决定新建文件和文件夹的默认权限

实现方式

  • 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶 数不变
  • 新建目录的默认权限: 777-umask

非特权用户umask默认是 002

root的umask 默认是 022

范例

#查看umask
[root@centos8 data]# umask
0022
#修改umask
[root@centos8 data]#umask 002

#持久保存umask
全局设置: /etc/bashrc
用户设置:~/.bashrc

4.6 SUID、SGID、Sticky

4.6.1 SUID

前提:进程有属主和属组;文件有属主和属组

1.执行者对该程序拥有执行权限

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

  • 启动进程后,其进程属主为源程序文件属主

  • 权限在执行过程中有效

范例

#两种修改方式
chmod u+s FILE...
chmod 6xxx FILE

[root@centos8 test]# chmod 6640 root.txt 
[root@centos8 test]# ll
-rwSr-S--- 1 root root 0 Dec 21 12:26 root.txt

4.6.2 SGID

二进制文件上的SGID权限功能:

  • 启动为进程之后,其进程的属组为原程序文件的属组
  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限

目录上的SGID权限功能:

默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有 写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录

SGID权限设定

#二进制文件设定权限
chmod g+s FILE...
chmod 2xxx FILE
[root@centos8 test]# chmod g+s root.txt 
-rw-r-S--- 1 root root 0 Dec 21 12:26 root.txt
[root@centos8 test]# chmod g-s root.txt 

#目录设定权限
chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...

4.6.3 Sticky

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权 在目录设置Sticky 位,只有文件的所有者或root可以删除该文件

sticky 设置在文件上无意义

范例

#权限设定
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
[root@centos8 ~]#ll -d /tmp
drwxrwxrwt. 15 root root 4096 Dec 12 20:16 /tmp

4.7 chattr

chattr:设置文件的特殊属性,可以访问 root 用户误操作删除或修改文件

不能删除,改名,更改

chattr +i 

只能追加内容,不能删除,改名

chattr +a

显示特定属性

lsattr 

4.8 ACL

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

setfacl 可以设置ACL权限
getfacl 可查看设置的ACL权限

范例

[root@centos8 test]# setfacl -m u:user:rw root.txt 
[root@centos8 test]# getfacl root.txt 
# file: root.txt
# owner: root
# group: root
user::rw-
user:user:rw-
group::r--
mask::rw-
other::---
#清楚所有ACL权限
[root@centos8 test]# setfacl -b root.txt
#复制file1的acl权限给file2
getfacl file1 | setfacl --set-file=-   file2  

5 练习

5.1 用户组练习

#创建组distro,其GID为2019
[root@centos8 test]# groupadd -g 2019 distro
[root@centos8 test]# getent group distro
distro:x:2019:

#创建用户mandriva,其ID号为1005,基本组为distro
[root@centos8 test]# useradd -u 1005 -g distro mandriva
[root@centos8 test]# getent passwd mandriva 
mandriva:x:1005:2019::/home/mandriva:/sbin/nologin

#创建用户mageia,其ID号为1100,家目录为/home/linux
[root@centos8 test]# useradd -u 1100 -d /home/linux mageia 
[root@centos8 test]# ls /home/
git  linux  mandriva  user  user1

#给用户mageia添加密码,密码为mageedu,并设置密码7天后过期
[root@centos8 test]# echo mageedu | passwd --stdin mageia
[root@centos8 test]# chage -M 7 mageia

#删除mandriva,但保留其家目录
[root@centos8 test]# userdel mandriva

#创建用户slackware,其ID号为2002,其基本组为distro,附加组peguin
[root@centos8 test]# groupadd peguin
[root@centos8 test]# useradd -u 2002 -g distro -G peguin slackware 
[root@centos8 test]# getent passwd slackware 
slackware:x:2002:2019::/home/slackware:/sbin/nologin

#修改slackware默认shell为/bin/sh
[root@centos8 ~]# chsh -s /bin/sh slackware 
Changing shell for slackware.
Shell changed.
[root@centos8 ~]# getent passwd slackware 
slackware:x:2002:2019::/home/slackware:/bin/sh

#为用户slackware新增附加组admins,并设置不可登陆
[root@centos8 ~]# groupmems -a slackware -g admins 
[root@centos8 ~]# groups slackware 
slackware : distro peguin admins

5.2 权限练习

#创建用户user1、user2、user3,在/data下创建目录test
[root@centos8 ~]# cat ls.txt 
user2:x:::::/bin/bash
user3:x:::::/bin/bash
[root@centos8 ~]# newusers ls.txt
[root@centos8 ~]# cat /etc/passwd
user1:x:1002:1002::/home/user1:/sbin/nologin
user2:x:2003:2003:::/bin/bash
user3:x:2004:2004:::/bin/bash

#目录/data/test属主、属组为user1
[root@centos8 data]# chown user1:user1 /data/test/

#在目录属主、属组不变的情况下,user2对文件user.txt有读写权限
[root@centos8 data]# setfacl -m u:user2:rw user.txt 
[root@centos8 data]# getfacl user.txt 
# file: user.txt
# owner: user
# group: user1
user::rw-
user:user2:rw-
group::---
mask::rw-
other::---

#user1在/data/test目录下创建文件a1.sh,a2.sh,a3.sh,设置所有用户都不可删除1.sh,2.sh文件,除了user1及root以外,所有用户都不可删除a3.sh
[root@centos8 test]# chattr +i a1.sh a2.sh
[root@centos8 test]# rm -rf a1.sh 
rm: cannot remove 'a1.sh': Operation not permitted
[root@centos8 test]# chmod 600 a3.sh 

#user3增加附加组user1,同时要求user1不能访问/data/test
[user1@centos8 test]$ groupmems -a user3 -g user1
[user1@centos8 data]$ chmod 700 test

#清理/data/test目录下所有文件的acl权限
[user1@centos8 data]$ setfacl -Rb test/

推荐阅读