前言:此次验证操作环境为CentOS7.3,及CentOS6.9。


人员账号的管理是身为运维人员必要掌握的技能之一。其工作中的用途甚至比文件安全、软件配置更为广泛。对用户组及其相关权限有个清晰的认识,有利于我们工作学习的开展。下面就我个人理解,在此斗胆做个总结。

我们知道,当用ll或ls –l去查看目录下文件时,往往会得到如下的结果。

Linux下用户组和权限管理_Linux

drwxrwxr-x. 2 magedu magedu 6 Jul 21 21:03 magedu
-rw-r--r--. 1 root   root   0 Jul 22 09:26 test

以文件test为例,我们将其对应表示内容整理如下:

-:文件类型,-为普通文件,d为目录,如文件magedu,b为装置文件里面的可供存储的接口设备,c为字符设备(键盘、鼠标),l为软链接文件,s为套接字文件socket,p为管道文件pipe
rw-:文件属主的权限;r--:文件属组的权限;
r--:其他用户(非属主、属组)的权限。
.:文件有隐藏属性(可隐藏,不表示已隐藏)
1:数字表示文件被硬链接的次数
root:文件的所有者(属主)
root:文件的属组
0:文件的大小,单位是字节(bytes);
Jul 22 09:26:文件最近一次被修改的时间
test:文件名

注意:r表示可读,w为可写,x为可执行,-则无权限。rwx所在的位置是固定的,若没有该项权限,则以-表示。如文件test拥有者的权限为可读可写不可执行,其同组用户权限为可读不可写不可执行,非同组的其他用户权限为可读不可写不可执行。

 

Linux中,/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow四个文件与用户组的关系密切相关。从四个文件入手,是系统了解用户及组、权限管理的有效方法。

由于我们的主题是用户及组的权限管理,这里相关文件就不详细说了。但这几个文件又是学习用户和组管理的关键,所以了解又是很必要的。

我们新建一个用户saber,并以此为例进行操作。在此之前,本机仅有root用户和magedu用户。

1.新建saber,用ll查询家目录,果然,/home/下多了一个saber的文件夹。

Linux下用户组和权限管理_Linux_02

用finger和id命令查看,我们会得到这样的结果:

Linux下用户组和权限管理_Linux_03

用cat浏览/etc/passwd,在/etc/passwd的结尾我们看到了这样的信息。

Linux下用户组和权限管理_Linux_03

saber:x:1001:1001::/home/saber:/bin/bash

由finger和id所得的信息,我们很容易理解。其内容以:为间隔对应位如下:

login name:登录用名(saber)

passwd:密码(x),真实密码加密后放在/etc/shadow

UID:用户身份编号 (1001)  

GID:登录默认所在组编号 (1001)  

GECOS:用户全名或注释(这里为空)

home directory:用户主目录 (/home/saber)  

shell:用户默认使用shell (/bin/bash)

我们已经知道用useradd可以创建用户,那么想要自定义创建用户相关信息由如何实现呢?我们先来看看useradd可以实现的功能

useradd
    -u uid username 创建用户时指定uid(如不指定则Centos:500-60000, Centos7: 1000-60000)
    -o -u uid username 创建用户时指定uid(可以与已存在用户的uid相同)
    -g groupname username 创建用户时指定主组为某个已存在的组。(将不会再创建与用户同名的组)
    -c "描述" username  创建用户时指定描述信息。
        chfn ... username
    -d path username 指定用户的家目录(确保指定的家目录所在的上级目录要存在,且家目录本身不能存在)
    -s /sbin/nologin username 指定用户的默认shell
    -G group1[,group2] username 指定用户的辅助组
    -N username 设置用户的主要组为默认组(users,uid=100)
    -r username 创建系统用户
        /etc/default/useradd
        /etc/login.defs
    -D -s /sbin/nologin 修改默认设置(以上两文件)

创建用户使用useradd,修改用户信息我们可以使用usermod

usermod 修改用户信息
    -u newuid username     修改用户的UID
    -o -u newuid username 修改用户的uid(可以与已存在用户的uid相同)           
    -aG 加组名,可以追加辅助组而不用覆盖之前的组
    -G "" username  或 usermod -G primarygroup username 清空用户所有的辅助组
    -g groupname username 修改用户的主组
    -s /sbin/nologin username 修改用户的默认shell
    -c ...  username 修改用户时指定描述信息。
        chfn ... username
    -d /.../path username 修改用户的家目录(不会创建,只修改/etc/passwd当中的家目录信息)
    -m -d /.../path username 修改用户的家目录信息,并将家目录移动到目的目录并改名。
    -l newname oldname 修改用户名
    -L 给用户/etc/shadow中的密码位加!使用户被锁定
    -U 把!拿掉。
    -e yyyy-mm-dd 设置一个帐户过期时间
    f days 指定密码过期之后多少天帐户过期

删除用户一般使用userdel

userdel [-r] username
    删除用户时,加上-r连同其家目录,mail一同删除

啊,我们差点忘了一个很重要的命令。用户创建好了,我们怎样切换呢?root想要以普通用户身份执行命令又要如何实现呢?su就可以哦。

