鸟哥的linux私房菜——第十三章学习(Linux 帐号管理与 ACLL 权限设置)

时间:2022-04-26 19:28:44

第十三章、Linux 帐号管理与 ACLL 权限设置

1.0)、使用者识别码: UID GID

UID :User ID

GID :group ID

[root@study ~]# ll -d /home/dmtsai

drwx------. 17 dmtsai dmtsai 4096 Jul 17 19:51 /home/dmtsai

Linux 系统上面的使用者如果需要登陆主机以取得 shell 的环境来工作时,他需要如何进行呢? 首先,他必须要在计算机前面利用tty1~tty6 的终端机提供的 login 接口,并输入帐号与密码后才能够登陆。

如果是通过网络的话,那至少使用者就得要学习 ssh 功能了。

那么你输入帐号密码后,系统帮你处理了什么呢?

1、先寻找、etc/passwd里面是否有你输入的账号,如果没有则跳出;如果有则将该账号对应的UID和GID读出来。此外还有账号的主文件夹与shell设置也一并读出;

2、再来则是核对密码表,Linux会进入/etc/shadow里找到账号与对应的UID,然后核对刚才输入的密码,看是否相同;

3、如果都ok,则进入shell。

所以,当你要登陆你的 Linux 主机的时候,那个 /etc/passwd 与 /etc/shadow 两个文件就必须要让系统读取。

/etc/passwd 文件结构

该文件每一行都代表一个帐号,有几行就代表有几个帐号在你的系统中! 不过需要特别留意的是,里头很多帐号本来就是系统正常运行所必须要的,我们可以简称他为系统帐号, 例如 bin, daemon, adm, nobody 等等,这些帐号请不要随意的杀掉他呢。

我们读取 /etc/passwd 主要就是来了解不同帐号的权限。故,/etc/passwd 的权限需设置为 -rw-r--r--。

  • UID:

id范围

该ID使用者特性

0(系统管理员)

UID=0表示该账号是“系统管理员”,当你要让其他的帐号名称也具有 root 的权限时,将该帐

号的 UID 改为 0 即可。故,一部系统上面的系统管理员不见得只有 root。

1-999(系统账号)

默认 1000 以下的数字让给系统作为保留帐号只是一个习惯。

1~200:由 distributions 自行创建的系统帐号;

201~999:若使用者有系统帐号需求时,可以使用的帐号 UID。

1000~60000(可登陆帐号)

给一般使用者用的

  • shell

当使用者登陆系统后就会取得一个 Shell 来与系统的核心沟通以进行使用者的操作任务。默认shell 会使用 bash。

/etc/shadow 文件结构

shadow 以“:”作为分隔符号,共有九个字段,分别表达的含义是:

  • 帐号名称
  • 密码(加密)
  • 最近更动密码的日期(可通过 echo $(($date --date="2015/05/04" +%s/86400+1))算出来)

其中,2015/05/04 为你想要计算的日期,86400 为每一天的秒数, %s 为 1970/01/01 以来的累积总秒数。 由于 bash 仅支持整数,因此最终需要加上 1 补齐 1970/01/01 当天。

  • 密码不可被更动的天数(与第 3 字段相比)
  • 密码需要重新变更的天数(与第 3 字段相比)
  • 密码需要变更期限前的警告天数(与第 5 字段相比)
  • 密码过期后的帐号宽限时间(密码失效日)(与第 5 字段相比)
  • 帐号失效日期
  • 保留

实例说明:

dmtsai:$6$M4IphgNP2TmlXaSS$B418YFroYxxmm....:16559:5:60:7:5:16679:

对应的解析:

  • 账号为dmtsai;
  • 密码加密后密文;
  • 此帐号最近一次更动密码的日期是 2015/05/04 (16559);
  • 能够再次修改密码的时间是 5 天以后,也就是 2015/05/09 以前 dmtsai 不能修改自己的密码;
  • 由于密码过期日期定义为 60 天后,亦即累积日数为: 16559+60=16619,经过计算得到此日数代表日期为 2015/07/03。这表示:“使用者必须要在 2015/05/09 (前 5 天不能改) 到 2015/07/03 之间的 60 天限制内去修改自己的密码,若 2015/07/03 之后还是没有变更密码时,该密码就宣告为过期”了!
  • 警告日期设为 7 天,亦即是密码过期日前的 7 天,在本例中则代表 2015/06/26 ~ 2015/07/03 这七天;
  • 如果该帐号一直到 2015/07/03 都没有更改密码,那么密码就过期了。但是由于有 5 天的宽限天数, 因此 dmtsai 在 2015/07/08 前都还可以使用旧密码登陆主机;
  • 如果使用者在 2015/07/03 以前变更过密码,那么第 3 个字段的那个 16559 的天数就会跟着改变;
  • 无论使用者如何动作,到了 16679 (大约是 2015/09/01 左右) 该帐号就失效了。

