第2章 系统用户/组管理

2.1 用户和组的基本概念

用户和组是操作系统中一种身份认证资源。

每个用户都有用户名、用户的唯一编号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(centos 6),出于安全考虑,它们一般不用来登录,所以它们的shell一般是/sbin/nologin,而且大多数时候它们是没有家目录的。

(3). 普通用户

普通用户是权限受到限制的用户,默认只能执行/bin、/usr/bin、/usr/local/bin和自身家目录下的命令。它们的uid从500开始。尽管普通用户权限收到限制,但是它对自身家目录下的文件是有所有权限的。

超级管理员和其他类型的用户,它们的命令提示符是不一样的。uid=0的超级管理员,命令提示符是"#",其他的为"$"。

默认root用户的家目录为/root,其他用户的家目录一般在/home下以用户名命名的目录中,如longshuai这个用户的家目录为/home/longshuai。当然,家目录是可以自定义位置和名称的。

2.2 用户和组管理相关的文件

2.2.1 用户文件/etc/passwd

/etc/passwd文件里记录的是操作系统中用户的信息,这里面记录了几行就表示系统中有几个系统用户。它的格式大致如下:


root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

nginx:x:498:499:Nginx web server:/var/lib/nginx:/sbin/nologin

longshuai:x:1000:1000::/home/longshuai:/bin/bash

每一行表示一个用户,每一行的格式都是6个冒号共7列属性,其中有很多用户的某些列属性是留空的。

用户名:x:uid:gid:用户注释信息:家目录:使用的shell类型

  • 第一列:用户名。注意两个个特殊的用户名,root、nobody
  • 第二列:x。在以前老版本的系统上,第二列是存放用户密码的,但是密码和用户信息放在一起不便于管理(密钥要保证其特殊属性),所以后来将密码单独放在另一个文件/etc/shadow中,这里就都写成x了
  • 第三列:uid
  • 第四列:gid
  • 第五列:用户注释信息。
  • 第六列:用户家目录。注意root用户的家目录为/root
  • 第七列:用户的默认shell,虽然叫shell,但其实可以是任意一个可执行程序或脚本。例如上面的/bin/bash、/sbin/nologin、/sbin/shutdown

用户的默认shell表示的是用户登录(如果允许登录)时的环境或执行的命令。例如shell为/bin/bash时,表示登录时就执行/bin/bash命令进入bash环境;shell为/sbin/nologin表示该用户不能登录,之所以不能登录不是因为指定了这个特殊的程序,而是由/sbin/nologin这个程序的功能实现的,假如修改Linux的源代码,将/sbin/nologin这个程序变成可登录,那么shell为/sbin/nologin时也是可以登录的。

2.2.2 密码文件/etc/shadow

/etc/shadow文件中存放的是用户的密码信息。该文件具有特殊属性,除了超级管理员,任何人都不能直接读取和修改该文件,而用户自身之所以能修改密码,则是因为该文件的suid属性,使得修改密码时临时提升为root权限。

该文件的格式大致如下:

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:::

每一行表示一个用户密码的属性,有8个冒号共9列属性。该文件更详细的信息看wiki:https://en.wikipedia.org/wiki/Passwd#Shadow_file

第一列:用户名。

第二列:加密后的密码。但是这一列是有玄机的,有些特殊的字符表示特殊的意义。

  • ①.该列留空,即"::",表示该用户没有密码。
  • ②.该列为"!",即":!:",表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如ssh key的方式,su的方式。
  • ③.该列为"*",即":*:",也表示该用户被锁,和"!"效果是一样的。
  • ④.该列以"!"或"!!"开头,则也表示该用户被锁。
  • ⑤.该列为"!!",即":!!:",表示该用户从来没设置过密码。
  • ⑥.如果格式为"$id$salt$hashed",则表示该用户密码正常。其中$id$的id表示密码的加密算法,$1$表示使用MD5算法,$2a$表示使用Blowfish算法,"$2y$"是另一算法长度的Blowfish,"$5$"表示SHA-256算法,而"$6$"表示SHA-512算法,可见上面的结果中都是使用sha-512算法的。$5$和$6$这两种算法的破解难度远高于MD5。$salt$是加密时使用的salt,$hashed才是真正的密码部分。

