Linux 账户管理与权限设置
管理员的工作中,相当重要的一环就是“管理帐号”啦!因为整个系统都是你在管理的, 并且 所有一般用户的帐号申请,都必须要通过你的协助才行!所以你就必须要了解一下如何管理 好一个服务器主机的帐号啦! 在管理 Linux 主机的帐号时,我们必须先来了解一下 Linux 到 底是如何辨别每一个使用者的!
1 账户与群组
虽然我们登陆 Linux 主机的时候,输入的是我们的帐号,但是其实 Linux 主机并不会直接认识 你的“帐号名称”的,他仅认识 ID 啊 (ID 就是一组号码啦)。 由于计算机仅认识 0 与 1,所 以主机对于数字比较有概念的;至于帐号只是为了让人们容易记忆而已。
- /etc/passwd :存储账户信息
- /etc/shadow : 存储账户密码信息
- /etc/group :群组信息
- /etc/gshadow :群组密码信息
1.1 /etc/passwd 存储账户信息
虽然我们登陆 Linux 主机的时候,输入的是我们的帐号,但是其实 Linux 主机并不会直接认识 你的“帐号名称”的,他仅认识 ID(一组号码)。ID 与帐号的对应关系就在存储在 /etc/passwd 之中。
示例:
[root@VM-24-3-centos bin]# head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行好了, 你 可以明显的看出来,每一行使用“:”分隔开,共有七个:
- 帐号名称: 就是帐号啦!用来提供给对数字不太敏感的人类使用来登陆系统
- 密码: 早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序 都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据 给他改放到 /etc/shadow 中了。所以这里你会看到一个“ x ”
- UID: 这个就是使用者识别码
- GID: 这个与 /etc/group 有关
- 使用者信息说明栏: 这个字段基本上并没有什么重要用途,只是用来解释这个帐号的意 义而已!
- 主文件夹: 这是使用者的主文件夹,以上面为例, root 的主文件夹在 /root
- Shell: 我们在第十章 BASH 提到很多次,当使用者登陆系统后就会取得一个 Shell 来与 系统的核心沟通以进行使用者的操作任务。那为何默认 shell 会使用 bash 呢?就是在这 个字段指定的啰!这里比较需要注意的是,有一个 shell 可以用来替代成让帐号无法取得 shell 环境的登陆动作!那就是 /sbin/nologin 这个东西!这也可以用来制作纯 pop 邮件帐 号者的数据呢!
1.2 /etc/shadow 存储账户信息
道很多程序的运行都与权限有关,而权限与 UID/GID 有关!因此各程序当然需要读取 /etc/passwd 来了解不同帐号的权限。 因此 /etc/passwd 的权限需设置为 -rw-r--r-- 这样的情况, 虽然早期的密码也有加密过,但却放置到 /etc/passwd 的第二个字段上!这样一来很容 易被有心人士所窃取的, 加密过的密码也能够通过暴力破解法去 trial and error (试误) 找 出来! 因为这样的关系,所以后来发展出将密码移动到 /etc/shadow 这个文件分隔开来的技术, 而 且还加入很多的密码限制参数在 /etc/shadow 里头
shadow 同样以“:”作为分隔符号,如果数一数,会发现共有九个字段啊,这九个字 段的用途是这样的:
-
帐号名称: 由于密码也需要与帐号对应啊~因此,这个文件的第一栏就是帐号,必须要 与 /etc/passwd 相同才行!
-
密码: 这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密) 。虽然密码加过密,但是还是有被破解的风险,所以文件的默认权限是“-rw-------”或者是“---- ------”,亦即只有 root 才可以读写就是了。
-
最近更动密码的日期: 这个字段记录了“更动密码那一天”的日期
-
密码不可被更动的天数:(与第 3 字段相比) 第四个字段记录了:这个帐号的密码在最 近一次被更改后需要经过几天才可以再被变更!如果是 0 的话, 表示密码随时可以更动 的意思。这的限制是为了怕密码被某些人一改再改而设计的!如果设置为 20 天的话,那 么当你设置了密码之后, 20 天之内都无法改变这个密码呦!
-
密码需要重新变更的天数:(与第 3 字段相比) 经常变更密码是个好习惯!为了强制要 求使用者变更密码,这个字段可以指定在最近一次更改密码后, 在多少天数内需要再次 的变更密码才行。你必须要在这个天数内重新设置你的密码,否则这个帐号的密码将 会“变为过期特性”。 而如果像上面的 99999 (计算为 273 年) 的话,那就表示,呵呵, 密码的变更没有强制性之意。
-
密码需要变更期限前的警告天数:(与第 5 字段相比) 当帐号的密码有效期限快要到的 时候 (第 5 字段),系统会依据这个字段的设置,发出“警告”言论给这个帐号,提醒 他“再过 n 天你的密码就要过期了,请尽快重新设置你的密码
-
密码过期后的帐号宽限时间(密码失效日):(与第 5 字段相比) 密码有效日期为“更新 日期(第3字段)”+“重新变更日期(第5字段)”,过了该期限后使用者依旧没有更新密 码,那该密码就算过期了。 虽然密码过期但是该帐号还是可以用来进行其他工作的,包 括登陆系统取得 bash 。不过如果密码过期了, 那当你登陆系统时,系统会强制要求你 必须要重新设置密码才能登陆继续使用喔,这就是密码过期特性。
-
帐号失效日期: 这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设置。这 个字段表示: 这个帐号在此字段规定的日期之后,将无法再使用。 就是所谓的“帐号失 效”,此时不论你的密码是否有过期,这个“帐号”都不能再被使用
-
保留: 最后一个字段是保留的
示例:
root:$1$zmPnvDkj$.FjKuyRWkTQkny4AoLIWb1:19682:0:99999:7:::
bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7::
# 用户:root用户
# 密码:$1$zmPnvDkj$.FjKuyRWkTQkny4AoLIWb1
# 最近一次修改日期:19682
# 密码不可被更动的天数:0 随时可以被修改
# 密码需要重新变更的天数:99999
# 密码需要变更期限前的警告天数:7
# 密码过期后的帐号宽限时间:无
# 帐号失效日期:无
# 保留字段
1.3 /etc/group 群组信息
这个文件就是在记录 GID 与群组名称的对应了
这个文件每一行代表一个群组,也是以冒号“:”作为字段的分隔符号,共分为四栏,每一字段 的意义是:
-
群组名称: 就是群组名称啦!同样用来给人类使用的,基本上需要与第三字段的 GID 对 应。
-
群组密码: 通常不需要设置,这个设置通常是给“群组管理员”使用的,目前很少有这个 机会设置群组管理员啦! 同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会 存在一个“x”而已;
-
GID: 就是群组的 ID 啊。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是 由这里对应出来的!
-
此群组支持的帐号名称: 我们知道一个帐号可以加入多个群组,那某个帐号想要加入此 群组时,将该帐号填入这个字段即可。 举例来说,如果我想要让 dmtsai 与 alex 也加入 root 这个群组,那么在第一行的最后面加上“dmtsai,alex”,注意不要有空格, 使成为“ root:x:0:dmtsai,alex ”就可以啰~
示例:
[root@VM-24-3-centos bin]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
1.4 /etc/gshadow
个文件内同样还是使用冒号“:”来作为字段的分隔字符,而且你会发现,这个文件几乎与 /etc/group 一模一样啊!是这样没错~不过,要注意的大概就是第二个字段吧~第二个字段是 密码栏, 如果密码栏上面是“!”或空的时,表示该群组不具有群组管理员!至于第四个字段也 就是支持的帐号名称啰~ 这四个字段的意义为:
[root@VM-24-3-centos bin]# head -n 4 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
- 群组名称
- 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员
- 群组管理员的帐号 (相关信息在 gpasswd 中介绍)
- 有加入该群组支持的所属帐号与 /etc/group 内容相同!
以系统管理员的角度来说,这个 gshadow 最大的功能就是创建群组管理员啦! 那么什么是群 组管理员呢?由于系统上面的帐号可能会很多,但是我们 root 可能平时太忙碌,所以当有使 用者想要加入某些群组时, root 或许会没有空管理。此时如果能够创建群组管理员的话,那 么该群组管理员就能够将那个帐号加入自己管理的群组中! 可以免去 root 的忙碌啦!不过, 由于目前有类似 sudo 之类的工具, 所以这个群组管理员的功能已经很少使用了
1.5 有效群组
上面在 /etc/group 中比较重要的特色在于第四栏啦,因为每个使用者都可以拥有多个支持的群组,不过这里你或许会觉 得奇怪的,那就是:“假如我同时加入多个群组,那么我在作业的时候,到底是以那个群组为准?这时就需要有效群组(effective group)与初始群组(initial group)
1.5.1 有效群组(effective group)
还记得每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓 的“初始群组 (initial group) ”!也就是说,当使用者一登陆系统,立刻就拥有这个群组的相 关权限的意思
2 账户管理
2.1 新增一个使用者
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 使用者帐号名
- -D, --defaults:显示或更改默认的 useradd 配置
- -u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号;
- -g :后面接的那个群组名称就是我们上面提到的 initial group 啦~ 该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
- -G :后面接的群组名称则是这个帐号还可以加入的群组。 这个选项与参数会修改 /etc/group 内的相关数据喔!
- -M :强制!不要创建使用者主文件夹!(系统帐号默认值)
- -m :强制!要创建使用者主文件夹!(一般帐号默认值)
- -c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设置的啦~
- -d :指定某个目录成为主文件夹,而不要使用默认值。务必使用绝对路径!
- -r :创建一个系统的帐号,这个帐号的 UID 会有限制 (参考 /etc/login.defs) - - -s :后面接一个 shell ,若没有指定则默认是 /bin/bash 的啦~
- -e :后面接一个日期,格式为“YYYY-MM-DD”此项目可写入 shadow 第八字段, 亦即帐号失效日的设置项目啰;
- -f :后面接 shadow 的第七字段项目,指定密码是否会失效。0为立刻失效, -1 为永远不失效(密码只会过期而强制于登陆时重新设置而已。)
由于在 /etc/shadow 内仅会有密码参数而不会有加密过的密码数据,因此我们在创建使用者帐 号时, 还需要使用“ passwd 帐号 ”来给予密码才算是完成了使用者创建的流程。
passwd [选项] [账户]
- -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
2.1.1 示例:创建一个普通账户
[root@VM-24-3-centos ~]# useradd jelly #创建jelly账户
[root@VM-24-3-centos ~]# ll -d /home/jelly/
drwx------ 2 jelly jelly 4096 Nov 22 14:14 /home/jelly/ # 默认会创建使用者主文件夹,且权限为 700
[root@VM-24-3-centos ~]# grep jelly /etc/passwd /etc/shadow /etc/group
/etc/passwd:jelly:x:1001:1001::/home/jelly:/bin/bash
/etc/shadow:jelly:!!:19683:0:99999:7::: #还没有设置密码
/etc/group:jelly:x:1001: #默认会创建一个与帐号一模一样的群组名
2.1.2 示例:创建一个系统账户
[root@VM-24-3-centos ~]# ll -d /home/admin
#由于系统帐号主要是用来进行运行系统所需服务的权限设置, 所以 系统帐号默认都不会主动创建主文件夹的!
ls: cannot access '/home/admin': No such file or directory
[root@VM-24-3-centos ~]# grep admin /etc/passwd /etc/shadow /etc/group
#UID 的时候曾经说过一般帐号应该是 1000 号以后,那使用者自己创建的系统帐 号则一般是小于 1000 号以下的。 所以在这里我们加上 -r 这个选项以后,系统就会主动将帐 号与帐号同名群组的 UID/GID 都指定小于 1000 以下 本案例 uid=993 gid=990
etc/passwd:admin:x:993:990::/home/admin:/bin/bash
/etc/shadow:admin:!!:19683::::::
/etc/group:admin:x:990:
2.1.3 示例查看默认值
为何“ useradd jelly ”会主动在 /home/jelly 创建起使用者的 主文件夹?主文件夹内有什么数据且来自哪里?为何默认使用的是 /bin/bash 这个 shell ?为 何密码字段已经都规范好了 (0:99999:7 那一串)?呵呵!这就得要说明一下 useradd 所使 用的参考文件
[root@VM-24-3-centos ~]# useradd -D
GROUP=100 # 默认的群组
HOME=/home # 默认的主文件夹所在目录
INACTIVE=-1 # 密码失效日,在 shadow 内的第 7 栏
EXPIRE= #=帐号失效日,在 shadow 内的第 8 栏
SHELL=/bin/bash #默认的 shell
SKEL=/etc/skel #使用者主文件夹的内容数据参考目录
CREATE_MAIL_SPOOL=yes #是否主动帮使用者创建邮件信箱
2.2 私有群组机制/公共群组机制
2.2.1 私有群组机制
系统会创建一个与帐号一样的群组给使用者作为初始群组。 这种群组的设置机制会比较有保 密性,这是因为使用者都有自己的群组,而且主文件夹权限将会设置为 700 (仅有自己可进 入自己的主文件夹) 之故。使用这种机制将不会参考 GROUP=100 这个设置值。代表性的 distributions 有 RHEL, Fedora, CentOS 等;
2.2.1 公有群组机制
就是以 GROUP=100 这个设置值作为新建帐号的初始群组,因此每个帐号都属于 users 这个 群组, 且默认主文件夹通常的权限会是“ drwxr-xr-x ... username users ... ”,由于每个帐号都 属于 users 群组,因此大家都可以互相分享主文件夹内的数据之故。代表 distributions 如 SuSE等。
2.3 chage
除了使用 passwd -S 之外,有没有更详细的密码参数显示功能呢?有的!那就是 chage 了
- -l :列出该帐号的详细密码参数;
- -d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
- -E :后面接日期,修改 shadow 第八字段(帐号失效日),格式 YYYY-MM-DD
- -I :后面接天数,修改 shadow 第七字段(密码失效日期)
- -m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
- -M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
- -W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)
[root@VM-24-3-centos ~]# chage -l jelly
Last password change : Nov 23, 2023
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
2.3.1 使用技巧:强制用户第一次登录修改密码
[root@VM-24-3-centos ~]# useradd xiaoming #创建用户xiaoming
[root@VM-24-3-centos ~]# passwd xiaoming #设置密码(这里的密码也是xiaoming)
Changing password for user xiaoming.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.
[root@VM-24-3-centos ~]# chage -l xiaoming #查看账户信息
Last password change : Nov 23, 2023 #最后一次修改密码时间
Password expires : never #密码过期时间
Password inactive : never #密码失效时间
Account expires : never #账户过期时间
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@VM-24-3-centos ~]# chage -d 0 xiaoming #此帐号的密码创建时间会被改为 1970/1/1,会导致密码,账户失效。
[root@VM-24-3-centos ~]# chage -l xiaoming
Last password change : password must be changed # 密码失效
Password expires : password must be changed
Password inactive : password must be changed
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
## 这时登录账户后会强制要求修改密码
2.4 usermod
发现某些地方还可以 进行细部修改。 此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段 的数据, 不过,Linux 也有提供相关的指令让大家来进行帐号相关数据的微调呢~那就是 usermod
- -c :后面接帐号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些帐号的说明。
- -d :后面接帐号的主文件夹,即修改 /etc/passwd 的第六栏;
- -e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦!
- -f :后面接天数,为 shadow 的第七字段。
- -g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
- -G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~
- -a :与 -G 合用,可“增加次要群组的支持”而非“设置”喔!
- -l :后面接帐号名称。亦即是修改帐号名称, /etc/passwd 的第一栏!
- -s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
- -u :后面接 UID 数字啦!即 /etc/passwd 第三栏的数据;
- -L :暂时将使用者的密码冻结,让他无法登陆。其实仅改 /etc/shadow 的密码栏。
- -U :将 /etc/shadow 密码栏的 ! 拿掉,解冻啦
2.4.1 示例修改说明栏增加说明
[root@VM-24-3-centos ~]# grep jelly /etc/passwd # jell当前的信息
jelly:x:1001:1001::/home/jelly:/bin/bash # 说明栏没有说明(第五栏)
[root@VM-24-3-centos ~]# usermod jelly -c "jelly的账户" # 增加信息
[root@VM-24-3-centos ~]# grep jelly /etc/passwd
jelly:x:1001:1001:jelly的账户:/home/jelly:/bin/bash #说明栏有了说明信息
2.5 userdel
删除账户
用法:userdel [选项] 登录
- -f, --force 即使不属于此用户,也强制删除文件
- -h, --help 显示此帮助信息并推出
- -r, --remove 删除主目录和邮件池
- -R, --root CHROOT_DIR chroot 到的目录
- -P
- --prefix PREFIX_DIR prefix directory where are located the /etc/* files
- --extrausers Use the extra users database
- -Z, --selinux-user 为用户删除所有的 SELinux 用户映射
常见问题
xxx is not in the sudoers file. This incident will be reported
普通用户执行sudo 时返回 xxx is not in the sudoers file. This incident will be reported。这条信息意味着用户jelly试图使用sudo命令来获得超级用户权限,但是该用户并未被添加到sudoers文件中,因此没有执行sudo命令的权限。
-
原因:doers文件是Unix和Linux系统中用于定义哪些用户或用户组可以运行sudo命令,以及他们可以执行哪些命令的配置文件。如果一个用户不在这个文件中,他们就不能使用sudo命令。
-
解决方案:你需要将用户添加到sudoers文件中。这通常涉及到编辑该文件,这可以通过运行visudo命令来完成
- 输入sudo visudo命令并按回车键。你需要提供当前具有sudo权限的用户的密码。
- 在打开的编辑器中找到类似这样的行:root ALL=(ALL:ALL) ALL。
- 在该行下方添加一条新的规则,例如:jelly ALL=(ALL:ALL) ALL,这将允许用户jelly执行sudo命令。
- 保存并关闭文件。
评论区