Linux 用户和组

admin
admin 2019年11月08日
  • 在其它设备中阅读本文章

一、定义

  • 每个用户有 用户名 用户编号 (uid) 所属组 及其 默认的 shell,可能还有 密码 家目录 附属组 注释信息 等。
  • 每个组有 组名 组编号 (gid),组分为 主组 (primary group) 和辅助组 (secondary group) 两种,用户一定会属于某个主组,也可以同时加入多个辅助组。
    用户的 gid 和 uid 可以不同,但一般情况下都会让它们保持一致,uid 和 gid 是唯一的,多个用户可以指定相同的 uid

在 Linux 系统中,用户分为三类:

  1. 超级管理员 :拥有对系统的完全控制权,uid 是 0,默认用户名为 root(可以更改,但是如非必要情况下不要更改它),可以修改、删除任何文件,运行任何命令,甚至可以在系统正常运行时删除所有文件系统,造成无法挽回的灾难,所以 root 用户也是系统里面最具危险性的用户,一般情况下,使用 root 用户登录系统时需要十分小心。
  2. 系统用户 :系统运行时必须有的用户(它具有某些特权),uid 范围从 1 到 999,用来运行特定的服务(比如使用系统用户 mysql 来运行 mysqld 服务),出于安全考虑,一般不能登录,所以它们的 shell 是 /sbin/nologin,而且大多数时候它们是没有家目录的。
  3. 普通用户 :实际使用用户,这类用户可以使用用户名及密码登录系统,权限受到限制的用户,默认只能执行 /bin、/usr/bin、/usr/local/bin 和自身家目录下的命令,uid 从 1000 开始。尽管普通用户权限受到限制,但是它对自身家目录下的文件是有所有权限的。
    其实 1~65534 之间的帐号并没有不同,也就是除了 0 之外,其他的 UID 并没有不一样 ,预设 1000 以下给系统作为保留帐号只是一个习惯。不过,一般来说, 1~99 会保留给系统预设的帐号,另外 100~999 则保留给一些服务来使用,剩余的给一般使用者用的。linux 系统现在已经可以支持 4294967295 (2^32-1)的 UID
    默认 root 用户的家目录为 /root,其他用户的家目录一般在 /home 下以用户名命名的目录中,如 longshuai 这个用户的家目录为 /home/longshuai,当然,家目录是可以自定义的。

二、查看

1、用户文件

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

root:x:0:0::/root:/bin/bash
nobody:x:65534:65534:Nobody:/:/usr/bin/nologin
dbus:x:81:81:System Message Bus:/:/usr/bin/nologin
bin:x:1:1::/:/usr/bin/nologin
daemon:x:2:2::/:/usr/bin/nologin
mail:x:8:12::/var/spool/mail:/usr/bin/nologin
ftp:x:14:11::/srv/ftp:/usr/bin/nologin
.....
rtkit:x:133:133:RealtimeKit:/proc:/usr/bin/nologin
sddm:x:969:969:Simple Desktop Display Manager:/var/lib/sddm:/usr/bin/nologin
kdkj3:x:1000:1000::/home/kdkj3:/usr/bin/zsh
git:x:967:967:git daemon user:/:/usr/bin/git-shell

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

  • 第一列:用户名。注意两个个特殊的用户名,root、nobody
  • 第二列:x。在古老版本系统上是存放用户密码的,后来为了安全将密码放在另一个文件 /etc/shadow 中,这里就都写成 x 了
  • 第三列:uid。
  • 第四列:gid。
  • 第五列:用户注释信息。
  • 第六列:用户家目录。注意 root 用户的家目录为 /root
  • 第七列:用户默认 shell。虽然叫 shell,但其实可以是任意一个可执行程序或脚本。例如 /bin/bash、/sbin/nologin、/sbin/shutdown

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

root:$6$88aAfvezQn4/BLJx$hhlOahhsNzdNp2LHgphuavZQQMBsD5ilv5OcLd5No9XIVqz5HO5bHMG0YKr.lZANOroRJpmUkIbQ8U1Pln/Py0:18167::::::
nobody:!!:18167:::
bin:!!:18167::::::
......
kdkj3:$6$ru3c8AfmEW68Ol2C$EpNGOEeZEmLUdBhiJAud0.FtH3c4aY35y6Mm/BEPx3pkNepsKq/KO2PZqBSk7kBFJRJ695MNBzGvP4yqZKKwG0:18167:0:99999:7:::
git:!!:18167::::::