由于 shadow 有这样的重要性,因此可不能随意修改。

一般用户的密码忘记了:这个最容易解决,请系统管理员帮忙,利用 root 的身份使用 passwd 指令来处理即可;

root 密码忘记了:无法使用 root 的身份登陆,但我们知道 root 的密码在 /etc/shadow 当中。所以,有两种方式进入Linux:(1)重新开机进入单人维护模式(第十九章)后,系统会主动的给予 root 权限的 bash 接口,此时再以 passwd 修改密码即可;(2)以 Live CD 开机后挂载根目录去修改 /etc/shadow,将里面的 root 的密码字段清空, 再重新开机后root 将不用密码即可登陆。

1.1)、关于群组:/etc/group /etc/gshadow

groups: 有效与支持群组的观察

newgrp: 有效群组的切换

以系统管理员的角度来说,这个 gshadow 最大的功能就是创建群组管理员啦! 由于目前有类似 sudo 之类的工具, 所以这个群组管理员的功能已经很少使用了。

2.1)、帐号管理

 l 新增与移除使用者:useradd, userdel(root)

帐号可以使用 useradd 来新建使用者,密码的给予则使用 passwd 这个指令

CentOS 会帮助我们进行:

  • 在 /etc/passwd 里面创建一行与帐号相关的数据,包括创建 UID/GID/主文件夹等;
  • 在 /etc/shadow 里面将此帐号的密码相关参数填入,但是尚未有密码;
  • 在 /etc/group 里面加入一个与帐号名称一模一样的群组名称;
  • 在 /home 下面创建一个与帐号同名的目录作为使用者主文件夹,且权限为 700。
