用户、组及其管理

用户和组管理

   Linux是一个多用户、多任务的操作系统。多用户、多任务就是可以在系统上建立多个用户,多个用户可以在同一时间内登录同一台主机的系统执行不同的任务,而互不影响。例如某台linux服务器上有4个用户,分别是root、www、ftp和mysql,在同一时间内root用户可能在管理维护系统,www用户可能在修改自己的程序和操作,ftp用户可能在上传软件到服务器,mysql用户可能在执行自己的SQL程序,每个用户互不干扰的进行自己的操作,而每个用户之间不能越权访问,比如www用户不能执行mysql用户的SQL程序,ftp用户也不能修改www用户的程序,因此不同用户具有不同的权限,每个用户是在权限允许的范围内完成不同的任务,linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。

Linux的安全模型 

        作为一个安全系统的重要功能之一就是只允许那些授权的用户登录该系统,而阻止那些未经授权的用户登录(进入)这一系统。,登录该系统的用户只能访问或者操作那些他有权访问和操作的文件和资源。那么在 Linux 操作系统中又是怎样做到这些的呢?Linux 操作系统采用了如下的措施:

用户登录系统时必须提供用户名和密码(用户是由 root 用户创建的,最初的密码也是 root 用户设定的)。

使用用户和群组来控制使用者访问文件和其他资源的权限。 

系统上的每一个文件都一定属于一个用户(一般该用户就是文件的创建者)并与一个群组相关。

每一个进程都会与一个用户和群组相关联。可以通过在所有的文件和资源上设定权限来只允许该文件的所有者或者某个群组的成员访问它们。

资源分派:

 Authentication:认证 (确认身份,登陆系统的用户名和密码)

 Authorization:授权 (对于文件或者程序的权限)

 Accouting|Audition:审计 (监控日志)

                

用户:

管理员:root   UID:0

普通用户:

      系统用户:1-499 (centos6)

                       1-999(centos7)    

      系统用户一般不登录,都是给后台进程使用

postfix   27756  0.0  0.0  80976  3396 ?   S  17:46  0:00 pickup -l -t fifo -u

这里的这个进程就是使用系统用户postfix在后台运行的。这些用户使用的是nologin的类型shell

      登录用户:500-60000(centos6)

            1000-60000(centos7)

组:

   用户组是一些用户的集合,在用户组里赋予组成员用户相同的权限。有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有10个用户的话,就需要授权10次,这样会很麻烦;另一种方法是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有用户就具有了和组一样的权限。这就是用户组,将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了管理工作。

 GID:组标识号

管理员组:root, 0

普通组: 

        系统组:1-499(centos6), 1-999(centos7) 

        普通组:500+ ,        1000+

linux 安全上下文:

security context

进程所能够访问资源的权限取决于进程的运行者的身份

linux组的类别:

用户的主要组(主组):

用户必须属于一个且只有一个主组 组名同用户名,且仅包含一个用户:私有组 (private 私有)

[root@localhost ~]# groups zang
zang : zang

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

[root@localhost ~]# groups zang
zang : zang bin
[root@localhost ~]# id zang
uid=500(zang) gid=500(zang) groups=500(zang),1(bin)

123.jpg

用户和组的配置文件

Linux用户的配置文件:

       系统用户配置文件,是用户管理中最重要的一个文件。这个文件记录了Linux系统中每个用户的一些基本属性,并且对所有用户可读。/etc/passwd中每一行记录对应一个用户,每行记录又被冒号分割。

/etc/passwd:用户及其属性信息(名称、UID、主组ID等)

zang:x:500:500::/home/zang:/bin/bash

login name:登录用(zang)

passwd:密码 (x)

    我们可以使用pwunconv(密码不转换),把密码显示在X处 ;使用pwconv(密码转换)把密码放到/ect/shadow中。

UID:用户身份编号 (500)

GID:登录默认所在组编号 (500) [用户的主组]

GECOS:用户全名或注释 

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

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

注意:第二项(passwd)存放着加密后的用户口令,虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 版本都使用了shadow,把真正加密后的用户口令存放到/etc/shadow文件中,该文件只有root用户拥有读权限,从而保证了用户密码的安全性。在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如用“x”或者“*”来表示。

下面我们来说一说/etc/shadow

/etc/shadow:用户密码及其相关属性 

shadow文件格式 :

zang:$6$vfI0a6tN$amq4Jm801CJKnbgJsjZ9sL3eahHnUrB3BxpRM50cvjrH6KbEV133EwQyFbjXfbWlKGvbDg8L3LwGNThOsmWkL.:17007:0:99999:7 : : :

