一、linux下用户和组管理

1.1、何为linux下用户

在谈论用户之前,我们简单的来说明一下单用户单任务操作系统以及多用户多任务操作系统
简单而言,单用户单任务就是可以登录操作系统的用户一次只能是一个,而且一次只能执行一个任务;多用户多任务操作系统就是一次登录用户可以有多个且同时也能执行多个任务。在计算机的发展历程中,操作系统软件是一个比较重要的概念,其中批处理的提出与实现,后来单核cpu的时间分片技术的提出与实现等等一切都与这个多任务有关系。在早些年间,计算机资源还是那么的昂贵,如果给每个工作任务的人都配备一台计算机的话,无疑是不可估量的成本,于是乎人们会把一台计算机资源给多个人使用,多个扮演着不同角色的人可能就使用同一台计算机资源,而linux下的用户就代表着他们的一种身份,是一个标识,同时对底层使一个抽象的认证,其对应到对应的与计算机操作系统的第三方登录应用程序。
 

1.2、何为linux下用户组

上面我们已经讲过,一台计算机资源可能面对着不同的工作者。有时候为了分工明细,把一类具有统一工作性质或者有着同样工种的人的账户划分为一个组,就像今天现实生活中的大部分的概念一样,比如你进入某个大学的某个系,某个系的某个专业的某个班级等等,这些划分都可以算一个分类,分组或者叫分层的概念。(理解未必准确或者专业,为了方便理解,自己可以抽象出概念)。

 

1.3、linux下用户分类和用户组分类

有了用户和组的基本概念之后,我们再来看看用户和组的分类划分以及相关标准。如今的linux操作系统可以算是"多用户多任务"的操作系统。一次操作系统支持多个用户的认证与登录,可以同时处理多个任务,互不干挠。
 
linux下的每个用户都有一个名字,对应系统上有一个id,以及对应的密码(我们暂且把空密码也算一种密码)),用来验证,认证。而每个组也有对应的名字和id,组算是一个容器,每个用户可以至少加入一个组等等。如果按照如今操作系统对用户的划分以及组的划分,我们可以把用户划分为两大类:一类是管理员用户,一类是普通用户,而普通用户又可以划分为系统用户以及登录用户。而组也同样可以抽象划分成两大类:一类是管理员组,一类是普通用户组,而普通用户组又可以划分为系统组以及登录组。用来表示用户的id叫做UID(user identifier),用来表示组的id叫GID(group identifier)。
 
有了UID和GID的概念后,我们来看看Unix早期的设计逻辑。Unix系统的正常运作需要使用大量的与系统有关的数据库文件,例如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁使用的两个文件。用户每次登陆Unix系统,以及每次执行ls -l命令都要使用口令文件。
由于历史原因,这些数据库文件都是ASCII文本文件,并且使用标准I/O库读这些文件。而上面提到的用户的口令文件/etc/passwd,以及组的组文件/etc/group,我们可以简单抽象出一个名称解析的概念。我们每个用户都有一个名字,对应系统上有一个UID,每个组都有一个名字对应系统上有一个GID。而从名字到ID的映射关系,对应就需要一种机制来完成,即我们这里说到的文本数据库,用户对应的名称解析库为/etc/passwd,而组的名称解析库为/etc/group。每个用户都有一个基本组,可以属于多个组,就像现实生活中,你是你爸的儿子,你的×××全国是唯一的,可以标识你是中国的一名公民,你属于中国人民这个组,这也是你的基本组。来到大学后,你加入了计算机专业,现在你也属于计算机专业这个体系,也算一个组等等还有其他的。可以大致这样认为。每个用户至少有一个组,唯一的组叫基本组,而有加入的其他组叫附加组。如果一个组只有一个用户,这种组,我们叫它为私有组,反之,如果一个组拥有多个用户,我们叫它为公共组。具体对应关系请参考下面的几个表格:

条目id

用户分类

UID值以及范围

1

管理员用户

0

2

普通用户

1~65535

条目id

普通用户分类

UID值或范围,CentOS 6系列为例

UID值或范围,CentOS 7系列为例

1

系统用户

1~499

1~999

2

登录用户

500~60000

1000~60000

 

条目id

组分类

GID值或范围

1

管理员组

0

2

普通用户组

1~65535

条目id

普通用户组分类

GID值或范围,CentOS 6系列为例

GID值或范围,CentOS 7系列为例

1

系统用户组

1~499

1~999

2

登录用户组

500~60000

1000~60000

 
在我们正式介绍用户配置文件之前,我们来简单划分一下加密算法的分类:

条目id

加密算法

说明

附加

1

对称加密

加密与解密使用同一个密码

-

2

非对称加密

加密与解密使用一对秘钥

密钥对儿:公钥(public key),私钥(private key)

3

单向加密

只能加密,不能加密。提取数据特征码

加密定长输出,满足雪崩效应

 

条目id

单向加密算法

常见的名字及特点

1

md5(message digest)

md5,128bits

2

sha(secure hash algorithm)

160bits,sha224(224bits),sha256,sha384,sha512

 