第三列:从1970年1月1日到上次密码修改经过的时间(天数)。通过计算现在离1970年1月1日的天数减去这个值,结果就是上次修改密码到现在已经经过了多少天,即现在的密码已经使用了多少天。

第四列:密码最少使用期限(天数)。省略或者0表示不设置期限。例如,刚修改完密码又想修改,可以限制多久才能再次修改

第五列:密码最大使用期限(天数)。超过了它不一定密码就失效,可能下一个字段设置了过期后的宽限天数。设置为空时将永不过期,后面设置的提醒和警告将失效。root等一些用户的已经默认设置为了99999,表示永不过期。如果值设置小于最短使用期限,用户将不能修改密码。

第六列:密码过期前多少天就开始提醒用户密码将要过期。空或0将不提醒。

第七列:密码过期后宽限的天数,在宽限时间内用户无法使用原密码登录,必须改密码或者联系管理员。设置为空表示没有强制的宽限时间,可以过期后的任意时间内修改密码。

第八列:帐号过期时间。从1970年1月1日开始计算天数。设置为空帐号将永不过期,不能设置为0。不同于密码过期,密码过期后账户还有效,改密码后还能登录;帐号过期后帐号失效,修改密码重设密码都无法使用该帐号。

第九列:保留字段。

2.2.3 组文件/etc/group和/etc/gshadow

大致知道有这么两个文件即可,至于文件中的内容无需关注。

/etc/group包含了组信息。每行一个组,每一行3个冒号共4列属性。

root:x:0:
longshuai:x:500:
xiaofang:x:501:zhangsan,lisi

第一列:组名。

第二列:占位符。

第三列:gid。

第四列:该组下的user列表,这些user成员以该组做为辅助组,多个成员使用逗号隔开。

/etc/gshadow包含了组密码信息

2.2.4 骨架目录/etc/skel

骨架目录中的文件是每次新建用户时,都会复制到新用户家目录里的文件。默认只有3个环境配置文件,可以修改这里面的内容,或者添加几个文件在骨架目录中,以后新建用户时就会自动获取到这些环境和文件。

shell> ls –l -A /etc/skel
total 12
-rw-r--r--. 1 root root 18 Oct 16 2014 .bash_logout
-rw-r--r--. 1 root root 176 Oct 16 2014 .bash_profile
-rw-r--r--. 1 root root 124 Oct 16 2014 .bashrc

删除家目录下这些文件,会导致某些设置出现问题。例如删除".bashrc"这个文件,会导致提示符变异的问题,如下右图。

要解决这个问题,只需拷贝一个正常的.bashrc文件到其家目录中即可。一般还会修改该文件的所有者和权限。

2.2.5 /etc/login.defs

设置用户帐号限制的文件。该文件里的配置对root用户无效。

如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs。

该文件有很多配置项,文件的默认内容只给出了一小部分,若想知道全部的配置项以及配个配置项的详细说明,可以"man 5 login.defs"查看。

[[email protected] ~]# less /etc/login.defs
#QMAIL_DIR Maildir             # QMAIL_DIR是Qmail邮件的目录,所以可以不设置它
MAIL_DIR /var/spool/mail    # 默认邮件根目录,即信箱
#MAIL_FILE .mail                # mail文件的格式是.mail

# Password aging controls:
PASS_MAX_DAYS 99999 # 密码最大有效期(天)
PASS_MIN_DAYS 0         # 两次密码修改之间最小时间间隔
PASS_MIN_LEN 5           # 密码最短长度
PASS_WARN_AGE 7       # 密码过期前给警告信息的时间

# 控制useradd创建用户时自动选择的uid范围
# 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

# 控制groupadd创建组时自动选择的gid范围
# 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