每一行表示一个用户密码的属性,有 8 个冒号共 9 列属性。

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

    • 该列留空,即”::”,表示该用户没有密码。
    • 该列为”!”,即”:!:”,表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如 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、组文件

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

root:x:0:root
adm:x:999:daemon
wheel:x:998:kdkj3
  • 第一列:组名。
  • 第二列:占位符 x。类似于用户文件的密码
  • 第三列:gid。
  • 第四列:该组下的 user 列表,这些 user 成员以该组做为辅助组,多个成员使用逗号隔开。

/etc/gshadow 包含了组密码信息,一般不设置用户组密码。

3、骨架目录

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

4、用户限制文件

/etc/login.defsh 是设置用户帐号限制(例如密码长度)的文件,该文件里的配置对 root 用户无效。
如果 /etc/shadow 文件里有相同的选项,则以 /etc/shadow 里的设置为准,也就是说 /etc/shadow 的配置优先级高于 /etc/login.defs。
该文件有很多配置项,文件的默认内容只给出了一小部分,若想知道全部的配置项以及配个配置项的详细说明,可以 man 5 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

4、用户默认配置

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

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缓冲

三、管理

1、创建

useradd 命令可以创建一个新用户,adduser 是 useradd 的一个软链接。useradd 创建用户时,默认会自动创建一个和用户名相同的用户组,这是 /etc/login.defs 中的 USERGROUP_ENAB 变量控制的,是否创建家目录是由 /etc/login.defs 中的 CREATE_HOME 变量控制的(如果不加任何和家目录相关的选项时)。

用法:useradd [选项] 登录名
      useradd -D
      useradd -D [选项]

