用户和组的基本概念:
每个用户都有用户名且唯一编号:
uid=0时,超级用户root,
uid在201-999之间,系统用户,
uid在1000以上,普通用户
所属组及其默认的shell:
/sbin/nologin:系统用户
bin:普通用户
/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列属性,其中有很多用户的某些列属性是留空的。
用户名❌uid:gid:用户注释信息:家目录:使用的shell类型
- 第一列:用户名。注意两个个特殊的用户名,root、nobody
- 第二列:x。在以前老版本的系统上,第二列是存放用户密码的,但是密码和用户信息放在一起不便于管理(密钥要保证其特殊属性),所以后来将密码单独放在另一个文件/etc/shadow中,这里就都写成x了
- 第三列:uid
- 第四列:gid
- 第五列:用户注释信息。
- 第六列:用户家目录。注意root用户的家目录为/root
- 第七列:用户的默认shell,虽然叫shell,但其实可以是任意一个可执行程序或脚本。例如上面的/bin/bash、/sbin/nologin、/sbin/shutdown
密码文件/etc/shadow
/etc/shadow文件中存放的是用户的密码信息。该文件具有特殊属性,除了超级管理员,任何人都不能直接读取和修改该文件,而用户自身之所以能修改密码,则是因为passwd程序的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:::
- 第一列:用户名。
- 第二列:加密后的密码。但是这一列是有玄机的,有些特殊的字符表示特殊的意义。
①.该列留空,即"::",表示该用户没有密码。
②.该列为"!",即":!:",表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如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。不同于密码过期,密码过期后账户还有效,改密码后还能登录;帐号过期后帐号失效,修改密码重设密码都无法使用该帐号。
- 第九列:保留字段。
组文件/etc/group和/etc/gshadow(包含组密码信息)
/etc/group包含了组信息。每行一个组,每一行3个冒号共4列属性。
root:x:0: longshuai:x:500: xiaofang:x:501:zhangsan,lisi
- 第一列:组名。
- 第二列:占位符。
- 第三列:gid。
- 第四列:该组下的user列表,这些user成员以该组做为辅助组,多个成员使用逗号隔开。
/etc/login.defs
/etc/login.defs文件定义了与/etc/password和/etc/shadow配套的用户限制设定。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs。
./etc/login.defs的使用
# *REQUIRED* required
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail #创建用户时,要在目录/var/spool/mail中创建一个用户mail文件
#MAIL_FILE .mail
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
PASS_MAX_DAYS 99999 #密码最大有效期
PASS_MIN_DAYS 0 #两次修改密码的最小间隔时间
PASS_MIN_LEN 5 #密码最小长度,对于root无效
PASS_WARN_AGE 7 #密码过期前多少天开始提示
# Min/max values for automatic uid selection in useradd
#创建用户时不指定UID的话自动UID的范围
UID_MIN 500 #用户ID的最小值
UID_MAX 60000 #用户ID的最大值
# Min/max values for automatic gid selection in groupadd
#自动组ID的范围
GID_MIN 500 #组ID的最小值
GID_MAX 60000 #组ID的最大值
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD /usr/sbin/userdel_local #当删除用户的时候执行的脚本
#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME yes #使用useradd的时候是够创建用户目录
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077 #创建后用户的权限掩码
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes #用MD5加密密码
注意,/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 :输出所有用户或给定用户最近登录信息
/etc/default/useradd
创建用户时的默认配置。useradd -D修改的就是此文件。
[root@xuexi ~]# 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缓冲
passwd 命令用于修改用户密码,过期时间,认证信息等。
普通用户只能使用 passwd 命令修改自身的系统密码,而 root 管理员则有权限修改其他所有人的密码。更酷的是,root 管理员在 Linux 系统中
修改自己或他人的密码时不需要验证旧密码,这一点特别方便。既然 root 管理员可以修改其他用户的密码,就表示完全拥有该用户的管理权限。
passwd命令:
passwd-i:锁定密码禁止登录
passwd-u:解除锁定允许登录``
passwd-d:删除密码,使用空密码登录
passwd-e:强制用户下次登录修改密码
usermod 命令修改系统帐户文件来反映通过命令行指定的变化
usermod命令:
-a|--append ##把用户追加到某些组中,仅与-G选项一起使用
-c|--comment ##修改/etc/passwd文件第五段comment
-d|--home ##修改用户的家目录通常和-m选项一起使用
-e|--expiredate ##指定用户帐号禁用的日期,格式YY-MM-DD ``
-f|--inactive ##用户密码过期多少天后采用就禁用该帐号,0表示密码已过期就禁用帐号,-1表示禁用此功能,默认值是-1
-g|--gid ##修改用户的gid,改组一定存在
-G|--groups ##把用户追加到某些组中,仅与-a选项一起使用
-l|--login ##修改用户的登录名称
-L|--lock ##锁定用户的密码
-m|--move-home ##修改用户的家目录通常和-d选项一起使用
-s|--shell ##修改用户的shell
-u|--uid ##修改用户的uid,该uid必须唯一
-U|--unlock ##解锁用户的密码
userdel 是一个底层用于删除用户的工具,注意权限
userdel命令:
userdel-f:强制删除用户
组账号管理:
- 增加一个新的用户组使用groupadd命令
格式:groupadd 选项 用户组- -g:指定组,默认GID
- -o:指于上一个组
- 如果要删除一个已有的用户组,使用groupdel命令
格式:groupdel 用户组
修改用户组的属性使用groupmod命令
格式:groupmod 选项 用户组- -g:指定新的组标
- -n:该为新的组名
- 如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。
用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。