[root@study ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\
> [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 使用者帐号名 范例二:假设我已知道我的系统当中有个群组名称为 users ,且 UID 1500 并不存在,
请用 users 为初始群组,以及 uid 为 1500 来创建一个名为 vbird2 的帐号
[root@study ~]# useradd -u 1500 -g users vbird2
[root@study ~]# ll -d /home/vbird2
drwx------. 3 vbird2 users 74 Jul 20 21:52 /home/vbird2
[root@study ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:1500:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:16636:0:99999:7:::
# 看一下,UID 与 initial group 确实改变成我们需要的了!

删除使用者:

与使用者相关的文件有:

  • 使用者帐号/密码相关参数:/etc/passwd, /etc/shadow
  • 使用者群组相关参数:/etc/group, /etc/gshadow
  • 使用者个人文件数据: /home/username, /var/spool/mail/username..
[root@study ~]# userdel [-r] username
选项与参数:
-r :连同使用者的主文件夹也一起删除
范例一:删除 vbird2 ,连同主文件夹一起删除
[root@study ~]# userdel -r vbird2

l 密码设置passwd

[root@study ~]# passwd [--stdin] [帐号名称] <==所有人均可使用来改自己的密码
[root@study ~]# passwd [-l] [-u] [--stdin] [-S] \
> [-n 日数] [-x 日数] [-w 日数] [-i 日期] 帐号 <==root 功能 范例一:请 root 给予 vbird2 密码
[root@study ~]# passwd vbird2
Changing password for user vbird2.
New UNIX password: <==这里直接输入新的密码,屏幕不会有任何反应
BAD PASSWORD: The password is shorter than 8 characters <==密码太简单或过短的错误!
Retype new UNIX password: <==再输入一次同样的密码
passwd: all authentication tokens updated successfully. <==竟然还是成功修改了! 范例二:用 vbird2 登陆后,修改 vbird2 自己的密码
[vbird2@study ~]$ passwd <==后面没有加帐号,就是改自己的密码!
Changing password for user vbird2.
Changing password for vbird2
(current) UNIX password: <==这里输入“原有的旧密码”
New UNIX password: <==这里输入新密码
BAD PASSWORD: The password is shorter than 8 characters <==密码太短!不可以设置!重新想
New password: <==这里输入新想的密码
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
# 同样的,密码设置在字典里面找的到该字串,所以也是不建议!无法通过,再想新的!
New UNIX password: <==这里再想个新的密码来输入吧
Retype new UNIX password: <==通过密码验证!所以重复这个密码的输入
passwd: all authentication tokens updated successfully. <==有无成功看关键字

特别注意:在root下要帮一般帐号创建密码需要使用“passwd帐号”的格式,使用“passwd”表示修改root自己的密码。

新的 distributions 是使用较严格的 PAM 模块来管理密码,这个管理的机制写在/etc/pam.d/passwd 当中。而该文件与密码有关的测试模块就是使用:pam_cracklib.so,这个模块会检验密码相关的信息, 并且取代 /etc/login.defs 内的 PASS_MIN_LEN 的设置。

此外,还有一些更为简洁的指令来帮助修改密码:

范例三:使用 standard input 创建用户的密码
[root@study ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.

但是也有缺点,就是是这个密码会保留在指令中, 未来若系统被攻破,人家可以在 /root/.bash_history 找到这个密码。

查看密码参数:chage

[root@study ~]# chage [-ldEImMW] 帐号名
选项与参数:
-l :列出该帐号的详细密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-E :后面接日期,修改 shadow 第八字段(帐号失效日),格式 YYYY-MM-DD
-I :后面接天数,修改 shadow 第七字段(密码失效日期)
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期) 范例一:列出 vbird2 的详细密码参数
[root@study ~]# chage -l vbird2
Last password change : Jul 20, 2015
Password expires : Sep 18, 2015
Password inactive : Sep 28, 2015
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7

2.2)、主机的细部权限规划:ACL 的使用

前提:从第五章开始,我们就一直强调 Linux 的权限概念是非常重要的! 但是传统的权限仅有三种身份 (owner, group, others) 搭配三种权限 (r,w,x) 而已,并没有办法单纯的针对某一个使用者或某一个群组来设置特定的权限需求! 此时就得要使用 ACL 这个机制

ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限设置。

ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。

他主要可以针对几个项目:

  • 使用者 (user):可以针对使用者来设置权限;
  • 群组 (group):针对群组为对象来设置其权限;
  • 默认属性 (mask):还可以针对在该目录下在创建新文件/目录时,规范新数据的默认权限;

【ACL暂时就先介绍这么多吧】

2.3)、使用者身份切换

即是一般账号和root账号的切换

两种方式:

l 以“ su - ”直接将身份变成 root 即可,但是这个指令却需要 root 的密码,也就是说,如果你要以 su 变成 root 的话,你的一般使用者就必须要有 root 的密码才行;

用“ su ”也可以,但是与“ su -”的主要区别是,该指令切换后,user还是一般使用者,并不是 完全的root,有些指令不能直接使用。所以要想完完全全变为root账户,还是加上“-”。

l 以“ sudo 指令 ”执行 root 的指令串,由于 sudo 需要事先设置妥当,且 sudo 需要输入使用者自己的密码, 因此多人共管同一部主机时,sudo 要比 su 来的好喔!至少 root 密码不会流出去!

但是,并非所有人都能够执行sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够执行 sudo 这个指令。

2.4)、PAM模块

PAM (Pluggable Authentication Modules, 嵌入式模块) 机制:PAM 可以说是一套应用程序接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。

PAM 是一个独立的 API 存在,只要任何程序有需求时,可以向 PAM 发出验证要求的通知, PAM 经过一连串的验证后,将验证的结果回报给该程序,然后该程序就能够利用验证的结果来进行可登陆或显示其他无法使用的讯息。 这也就是说,你可以在写程序的时候将 PAM 模块的功能加入,就能够利用 PAM 的验证功能啰。

PAM 用来进行验证的数据称为模块 (Modules),

我们以 passwd 这个指令的调用 PAM 来说明。

当你执行 passwd 后,这支程序调用 PAM 的流程是:

1. 使用者开始执行 /usr/bin/passwd 这支程序,并输入密码;

2. passwd 调用 PAM 模块进行验证;

3. PAM 模块会到 /etc/pam.d/ 找寻与程序 (passwd) 同名的配置文件;

4. 依据 /etc/pam.d/passwd 内的设置,引用相关的 PAM 模块逐步进行验证分析;

5. 将验证结果 (成功、失败以及其他讯息) 回传给 passwd 这支程序;

6. passwd 这支程序会根据 PAM 回传的结果决定下一个动作 (重新输入新密码或者通过验证!)

2.5)、查询使用者:w,who,last,lastlog

