Linux 用户和组
一、定义
- 每个用户有 用户名 、 用户编号 (uid)、 所属组 及其 默认的 shell,可能还有 密码 、 家目录 、 附属组 、 注释信息 等。
- 每个组有 组名 、 组编号 (gid),组分为 主组 (primary group) 和辅助组 (secondary group) 两种,用户一定会属于某个主组,也可以同时加入多个辅助组。
用户的 gid 和 uid 可以不同,但一般情况下都会让它们保持一致,uid 和 gid 是唯一的,多个用户可以指定相同的 uid
在 Linux 系统中,用户分为三类:
- 超级管理员 :拥有对系统的完全控制权,uid 是 0,默认用户名为 root(可以更改,但是如非必要情况下不要更改它),可以修改、删除任何文件,运行任何命令,甚至可以在系统正常运行时删除所有文件系统,造成无法挽回的灾难,所以 root 用户也是系统里面最具危险性的用户,一般情况下,使用 root 用户登录系统时需要十分小心。
- 系统用户 :系统运行时必须有的用户(它具有某些特权),uid 范围从 1 到 999,用来运行特定的服务(比如使用系统用户 mysql 来运行 mysqld 服务),出于安全考虑,一般不能登录,所以它们的 shell 是 /sbin/nologin,而且大多数时候它们是没有家目录的。
- 普通用户 :实际使用用户,这类用户可以使用用户名及密码登录系统,权限受到限制的用户,默认只能执行 /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 命令。