用户名:(zang)

用户密码:$6加密算法为sha512加密;第二个$与第三个$之间,我们通常称为salt;第三个$之后为加密的密码

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

最小时间间隔:密码再过几天可以被变更(0表示随时可被变更)

最长密码使用期限:密码再过几天必须被变更(99999表示永不过期)

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

密码非活动期限:密码过期几天后帐号会被锁定

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

保留字段:这个字段留作以后使用。

1234.png

补充知识:密码加密

加密机制: 

加密:明文–> 密文 

解密:密文–> 明文

单向加密:哈希算法,原文不同,密文必不同 

相同算法定长输出,获得密文不可逆推出原始数据

雪崩效应:初始条件的微小改变,引起结果的巨大改变 

如下面的例子:

我们把zang用户与zanghl用户的密码设置为相同的密码centos

[root@localhost ~]# echo centos | passwd --stdin zang
Changing password for user zang.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# echo centos | passwd --stdin zanghl
Changing password for user zanghl.
passwd: all authentication tokens updated successfully.

查看配置文件:

[root@localhost ~]# getent shadow zang
zang:$6$CIZ.tGks$AZfFMfmNQQ6rfQ7XMIZolX4Awp6CCSmJ8oNUE7xvNuaX7MAqyzx5/dvP/WszEgECpQOiUN.o.BZ..h1ZsMdo/0:17007:0:99999:7:::
[root@localhost ~]# getent shadow zanghl
zanghl:$6$wpSq8G7i$QMqWoPxyjymeuvy9a0l5B4p8LxFgzAOoiiNAYetFLTrMg/ox7XYB3roVseGzA3hhfYUNdglEplzh8m/s4T4E90:17007:0:99999:7:::

这里我们看到加密时加入的salt并不相同,所以我们说初始条件的微小改变,引起结果的巨大改变。

加密算法:

md5: message digest, 128bits 

sha1: secure hash algorithm, 160bits 

sha224: 224bits 

sha256: 256bits 

sha384: 384bits 

sha512: 512bits

更改加密算法 authconfig –passalgo=sha256 –update

[root@localhost ~]# cat /etc/login.defs 
...
ENCRYPT_METHOD SHA256

密码加密算法保存在:/etc/login.defs 

/etc/login.defs储存的是建立用户时用户的必要信息。

Linux组的配置文件:

/etc/group:组及其属性信息 

[root@localhost ~]# getent group zang

zang:x:500:

群组名称:群组名称(zang) 

群组密码: x (存放在/etc/gshadow) 

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

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

/etc/gshadow:组密码及其相关属性

群组名称:

加密的密码:

管理员:可以对组成员进行调整。

群组成员

注意:

系统用户的家目录和邮箱不会自动创建。

用户添加新的组成员,用户必须重新登陆之后才能获取组成员关系信息。

如果组没有组密码其他用户无法加入该群组。

newgrp:临时切换主组

如果创建一个文件,想要这个文件有其他组的权限,可以临时切换主组,之后再创建文件

[zanghl@localhost ~]$ ll
total 0
-rw-rw-r-- 1 zanghl zanghl 0 Jul 26 00:56 f1
-rw-rw-r-- 1 zanghl zanghl 0 Jul 26 00:58 f2
-rw-rw-r-- 1 zanghl zanghl 0 Jul 26 00:59 f3
[zanghl@localhost ~]$ newgrp zang
Password: 
[zanghl@localhost ~]$ touch f5
[zanghl@localhost ~]$ ll
total 0
-rw-rw-r-- 1 zanghl zanghl 0 Jul 26 00:56 f1
-rw-rw-r-- 1 zanghl zanghl 0 Jul 26 00:58 f2
-rw-rw-r-- 1 zanghl zanghl 0 Jul 26 00:59 f3
-rw-r--r-- 1 zanghl zang   0 Jul 26 01:00 f5

用户和组管理命令:

useradd:添加用户或更改用户默认信息

-u UID: [UID_MIN, UID_MAX]定义在/etc/login.defs 

示例:

[root@localhost ~]# useradd -u 10000 zz
[root@localhost ~]# getent passwd zz
zz:x:10000:10000::/home/zz:/bin/bash

-o 配合-u 选项,不检查UID的唯一性 

[root@localhost ~]# useradd -ou 10000 zz1
[root@localhost ~]# cat /etc/passwd
...
zz:x:10000:10000::/home/zz:/bin/bash
zz1:x:10000:10001::/home/zz1:/bin/bash