su:switch user
    su username 非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
    su - username 登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
    -c 'command' 以用户的身份执行命令而不登录(仅root)

2.使用chage –l ,我们可以查看到一串关于saber的信息。这些信息对应的文件是/etc/shadow

Linux下用户组和权限管理_Linux_05

用cat浏览/etc/shadow,其结尾如下:

Linux下用户组和权限管理_Linux_06

saber:!!:17369:0:99999:7:::

其内容以:为间隔对应位如下:

登录用户名:(saber)

用户密码:一般用sha512加密(!与!!表示用户被锁定)

authconfig --passalgo=sha256 --update 修改密码加密方式

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

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

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

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

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

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

我们知道chage –l可以查看用户帐户日期信息,那修改这些信息的可不可以呢?其实,chage的用途还有很多。

chage -l username 显示帐户的密码信息
  -d 指定密码的上次修改时间(yyyy-mm-dd)
      -d 0 强制用户下次登录时必须修改密码
  -E 指定账户的过期时间
  -I 密码过期之后多少天帐户过期
  -m 设置最小存活时间
  -M 设置最大存活时间
  -W 设置密码过期前的提醒时间
  -L 多少天帐户过期
chage username 交互式修改用户的密码策略

chage多用于修改密码帐户存活期,那么又怎样设置修改用户的密码呢?既然建立了用户账号,不可能一直都是锁定状态吧。这里,passwd命令就派上用场了。

passwd [OPTIONS] UserName: 修改指定用户的密码,仅 root用户权限(普通用户可以 passwd:修改自己的密码)   
    -l:锁定指定用户
    -u:解锁指定用户
    -e:强制用户下次登录修改密码
    -n mindays: 指定最短使用期限
    -x maxdays:最大使用期限
    -w warndays:提前多少天开始警告
    -i inactivedays:非活动期限
    --stdin:从标准输入接收用户密码
    echo "PASSWORD" | passwd --stdin USERNAME从标准输入接收用户密码


3.使用cat查看/etc/group,结尾如下:

Linux下用户组和权限管理_Linux_07

saber:x:1001:

    组名:saber
    密码位:x
    GID:
        CentOS6 1-499为系统用户,预留
        CentOS7 1-999为系统组,预留
    组成员:讲该组作为辅助组的成员列表,当成员先把该组当作辅助组,再转成主要组时,不改变。当成员离开该组时,被删除。

下面是组相关的常用命令:

getent group groupname查看某组/etc/group内信息

groups username 查看用户所属组
    id username查看用户uid,gid

groupadd
    -g gid groupname 创建指定gid的组
    -r groupname 创建系统组(小于1000)

groupmod
    -n newgrpname oldgrpname  修改组名
    -g newgid groupname 修改gid

groupdel groupname 删除组

groupmems -g admin -a libai (仅能一次加一个用户到组中)
groupmems -g admin -d libai  将指定成员从组中删除
groupmems -g admin -l 列出指定组的成员列表(辅助组)
groupmems -p admin 消除指定组的所有成员。

4.使用cat查看/etc/gshadow,结尾如下:

Linux下用户组和权限管理_Linux_08

saber:!::

        组名:groupname
        密码位:
        gpasswd groupname 设置组密码
        newgrp groupname(普通用户)
            当用户不是该组的辅助组成员时,则需要输入密码,成功后可临时获得主要组成员身份加入该组
            当用户是该组的辅助组成员时,无需输入密码,讲临时以主要组的身份加入该组,而其原有的主要组,则临时变为辅助组
         管理员位:只能由root任命或撤销,可以同时由多名。以,为间隔。
                 权利:可以修改组密码,可以将用户从该组(辅助组)内添加或删除
         组成员位:将该组作为辅助组的成员列表,当成员先把该组当作辅助组,再转成主要组时,不改变。当成员离开该组时,被删除。

组密码与管理的相关命令;

getent gshadow [groupname]查看某组的gshadow信息

gpasswd -A username groupname任命用户为组管理员
撤消所有管理员:gpasswd -A "" admin
gpasswd -a libai admin 往组内添加用户
gpasswd -d libai admin  将用户从组中删除
gpasswd -r admin 删除组密码
gpasswd -R admin 用!覆盖密码 ,限制非辅助组组成员进入
gpasswd -M libai,luren admin 指定辅助组成员

 

5.linux的哲学思想之一——一切皆文件。所以以上的一切命令其实我们都可以通过修改最初的几个文件实现。诸如:

vipw = vim /etc/passwd
vipw -s = vim /etc/shadow
vigr = vim /etc/group
vigr -s = vim /etc/gshadow
pwck 检查/etc/passwd /etc/shadow
grpck 检查/etc/group /etc/gshadow


再者诸如,getent还可以又如下用法:

getent passwd username 查看用户的/etc/passwd信息
getent shadow username 查看用户的/etc/shadow信息

此外还有:

chfn username修改用户描述信息

chsh 指定shell

newusers passwd格式文件 批量创建用户

chpasswd 批量修改用户口令

相关文档:/etc/default/useradd新建用户的默认信息文件
                    /etc/skel/.*新建用户家目录内默认文件(别名等)
                    /etc/login.defs