1.4、配置文件说明
  • 用户信息库文件(/etc/passwd)
    简单来看看格式:
[root@localhost ~]# cat /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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
......
用户的信息配置文件大体格式如下:
name:password:UID:GID:GECOS:directory:shell
一共是以冒号(:)隔开的7列,具体含义是:
name:用户的登录用户名;
password:可以是加密的密码,也可以是占位符"*"或者"x";
UID:用户标识id号;
GID:用户的基本组(主组)id号;
GECOS:关于用户的注释信息;
directory:用户的家目录;
shell:用户登录shell的名字
  • 用户密码影子文件(/etc/shadow)
    简单来看看格式:
[root@localhost ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
......
用户密码影子文件字段也是以符号":"隔开的,严格来说有9段,通常我们见到的可能只有几段
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

用户名:加密的密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告期段:密码不活动期限:过期期限:保留字段
  • 关于linux下用户的生命周期的几个时间段如下图所示

centos7 系统建立三权分立用户_centos7 系统建立三权分立用户

 

  • 组信息库文件(/etc/group)
    简单来看看格式:
[root@localhost ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
...
group name:password:GID:user_list
组名:密码:组id:组内用户列表
group name: 表示组名字;
password:密码占位符"x";
GID:组id;
user_list:以逗号隔开的属于该组的用户列表;
  • 组密码影子文件(/etc/gshadow)
    简单来看看格式:
[root@localhost ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
tape:::
video:::
ftp:::
lock:::
audio:::
nobody:::
users:::
utmp:!::
utempter:!::
input:!::
......
group name:encrypted passwd:administrators:members
group name:组名;
encrypted passwd:组认证密码,如果为空或者"!"表示组没有设置密码;
administrators:组内管理者,如果有多个组是管理,用逗号分隔;
members:组内成员,多个用逗号分隔;
1.5、案例分析,示例环节

常用的命令有:

useradd(adduser):新增用户或者更新已有用户的属性的命令;
语法结构:
useradd [options] USERNAME #创建用户
useradd -D  #显示创建用户默认配置
useradd -D [options]  #修改用户默认选项配置
主要选项:
-u, --uid UID:指定UID;
-g, --gid GROUP:指定基本组ID,此组得事先存在;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个组之间用逗号分隔;
-c, --comment COMMENT:指明注释信息;
-d, --home HOME_DIR:以指定的路径为用户的家目录;通过复制/etc/skel此目录并重命名实现;
指定的家目录路径。如果事先存在,则不会为用户复制环境配置文件;
-s, --shell SHELL:指定用户的默认shell,可用的所有shell列表存储在/etc/shells文件中;
-r, --system:创建系统用户;

userdel:删除一个用户和用户相关联的文件的命令;
语法结构:
userdel [options] USERNAME #删除用户
常用选项:
-r, --remove:删除用户时候一并删除创建用户时相关联的几个目录(家目录,邮件目录等);

usermod:修改用户的属性的命令;
语法结构:
usermod [options] USERNAME #修改用户属性
常用选项:
-u, --uid UID:修改用户的ID为此处指定的新UID;
-g, --gid GROUP:修改用户所属的基本组;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组;原来的附加组会被覆盖;
-a, --append:与-G一同使用,用于为用户追加新的附加组;
-c, --comment COMMENT:修改注释信息;
-d, --home HOME_DIR:修改用户的家目录;用户原有的文件不会被转移至新位置;
-m, --move-home:只能与-d选项一同使用,用于将原来的家目录移动为新的家目录;
-l, --login NEW_LOGIN:修改用户名;
-s, --shell SHELL:修改用户的默认shell;
-L, --lock:锁定用户密码;即在用户原来的密码字符串之前添加一个"!";
-U, --unlock:解锁用户的密码;

passwd:更新用户认证信息的命令;
语法结构:
passwd  [-k]  [-l]  [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
简化后常用结构:
passwd  #不指定用户名表示修改当前登录用户自己的密码;
passwd USERNAME #修改指定用户的密码,仅管理员用户修改其他用户密码

常用选项:
-l, -u:锁定和解锁用户;
-d:清除用户密码串;
-e DATE: 过期期限,日期;
-i DAYS:非活动期限;
-n DAYS:密码的最短使用期限;
-x DAYS:密码的最长使用期限;
-w DAYS:警告期限;
--stdin:非交互式默认修改密码,一般常用语脚本中
    echo "PASSWORD" | passwd --stdin USERNAME

groupadd:新建组命令;
语法结构:
groupadd [options] GROUP_NAME #新建组
常用选项:
-g GID:指定GID;默认是上一个组的GID+1;
-r: 创建系统组;

groupdel:删除组命令;
语法结构:
groupdel [options] GROUP_NAME
常用选项:
无,直接groupdel加组名就是常见的操作。

groupmod:修改系统定义的组属性信息的命令;
语法结构:
groupmod [options] GROUP_NAME
常见选项:
-g GID:修改GID;
-n new_name:修改组名;

gpasswd:管理组的命令;
语法结构:
gpasswd [option] group_name
常用选项:
-a USERNAME:向组中添加用户
-d USERNAME:从组中移除用户

newgrp:临时切换到一个组
语法结构:
newgrp [-] [group]
常用选项:
无,特别说明切换时加上符号"-"的含义:
-: 会模拟用户重新登录以实现重新初始化其工作环境

pwconv:creates shadow from passwd and an optionally existing shadow.
启用/etc/passwd到/etc/shadow的投影,开启用户密码映射到/etc/shadow;
特点:启用后,/etc/passwd文件的第二列(前边介绍过,以冒号分隔),有一个密码占位符,加密后的密码串
存放于用户信息库的影子文件/etc/shadow对应行的第二列。(安全)

pwunconv:creates passwd from passwd and shadow and then removes shadow.
关闭/etc/passwd到/etc/shadow的投影,关闭用户密码映射到/etc/shadow;
特点:关闭后,/etc/passwd文件的第二列将会直接存储用户密码加密后的连接串(不安全),/etc/shadow文件
被临删除。/etc/passwd配置文件除了管理员之外,其他用户也可读,所以相对来说不安全;

grpconv:creates gshadow from group and an optionally existing gshadow
启用/etc/group到/etc/gshadow的投影,开启组密码映射到/etc/gshadow;
特点:启用后,/etc/group文件的第二列,有个密码占位符,用户组加密后的密码串存放于组信息库
的影子文件/etc/gshadow对应行的第二列(安全);

grpunconv:creates group from group and gshadow and then removes gshadow.
关闭/etc/group到/etc/gshadow的投影,关闭组密码映射到/etc/gshadow;
特点:关闭后,/etc/group文件的第二列,会直接显示加密后组的密码连接串(不安全),/etc/gshadow文件
被临时删除。/etc/group配置文件除了管理员之外,其他用户也可以读,所以相对来说不安全;

###以上四个命令(pwconv,pwunconv,grpconv,grpunconv),与用户信息文件与密码影子文件映射关系的,直接操作:
COMMAND 

finger:用户信息查找的命令;
语法结构:
finger [-lmsp] [user ...] [user@host ...]
常用选项:
无,命令本身用的比较少,如果要用可以自行查阅手册。一般是直接执行命令本身或命令加上一个或多个
用户(空白字符分隔多个用户)

chage:修改用户密码过期信息的命令;
语法结构:
chage [options] USERNAME
常用选项:
-d, --lastday LAST_DAY:设置用户最进一次修改密码的时刻;上一次更改用户密码的日期。
-E, --expiredate EXPIRE_DATE:设置用户密码过期时刻的日期;帐号到期的日期。过了这天,此帐号将被锁定;
-W, --warndays WARN_DAYS:设置用户密码告警时间段的天数;用户密码到期前,提前收到警告信息的天数;
-m, --mindays MIN_DAYS:设置用户密码最短使用的天数;密码可更改的最小天数。为零时代表任何时候都
可以更改密码;
-M, --maxdays MAX_DAYS:设置用户密码最长使用的天数;密码保持有效的最大天数。快到密码过期时刻区间,
会在这个最长密码使用天数的时间段内;

chsh:修改用户登录shell的命令;
语法结构:
chsh [-s shell] [-l] [-u] [-v] [username]

常用选项:
-s, --shell shell :修改用户登录shell;
-l, --list-shells:当用当前系统可用的shell,/etc/shells这个配置文件里面的内容列表;

id:打印用户真实的有效的用户id和组id的命令;
语法结构:
id [OPTION]... [USERNAME]

一个用户可以属于多个组,每一个用户都有一个UID;
每个组都有一个GID;
一个GID对应多个UID;

常用选项:
-g, --group:显示用户所属群组(主要组)的ID;
-G, --groups:显示用户所属附加群组(附加组)的ID;
-n, --name:显示用户,所属群组或附加群组的名称。一定要和-u,-g,-G选项可以一起使用;
-r, --real:打印真实的id而非有效的id,一定要与-ugG一起用;
-u, --user:打印有效的用户id;

su:切换用户运行命令的一个工具;(可以切换到其他用户运行命令)
语法结构:
su [options...] [-] [user [args...]]

常用选项:
登录式切换:会通过读取目标用户的配置文件来重新初始化
    su - USERNAME
    su -l USERNAME
非登录式切换:不会读取目标用户的配置文件进行初始化
    su USERNAME
注意:管理员可无密码切换至其它任何用户;(受到PAM机制的控制,默认机制如此)
-c 'COMMAND':仅以指定用户的身份运行此处指定的命令;

========================================================================
chmod:改变文件权限位的命令;
语法结构:
chmod [OPTION]... MODE[,MODE]... FILE...  #指定修改修改方式
chmod [OPTION]... OCTAL-MODE FILE...   #指定八进制权限修改方式
chmod [OPTION]... --reference=RFILE FILE...  #参照引用修改权限方式

说明:
三类用户:
        u:属主
        g:属组
        o:其它
        a: 所有
选项:
    -R, --recursive:递归修改        

第一种形式:
MODE表示法:
    赋权表示法:直接操作一类用户的所有权限位rwx;
        u=
        g=
        o=
        a=

    授权表示法:直接操作一类用户的一个权限位r,w,x;
        u+, u-
        g+, g-
        o+, o-
        a+, a-

第二种形式:
COTAL-MODE为八进制权限,例如660,775,600,400等;

第三种形式:
注意:用户仅能修改属主为自己的那些文件的权限
========================================================================

chown:改变文件从属关系(用户属主和用户属组)的命令;
语法结构:
chown [OPTION]... [OWNER][[:|.][GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

常用选项:
-R:递归修改;

chgrp:改变组从属关系(用户属组)的命令;
语法结构:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

常用选项:
一般不会用这个命令。
注意:仅管理员可修改文件的属主和属组

umask:显示或设置文件权限模型掩码的命令;
常用选项:
-p:输出的权限掩码可直接作为指令来执行;
-S:以符号方式输出权限掩码。

说明:
文件:
    666-umask
目录:
    777-umask

注意:之所以文件用666去减,表示文件默认不能拥有执行权限;
如果减得的结果中有执行权限,则需要将其加1;

    umask: 023
        666-023=644
        777-023=754

umask命令:
    umask:查看当前umask
    umask MASK: 设置umask

install:复制文件并设置属性的命令;
语法结构:
install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...
几种形式,和cp,mv差不多,有多源,和单源复制;

常用选项:
-m, --mode=MODE:设定目标文件权限,默认为755;
-o, --owner=OWNER:设定目标文件属主;
-g, --group=GROUP:设定目标文件属组;

mktemp:创建临时文件或临时目录的命令;
语法结构:
mktemp [OPTION]... [TEMPLATE]

常用选项:
-d:创建临时目录
-u, --dry-run:模拟跑一遍,不实际执行;(干跑一遍)
--suffix=SUFF:在创建临时文件的后缀标志控制的后面再加上我们指定的后缀;
-p DIR, --tmpdir[=DIR]:指定创建临时文件的目录,默认是/tmp目录;

注意:mktemp会将创建的临时文件名直接返回,因此,可直接通过命令引用保存起来
说明:
安全的创建一个临时文件或临时目录,并打印创建的文件或目录的名字;
TEMPLATE控制标志至少包含3个连续的符号'X'.默认省略这个标志表示
采取这种形式:tmp.XXXXXXXXXX

# 案例一(新建用户类)

新建一个用户centos,属性都采用默认值;
[root@localhost ~]# useradd centos
[root@localhost ~]# id centos
uid=1002(centos) gid=1002(centos) groups=1002(centos)
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# grep --color=auto 'centos' /etc/passwd /etc/group /etc/shadow /etc/gshadow
/etc/passwd:centos:x:1002:1002::/home/centos:/bin/bash
/etc/group:centos:x:1002:
/etc/shadow:centos:!!:17783:0:99999:7:::
/etc/gshadow:centos:!::
说明:我拿我本地的centos 7系列的系统,创建流一个centos用户,然后用id工具查看流该用户的id相关的
属性。然后利用grep过滤工具过滤了4个配置文件里面对应存储的信息。(/etc/passwd,/etc/shadow,/etc/group,
/etc/gshadow)。
有个系统配置文件定了默认用户的属性信息,这个配置文件是/etc/login.defs
[root@localhost ~]# ls -l /etc/login.defs 
-rw-r--r--. 1 root root 2028 Nov  5  2016 /etc/login.defs
man手册信息摘要指出该配置文件:shadow password suite configuration,含义是密码影子配置文件的
默认配置。简单来说,默认如果我们使用工具useradd来创建用户,而用户本身有许多属性信息(比如用户
的家目录,用户id,用户组,登录shell等等),这些属性信息默认如果不用参数显式的指明,我们的工具
就会套用默认配置文件配置。由于这个模板配置文件的内容较多:
[root@localhost ~]# wc -l /etc/login.defs 
72 /etc/login.defs
我们这里就简单的列出其中几处进行说明。
/etc/login.defs部分节选内容:
......
#QMAIL_DIR      Maildir
MAIL_DIR        /var/spool/mail   #指明定义用户邮件目录,该目录下会默认创建一个同用户名的配置文件
#MAIL_FILE      .mail
......
# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999   #最大的密码使用天数,数字99999几乎算是永不过期;
PASS_MIN_DAYS   0            #最小的密码使用天数,0表示随时可以更改密码,如果指定一个
天数,每一次修改一次密码,最少密码要使用这么一段时间才能继续修改用户密码。
PASS_MIN_LEN    5             #密码最少接受的长度
PASS_WARN_AGE   7         #密码过期前的警告时间天数,这个警告时间段内,用户登录一次,
会提示密码快过期了。这个时间段,即使你不修改密码,还是照样可以登录。如果过了这个时间
段,接下来是密码过期截止时间段,有一个缓存区间,在账户被锁定前,这个区间,你要修改密码
才能登录,实际密码算是已经过期了。如果你继续不该密码,过了这个时间段,你的账户就被锁定了;
......
# Min/max values for automatic uid selection in useradd
#
UID_MIN                  1000
UID_MAX                 60000
# System accounts
SYS_UID_MIN               201
SYS_UID_MAX               999

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                  1000
GID_MAX                 60000
# System accounts
SYS_GID_MIN               201
SYS_GID_MAX               999

上面这两部分指定的是登录用户和系统用户,以及登录用户组合系统用户组的ID范围;
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME     yes   #默认表示要创建用户家目录

# The permission mask is initialized to this value. If not specified, 
# the permission mask will be initialized to 022.
UMASK           077    #系统上默认创建文件时的掩码值;

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes  #使用userdel删除用户的时候,如果对应用户组没有其他成员默认要删除对应的组;

# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512    #加密密码使用的单项加密算法是用的sha512

# 案例二(新建用户组类)

创建一个用户组叫gerror,并把我们之前创建的用户centos加入到这个组(我们的centos有一个主组
默认是centos,让gerror这个新建组属于centos的附加组)。
[root@localhost ~]# groupadd gerror #创建gerror这个组
[root@localhost ~]# grep --color=auto 'gerror' /etc/group /etc/gshadow  #看看与组相关的配置文件里面
是否包含gerror
/etc/group:gerror:x:1003:
/etc/gshadow:gerror:!::
[root@localhost ~]# id centos   #把centos加入gerror组之前查看其归属id信息
uid=1002(centos) gid=1002(centos) groups=1002(centos)
[root@localhost ~]# usermod -G gerror centos #利用usermod修改用户属性,给centos添加一个附加组gerror
[root@localhost ~]# id centos #添加附加组之后,看看centos用户的id后边的变化,多了一个GID为1003的gerror组
uid=1002(centos) gid=1002(centos) groups=1002(centos),1003(gerror)
[root@localhost ~]# grep --color=always 'centos' /etc/passwd /etc/shadow /etc/group /etc/gshadow
/etc/passwd:centos:x:1002:1002::/home/centos:/bin/bash
/etc/shadow:centos:!!:17783:0:99999:7:::
/etc/group:centos:x:1002:
/etc/group:gerror:x:1003:centos
/etc/gshadow:centos:!::
/etc/gshadow:gerror:!::centos
#这里可以看出,我们的组相关的配置文件中gerror的对应用户列表中多了一个centos用户;
[root@localhost ~]# id centos
uid=1002(centos) gid=1002(centos) groups=1002(centos),1003(gerror)
[root@localhost ~]# id -u centos
1002
[root@localhost ~]# id -G centos
1002 1003
[root@localhost ~]# id -Gn centos
centos gerror
[root@localhost ~]# id -un centos
centos

# 案例三(修改用户属性类)

修改用户centos的默认家目录:
先看看我们的centos默认家目录,默认应该是/home/username
[root@localhost ~]# grep 'centos' /etc/passwd
centos:x:1002:1002::/home/centos:/bin/bash
[root@localhost ~]# ls -la /home/centos/ 
total 12
drwx------. 3 centos centos  78 Sep 10 07:10 .
drwxr-xr-x. 5 root   root    47 Sep 10 07:10 ..
-rw-r--r--. 1 centos centos  18 Apr 11 08:53 .bash_logout
-rw-r--r--. 1 centos centos 193 Apr 11 08:53 .bash_profile
-rw-r--r--. 1 centos centos 231 Apr 11 08:53 .bashrc
drwxr-xr-x. 4 centos centos  39 Sep  9 18:38 .mozilla

默认创建用户家目录会有几个隐藏文件,这几个文件,我们之前已经讲过了,在之前的
博文中有简单提及,你就记住,它们是为了让用户更好的运行与系统的配置文件即可。
情况1:指定创建用户家目录路径如果存在;
[root@localhost ~]# touch /home/centos/{a..z}.log
[root@localhost ~]# ls /home/centos/{a..z}.log
/home/centos/a.log  /home/centos/f.log  /home/centos/k.log  /home/centos/p.log  /home/centos/u.log  /home/centos/z.log
/home/centos/b.log  /home/centos/g.log  /home/centos/l.log  /home/centos/q.log  /home/centos/v.log
/home/centos/c.log  /home/centos/h.log  /home/centos/m.log  /home/centos/r.log  /home/centos/w.log
/home/centos/d.log  /home/centos/i.log  /home/centos/n.log  /home/centos/s.log  /home/centos/x.log
/home/centos/e.log  /home/centos/j.log  /home/centos/o.log  /home/centos/t.log  /home/centos/y.log
[root@localhost ~]# usermod -d /var/tmp/new_centos centos
[root@localhost ~]# grep '^centos' /etc/passwd
centos:x:1002:1002::/var/tmp/new_centos:/bin/bash
[root@localhost ~]# ls -a /home/centos/
.   a.log         .bash_profile  b.log  d.log  f.log  h.log  j.log  l.log  .mozilla  o.log  q.log  s.log  u.log  w.log  y.log
..  .bash_logout  .bashrc        c.log  e.log  g.log  i.log  k.log  m.log  n.log     p.log  r.log  t.log  v.log  x.log  z.log
这种情况,我们指定的家目录不存在,修改用户家目录,会把之前家目录的文件都拷贝过来。

情况2:指定创建用户家目录路径如果不存在;
[root@localhost ~]# mkdir /tmp/mytestdir
[root@localhost ~]# usermod -d /tmp/mytestdir centos
[root@localhost ~]# ls -a /tmp/mytestdir/
.  ..
[root@localhost ~]# ls -a /home/centos/
.   a.log         .bash_profile  b.log  d.log  f.log  h.log  j.log  l.log  .mozilla  o.log  q.log  s.log  u.log  w.log  y.log
..  .bash_logout  .bashrc        c.log  e.log  g.log  i.log  k.log  m.log  n.log     p.log  r.log  t.log  v.log  x.log  z.log
[root@localhost ~]# ls -a /var/tmp/new_centos
ls: cannot access /var/tmp/new_centos: No such file or directory
[root@localhost ~]# grep 'centos' /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/bash
这种情况,我们的目录已经存在,这个时候修改用户家目录到一个已经存在的目录,会导致原先家目录的
文件全部丢失,比较危险。创建用户应当在用户创建初期就规划好用户相关的属性信息,即使后期要移动
或者改变,此属于维护,应当对相关文件进行备份后再操作。

修改用户centos的默认登录shell为/sbin/nologin:
[root@localhost tmp]# grep 'centos' /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/bash
[root@localhost tmp]# usermod -s /sbin/nologin centos
[root@localhost tmp]# grep 'centos' /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/sbin/nologin
[root@localhost tmp]# su - centos
This account is currently not available.

[root@localhost tmp]# usermod -s /bin/tcsh centos
[root@localhost tmp]# grep 'centos' /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/tcsh
[root@localhost tmp]# su - centos
Last login: Mon Sep 10 07:58:43 CST 2018 on pts/1
[centos@localhost ~]$ exit
logout

可以看到,当我们把用户的登录shell第一次改为/sbin/nologin后,利用su切换到该用户的时候
直接提示我该用户不可用。这种做法常应用在,我要以普通身份运行某类应用的工作进程
例如(nginx,apache的工作进程等),我创建的用户只是为了让进程启用身份是普通用户,所以
为了安全考虑,创建的用户不需要其登录。

其实我们可以利用chsh来修改我们的登录shell,把它修改成最初默认的/bin/bash
[root@localhost ~]# grep 'centos' /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/tcsh
[root@localhost ~]# chsh -l  #修改前可以利用这个选项列出一下当前可用的shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost ~]# chsh -s /bin/bash centos
Changing shell for centos.
Shell changed.
[root@localhost ~]# grep 'centos' /etc/passwd
centos:x:1002:1002::/tmp/mytestdir:/bin/bash

修改其他属性,举一个例子,修改centos用户密码最大使用期限
[root@localhost ~]# grep 'centos' /etc/shadow
centos:!!:17783:0:99999:7:::
[root@localhost ~]# chage -M 128 centos
[root@localhost ~]# grep 'centos' /etc/shadow
centos:!!:17783:0:128:7:::
可以看到我们的99999变成了128天。

# 案例四(修改组属性类)

[root@localhost ~]# groupadd -g 30000 luoque
[root@localhost ~]# grep 'luoque' /etc/group
luoque:x:30000:
[root@localhost ~]# groupmod -g 2000 luoque
[root@localhost ~]# grep 'luoque' /etc/group
luoque:x:2000:
[root@localhost ~]# groupmod -n jiumeng luoque
[root@localhost ~]# grep -E 'luoque|jiumeng' /etc/group
jiumeng:x:2000:
[root@localhost ~]# grep -E 'luoque|jiumeng' /etc/gshadow
jiumeng:!::
我新建的另一个组罗雀,显式指明创建其id为3000。后面利用groupmod工具修改了它的id成为2000.
其后,我又修改成了另外一个新的名字jiumeng。

# 案例五(修改用户权限类)

我们只是简单的举例子,实际如果要想掌握权限知识点,还是希望大家多看理论并结合实际联系。
工作中,我们经常因为一些特别的原因,要修改某个目录,某个文件,某几个目录里面用户的
从属关系。
[root@localhost ~]# touch /tmp/{1..10}.log
[root@localhost ~]# ls -l /tmp/{1..10}.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/10.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/1.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/2.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/3.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/4.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/5.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/6.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/7.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/8.log
-rw-r--r--. 1 root root 0 Sep 10 08:18 /tmp/9.log

#下面这部分,利用工具chmod,直接指定修改的权限,非八进制权限
[root@localhost ~]# chmod u+x /tmp/1.log
[root@localhost ~]# ls -l /tmp/1.log 
-rwxr--r--. 1 root root 0 Sep 10 08:18 /tmp/1.log
[root@localhost ~]# chmod u-x,u-w /tmp/1.log 
[root@localhost ~]# ls -l /tmp/1.log
-r--r--r--. 1 root root 0 Sep 10 08:18 /tmp/1.log
[root@localhost ~]# chmod 400 /tmp/{1..10}.log
[root@localhost ~]# ls -l /tmp/{1..10}.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/10.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/1.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/2.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/3.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/4.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/5.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/6.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/7.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/8.log
-r--------. 1 root root 0 Sep 10 08:18 /tmp/9.log

[root@localhost ~]# mkdir -pv /tmp/test1/test2 ; touch /tmp/test1/{a..b}.txt ;touch /tmp/test1/test2/{10..13}.log
mkdir: created directory ‘/tmp/test1’
mkdir: created directory ‘/tmp/test1/test2’

[root@localhost ~]# tree /tmp/test1/
/tmp/test1/
├── a.txt
├── b.txt
└── test2
    ├── 10.log
    ├── 11.log
    ├── 12.log
    └── 13.log

1 directory, 6 files

[root@localhost ~]# ls -ld /tmp/test1/
drwxr-xr-x. 3 root root 45 Sep 10 08:21 /tmp/test1/
[root@localhost ~]# ls -l /tmp/test1/
total 0
-rw-r--r--. 1 root root  0 Sep 10 08:21 a.txt
-rw-r--r--. 1 root root  0 Sep 10 08:21 b.txt
drwxr-xr-x. 2 root root 62 Sep 10 08:21 test2
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-rw-r--r--. 1 root root  0 Sep 10 08:21 a.txt
-rw-r--r--. 1 root root  0 Sep 10 08:21 b.txt
drwxr-xr-x. 2 root root 62 Sep 10 08:21 test2

/tmp/test1/test2:
total 0
-rw-r--r--. 1 root root 0 Sep 10 08:21 10.log
-rw-r--r--. 1 root root 0 Sep 10 08:21 11.log
-rw-r--r--. 1 root root 0 Sep 10 08:21 12.log
-rw-r--r--. 1 root root 0 Sep 10 08:21 13.log

#下面这部分,递归修改文件的权限。
[root@localhost ~]# chmod -R 400 /tmp/test1
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-r--------. 1 root root  0 Sep 10 08:21 a.txt
-r--------. 1 root root  0 Sep 10 08:21 b.txt
dr--------. 2 root root 62 Sep 10 08:21 test2

/tmp/test1/test2:
total 0
-r--------. 1 root root 0 Sep 10 08:21 10.log
-r--------. 1 root root 0 Sep 10 08:21 11.log
-r--------. 1 root root 0 Sep 10 08:21 12.log
-r--------. 1 root root 0 Sep 10 08:21 13.log

#下面这部分,修改文件的从属关系,用户属主和属组,递归修改多个文件和目录
[root@localhost ~]# chown -R centos:centos /tmp/test1
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-r--------. 1 centos centos  0 Sep 10 08:21 a.txt
-r--------. 1 centos centos  0 Sep 10 08:21 b.txt
dr--------. 2 centos centos 62 Sep 10 08:21 test2

/tmp/test1/test2:
total 0
-r--------. 1 centos centos 0 Sep 10 08:21 10.log
-r--------. 1 centos centos 0 Sep 10 08:21 11.log
-r--------. 1 centos centos 0 Sep 10 08:21 12.log
-r--------. 1 centos centos 0 Sep 10 08:21 13.log
[root@localhost ~]# 

#下面这一部分,只是修改文件用户属组,多个文件和目录,递归选项-R
[root@localhost ~]# id yanhui
uid=1000(yanhui) gid=1000(yanhui) groups=1000(yanhui),1001(hello)
[root@localhost ~]# chown -R .yanhui /tmp/test1/
[root@localhost ~]# ls -lR /tmp/test1/
/tmp/test1/:
total 0
-r--------. 1 centos yanhui  0 Sep 10 08:21 a.txt
-r--------. 1 centos yanhui  0 Sep 10 08:21 b.txt
dr--------. 2 centos yanhui 62 Sep 10 08:21 test2

/tmp/test1/test2:
total 0
-r--------. 1 centos yanhui 0 Sep 10 08:21 10.log
-r--------. 1 centos yanhui 0 Sep 10 08:21 11.log
-r--------. 1 centos yanhui 0 Sep 10 08:21 12.log
-r--------. 1 centos yanhui 0 Sep 10 08:21 13.log

 

二、linux下权限分类

 

2.1、基本权限以及模型说明
  • 安全上下文说明:
    1、进程以某用户的身份运行; 进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
    2、权限匹配模型:
    (1) 判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;
    (2) 判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第3步;
    (3) 应用other的权限;
  • 权限:
r:readable,读
    w:writable,写
    x:excutable,执行
  • 基本权限相对于文件:
r:可获取文件的数据;
        w:可修改文件的数据;
        x:可将此文件发起运行为进程;
  • 基本权限相对于目录:
r:可使用ls命令获取其下的所有文件列表;
        w:可修改此目录下的文件列表;即创建或删除文件;
        x:可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息;
  • 权限模型(基本的9位,ls -l可以看见的属性)以及从属关系:
mode:rwxrwxrwx
    ownership:user,group
  • 权限组合机制:八进制表示0~7,最大为7,二进制可以为111,最小为0,二进制可以为000
--- 二进制表示:000 转换成八进制:0
    r-- 二进制表示:100 转换成八进制:4
    rw- 二进制表示:110 转换成八进制:6
    r-x 二进制表示:101 转换成八进制:5
    -w- 二进制表示:010 转换成八进制:2
    -wx 二进制表示:011 转换成八进制:3
    --x 二进制表示:001 转换成八进制:1
    rwx 二进制表示:111 转换成八进制:7
  • 附加特殊权限:
管理特殊权限的另一方式:
    suid sgid sticy     八进制权限
            0 0 0   0
            0 0 1   1
            0 1 0   2
            0 1 1   3
            1 0 0   4
            1 0 1   5
            1 1 0   6
            1 1 1   7
基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字
例如:chmod 1777

 

2.2、特殊权限SUID

默认情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行;
SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是
发起者,而程序文件自己的属主;

管理文件的SUID权限:
chmod u+|-s FILE...

展示位置:属主的执行权限位
如果属主原本有执行权限,显示为小写s;
否则,显示为大写S;
 

2.3、特殊权限SGID

功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;

管理文件的SGID权限:
chmod g+|-s FILE...
展示位置:属组的执行权限位
如果属组原本有执行权限,显示为小写s;
否则,显示为大写S;
 

2.4、特殊权限Sticky

功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除所有的已有文件;如果为此类目录设置Sticky权限,则每个用户能创建新文件,且只能删除自己的文件;

管理文件的Sticky权限:
chmod o+|-t FILE...

展示位置:其它用户的执行权限位
如果其它用户原本有执行权限,显示为小写t;
否则,显示为大写T;
系统上的/tmp和/var/tmp目录默认均有sticky权限;

小贴士:初学者,建议先用户管理和初级权限控制学透后再分析特殊权限,我这里由于时间关系,暂时不列举示例
后续对文章进行二次编辑的时候会考虑增加实际案例分析说明,如果有兴趣的或者有疑问的可以给我留言,或者
大家一起相互探讨。

 

2.5、灵活权限管控机制acl

文件的额外赋权机制:
在原来的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制;

  • getfacl命令:
getfacl FILE...
        user:USERNAME:MODE
        group:GROUPNAME:MODE

[root@localhost tmp]# touch 123.txt
[root@localhost tmp]# ls -l 123.txt
-rw-r--r--. 1 root root 0 Sep 10 08:33 123.txt
[root@localhost tmp]# getfacl 123.txt 
# file: 123.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

我创建了一个123.txt的文件,可以看到getfacl的输出结果,分为六列。
第一列:file列,分隔符冒号后边指明流getfacl查看的文件名;
第二列:owner,指明的是权限从属关系中的文件属主;
第三列:group,指明的是权限从属关系中的文件属组;
第四列:user,表示的是owner中属主的权限位标志;
第五列:group,表示的是group中属组的权限位标志;
第六列:other,表示其他者权限位标志;
  • setfacl命令:
    赋权给用户:
setfacl  -m  u:USERNAME:MODE  FILE...

[root@localhost tmp]# chmod 600 123.txt 
[root@localhost tmp]# ls -l 123.txt 
-rw-------. 1 root root 0 Sep 10 08:33 123.txt
[root@localhost tmp]# setfacl -m u:centos:rw 123.txt 
[root@localhost tmp]# getfacl 123.txt 
# file: 123.txt
# owner: root
# group: root
user::rw-
user:centos:rw-
group::---
mask::rw-
other::---      
例子中,我们先利用chmod把123.txt文件改成只有文件属主才有权限读写,
然后让普通用户centos对该文件有读写权限,
后边新增了一列user:centos:rw-
每授权给一个用户,这里都会新增一列,格式为:
用户名或组名:权限标志

这样,即使我不属于root组,而且又不让其他所有人都可以读写123.txt,我作为普通用户
centos,也可以读写该文件了。
[root@localhost tmp]# su - centos
Last login: Mon Sep 10 07:59:36 CST 2018 on pts/1
-bash-4.2$ echo 123 > 123.txt 
[root@localhost tmp]# su - yanhui
\[yanhui@localhost ~]$ cat /var/tmp/123.txt 
cat: /var/tmp/123.txt: 权限不够

[yanhui@localhost ~]$ echo 345 > /var/tmp/123.txt
-bash: /var/tmp/123.txt: 权限不够

赋权给组:

setfacl  -m  g:GROUPNAME:MODE FILE...
        赋权给组的案例,我就不演示了,二次编辑该博文会考虑添加案例。

撤销赋权:

setfacl  -x u:USERNAME  FILE...
        setfacl  -x  g:GROUPNAME  FILE...

[root@localhost tmp]# setfacl -x u:centos 123.txt 
[root@localhost tmp]# getfacl 123.txt 
# file: 123.txt
# owner: root
# group: root
user::rw-
group::---
mask::---
other::---