之前创建了一个指定UID为10000的用户zz,用 -ou选项在此创建一个zz1用户也指定

用户的UID为10000。

-g GID:指明用户所属基本组,可为组名,也可以GID

[root@localhost ~]# useradd -g 501 zz2
[root@localhost ~]# cat /etc/passwd
...
zanghl:x:501:501::/home/zanghl:/bin/bash
zz:x:10000:10000::/home/zz:/bin/bash
zz1:x:10000:10001::/home/zz1:/bin/bash
zz2:x:10001:501::/home/zz2:/bin/bash

-c "COMMENT":用户的注释信息 

[root@localhost skel]# useradd -c "dsadsada" zz67
[root@localhost skel]# getent passwd zz67
zz67:x:10003:10003:dsadsada:/home/zz67:/bin/bash

-d HOME_DIR: 以指定的路径(不存在)为家目录 

[root@localhost ~]# useradd -d /test zz3
[root@localhost ~]# getent passwd zz3
zz3:x:10002:10002::/test:/bin/bash

默认家目录的基本文件/etc/skel/

指定路径为家目录创建用户后,默认从/etc/skel/ 中复制文件到指定的家目录中。

-s SHELL: 指明用户的默认shell程序 可用列表在/etc/shells文件中 

-G GROUP1[,GROUP2,…]:为用户指明附加组,组必须事先存在

-N 不创建私用组做主组,使用users组做主组 

-r: 创建系统用户 CentOS 6: ID<500,CentOS 7: ID<1000

默认值设定:/etc/default/useradd文件中 

显示或更改默认设置: useradd -D 

[root@localhost ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[root@localhost ~]# useradd -D -s SHELL

删除用户

userdel [OPTION]… login 

-r: 删除用户家目录;

查看用户相关的ID信息 

id [OPTION]… [USER] 

-u: UID 显示用户的UID。

-g: GID 显示用户的GID。

-G: Groups 显示用户所有的组的GID。

-n: Name 与-ugG一起使用,显示名称。

[root@localhost test]# id -u zz1
10000
[root@localhost test]# id -g zz1
10001
[root@localhost test]# id -G zz1
10001 10000
[root@localhost test]# id -nu zz1
zz

设置密码

passwd [OPTIONS] UserName: 修改指定用户的密码,仅 root用户权限 

passwd: 修改自己的密码;  

常用选项: 

-l:锁定指定用户 

-u:解锁指定用户 

-e:强制用户下次登录修改密码 

-n mindays: 指定最短使用期限 

-x maxdays:最大使用期限 

-w warndays:提前多少天开始警告 

-i inactivedays:非活动期限; 

–stdin:从标准输入接收用户密码; 

  echo "PASSWORD" | passwd –stdin USERNAME

用户属性修改

usermod [OPTION] login 

-u UID: 新UID 

-g GID: 新基本组 

-G GROUP1[,GROUP2,…[,GROUPN]]]:新附加组,原来的附加 组将会被覆盖;若保留原有,则要同时使用-a选项,表示append; 

-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: 设定非活动期限;

修改用户密码策略

chage [OPTION]… LOGIN 

-d LAST_DAY 

-E, –expiredate EXPIRE_DATE 

-I, –inactive INACTIVE 

-m, –mindays MIN_DAYS 

-M, –maxdays MAX_DAYS 

-W, –warndays WARN_DAYS 

–l,显示密码策略  

下一次登录强制重设密码 

chage -d 0 tom

设置用户zzz

[root@localhost ~]# chage zzz
Changing the aging information for zzz
Enter the new value, or press ENTER for the default
  Minimum Password Age [0]: 
  Maximum Password Age [99999]: 42
  Last Password Change (YYYY-MM-DD) [2016-07-25]: 
  Password Expiration Warning [7]: 
  Password Inactive [-1]: 5
  Account Expiration Date (YYYY-MM-DD) [-1]: 2016-12-12

chfn 指定个人信息

[root@localhost test]# chfn zz1
Changing finger information for zz1.
Name []: zanghl
Office []: 1 
Office Phone []: 010111
Home Phone []: 1821211

chsh 指定shell

[root@localhost test]# chsh zz1
Changing shell for zz1.
New shell [/bin/bash]: /bin/csh
Shell changed.
[root@localhost test]# getent passwd zz1
zz1:x:10000:10001:zanghl,1,010111,1821211:/home/zz1:/bin/csh

finger

