NingG +

Linux下用户和组管理

背景

平日里,常遇到几个需求:

  1. Linux服务器上,为新人开个账号,并加入到某一组中;
  2. 查询,组中的所有用户;
  3. 查询,用户是否存在;
  4. 查询,某一用户所在组;
  5. 用户和组管理,如何实现的;

如何使用

几个命令

用户相关

用户组相关

注:作为初始组的用户组,无法使用命令groupdel进行删除。

上面的命令,细节不想多说,用的时候,直接man command查看帮助文档即可。

几个文件

文件 说明
/etc/passwd 用户信息
/etc/shadow 用户密码信息
/etc/group 用户组信息
/etc/gshadow 用户组管理信息

/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
hbase:x:1002:507::/home/hbase:/bin/bash
nagios:x:1003:508::/home/nagios:/bin/bash
oozie:x:1004:507::/home/oozie:/bin/bash
hcat:x:1005:507::/home/hcat:/bin/bash
hive:x:1006:507::/home/hive:/bin/bash
yarn:x:1007:507::/home/yarn:/bin/bash
hdfs:x:1008:507::/home/hdfs:/bin/bash
mapred:x:1009:507::/home/mapred:/bin/bash

格式说明:

`用户名`:`密码`:`UID`:`GID`:`用户说明信息`:`默认登录路径`:`Shell`

补充说明:

  1. 密码列,是历史遗留问题,现在所有的密码,都已被单独的提出并存储至/etc/passwd文件中;
  2. UID=0,表示系统管理员;
  3. GID,与文件/etc/group有关,这个文件用于规范组名和GID的对应关系;
  4. Shell,用户登录之后,就会获得一个Shell进程来与系统核心进行沟通,以此来执行用户任务;特别需要注意的是,/sbin/nologin将会使用户无法登录;

/etc/shadow

文件片段:

root:$6$t...(实际密码较长):15996:0:99999:7:::
bin:*:15422:0:99999:7:::
sshd:!!:15977::::::
dev:!!:15989:0:99999:7:::
devp:$6$...(实际密码较长):15989:0:99999:7:::
mysql:!!:15990::::::
storm:$6$2...(实际密码较长):15991:0:99999:7:::
strom:!!:15991:0:99999:7:::
ambari-qa:!!:16262:0:99999:7:::
hbase:!!:16262:0:99999:7:::
nagios:!!:16262:0:99999:7:::
oozie:!!:16262:0:99999:7:::
hcat:!!:16262:0:99999:7:::
hive:!!:16262:0:99999:7:::
yarn:!!:16262:0:99999:7:::
hdfs:!!:16262:0:99999:7:::
mapred:!!:16262:0:99999:7:::

格式说明(:分隔各个列):

  1. 用户名
  2. 密码:是加密后的结果,但仍有可能被破解;
  3. 最近改动密码日期:单位:天,从1970.01.01算起的天数;
  4. 密码不可被改动的天数:多少天内不能修改;如果为0,表示随时可以更改;
  5. 密码需要重新改动的天数:多少天内需要修改再次密码;
  6. 需要变更前的警告天数:在密码需要重新改动的天数到来之前,提前显示警告信息;
  7. 密码过期后帐号宽限期:在密码需要重新改动的天数到来之前,都没有修改密码,那么还有机会,在宽限期内,用户登录,系统会强制用户必须重新设定密码;
  8. 帐号失效日期:单位:天,从1970.01.01算起的天数;过了这一天,帐号当即失效;
  9. (保留)

补充说明:

  1. 密码列,是加密后的结果,但仍有可能被破解;
  2. 最近改动密码日期列,单位:天,从1970.01.01算起的天数;
  3. 密码不可被改动的天数列,从最近改动密码日期向后推迟的天数,如果为0,表示随时可以更改;
  4. 密码需要重新改动的天数列,强制用户在多少天内必须修改密码;
  5. chage -l [LOGIN]命令,可用于查询用户密码相关的详细信息;