# 设置此项后,在删除用户时,将自动删除用户拥有的at/cron/print等job
#USERDEL_CMD /usr/sbin/userdel_local

# 控制useradd添加用户时是否默认创建家目录,useradd -m选项会覆盖此处设置
CREATE_HOME yes

# 设置创建家目录时的umask值,若不指定则默认为022
UMASK 077

# 设置此项表示当组中没有成员时自动删除该组
# 且useradd是否同时创建同用户名的主组。(该文件中并没有此项说明,来自于man useradd中-g选项的说明)
USERGROUPS_ENAB yes

# 设置用户和组密码的加密算法
ENCRYPT_METHOD SHA512

注意,/etc/login.defs中的设置控制的是shadow-utils包中的组件,也就是说,该组件中的工具执行操作时会读取该文件中的配置。该组件中包含下面的程序:

/usr/bin/gpasswd      :administer /etc/group and /etc/gshadow
/usr/bin/newgrp       :log in to a new group,可用来修改gid,哪怕是正在登陆的会话也可以修改
/usr/bin/sg           :execute command as different group ID
/usr/sbin/groupadd    :添加组
/usr/sbin/groupdel    :删除组
/usr/sbin/groupmems   :管理当前用户的主组中的成员,root用户则可以指定要管理的组
/usr/sbin/groupmod    :modify a group definition on the system
/usr/sbin/grpck       :verify integrity of group files
/usr/sbin/grpconv     :无视它
/usr/sbin/grpunconv   :无视它
/usr/sbin/pwconv      :无视它
/usr/sbin/pwunconv    :无视它
/usr/sbin/adduser     :是useradd的一个软链接,添加用户
/usr/sbin/chpasswd    :update passwords in batch mode
/usr/sbin/newusers    :update and create new users in batch
/usr/sbin/pwck        :verify integrity of passsword files
/usr/sbin/useradd     :添加用户
/usr/sbin/userdel     :删除用户
/usr/sbin/usermod     :重定义用户信息
/usr/sbin/vigr        :edit the group and shadow-group file
/usr/sbin/vipw        :edit the password and shadow-password file
/usr/bin/lastlog      :输出所有用户或给定用户最近登录信息

2.2.6 /etc/default/useradd

创建用户时的默认配置。useradd -D修改的就是此文件。

[[email protected] ~]# cat /etc/default/useradd

# useradd defaults file

GROUP=100       # 在useradd使用-N或/etc/login.defs中USERGROUPS_ENAB=no时表示创建用户时不创建同用户名的主组(primary group),

# 此时新建的用户将默认以此组为主组,网上关于该设置的很多说明都是错的,具体可看man useradd的-g选项或useradd -D的-g选项

HOME=/home     # 把用户的家目录建在/home中

INACTIVE=-1     # 是否启用帐号过期设置(是帐号过期不是密码过期),-1表示不启用

EXPIRE=           # 帐号过期时间,不设置表示不启用

SHELL=/bin/bash # 新建用户默认的shell类型

SKEL=/etc/skel    # 指定骨架目录,前文的/etc/skel就在这里

CREATE_MAIL_SPOOL=yes # 是否创建用户mail缓冲

man useradd的useradd -D选项介绍部分说明了这些项的意义。

时间: 2024-10-18 03:20:57

第2章 系统用户/组管理的相关文章

第2章 系统用户/组管理(2) su和sudo