目前已登陆在系统上面的使用者:who/w

2.6)、大量创建帐号范本

[root@study ~]# vim accountadd.sh
#!/bin/bash
# This shell script will create amount of linux login accounts for you.
# 1. check the "accountadd.txt" file exist? you must create that file manually.
# one account name one line in the "accountadd.txt" file.
# 2. use openssl to create users password.
# 3. User must change his password in his first login.
# 4. more options check the following url:
# 0410accountmanager.html#manual_amount
# 2015/07/22 VBird
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# 0. userinput
usergroup="" # if your account need secondary group, add here.
pwmech="openssl" # "openssl" or "account" is needed.
homeperm="no" # if "yes" then I will modify home dir permission to 711 # 1. check the accountadd.txt file
action="${1}" # "create" is useradd and "delete" is userdel.
if [ ! -f accountadd.txt ]; then
  echo "There is no accountadd.txt file, stop here."
  exit 1
fi [ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt) for username in ${usernames}
do
  case ${action} in
    "create")
    [ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp=""
    useradd ${usegrp} ${username} # 新增帐号
    [ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username}
    echo ${usepw} | passwd --stdin ${username} # 创建密码
    chage -d 0 ${username} # 强制登陆修改密码
    [ "${homeperm}" == "yes" ] && chmod 711 /home/${username}
    echo "username=${username}, password=${usepw}" >> outputpw.txt
    ;;
  "delete")
    echo "deleting ${username}"
    userdel -r ${username}
    ;;
  *)
    echo "Usage: $0 [create|delete]"
    ;;
  esac
done

接下来只要创建 accountadd.txt 这个文件即可!

[root@study ~]# vim accountadd.txt
std01
std02
std03
std04
std05
[root@study ~]# sh accountadd.sh create
Changing password for user std01.
passwd: all authentication tokens updated successfully.
....(后面省略)....

【重点回顾】

  1. Linux 操作系统上面,关于帐号与群组,其实记录的是 UID/GID 的数字而已;
  2. 使用者的帐号/群组与 UID/GID 的对应,参考 /etc/passwd 及 /etc/group 两个文件;
  3. /etc/passwd 文件结构以冒号隔开,共分为七个字段,分别是“帐号名称、密码、UID、GID、全名、主文件夹、shell”;
  4. UID 只有 0 与非为 0 两种,非为 0 则为一般帐号。一般帐号又分为系统帐号 (1~999) 及可登陆者帐号 (大于 1000);
  5. 帐号的密码已经移动到 /etc/shadow 文件中,该文件权限为仅有 root 可以更动。该文件分为九个字段,内容为“ 帐号名称、加密密码、密码更动日期、密码最小可变动日期、密码最大需变动日期、密码过期前警告日数、密码失效天数、 帐号失效日、保留未使用”;
  6. 使用者可以支持多个群组,其中在新建文件时会影响新文件群组者,为有效群组。而写入 /etc/passwd 的第四个字段者, 称为初始群组。
  7. 与使用者创建、更改参数、删除有关的指令为:useradd, usermod, userdel等,密码创建则为 passwd;
  8. 与群组创建、修改、删除有关的指令为:groupadd, groupmod, groupdel 等;
  9. 群组的观察与有效群组的切换分别为:groups 及 newgrp 指令;
  10. useradd 指令作用参考的文件有: /etc/default/useradd, /etc/login.defs, /etc/skel/ 等等;
  11. 观察使用者详细的密码参数,可以使用“ chage -l 帐号 ”来处理;
  12. 使用者自行修改参数的指令有: chsh, chfn 等,观察指令则有: id, finger 等;
  13. ACL 的功能需要文件系统有支持,CentOS 7 默认的 XFS 确实有支持 ACL 功能!
  14. ACL 可进行单一个人或群组的权限管理,但 ACL 的启动需要有文件系统的支持;
  15. ACL 的设置可使用 setfacl ,查阅则使用 getfacl ;
  16. 身份切换可使用 su ,亦可使用 sudo ,但使用 sudo 者,必须先以 visudo 设置可使用的指令;
  17. PAM 模块可进行某些程序的验证程序!与 PAM 模块有关的配置文件位于 /etc/pam.d/* 及 /etc/security/*;
  18. 系统上面帐号登陆情况的查询,可使用 w, who, last, lastlog 等;
  19. 线上与使用者交谈可使用 write, wall,离线状态下可使用 mail 传送邮件!

Over......