小提示:

有趣的功能:用户第一次登录后,强制其修改密码后才能使用系统资源. 具体命令:chage -d 0 [LOGIN]

/etc/group

文件片段:

hadoop:x:507:hbase,hdfs,mapred
nagios:x:508:
mailnull:x:47:
smmsp:x:51:
hdfs:x:481:devp
hbase:x:480:

格式说明:

`组名`:`群组密码`:`GID`:`组内成员`

补充说明:

  1. 在上面文件片段中,如果想将用户nagios,添加到hdfs组中,则,只需在hdfs的组内成员列中添加,nagios即可;
  2. id命令,可查询用户组的详细信息;(类似groups命令)

疑问:

有的账户,在/etc/passwd中,看出其GID项为507,而在/etc/groupGID=507的组内成员中,并没有看到这些账户?

这个涉及到有效组(effective group)初始组(initial group)的概念,请往下继续看。

有效组(effective group) vs. 初始组(initial group)

  1. 文件/etc/passwd中,每个用户对应有且只有一个GID,这是初始组,即用户一登入系统,立即拥有这个群组的权限;
  2. 初始组,不需要在/etc/group文件的组内成员中写入该用户(也可以写入);
  3. 若用户还属于非初始组,则,在/etc/group文件的组内成员部分进行标识;
  4. 用户新建一个文件,这个文件属于有效组
  5. groups命令,查询出的组中,第一个组为有效组
  6. 用户登录之后,newgrp [GROUP]命令,可以切换有效组;

额外,需要说明一下newgrp [GROUP],其实质上是有启动了一个shell,来实现切换有效组的,具体如下:

如何将用户添加到组中呢?两种方式:

  1. root用户,使用命令:usermod
  2. 组管理员,使用命令:gpasswd;(下文会介绍)

有个问题,记录一下:

疑问:命令newgrp会重新启动一个shell,shell是kernel之外的一层壳,shell与进程、线程之间什么关系?shell是如何调用内核?

(之前APUE课程上,有个课下作业:写一个自己的shell,类似bash)

/etc/gshadow

文件片段:

hadoop:!::hbase,hdfs,mapred
nagios:!::
mailnull:!::
smmsp:!::
hdfs:!::

格式说明:

`组名`:`组密码`:`组管理员帐号`:`组内成员`

补充说明:

  1. 组密码!,表示无合法密码,无组管理员;
  2. 组内成员,与/etc/group文件中内容相同;

具体添加组内成员、设置组的管理员,使用命令:gpasswd

特别提示

使用useraddpasswd等命令添加用户,并为用户设置用户组之后,如果想修改用户的信息,两条途径:

  1. 直接修改/etc/passwd/etc/shadow文件中相应字段;
  2. 使用usermod命令进行修改;[推荐]

深入原理

为什么存在用户和用户组

主机放在这,谁都想用,如果所有人(UserA\UserB\UserC)都使用同一个帐号登录,则,大家都没有隐私可言,而且UserA的文件可能会被UserB给删除;这就要求创建多个帐号(用户),UserA\UserB\UserC每人使用一个不同的帐号来登陆,这样大家的文件就相互隔离了;问题又来了,UserA想与UserB共享文件FileA,但是不想与UserC共享这一文件怎么办?这就产生了用户组这一概念,只需要UserA\UserB同属某个用户组GroupA,然后设置组GroupA内的人都有权操作FileA就可以了。

具体实现原理

用户登录时,输入用户名密码,实际上,Linux主机是按照 UID(User ID) 来识别用户的,用户名是为便于人们记忆才存在的。 同理,Linux主机只识别GID(Group ID)来标识用户组。具体,使用ls -l命令查询文件详情时,系统会按照GIDUID分别去文件/etc/group/etc/passwd中查询相应的用户组用户的名字并显示出来。

上面一段话,总结:系统上文件属性、权限等存储的都是UIDGID,只有在登录、显示时,才会用到用户名用户组名

参考来源

Top