https://www.cnblogs.com/f-ck-need-u/p/7011669.html
linux系统用户/组管理
用户和组的基本概念
用户和组是操作系统中一种身份认证资源。
每个用户都有用户名、用户的唯一编号uid(user id)、所属组及默认的shell,可能还有密码、家目录、附属组、注释信息等。
每个组也有自己的名称、组唯一编号gid(group id)。一般来说,gid和uid是可以不相同的,但绝大多数都会让它们保持一致,一致属于约定俗成类的概念吧。
组分为主组(primary group)和辅助组(secondary group)两种,用户一定会属于某个主组,也可以同时加入多个辅助组。
在linux中,用户分为3类:
(1).超级管理员
下级管理员是最高权限者,它的uid=0,默认超级管理员用户名为root,因为uid默认具有唯一性,所以超级管理员默认只能有一个(如何添加额外的超级管理员,见useradd命令),但这一个超级管理员的名称并非一定要是root,但没人会去改root的名称,在后续非常非常多的程序中,都认为超级管理员名称为root,这里要是一改,牵一发而动全身。
(2).系统用户
有时候需要一类具有某些特权但又不需要登录操作系统的用户,这类用户称为系统用户。它们的uid范围从201到999(不包括 1000)有些老版本范围是1到499(centos6),出于安全考虑,它们一般不用来登录,所以它们的shell一般是/sbin/nologin,而且 大多数时候它们是没有家目录的。
(3). 普通用户
普通用户是权限受到限制的用户,默认只能执行/bin、/usr/bin、/usr/local/bin和自身家目录下的命令。它们的uid从500开始。尽管普通用户权限收到限制,但是它对自身家目录下的文件是有所有权限的。
超级管理员和其他类型的用户,它们的命令提示符是不一样的。uid=0的超级管理员,命令提示符是”#”,其他的为”$”。
默认root用户的家目录为/root,其他用户的家目录一般在/home下以用户名命名的目录中,如longshuai这个用户的家目录为/home/longshuai。当然,家目录是可以自定义位置和名称的。
用户和组管理相关的文件
用户文件/etc/passwd
/etc/passwd文件里记录的是操作系统中用户的信息,这里面记录了几行就表示系统中有几个系统用户。它的格式大致如下:
1 | root:x:0:0:root:/root:/bin/bash |
每一行表示一个用户,每一行的格式都是6个冒号共7列属性,其中有很多用户的某些列属性是留空的。
1 | 用户名:x:uid:gid:用户注释信息:家目录:使用的shell类型 |
用户的默认shell表示的是用户登录(如果允许登录)时的环境或执行的命令。例如shell为/bin/bash时,表示登录时就执行/bin/bash命令进入bash环境;shell为/sbin/nologin表示该用户不能登录,之所以不能登录不是因为指定了这个特殊的程序,而是由/sbin/nologin这个程序的功能实现的,假如修改Linux的源代码,将/sbin/nologin这个程序变成可登录,那么shell为/sbin/nologin时也是可以登录的。
密码文件/etc/shadow
/etc/shadow文件中存放的是用户的密码信息。该文件具有特殊属性,除了超级管理员,任何人都不能直接读取和修改该文件,而用户自身之所以能修改密码,则是因为passwd程序的suid属性,使得修改密码时临时提升为root权限。
该文件的格式大致如下:
1 | root:$6$hS4yqJu7WQfGlk0M$Xj/SCS5z4BWSZKN0raNncu6VMuWdUVbDScMYxOgB7mXUj./dXJN0zADAXQUMg0CuWVRyZUu6npPLWoyv8eXPA.::0:99999:7::: ftp:*:16659:0:99999:7::: nobody:*:16659:0:99999:7::: longshuai:$6$8LGe6Eh6$vox9.OF3J9nD0KtOYj2hE9DjfU3iRN.v3up4PbKKGWLOy3k1Up50bbo7Xii/Uti05hlqhktAf/dZFy2RrGp5W/:17323:0:99999:7::: |
组文件/etc/group和/etc/gshadow
大致知道有这么两个文件即可,至于文件中的内容无需关注。
/etc/group包含了组信息。每行一个组,每一行3个冒号共4列属性。
1 | root:x:0: longshuai:x:500: xiaofang:x:501:zhangsan,lisi |
/etc/gshadow包含了组密码信息
骨架目录/etc/skel
骨架目录中的文件是每次新建用户时,都会复制到新用户家目录里的文件。默认只有3个环境配置文件,可以修改这里面的内容,或者添加几个文件在骨架目录中,以后新建用户时就会自动获取到这些环境和文件。
1 | shell> ls –l -A /etc/skel |
删除家目录下这些文件,会导致某些设置出现问题。例如删除”.bashrc”这个文件,会导致提示符变异的问题,如
-bash-4.2$ [linshuai@server2 ~]$
要解决这个问题,只需拷贝一个正常的.bashrc文件到其家目录中即可。一般还会修改该文件的所有者和权限。
/etc/login.defs
设置用户帐号限制的文件。该文件里的配置对root用户无效。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs。
该文件有很多配置项,文件的默认内容只给出了一小部分,若想知道全部的配置项以及配个配置项的详细说明,可以”man 5 login.defs”查看。
1 | [root@xuexi ~]# less /etc/login.defs |
注意,/etc/login.defs中的设置控制的是shadow-utils包中的组件,也就是说,该组件中的工具执行操作时会读取该文件中的配置。该组件中包含下面的程序:
1 | /usr/bin/gpasswd :administer /etc/group and /etc/gshadow |
/etc/default/useradd
创建用户时的默认配置。useradd -D修改的就是此文件。
1 | [root@xuexi ~]# cat /etc/default/useradd |
man useradd的useradd -D选项介绍部分说明了这些项的意义
用户和组管理命令
useradd和adduser
1 | adduser是useradd的一个软链接。 |
示例:
1 | [root@xuexi ~]# useradd -D -e "2016-08-20" # 设置用户2016-08-20过期 |
useradd创建用户时,默认会自动创建一个和用户名相同的用户组,这是/etc/login.defs中的USERGROUP_ENAB变量控制的。
useradd创建普通用户时,不加任何和家目录相关的选项时,是否创建家目录是由/etc/login.defs中的CREATE_HOME变量控制的。
批量创建用户newusers
newusers用于批量创建或修改已有用户信息。在创建用户时,它会读取/etc/login.defs文件中的配置项。
newusers [options] [file]
newusers命令从file中或标准输入中读取要创建或修改用户的信息,文件中每行格式都一样,一行代表一个用户。格式如下:
1 | pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell |
newusers [options] [file]
选项说明:
-c:指定加密方法,可选DES,MD5,NONE,SHA256和SHA512
-r:创建一个系统用户
newusers首先尝试创建或修改所有指定的用户,然后将信息写入到user和group的文件中。如果尝试创建或修改用户过程中发生错误,则所有动作都将回滚,但如果在写入过程中发生错误,则写入成功的不会回滚,这将可能导致文件的不一致性。要检查用户、组文件的一致性,可以使用showdow-utils包提供的grpck和pwck命令。
示例:
1 | shell> cat /tmp/userfile |
groupadd
创建一个新组。
1 | groupadd [options] group |
修改密码passwd
修改密码的工具。默认passwd命令不允许为用户创建空密码。
passwd修改密码前会通过pam认证用户,pam配置文件中与此相关的设置项如下:
1 | passwd password requisite pam_cracklib.so retry=3 |
命令的用法如下:
1 | passwd options [username] |
批量修改密码chpasswd
以批处理模式从标准输入中获取提供的用户和密码来修改用户密码,可以一次修改多个用户密码。也就是说不用交互。适用于一次性创建了多个用户时为他们提供密码。
1 | chpasswd [-e -c] "user:passwd" |
chpasswd会读取/etc/login.defs中的相关配置,修改成功后会将密码信息写入到密码文件中。
该命令的修改密码的处理方式是先在内存中修改,如果所有用户的密码都能设置成功,然后才写入到磁盘密码文件中。在内存中修改过程中出错,则所有修改都回滚,但若在写入密码文件过程中出错,则成功的不会回滚。
示例:
修改单个用户密码。
1 | shell> echo "user1:123456" | chpasswd -c SHA512 |
修改多个用户密码,则提供的每个用户对都要分行。
1 | shell> echo -e 'usertest:123456\nusertest2:123456' | chpasswd |
更方便的是写入到文件中,每行一个用户密码对。
1 | shell> cat /tmp/passwdfile |
chage
chage命令主要修改或查看和密码时间相关的内容。具体的看man文档,可能用到的两个选项如下:
-l:列出指定用户密码相关信息
-E:指定帐户(不是密码)过期时间,所以是强锁定,如果指定为0,则立即过期,即直接锁定该用户
1 | [root@server2 ~]# chage -l zhangsan |
删除用户和组
userdel命令用于删除用户。
1 | userdel [options] login_name |
一般不直接删除家目录,即不用-r,可以vim /etc/passwd,将不需要的用户直接注释掉。
groupdel命令删除组。如果要删除的组是某用户的主组,需要先删除主组中的用户。
usermod
修改帐户属性信息。必须要确保在执行该命令的时候,待修改的用户没有在执行进程。
1 | usermod [options] login |
同样,还有groupmod修改组信息,用法非常简单,几乎也用不上,不多说了。
vipw和vigr
vipw和vigr是编辑用户和组文件的工具,vipw可以修改/etc/passwd和/etc/shadow,vigr可以修改/etc/group和/etc/gshadow,用这两个工具比较安全,在修改的时候会检查文件的一致性。
删除用户出错时,提示用户正在被进程占用。可以使用vi编辑/etc/paswd和/etc/shadow文件将该用户对应的行删除掉。也可以使用vipw和vipw -s来分别编辑/etc/paswd和/etc/shadow文件。它们的作用是一样的。
手动创建用户
手动创建用户的全过程:需要管理员权限。
•在/etc/group中添加用户所属组的相关信息。如果用户还有辅助组则在对应组中加入该用户作为成员。
•在/etc/passwd和/etc/shadow中添加用户相关信息。此时指定的家目录还不存在,密码不存在,所以/etc/shadow的密码位使用”!!”代替。
•创建家目录,并复制骨架目录中的文件到家目录中。
1 | shell> mkdir /home/user_name |
•修改家目录及子目录的所有者和属组。
1 | shell> chown -R user_name:user_name /home/user_name |
•修改家目录及子目录的权限。例如设置组和其他用户无任何权限但所有者有。
1 | shell> chmod -R 700 /home/user_name |
到此为止,用户已经创建完成了,只是没有密码,所以只能su,不能登录。
•生成密码。 ◦使用openssl passwd生成密码。但openssl passwd生成的密码只能是MD5算法的,很容易被破解
1 | # 生成使用md5算法的密码,然后将其复制到/etc/shadow对应的密码位 |
◦直接使用passwd命令创建密码
•测试手动创建的用户是否可以正确登录。
以下是全过程。
1 | shell> mkdir /tmp/12;cp /etc/group /etc/passwd /etc/shadow /tmp/12/ # 备份这些文件 |
测试使用userX是否可以登录。
如果是使用openssl passwd创建的密码。那么使用下面的方法将这部分密码替换到/etc/shadow中。
1 | shell> field=$(tail -1 /etc/shadow | cut -d":" -f2) |
其他用户相关命令
2.4.1 finger查看用户信息
从CentOS 6版本开始就没有该命令了,要先安装。
1 | shell> yum -y install finger |
2.4.2 id
1 | id username |
示例:
1 | shell> id root |
2.4.3 users
查看当前正在登陆的用户名。
2.4.4 last
查看最近登录的用户列表,其实last查看的是/var/log/wtmp文件。
-n 显示行数:列出最近几次登录的用户
1 |
|
2.4.5 lastb
查看谁尝试登陆过但没有登录成功的。即能够审核和查看谁曾经不断的登录,可能那就是黑客。
-n:只列出最近的n个尝试对象。
2.4.6 who和w
都是查看谁登录过,并干了什么事
w查看的信息比who多。
1 | shell> who |
其中w的第一行,分别表示当前时间,已开机时长,当前在线用户,过去1、5、15分钟的平均负载率。这一行和uptime命令获取的信息是完全一致的。
2.4.7 lastlog
可以查看登录的来源IP
-u 指定查看用户
1 | shell> lastlog|head -n 10 |