选项:
  -b, --base-dir BASE_DIR       新账户的主目录的基目录
      --btrfs-subvolume-home    use BTRFS subvolume for home directory
  -c, --comment COMMENT         新账户的 GECOS 字段
  -d, --home-dir HOME_DIR       新账户的主目录
  -D, --defaults                显示或更改默认的 useradd 配置
  -e, --expiredate EXPIRE_DATE  新账户的过期日期
  -f, --inactive INACTIVE       新账户的密码不活动期
  -g, --gid GROUP               新账户主组的名称或 ID
  -G, --groups GROUPS           新账户的附加组列表
  -h, --help                    显示此帮助信息并退出
  -k, --skel SKEL_DIR           使用此目录作为骨架目录
  -K, --key KEY=VALUE           不使用 /etc/login.defs 中的默认值
  -l, --no-log-init             不要将此用户添加到最近登录和登录失败数据库
  -m, --create-home             创建用户的主目录
  -M, --no-create-home          不创建用户的主目录
  -N, --no-user-group           不创建同名的组
  -o, --non-unique              允许使用重复的 UID 创建用户
  -p, --password PASSWORD       加密后的新账户密码
  -r, --system                  创建一个系统账户
  -R, --root CHROOT_DIR         chroot 到的目录
  -P, --prefix PREFIX_DIR       prefix directory where are located the /etc/* files
  -s, --shell SHELL             新账户的登录 shell
  -u, --uid UID                 新账户的用户 ID
  -U, --user-group              创建与用户同名的组

newusers 命令可以批量创建或修改已有用户信息。在创建用户时,它会读取 /etc/login.defs 文件中的配置项。

用法:newusers [选项] 文件

选项:
  -h, --help                    显示此帮助信息并退出
  -r, --system                  创建系统帐号
  -R, --root CHROOT_DIR         chroot 到的目录

它从 file 中或标准输入中读取要创建或修改用户的信息,文件中每行格式都一样,一行代表一个用户。格式如下:

pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell
  • pw_name:用户名,若不存在则新创建,否则修改已存在用户的信息
  • pw_passwd:用户密码,该项使用明文密码,在修改或创建用户时会按照指定的算法自动对其进行加密转换
  • pw_uid:指定 uid,留空则自动选择 uid。如果该项为已存在的用户名,则使用该用户的 uid,但不建议这么做,uid 应尽量保证唯一性
  • pw_gid:用户主组的 gid 或组名。若给定组不存在,则自动创建组。若留空,则创建同用户名的组,gid 将自动选择
  • pw_gecos:用户注释信息
  • pw_dir:指定用户家目录,若不存在则自动创建。留空则不创建。注意,newusers 命令不会递归创建父目录,父目录不存在时将会给出信息,但 newusers 命令仍会继续执行以完成创建剩下的用户,所以这些错误的用户家目录需要手动去创建
  • pw_shell:指定用户的默认 shell

groupadd 命令用于创建一个新组。

用法:groupadd [选项] 组

选项:
  -f, --force                   如果组已经存在则成功退出
                                并且如果 GID 已被使用则取消 -g
  -g, --gid GID                 为新组使用 GID
  -h, --help                    显示此帮助信息并退出
  -K, --key KEY=VALUE           不使用 /etc/login.defs 中的默认值
  -o, --non-unique              允许创建有重复 GID 的组
  -p, --password PASSWORD       为新组使用此加密过的密码
  -r, --system                  创建一个系统账户
  -R, --root CHROOT_DIR         chroot 到的目录
  -P, --prefix PREFIX_DIR       directory prefix

2、修改

passwd 是修改密码的工具,默认 passwd 命令不允许为用户创建空密码,passwd 修改密码前需要认证用户。

用法:passwd [选项] [登录名]

选项:
  -a, --all                     报告所有帐户的密码状态
  -d, --delete                  删除指定帐户的密码
  -e, --expire                  强制使指定帐户的密码过期
  -h, --help                    显示此帮助信息并退出
  -k, --keep-tokens             仅在过期后修改密码
  -i, --inactive INACTIVE       密码过期后设置密码不活动为 INACTIVE
  -l, --lock                    锁定指定的帐户
  -n, --mindays MIN_DAYS        设置到下次修改密码所须等待的最短天数
                                为 MIN_DAYS
  -q, --quiet                   安静模式
  -r, --repository REPOSITORY   在 REPOSITORY 库中改变密码
  -R, --root CHROOT_DIR         chroot 到的目录
  -S, --status                  报告指定帐户密码的状态
  -u, --unlock                  解锁被指定帐户
  -w, --warndays WARN_DAYS      设置过期警告天数为 WARN_DAYS
  -x, --maxdays MAX_DAYS        设置到下次修改密码所须等待的最多天数
                                为 MAX_DAYS

批量修改密码用 chpasswd 命令,以批处理模式从标准输入中获取提供的用户和密码来修改用户密码,可以一次修改多个用户密码。也就是说不用交互,适用于一次性创建了多个用户时为他们提供密码。

用法:chpasswd [选项] "user:passwd"

选项:
  -c, --crypt-method METHOD     加密方法(NONE DES MD5 SHA256 SHA512 中的一个)
  -e, --encrypted               提供的密码已经加密
  -h, --help                    显示此帮助信息并退出
  -m, --md5                     使用 MD5 算法加密明文密码
  -R, --root CHROOT_DIR         chroot 到的目录
  -s, --sha-rounds              使用 SHA* 加密算法的轮数

该命令的修改密码的处理方式是先在内存中修改,如果所有用户的密码都能设置成功,然后才写入到磁盘密码文件中。在内存中修改过程中出错,则所有修改都回滚,但若在写入密码文件过程中出错,则成功的不会回滚。

chage 命令主要修改或查看和密码时间相关的内容。

用法:chage [选项] 登录名

选项:
  -d, --lastday 最近日期        将最近一次密码设置时间设为“最近日期”
  -E, --expiredate 过期日期     将帐户过期时间设为“过期日期”
  -I, --inactive INACITVE       过期 INACTIVE 天数后,设定密码为失效状态
  -l, --list                    显示帐户年龄信息
  -m, --mindays 最小天数        将两次改变密码之间相距的最小天数设为“最小天数”
  -M, --maxdays MAX_DAYS        set maximum number of days before password
                                change to MAX_DAYS
  -R, --root CHROOT_DIR         chroot 到的目录
  -W, --warndays 警告天数       将过期警告天数设为“警告天数”

usermod 修改帐户属性信息。必须要确保在执行该命令的时候,待修改的用户没有在执行进程。

用法:usermod [选项] 登录名

选项:
  -c, --comment COMMENT         GECOS 字段的新值
  -d, --home HOME_DIR           用户的新主目录
  -e, --expiredate EXPIRE_DATE  设定帐户过期的日期为 EXPIRE_DATE
  -f, --inactive INACTIVE       过期 INACTIVE 天数后,设定密码为失效状态
  -g, --gid GROUP               强制使用 GROUP 为新主组
  -G, --groups GROUPS           新的附加组列表 GROUPS
  -a, --append GROUP            将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用户
  -l, --login NEW_LOGIN         新的登录名称
  -L, --lock                    锁定用户帐号
  -m, --move-home               将家目录内容移至新位置 (仅于 -d 一起使用)
  -o, --non-unique              允许使用重复的(非唯一的) UID
  -p, --password PASSWORD       将加密过的密码 (PASSWORD) 设为新密码
  -R, --root CHROOT_DIR         chroot 到的目录
  -P, --prefix PREFIX_DIR       prefix directory where are located the /etc/* files
  -s, --shell SHELL             该用户帐号的新登录 shell
  -u, --uid UID                 用户帐号的新 UID
  -U, --unlock                  解锁用户帐号
  -v, --add-subuids FIRST-LAST  添加子 UID 范围
  -V, --del-subuids FIRST-LAST  移除子 UID 范围
  -w, --add-subgids FIRST-LAST  添加子 GID 范围
  -W, --del-subgids FIRST-LAST  移除子 GID 范围

同样,还有 groupmod 修改组信息

3、删除

userdel 命令用于删除用户。

用法:userdel [选项] 登录名

选项:
-r:递归删除家目录,默认不删除家目录。
-f:强制删除用户,即使这个用户正处于登录状态。同时也会强制删除家目录。

一般不直接删除家目录,即不用 -r,可以 vim /etc/passwd,将不需要的用户直接注释掉。
groupdel 命令删除组。如果要删除的组是某用户的主组,需要先删除主组中的用户。

4、手动创建用户

  • 在 /etc/group 中添加用户所属组的相关信息。如果用户还有辅助组则在对应组中加入该用户作为成员。
  • 在 /etc/passwd 和 /etc/shadow 中添加用户相关信息。此时指定的家目录还不存在,密码不存在,所以 /etc/shadow 的密码位使用”!!”代替。
  • 创建家目录,并复制骨架目录中的文件到家目录中。
    只是没有密码,所以只能 su,不能登录,可使用 passwd 命令创建密码。

用户和组的信息保存在 /etc/group、/etc/passwd、/etc/shadow 中,直接修改文件和使用命令更改是一样的

四、其他有关的命令

1、id

id username
-u:得到uid
-n:得到用户名而不是uid
-z:无任何空白字符输出模式,不能在默认的格式下使用。

2、users

查看当前正在登陆的用户名。

3、last

查看最近登录的用户列表,其实 last 查看的是 /var/log/wtmp 文件。

用法:
 last [选项] [<用户名>...] [<tty>...]

显示上次登录用户的列表。

选项:
 -<数字>              显示行数
 -a, --hostlast       最后一列显示主机名
 -d, --dns            将 IP 号转换回主机名
 -F, --file <文件>    用指定文件代替 /var/log/wtmp
 -F, --fulltimes      打印完整的登录和注销时间和日期
 -i, --ip             以数字和点的形式显示 IP 号
 -n, --limit <数字>   要显示的行数
 -R, --nohostname     不显示主机名字段
 -s, --since <时间>   显示从指定时间起的行
 -t, --until <时间>   显示到指定时间为止的行
 -p, --present <时间> 显示在指定时间谁在场(present)
 -w, --fullnames      显示完整的用户名和域名
 -x, --system         显示系统关机项和运行级别更改

4、lastb

查看谁尝试登陆过但没有登录成功的。即能够审核和查看谁曾经不断的登录,可能那就是黑客。

5、who 和 w

都是查看谁登录过,并干了什么事,w 查看的信息比 who 多。

6、lastlog

用户最后远程登录的记录,可以查看登录的来源 IP。

7、su

切换用户或以指定用户运行命令,为了向后兼容,su 默认不会改变当前目录。若 su 没有给定任何参数,将默认以 root 身份运行交互式的 shell

8、sudo

sudo -u USERNAME COMMAND

sudo 可以让一个用户以某个身份 (如 root 或其他用户) 执行某些命令,它隐含的执行方式是切换到指定用户再执行命令,因为涉及到了用户的切换,所以环境变量是否重置是需要设置的。
默认情况下,系统只有 root 用户可以执行 sudo 命令。需要 root 用户编辑 sudo 的配置文件 /etc/sudoers,才可以授权其他普通用户执行 sudo 命令。