本文目录: 2.1 su 2.2 sudo 2.2.1 /etc/sudoers文件 2.2.2 sudo和sudoedit命令 2.1 su 切换用户或以指定用户运行命令. 使用su可以指定运行命令的身份(user/group/uid/gid). 为了向后兼容,su默认不会改变当前目录,且仅设置HOME和SHELL这两个环境变量(若目标用户非root,则还设置USER和LOGNAME环境变量).推荐使用--login选项(即"-"选项)避免环境变量混乱. su [options...

Linux查找过滤及用户/组管理

1.        列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. who | cut –d ' ' –f1 | uniq 2.        取出最后登录到当前系统的用户的相关信息. who | tail -1 who | head -1 3.        取出当前系统上被用户当作其默认shell的最多的那个shell cut –d : -f7 /etc/passwd | uniq –c | sort  -n | tail -1 4.        将

SaltStack与Python配合实现系统用户自动化管理

背景需求: 随意业务的发展,服务器数据也是越来越多,开发人员,运维人员也是越来越多.这时候如果有大量的人需要登录到服务器的话,那么我们就很有必要对用户进行管理.传统的方式是登录到每台服务器创建一个用户,工作重复性太大,如果有 1000台怎么办?甚至有的公司用户都不创建直接让所有人以root登录,这样更危险!!!,那么聪明一点的运维人员会写个创建用户的脚本来实现半自动化的创建用户.这些方法都不适合管理大批量的机器,接下来给大家带来其于SaltStack和Python脚本实现的自动化用户管理. 实现

第五章-系统用户与用户组管理

#-----------------------认识/etc/passwd和/etc/shadow--------------------- 这两个文件可以说是linux系统中最重要的文件之一.如果没有这两个文件或者这两个文件出问题,则你是无法正常登录linux系统的. [[email protected] ~]# cat /etc/passwd | head root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin dae

第二章:用户登录管理模块

本章简介 1.项目分层 2.创建MyHibernateSessionFactory 3.设计用户接口和实现类 4.设计所有Action父类 5.设计用户Action类 6.页面调用 7.完成显示登录成功用户名和注销功能 8.显示报错信息 1.项目分层 实体层(模型层):entity包 学生类.用户类 数据库层(模型层):db包 接口层(模型层):service包 接口实现层(模型层):service.impl包 动作层(控制层):action包 Jsp页面(视图层):整个项目所有的JSP页面 2

用户和密码配置文件、用户管理、组管理

用户和密码配置文件 useradd 用户名:增加一个用户. /etc/passwd:用户的配置文件,包含了所有用户的信息.每新增一个用户,都会在这个文件中增加一行这个用户的信息. 一共有7列,每一列之间用:分隔开.每一列代表的含义如下: 第一列:用户名 第二列:密码(用x代替,真正的密码存放在/etc/shadow中,只有root用户可以访问) 第三列:UID(普通用户的UID从1000开始,之前的都是系统用户,root用户的UID为0.系统用户用于管理相关服务,登录状态均为/sbin/nolo

【Linux下用户和组管理】 𬤺

原文: http://blog.gqylpy.com/gqy/315 "> ##### 创建用户--useradd . 命令格式:useradd [参数] 用户名 useradd也可写成adduser . 参数如下 -u 指定UID号 -d 指定宿主目录 -e 指定生效时间 -g 指定基本组 -G 指定附加组 -M 不建立宿主目录 -s 指定shell -r 用于删除用户时,同时删除宿主目录 -f 一般用于强制删除用户 . 补充命令: echo '密码' | passwd --stdin

第六章 用户帐号和组管理

第六章 用户帐号和组管理 第一节 用户分类 超级用户 root:x:0:0:root:/root:/bin/bash root x 0 0 root /root /bin/bash 用户名为root x表示有密码 用户ID 组ID 与用户相关的注释 用户主目录 登录系统后执行的第一个程序 普通用户 thomas:x:1000:1000:thomas:/home/thomas:/bin/bash thomas x 1000 1000 thomas /home/thomas /bin/bash 用户

第四章:用户和组管理

第四章:用户和组管理 1.基本概念 1.1.UID&GID Linux是通过UID和GID号来识别用户和组.对某个文件或程序的访问也是以UID和GID为基础.一个执行中的程序继承了调用它的用户的权利和访问权限. 1.2.Linux用户类型 根用户(0):UID为0的用户,能够访问系统任何文件和程序,而不论root根用户是否有权限.root用户通常称为"超级用户" 系统/服务用户(1-999):UID为1-999.系统保留账号,或者某些服务才能使用的的账号 普通用户(大于1000