[root@localhost test]# finger zz1
Login: zz1                      Name: zanghl
Directory: /home/zz1                    Shell: /bin/bash
Office: 1, 010111           Home Phone: 182-1211
Never logged in.
No mail.
No Plan.

切换用户或以其他用户身份执行命令

su

su [options…] [-] [user [args…]]  

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

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

root su至其他用户无须密码;非root用户切换时需要密码 

 

换个身份执行命令: su [-] UserName -c 'COMMAND' 

选项:-l  –login: 

su -l UserName 相当于 su – UserName

不完全切换保留之前用户的工作环境

[zzz@localhost ~]$ su root -c 'cat /etc/issue'
Password: 
CentOS release 6.8 (Final)
Kernel \r on an \m
Mage Education Learning Services

设置密码

passwd [OPTIONS] UserName: 修改指定用户的密码,仅 root用户权限 

passwd: 修改自己的密码;

 

常用选项: 

-l:锁定指定用户 

-u:解锁指定用户 

-e:强制用户下次登录修改密码 

-n mindays: 指定最短使用期限 

-x maxdays:最大使用期限 

-w warndays:提前多少天开始警告 

-i inactivedays:非活动期限;

–stdin:从标准输入接收用户密码; 

echo "PASSWORD" | passwd –stdin USERNAME

创建组

groupadd [OPTION]… group_name 

-g GID: 指明GID号;[GID_MIN, GID_MAX]

[root@localhost ~]# getent group free
free:x:2016:

-r: 创建系统组; 

CentOS 6: ID<500   CentOS 7: ID<1000

修改和删除组

组属性修改:groupmod groupmod [OPTION]… group 

-n group_name: 新名字

-g GID: 新的GID

[root@localhost ~]# groupmod -g 2017 -n freed free
[root@localhost ~]# getent group freed
freed:x:2017:

组删除:

groupdel 

groupdel GROUP

更改组密码

组密码:gpasswd 

gpasswd [OPTION] GROUP 

-a user: 将user添加至指定组中;(下面有举例)

-d user: 从指定组中移除用户user 

[root@localhost ~]# id user2
uid=503(user2) gid=504(user2) groups=504(user2),1(bin)
[root@localhost ~]# gpasswd -d user2 bin
Removing user user2 from group bin
[root@localhost ~]# id user2
uid=503(user2) gid=504(user2) groups=504(user2)

-A user1,user2,…: 设置有管理权限的用户列表 (添加组管理员)

newgrp命令:临时切换基本组; 

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

[root@localhost ~]# id user2
uid=503(user2) gid=504(user2) groups=504(user2),505(free)
[user2@localhost ~]$ ll
total 0
-rw-rw-r-- 1 user2 user2 0 Aug  3 21:27 user2file
[user2@localhost ~]$ newgrp free user2
[user2@localhost ~]$ touch user2file3
[user2@localhost ~]$ ll
total 0
-rw-rw-r-- 1 user2 user2 0 Aug  3 21:27 user2file
-rw-r--r-- 1 user2 free  0 Aug  3 21:29 user2file3

更改和查看组成员

groupmems [options] [action] 

options: 

-g, –group groupname 更改为指定组 (只有root) 

Actions: 

-a, –add username    指定用户加入组 

-d, –delete username 从组中删除用户

[root@localhost ~]# getent group free
free:x:505:user2,user1,zzz
[root@localhost ~]# groupmems -g free -d zzz
[root@localhost ~]# getent group free
free:x:505:user2,user1

-p, –purge           从组中清除所有成员

-l, –list            显示组成员列表 

[root@localhost ~]# groupmems -g free -l
user2

groups [OPTION].[USERNAME]… 查看用户所属组列表

[root@localhost ~]# groups  user1
user1 : bin free

添加用户附加组:

[root@localhost home]# groupmems -g bin -a user1
[root@localhost home]# id user1
uid=502(user1) gid=505(user1) groups=505(user1),1(bin)
[root@localhost home]# usermod -aG user2 user1
[root@localhost home]# id user1
uid=502(user1) gid=505(user1) groups=505(user1),1(bin),506(user2)
[root@localhost home]# gpasswd -a user1 user3
Adding user user1 to group user3
[root@localhost home]# id user1
uid=502(user1) gid=505(user1) groups=505(user1),1(bin),506(user2),507(user3)

原创文章,作者:zanghonglei,如若转载,请注明出处:http://www.178linux.com/28385

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-04 15:50

    写的不错,如果能将选项缩进看起来会更直观哦。