20220915 13. Linux 帐号管理与 ACL 权限设置

13.1 Linux 的帐号与群组

13.1.1 使用者识别码: UID 与 GID

Linux 主机并不会直接认识 你的“帐号名称”的,他仅认识 ID 啊 (ID 就是一组号码啦)

每个登陆的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)

每一个文件都会有所 谓的拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的帐号与群组名称再显示出来

# 1\. 先察看一下,系统里面有没有一个名为 dmtsai 的用户?
id dmtsai

ll -d /home/dmtsai

# 2\. 修改一下,将刚刚我们的 dmtsai 的 1000 UID 改为 2000 看看
vim /etc/passwd
ll -d /home/dmtsai

# 3\. 记得将刚刚的 2000 改回来!
ll -d /home/dmtsai

13.1.2 使用者帐号

Linux 系统上面的使用者如果需要登陆主机以取得 shell 的环境来工作时,你输入帐号密码后,系统帮你处理了什么呢?

  1. 先找寻 /etc/passwd 里面是否有你输入的帐号?如果没有则跳出,如果有的话则将该帐号 对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该帐号的主文件夹与 shell 设置 也一并读出;

  2. 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的帐号与 UID,然 后核对一下你刚刚输入的密码与里头的密码是否相符?

  3. 如果一切都 OK 的话,就进入 Shell 控管的阶段啰!

跟使用者帐号有关的有两个非常重要的文件,一个是管理使用者 UID/GID 重要参数的 /etc/passwd ,一个则是专门管理密码相关数据的 /etc/shadow

这两个文件,详细的说明可 以参考 man 5 passwd 及 man 5 shadow

/etc/passwd 文件结构

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

head -n 5 /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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行

每一行使用“:”分隔开,共有七个内容:

  1. 帐号名称:就是帐号啦!用来提供给对数字不太敏感的人类使用来登陆系统的!需要用 来对应 UID 喔。例如 root 的 UID 对应就是 0 (第三字段)

  2. 密码: 早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序 都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据 给他改放到 /etc/shadow 中了。所以这里你会看到一个“ x ”

  3. UID: 这个就是使用者识别码

    id 范围 该 ID 使用者特性
    0(系统管理员) 当 UID 是 0 时,代表这个帐号是“系统管理员”! 所以当你要让其他的帐号名称也具有 root 的权限时,将该帐号的 UID 改为 0 即可。 这也就是说,一部系统上面的系统管理员不见得只有 root 喔! 不过,很不建议有多个帐号的 UID 是 0 啦~容易让系统管理员混乱!
    1~999(系统帐号) 保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有不一样。默认 1000 以下的数字让给系统作为保留帐号只是一个习惯。
    由于系统上面启动的网络服务或背景服务希望使用较小的权限去运行,因此不希望使用 root 的身份去执行这些服务, 所以我们就得要提供这些运行中程序的拥有者帐号才行。这些系统帐号通常是不可登陆的, 所以才会有 /sbin/nologin 这个特殊的 shell 存在。
    根据系统帐号的由来,通常这类帐号又约略被区分为两种:
    1~200:由 distributions 自行创建的系统帐号
    201~999:若使用者有系统帐号需求时,可以使用的帐号 UID
    1000~60000(可登陆帐号) 给一般使用者用的。事实上,目前的 linux 核心 (3.10.x 版)已经可以支持到 4294967295 (2^32-1) 这么大的 UID 号码喔!
  4. GID: 这个与 /etc/group 有关

  5. 使用者信息说明栏:这个字段基本上并没有什么重要用途,只是用来解释这个帐号的意 义而已!不过,如果您提供使用 finger 的功能时, 这个字段可以提供很多的讯息

  6. 主文件夹: 这是使用者的主文件夹,默认的使用者主文件夹在 /home/yourIDname

  7. Shell:当使用者登陆系统后就会取得一个 Shell 来与 系统的核心沟通以进行使用者的操作任务。默认 shell 会使用 bash ,有一个 shell 可以用来替代成让帐号无法取得 shell 环境的登陆动作!那就是 /sbin/nologin

/etc/shadow 文件结构

head -n 4 /etc/shadow

root:$1$BVthfeTI$z/hX.lT6twiUK6n6UCd7h0:18953:0:99999:7:::
bin:*:18143:0:99999:7:::
daemon:*:18143:0:99999:7:::
adm:*:18143:0:99999:7:::

shadow 同样以“:”作为分隔符号,共有九个字段

  1. 帐号名称:必须要 与 /etc/passwd 相同

  2. 密码:经过编码的密码 (加密)

  3. 最近更动密码的日期:天数,计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1 月 1 日则为 366

    echo $(($(date --date="2015/05/04" +%s)/86400+1))
    
  4. 密码不可被更动的天数:(与第 3 字段相比)

  5. 密码需要重新变更的天数:(与第 3 字段相比)

  6. 密码需要变更期限前的警告天数:(与第 5 字段相比)

  7. 密码过期后的帐号宽限时间(密码失效日):(与第 5 字段相比)

  8. 帐号失效日期

  9. 保留

密码忘记了怎么办?

  • 一般用户的密码忘记了:请系统管理员帮忙,利用 root 的身份使用 passwd 指令来处理

  • root 密码忘记了:root 的密码在 /etc/shadow 当中,因此你可以使用各种可行的方法开机进入 Linux 再去修改,将里面的 root 的密码字段清空, 再重新开机后 root 将不用密码即可登 陆!登陆后再赶快以 passwd 指令去设置 root 密码

shadow 是使用哪种加密的机制

authconfig --test | grep hashing

13.1.3 关于群组: 有效与初始群组、groups, newgrp

/etc/group 与 /etc/gshadow

/etc/group 文件结构

head -n 4 /etc/group

root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:

这个文件每一行代表一个群组,也是以冒号“:”作为字段的分隔符号,共分为四栏,每一字段 的意义是:

  1. 群组名称:需要与第三字段的 GID 对应

  2. 群组密码: 通常不需要设置,这个设置通常是给“群组管理员”使用的,目前很少有这个 机会设置群组管理员啦! 同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会 存在一个“x”而已;

  3. GID: 就是群组的 ID 。/etc/passwd 第四个字段使用的 GID 对应的群组名,就是 由这里对应出来的

  4. 此群组支持的帐号名称: 我们知道一个帐号可以加入多个群组,那某个帐号想要加入此 群组时,将该帐号填入这个字段即可。 举例来说,如果我想要让 dmtsai 与 alex 也加入 root 这个群组,那么在第一行的最后面加上“dmtsai,alex”,注意不要有空格

几个文件中重点是 /etc/passwd 啦,其他相关的数据都是 根据这个文件的字段去找寻出来的

账号相关文件之间的 UID/GID 与口令相关性示意图

注意,新版的 Linux 中,初始群组的用户群已经不会加入在第四个字段

有效群组(effective group)与初始群组(initial group)

usermod -a -G users dmtsai    # 先设置好次要群组

grep dmtsai /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dmtsai:x:1002:1002::/home/dmtsai:/bin/bash
/etc/group:users:x:100:dmtsai    # 次要群组的设置
/etc/group:dmtsai:x:1002:        # 因为是初始群组,所以第四字段不需要填入帐号
/etc/gshadow:users:::dmtsai        # 次要群组的设置
/etc/gshadow:dmtsai:!::

非 initial group 的其他群组,必须要在 /etc/group 这个文件中,将帐号加入相应组的第四栏

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

查看所有支持的群组

groups

第一个输出的群组即为有效群组 (effective group)

创建一个新文件,那么这个 文件的群组就是有效群组

通常有效群组的作用是在新建文件啦

newgrp: 有效群组的切换

使用 newgrp 是有限制的,那就是你想要 切换的群组必须是你已经有支持的群组。

newgrp users
groups

newgrp 指令可以变更目前使用者的有效群组, 而且是另外以一个 shell 来提供这个功能的

newgrp 的运行示意图

要加入一个群组有两个方式,一个是 通过系统管理员 (root) 利用 usermod 帮你加入,如果 root 太忙了而且你的系统有设置群 组管理员,那么你可以通过群组管理员以 gpasswd 帮你加入他所管理的群组中

/etc/gshadow

head -n 4 /etc/gshadow

root:::
bin:::
daemon:::
sys:::

这四个字段的意义为:

  1. 群组名称

  2. 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员

  3. 群组管理员的帐号

  4. 有加入该群组支持的所属帐号 (与 /etc/group 内容相同!)

gshadow 最大的功能就是创建群组管理员

那么什么是群 组管理员呢?由于系统上面的帐号可能会很多,但是我们 root 可能平时太忙碌,所以当有使 用者想要加入某些群组时, root 或许会没有空管理。此时如果能够创建群组管理员的话,那 么该群组管理员就能够将那个帐号加入自己管理的群组中!

不过, 由于目前有类似 sudo 之类的工具, 所以这个群组管理员的功能已经很少使用了。

13.2 帐号管理

13.2.1 新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel

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

useradd

useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 使用者帐号名 

选项与参数: 
-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 为永远不失效(密码只会过期而强制于登陆时重新设置而已。)
# 范例一:完全参考默认值创建一个使用者,名称为 vbird1
useradd vbird1

grep vbird1 /etc/passwd /etc/shadow /etc/group

CentOS 默认会帮我们:

  • 在 /etc/passwd 里面创建一行与帐号相关的数据,包括创建 UID/GID/主文件夹等;

  • 在 /etc/shadow 里面将此帐号的密码相关参数填入,但是尚未有密码;

  • 在 /etc/group 里面加入一个与帐号名称一模一样的群组名称;

  • 在 /home 下面创建一个与帐号同名的目录作为使用者主文件夹,且权限为 700

# 范例二:假设我已知道我的系统当中有个群组名称为 users ,且 UID 1500 并不存在, 请用 users 为初始群组,以及 uid 为 1500 来创建一个名为 vbird2 的帐号
useradd -u 1500 -g users vbird2
# 范例三:创建一个系统帐号,名称为 vbird3
useradd -r vbird3

系统帐号默认都不会主动创建主文件夹

useradd 参考文件

显示 useradd 的默认值

useradd -D


GROUP=100       <==默认的群组
HOME=/home      <==默认的主文件夹所在目录
INACTIVE=-1         <==密码失效日,在 shadow 内的第 7 栏 
EXPIRE=             <==帐号失效日,在 shadow 内的第 8 栏 
SHELL=/bin/bash      <==默认的 shell 
SKEL=/etc/skel        <==使用者主文件夹的内容数据参考目录
CREATE_MAIL_SPOOL=yes       <==是否主动帮使用者创建邮件信箱(mailbox)

这个数据其实是由 /etc/default/useradd 调用出来的

针对群组的角度有两种不同的机制, 这两种机制分别是:

  • 私有群组机制:系统会创建一个与帐号一样的群组给使用者作为初始群组

  • 公共群组机制:就是以 GROUP=100 这个设置值作为新建帐号的初始群组,因此每个帐号都属于 users 这个 群组

除了这些基本的帐号设置值之外, UID/GID 还有密码参数又是在哪里参考的呢?那就得要看 一下 /etc/login.defs

MAIL_DIR        /var/spool/mail    <==用户默认邮件信箱放置目录

PASS_MAX_DAYS   99999    <==/etc/shadow 内的第 5 栏,多久需变更口令日数
PASS_MIN_DAYS   0    <==/etc/shadow 内的第 4 栏,多久不可重新配置口令日数
PASS_MIN_LEN    5    <==口令最短的字符长度,已被 pam 模块取代,失去效用!
PASS_WARN_AGE   7    <==/etc/shadow 内的第 6 栏,过期前会警告的日数

UID_MIN         1000    <==使用者最小的 UID,意即小于 1000 的 UID 为系统保留
UID_MAX       60000        <==使用者能够用的最大 UID
SYS_UID_MIN     201     <==保留给使用者自行设置的系统帐号最小值 UID 
SYS_UID_MAX     999     <==保留给使用者自行设置的系统帐号最大值 UID
GID_MIN         1000    <==使用者自定义组的最小 GID,小于 1000 为系统保留
GID_MAX       60000        <==使用者自定义组的最大 GID
SYS_GID_MIN     201     <==保留给使用者自行设置的系统帐号最小值 GID 
SYS_GID_MAX     999     <==保留给使用者自行设置的系统帐号最大值 GID

CREATE_HOME     yes    <==在不加 -M 及 -m 时,是否主动创建用户家目录?
UMASK           077     <==用户家目录创建的 umask ,因此权限会是 700
USERGROUPS_ENAB yes     <==使用 userdel 删除时,是否会删除初始群组
MD5_CRYPT_ENAB yes      <==口令是否经过 MD5 的加密机制处理

passwd

passwd [--stdin] [帐号名称]     <==所有人均可使用来改自己的密码 
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 帐号    <==root 功能 

选项与参数: 
--stdin :可以通过来自前一个管线的数据,作为密码输入,对 shell script 有帮助! 
-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效; 
-u :与 -l 相对,是 Unlock 的意思! 
-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。 
-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数 
-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码 
-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数 
-i :后面接“日期”,shadow 的第 7 字段,密码失效日期
# 范例一:请 root 给予 vbird2 密码
[root@study ~]# passwd vbird2
# 范例二:用 vbird2 登陆后,修改 vbird2 自己的密码
[vbird2@study ~]$ passwd

密码的规范是非常严格的,尤其新 的 distributions 大多使用 PAM 模块来进行密码的检验

# 范例三:使用 standard input 创建用户的密码
echo "abc543CC" | passwd --stdin vbird2

这个动作会直接更新使用者的密码而不用再次的手动输入!好处是方便处理,缺点是这个密 码会保留在指令中

# 范例四:管理 vbird2 的密码使具有 60 天变更、密码过期 10 天后帐号失效的设置
passwd -S vbird2
vbird2 PS 2015-07-20 0 99999 7 -1 (Password set, SHA512 crypt.)
# 上面说明密码创建时间 (2015-07-20)、0 最小天数、99999 变更天数、7 警告日数与密码不会失效 (-1)

passwd -x 60 -i 10 vbird2

passwd -S vbird2
vbird2 PS 2015-07-20 0 60 7 10 (Password set, SHA512 crypt.)
# 范例五:让 vbird2 的帐号失效,观察完毕后再让她失效
passwd -l vbird2
passwd -S vbird2
vbird2 LK 2015-07-20 0 60 7 10 (Password locked.)
# 嘿嘿!状态变成“ LK, Lock ”了啦!无法登陆喔!


grep vbird2 /etc/shadow
# 其实只是在第二栏前加上 !!

passwd -u vbird2
grep vbird2 /etc/shadow
# 在第二栏前去掉了 !!

chage

更详细的密码参数显示功能

chage [-ldEImMW] 帐号名 

选项与参数: 
-l :列出该帐号的详细密码参数; 
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD 
-E :后面接日期,修改 shadow 第八字段(帐号失效日),格式 YYYY-MM-DD 
-I :后面接天数,修改 shadow 第七字段(密码失效日期) 
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数) 
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更) 
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)
# 范例一:列出 vbird2 的详细密码参数
chage -l vbird2
# 范例二:创建一个名为 agetest 的帐号,该帐号第一次登陆后使用默认密码,但必须要更改过密码后, 使用新密码才能够登陆系统使用 bash 环境
useradd agetest 
echo "agetest" | passwd --stdin agetest 
chage -d 0 agetest 
# 此时此帐号的密码创建时间会被改为 1970/1/1

usermod

在使用 useradd 后,发现某些地方还可以 进行细部修改。 此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段 的数据, 不过,Linux 也有提供相关的指令让大家来进行帐号相关数据的微调呢~那就是 usermod

usermod 的选项与 useradd 非常类似

usermod [-cdegGlsuLU] username 

选项与参数: 
-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 密码栏的 ! 拿掉,解冻啦!

userdel

删除使用者的相关数据,而使用者的数据有:

  • 使用者帐号/密码相关参数:/etc/passwd, /etc/shadow

  • 使用者群组相关参数:/etc/group, /etc/gshadow

  • 使用者个人文件数据:/home/username, /var/spool/mail/username..

userdel [-r] username

选项与参数:
-r :连同使用者的主文件夹也一起删除
# 范例一:删除 vbird2 ,连同主文件夹一起删除
userdel -r vbird2

通常我们要移除一个帐号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该帐号取消即可!一般而言,如果该帐号只是“暂时不启 用”的话,那么将 /etc/shadow 里头帐号失效日期 (第八字段) 设置为 0 就可以让该帐号无法 使用,但是所有跟该帐号相关的数据都会留下来! 使用 userdel 的时机通常是“你真的确定不 要让该用户在主机上面使用任何数据了!”

其实使用者如果在系统上面操作过一阵子了,那么该使用者其实在系统内可能会含有 其他文件的。所以,如果想要完整的将某个帐号完整的移除,最好可以在下达 userdel - r username 之前, 先以“ find / -user username ”查出整个系统内属于 username 的文件,然 后再加以删除

13.2.2 使用者功能

不论是 useradd/usermod/userdel ,那都是系统管理员所能够使用的指令

这里我们介 绍几个一般身份使用者常用的帐号数据变更与查询指令

id

id 这个指令则可以查询某人或自己的相关 UID/GID 等等的信息

id [username]
# 范例一:查阅 root 自己的相关 ID 信息!
id
# 范例二:查阅一下 vbird1
id vbird1

finger

finger 的中文字面意义是:“手指”或者是“指纹”的意思

finger 可以查阅很多使用者相关 的信息喔! 大部分都是在 /etc/passwd 这个文件里面的信息

新的版本中已经默认不安装这个软件

finger [-s] username 

选项与参数: 
-s :仅列出使用者的帐号、全名、终端机代号与登陆时间等等; 
-m :列出与后面接的帐号相同者,而不是利用部分比对 (包括全名部分)
# 范例一:观察 vbird1 的使用者相关帐号属性
finger vbird1

列出的信息说明如下:

  • Login:为使用者帐号,亦即 /etc/passwd 内的第一字段;

  • Name:为全名,亦即 /etc/passwd 内的第五字段(或称为注解);

  • Directory:就是主文件夹了;

  • Shell:就是使用的 Shell 文件所在;

  • Never logged in.:figner 还会调查使用者登陆主机的情况喔!

  • No mail.:调查 /var/spool/mail 当中的信箱数据;

  • No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明!

chfn

chfn [-foph] [帐号名] 

选项与参数: 
-f :后面接完整的大名; 
-o :您办公室的房间号码; 
-p :办公室的电话号码; 
-h :家里的电话号码!

其实就是改 /etc/passwd 第五个字段

chsh

change shell 的简写

chsh [-ls] 

选项与参数: 
-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容! 
-s :设置修改自己的 Shell 啰
# 范例一:用 vbird1 的身份列出系统上所有合法的 shell,并且指定 csh 为自己的 shell
chsh -l

chsh -s /bin/csh; grep vbird1 /etc/passwd
chsh -s /bin/bash    # 改回来

不论是 chfn 与 chsh ,都是能够让一般使用者修改 /etc/passwd 这个系统文件的!所以你猜 猜,这两个命令文件的权限是什么? 一定是 SUID 的功能

13.2.3 新增与移除群组

群组的内容都与这两个文件有关:/etc/group, /etc/gshadow

groupadd

groupadd [-g gid] [-r] 群组名称 

选项与参数: 
-g :后面接某个特定的 GID ,用来直接给予某个 GID  
-r :创建系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关

groupmod

groupmod [-g gid] [-n group_name] 群组名 

选项与参数: 
-g :修改既有的 GID 数字; 
-n :修改既有的群组名称

groupdel

groupdel [groupname]

要删除组,必须要确认 /etc/passwd 内的帐号没有任何人使用该群组 作为 initial group 才行

可以选择以下一个方法:

  • 修改 vbird1 的 GID

  • 删除 vbird1 这个使用者

gpasswd:群组管理员功能

什么是群组管理员呢?就是让某个群组具有一个管理员,这个群组管 理员可以管理哪些帐号可以加入/移出该群组! 那要如何“创建一个群组管理员”呢?就得要通 过 gpasswd 啰!

# 关于系统管理员(root)做的动作:
gpasswd groupname 
gpasswd [-A user1,...] [-M user3,...] groupname 
gpasswd [-rR] groupname 

选项与参数: 
   :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow) 
-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员) 
-M :将某些帐号加入这个群组当中! 
-r :将 groupname 的密码移除 -R :让 groupname 的密码栏失效
# 关于群组管理员(Group administrator)做的动作:
gpasswd [-ad] user groupname 

选项与参数: 
-a :将某位使用者加入到 groupname 这个群组当中! 
-d :将某位使用者移除出 groupname 这个群组当中。
# 范例一:创建一个新群组,名称为 testgroup 且群组交由 vbird1 管理:
groupadd testgroup     <==先创建群组
gpasswd testgroup     <==给这个群组一个密码吧!


gpasswd -A vbird1 testgroup     <==加入群组管理员为 vbird1
grep testgroup /etc/group /etc/gshadow
# 范例二:以 vbird1 登陆系统,并且让他加入 vbird1, vbird3 成为 testgroup 成员
id
gpasswd -a vbird1 testgroup
gpasswd -a vbird3 testgroup
grep testgroup /etc/group

13.2.4 帐号管理实例

实例一

假设我们需要的帐号数据如下

账号名称 账号全名 支持次要群组 是否可登陆主机 口令
myuser1 1st user mygroup1 可以 password
myuser2 2nd user mygroup1 可以 password
myuser3 3rd user 无额外支持 不可以 password
# 先处理帐号相关属性的数据: 
[root@study ~]# groupadd mygroup1 
[root@study ~]# useradd -G mygroup1 -c "1st user" myuser1 
[root@study ~]# useradd -G mygroup1 -c "2nd user" myuser2 
[root@study ~]# useradd -c "3rd user" -s /sbin/nologin myuser3 

# 再处理帐号的密码相关属性的数据: 
[root@study ~]# echo "password" | passwd --stdin myuser1 
[root@study ~]# echo "password" | passwd --stdin myuser2 
[root@study ~]# echo "password" | passwd --stdin myuser3

实例二

我的使用者 pro1, pro2, pro3 是同一个专案计划的开发人员,我想要让这三个用户在 同一个目录下面工作, 但这三个用户还是拥有自己的主文件夹与基本的私有群组。假设我要 让这个专案计划在 /srv/projecta 目录下开发

# 1\. 假设这三个帐号都尚未创建,可先创建一个名为 projecta 的群组, # 再让这三个用户加入其次要群组的支持即可: 
[root@study ~]# groupadd projecta 
[root@study ~]# useradd -G projecta -c "projecta user" pro1 
[root@study ~]# useradd -G projecta -c "projecta user" pro2 
[root@study ~]# useradd -G projecta -c "projecta user" pro3 
[root@study ~]# echo "password" &#124; passwd --stdin pro1 
[root@study ~]# echo "password" &#124; passwd --stdin pro2 
[root@study ~]# echo "password" &#124; passwd --stdin pro3 

# 2\. 开始创建此专案的开发目录: 
[root@study ~]# mkdir /srv/projecta 
[root@study ~]# chgrp projecta /srv/projecta 
[root@study ~]# chmod 2770 /srv/projecta

权限怎么会是 2770 呢?为了让三个使用者能够互相修改对方的文件, 这个 SGID 是必须要存在的

13.2.5 使用外部身份认证系统

CentOS 提供一只名为 authconfig-tui 的指 令

13.3 主机的细部权限规划:ACL 的使用

传统的权限仅有三种 身份 (owner, group, others) 搭配三种权限 (r,w,x) 而已,并没有办法单纯的针对某一个 使用者或某一个群组来设置特定的权限需求

此时就得要使 用 ACL 这个机制

13.3.1 什么是 ACL 与如何支持启动 ACL

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

那 ACL 主要可以针对哪些方面来控制权限呢?他主要可以针对几个项目:

  • 使用者 (user):可以针对使用者来设置权限;

  • 群组 (group):针对群组为对象来设置其权限;

  • 默认属性 (mask):还可以针对在该目录下在创建新文件/目录时,规范新数据的默认权限;

ACL 是 unix-like 操作系统的额外支持项目,但因为近年以来 Linux 系统对权限 细部设置的热切需求, 因此目前 ACL 几乎已经默认加入在所有常见的 Linux 文件系统的挂载 参数中 (ext2/ext3/ext4/xfs等等)

检查一下核心挂载时显示的信息

dmesg | grep -i acl

13.3.2 ACL 的设置技巧: getfacl, setfacl

  • getfacl:取得某个文件/目录的 ACL 设置项目;

  • setfacl:设置某个目录/文件的 ACL 规范。

setfacl 指令用法介绍及最简单的“ u:帐号:权限 ”设置

setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名 

选项与参数: 
-m :设置后续的 acl 参数给文件使用,不可与 -x 合用; 
-x :删除后续的 acl 参数,不可与 -m 合用; 
-b :移除“所有的” ACL 设置参数; 
-k :移除“默认的” ACL 参数,关于所谓的“默认”参数于后续范例中介绍; 
-R :递回设置 acl ,亦即包括次目录都会被设置起来; 
-d :设置“默认 acl 参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值
# 1\. 针对特定使用者的方式:
# 设置规范:“ u:[使用者帐号列表]:[rwx] ”,例如针对 vbird1 的权限规范 rx :
[root@study ~]# touch acl_test1
[root@study ~]# ll acl_test1 
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1

[root@study ~]# setfacl -m u:vbird1:rx acl_test1
[root@study ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 权限部分多了个 +

[root@study ~]# setfacl -m u::rwx acl_test1
[root@study ~]# ll acl_test1 
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 设置值中的 u 后面无使用者列表,代表设置该文件拥有者

如果一个文件设置了 ACL 参数后,他的权限部分就会多出一个 + 号了

getfacl 指令用法

getfacl filename

选项与参数: 
getfacl 的选项几乎与 setfacl 相同!
# 请列出刚刚我们设置的 acl_test1 的权限内容:
[root@study ~]# getfacl acl_test1 
# file: acl_test1           <==说明文档名而已! 
# owner: root           <==说明此文件的拥有者,亦即 ls -l 看到的第三使用者字段 
# group: root           <==此文件的所属群组,亦即 ls -l 看到的第四群组字段 
user::rwx           <==使用者列表栏是空的,代表文件拥有者的权限 
user:vbird1:r-x             <==针对 vbird1 的权限设置为 rx ,与拥有者并不同! 
group::r--          <==针对文件群组的权限设置仅有 r 
mask::r-x           <==此文件默认的有效权限 (mask) 
other::r--          <==其他人拥有的权限啰!

显示的数据前面加上 # 的,代表这个文件的默认属性,包括文 件名、文件拥有者与文件所属群组。 下面出现的 user, group, mask, other 则是属于不同使用 者、群组与有效权限(mask)的设置值。

特定的单一群组的权限设置:“ g:群组名:权限 ”

# 2\. 针对特定群组的方式: 
# 设置规范:“ g:[群组列表]:[rwx] ”,例如针对 mygroup1 的权限规范 rx : 
[root@study ~]# setfacl -m g:mygroup1:rx acl_test1 
[root@study ~]# getfacl acl_test1 
# file: acl_test1 
# owner: root 
# group: root 
user::rwx 
user:vbird1:r-x 
group::r-- 
group:mygroup1:r-x      <==这里就是新增的部分!多了这个群组的权限设置! 
mask::r-x other::r--

针对有效权限设置:“ m:权限 ”

mask 是什么东西啊?其实他有点像是“有效权限”的意 思!他的意义是: 使用者或群组所设置的权限必须要存在于 mask 的权限设置范围内才会生 效,此即“有效权限 (effective permission)”

# 3\. 针对有效权限 mask 的设置方式: 
# 设置规范:“ m:[rwx] ”,例如针对刚刚的文件规范为仅有 r : 
[root@study ~]# setfacl -m m:r acl_test1 
[root@study ~]# getfacl acl_test1 
# file: acl_test1 
# owner: root 
# group: root 
user::rwx 
user:vbird1:r-x     #effective:r--      <==vbird1+mask均存在者,仅有 r 而已,x 不会生效 
group::r-- 
group:mygroup1:r-x      #effective:r-- 
mask::r-- 
other::r--

可以通过使用 mask 来规范最大允许的权限,就能够避免 不小心开放某些权限给其他使用者或群组了。 不过,通常鸟哥都是将 mask 设置为 rwx 啦! 然后再分别依据不同的使用者/群组去规范她们的权限就是了。

使用默认权限设置目录未来文件的 ACL 权限继承“ d:[u|g]:[user|group]:权限 ”

# 4\. 针对默认权限的设置方式: 
# 设置规范:“ d:[ug]:使用者列表:[rwx] ”

# 让 myuser1 在 /srv/projecta 下面一直具有 rx 的默认权限!
[root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta 
[root@study ~]# getfacl /srv/projecta
# file: srv/projecta 
# owner: root 
# group: projecta 
# flags: -s- 
user::rwx 
user:myuser1:r-x 
group::rwx 
mask::rwx 
other::--- 
default:user::rwx 
default:user:myuser1:r-x 
default:group::rwx 
default:mask::rwx 
default:other::---

取消 ACL 权限

# 让 ACL 的属性全部消失
setfacl -b 文件名

取消全部的 ACL 设置可以使用 -b 来处理,但单一设置值的取消,就得要通 过 -x 才行了

# 1.1 找到针对 myuser1 的设置值 
[root@study ~]# getfacl /srv/projecta | grep myuser1

# 1.2 针对每个设置值来处理,注意,取消某个帐号的 ACL 时,不需要加上权限项目!
[root@study ~]# setfacl -x u:myuser1 /srv/projecta 
[root@study ~]# setfacl -x d:u:myuser1 /srv/projecta

# 2.1 开始让 pro3 这个用户无法使用该目录啰!
[root@study ~]# setfacl -m u:pro3:- /srv/projecta

当设置一个用户/群组没有任何权限的 ACL 语法中,在权限的字段不可留白,而 是应该加上一个减号 (-)

13.4 使用者身份切换

身份切换的原因:

  • 使用一般帐号:系统平日操作的好习惯

  • 用较低权限启动系统服务

  • 软件本身的限制

让一般使用者转变身份成为 root

  • 以“ su - ”直接将身份变成 root 即可,但是这个指令却需要 root 的密码

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

13.4.1 su

su 是最简单的身份切换指令了,他可以进行任何身份的切换

su [-lm] [-c 命令] [username]

选项与参数:
-   :单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登陆系统;若使用者名称没有加上去,则代表切换为 root 的身份。
-l  :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
-m  :-m 与 -p 是一样的,表示『使用目前的环境配置,而不读取新使用者的配置文件』
-c  :仅进行一次命令,所以 -c 后面可以加上命令喔!

login-shell 与 non-login shell 有出现之前第十章谈过的 login-shell 配置文件读取方式

# 范例一:假设你原本是 vbird1 的身份,想要使用 non-login shell 的方式变成 root
[vbird1@www ~]$ su       <==注意提示字符,是 vbird1 的身份喔!
Password:                <==这里输入 root 的口令喔!
[root@www vbird1]# id    <==提示字符的目录是 vbird1 喔!
uid=0(root) gid=0(root) groups=0(root),1(bin),...   <==确实是 root 的身份!
[root@www vbird1]# env | grep 'vbird1'
USER=vbird1
PATH=/usr/local/bin:/bin:/usr/bin:/home/vbird1/bin  <==这个影响最大!
MAIL=/var/spool/mail/vbird1                         <==收到的 mailbox 是 vbird1
PWD=/home/vbird1                                    <==并非 root 的家目录
LOGNAME=vbird1
# 虽然你的 UID 已经是具有 root 的身份,但是看到上面的输出信息吗?
# 还是有一堆变量为原本 vbird1 的身份,所以很多数据还是无法直接利用。
[root@www vbird1]# exit   <==这样可以离开 su 的环境!
# 范例二:使用 login shell 的方式切换为 root 的身份并观察变量
[vbird1@www ~]$ su -
Password:   <==这里输入 root 的口令喔!
[root@www ~]# env | grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
# 了解差异了吧?下次变换成为 root 时,记得最好使用 su - 喔!
[root@www ~]# exit   <==这样可以离开 su 的环境!
# 范例三:vbird1 想要运行『 head -n 3 /etc/shadow 』一次,且已知 root 口令
[vbird1@www ~]$ head -n 3 /etc/shadow
head: cannot open `/etc/shadow' for reading: Permission denied
[vbird1@www ~]$ su - -c "head -n 3 /etc/shadow"
Password: <==这里输入 root 的口令喔!
root:$1$/30QpEWEBEZXRD0bh6rAABCEQD.BAH0:14126:0:99999:7:::
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
[vbird1@www ~]$ <==注意看,身份还是 vbird1 喔!继续使用旧的身份进行系统操作!
范例四:原本是 vbird1 这个使用者,想要变换身份成为 dmtsai 时?
[vbird1@www ~]$ su -l dmtsai
Password: <==这里输入 dmtsai 的口令喔!
[dmtsai@www ~]$ su -
Password: <==这里输入 root 的口令喔!
[root@www ~]# id sshd
uid=74(sshd) gid=74(sshd) groups=74(sshd) ... <==确实有存在此人
[root@www ~]# su -l sshd
This account is currently not available.      <==竟然说此人无法切换?因为在/etc/passwd中被设置了nologin
[root@www ~]# finger sshd
Login: sshd                             Name: Privilege-separated SSH
Directory: /var/empty/sshd              Shell: /sbin/nologin
[root@www ~]# exit    <==离开第二次的 su 
[dmtsai@www ~]$ exit  <==离开第一次的 su 
[vbird1@www ~]$ exit  <==这才是最初的环境!

总结一下 su 的用法是这样的:

  • 若要完整的切换到新使用者的环境,必须要使用“ su - username ”或“ su -l username ”,才会连同 PATH/USER/MAIL 等变量都转成新使用者的环境;

  • 如果仅想要执行一次 root 的指令,可以利用“ su - -c "指令串" ”的方式来处理;

  • 使用 root 切换成为任何使用者时,并不需要输入新使用者的密码;

13.4.2 sudo

由于 sudo 可以让你以其他用 户的身份执行指令 (通常是使用 root 的身份来执行指令),因此并非所有人都能够执行 sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够执行 sudo 这个指令

sudo 的指令用法

[root@www ~]# sudo [-b] [-u 新使用者账号]
选项与参数:
-b  :将后续的命令放到背景中让系统自行运行,而不与目前的 shell 产生影响
-u  :后面可以接欲切换的使用者,若无此项则代表切换身份为 root 。
范例一:你想要以 sshd 的身份在 /tmp 底下创建一个名为 mysshd 的文件
[root@www ~]# sudo -u sshd touch /tmp/mysshd
[root@www ~]# ll /tmp/mysshd
-rw-r--r-- 1 sshd sshd 0 Feb 28 17:42 /tmp/mysshd
# 特别留意,这个文件的权限是由 sshd 所创建的情况喔!
范例二:你想要以 vbird1 的身份创建 ~vbird1/www 并于其中创建 index.html 文件
[root@www ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; \
>  echo 'This is index.html file' > index.html"
[root@www ~]# ll -a ~vbird1/www
drwxr-xr-x 2 vbird1 vbird1 4096 Feb 28 17:51 .
drwx------ 5 vbird1 vbird1 4096 Feb 28 17:51 ..
-rw-r--r-- 1 vbird1 vbird1   24 Feb 28 17:51 index.html
# 要注意,创建者的身份是 vbird1 ,且我们使用 sh -c "一串命令" 来运行的!

范例一中,我们的 root 使用 sshd 的权限去进行某项任务! 要注意,因为我们无法使用“ su - sshd ”去切换系统帐号 (因 为系统帐号的 shell 是 /sbin/nologin)

sudo 的执行是这样的流程:

  1. 当使用者执行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有执行 sudo 的权限;

  2. 若使用者具有可执行 sudo 的权限后,便让使用者“输入使用者自己的密码”来确认;

  3. 若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码);

  4. 若欲切换的身份与执行者身份相同,那也不需要输入密码。

直接使用 vi 去编辑 /etc/sudoers 是不好的,得要通过 visudo 去修改这个文件

visudo 与 /etc/sudoers

visudo

visudo 只是利用 vi 将 /etc/sudoers 文件调用出来进行修改

使用者帐号     登陆者的来源主机名称=(可切换的身份)     可下达的指令 
root             ALL=(ALL)                         ALL     <==这是默认值

上面这一行的四个元件意义是:

  1. “使用者帐号”:系统的哪个帐号可以使用 sudo 这个指令的意思;

  2. “登陆者的来源主机名称”:当这个帐号由哪部主机连线到本 Linux 主机,意思是这个帐号 可能是由哪一部网络主机连线过来的, 这个设置值可以指定用户端计算机(信任的来源 的意思)。默认值 root 可来自任何一部网络主机

  3. “(可切换的身份)”:这个帐号可以切换成什么身份来下达后续的指令,默认 root 可以 切换成任何人;

  4. “可下达的指令”:可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。 默认 root 可以切换任何身份且进行任何指令之意。

两次执行 sudo 的间隔在五分钟内,那么再次执行 sudo 时就不需要再次输入密码了

13.5 使用者的特殊 shell 与 PAM 模块

13.5.1 特殊的 shell, /sbin/nologin

无法登陆的默认提示信息:

This account is currently not available.

所谓的“无法登陆”指的仅是:“这个使用者无法使用 bash 或其他 shell 来登陆系统”而已, 并不是说这个帐号就无法使用其他的系统资源

/etc/nologin.txt 文件可以替代无法登陆的默认提示

13.5.2 PAM 模块简介

认证 (authentication)

PAM (Pluggable Authentication Modules, 嵌入式模块)

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

PAM 模块与其他程序的相关性

PAM 用来进行验证的数据称为模块 (Modules),每个 PAM 模块的功能都不太相同

13.5.3 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 回传的结果决定下一个动作 (重新输入新密码或者通过验证!)

[root@www ~]# cat /etc/pam.d/passwd
#%PAM-1.0  <==PAM版本的说明而已!
auth       include      system-auth     <==每一行都是一个验证的过程
account    include      system-auth
password   include      system-auth
验证类别     控制标准      PAM 模块与该模块的参数

“ include (包括) ”这个关键字,他代表的 是“请调用后面的文件来作为这个类别的验证”, 所以,上述的每一行都要重复调用 /etc/pam.d/system-auth 那个文件来进行验证

第一个字段:验证类别 (Type)

验证类别主要分为四种,分别说明如下:

  1. auth 是 authentication (认证) 的缩写,所以这种类别主要用来检验使用者的身份验 证,这种类别通常是需要密码来检验的, 所以后续接的模块是用来检验使用者的身份

  2. account (帐号) 则大部分是在进行 authorization (授权),这种类别则主要 在检验使用者是否具有正确的使用权限, 举例来说,当你使用一个过期的密码来登陆 时,当然就无法正确的登陆了。

  3. session 是会议期间的意思,所以 session 管理的就是使用者在这次登陆 (或使 用这个指令) 期间,PAM 所给予的环境设置。 这个类别通常用在记录使用者登陆与登出 时的信息!例如,如果你常常使用 su 或者是 sudo 指令的话, 那么应该可以在 /var/log/secure 里面发现很多关于 pam 的说明,而且记载的数据是“session open, session close”的信息!

  4. password 就是密码嘛!所以这种类别主要在提供验证的修订工作,举例来 说,就是修改/变更密码啦!

这四个验证的类型通常是有顺序的,不过也有例外就是了。 会有顺序的原因是,(1)我们总 是得要先验证身份 (auth) 后, (2)系统才能够借由使用者的身份给予适当的授权与权限 设置 (account),而且(3)登陆与登出期间的环境才需要设置, 也才需要记录登陆与登出 的信息 (session)。如果在运行期间需要密码修订时,(4)才给予 password 的类别。

第二个字段:验证的控制旗标 (control flag)

就是“验证通过的标准”

主要也分为四种控制方式:

  • required
    此验证若成功则带有 success (成功) 的标志,若失败则带有 failure 的标志,但不论成功或失败都会继续后续的验证流程。 由于后续的验证流程可以继续进行,因此相当有利于数据的登录 (log) ,这也是 PAM 最常使用 required 的原因。

  • requisite
    若验证失败则立刻回报原程序 failure 的标志,并终止后续的验证流程。若验证成功则带有 success 的标志并继续后续的验证流程。 这个项目与 required 最大的差异,就在于失败的时候还要不要继续验证下去?由于 requisite 是失败就终止, 因此失败时所产生的 PAM 信息就无法透过后续的模块来记录了。

  • sufficient
    若验证成功则立刻回传 success 给原程序,并终止后续的验证流程;若验证失败则带有 failure 标志并继续后续的验证流程。 这玩意儿与 requisits 刚好相反!

  • optional
    这个模块控件目大多是在显示信息而已,并不是用在验证方面的。

PAM 控制旗标所造成的回报流程

13.5.4 常用模块简介

# 登录
cat /etc/pam.d/login
cat /etc/pam.d/system-auth
  • /etc/pam.d/*:每个程序个别的 PAM 配置文件;

  • /lib64/security/*:PAM 模块文件的实际放置目录;

  • /etc/security/*:其他 PAM 环境的配置文件;

  • /usr/share/doc/pam-*/:详细的 PAM 说明文档。

13.5.5 其他相关文件

PAM 相关的配置文件在 /etc/pam.d , 说明文档在 /usr/share/doc/pam-(版本) ,模块实际在 /lib64/security/ 。那么还有没有相关 的 PAM 文件呢? 是有的,主要都在 /etc/security 这个目录内

limits.conf

范例一:vbird1 这个用户只能创建 100MB 的文件,且大于 90MB 会警告
[root@www ~]# vi /etc/security/limits.conf
vbird1    soft        fsize         90000
vbird1    hard        fsize        100000
#账号   限制依据    限制项目     限制值
# 第一字段为账号,或者是群组!若为群组则前面需要加上 @ ,例如 @projecta
# 第二字段为限制的依据,是严格(hard),还是仅为警告(soft);
# 第三字段为相关限制,此例中限制文件容量,
# 第四字段为限制的值,在此例中单位为 KB。
# 若以 vbird1 登陆后,进行如下的操作则会有相关的限制出现!

[vbird1@www ~]$ ulimit -a
....(前面省略)....
file size               (blocks, -f) 90000
....(后面省略)....

[vbird1@www ~]$ dd if=/dev/zero of=test bs=1M count=110
File size limit exceeded
[vbird1@www ~]$ ll -k test
-rw-rw-r-- 1 vbird1 vbird1 90000 Mar  4 11:30 test
# 果然有限制到了
范例二:限制 pro1 这个群组,每次仅能有一个用户登陆系统 (maxlogins)
[root@www ~]# vi /etc/security/limits.conf
@pro1   hard   maxlogins   1
# 如果要使用群组功能的话,这个功能似乎对初始群组才有效喔!
# 而如果你尝试多个 pro1 的登陆时,第二个以后就无法登陆了。
# 而且在 /var/log/secure 文件中还会出现如下的信息:
# pam_limits(login:session): Too many logins (max 1) for pro1

这个文件是设置完成就生效了,你不用重新启动任何服务的! 但是 PAM 有个 特殊的地方,由于他是在程序调用时才予以设置的,因此你修改完成的数据, 对于已登陆系 统中的使用者是没有效果的,要等他再次登陆时才会生效

/var/log/secure, /var/log/messages

如果发生任何无法登陆或者是产生一些你无法预期的错误时,由于 PAM 模块都会将数据记载 在 /var/log/secure 当中

13.6 Linux 主机上的使用者讯息传递

13.6.1 查询使用者: w, who, last, lastlog

如果你想要知道目前已登陆在系统上面的使用者呢?可以通过 w 或 who 来查询

last 可以列出从系统创建之后到目前为止的所有登陆者信息

如果您想要知道每个帐号的最近登陆的时间,则可以使用 lastlog 这个指令喔! lastlog 会去读取 /var/log/lastlog 文件

13.6.2 使用者对谈: write, mesg, wall

[root@www ~]# write 使用者账号 [用户所在终端接口]

[root@www ~]# who
root     pts/1    2009-03-04 11:04 (192.168.1.100)
vbird1   pts/2    2009-03-04 13:15 (192.168.1.100)  <==有看到 vbird1 在在线

[root@www ~]# write vbird1 pts/2
Hello, there:
Please don't do anything wrong...  <==这两行是 root 写的信息!
# 结束时,请按下 [crtl]-d 来结束输入。此时在 vbird1 的画面中,会出现:

Message from root@www.vbird.tsai on pts/1 at 13:23 ...
Hello, there:
Please don't do anything wrong...
EOF

如果 vbird1 这个人不想要接受任何信息,直接下达这个动作:

[vbird1@www ~]$ mesg n
[vbird1@www ~]$ mesg
is n

如果想要解开的话,再次下达『 mesg y 』就好啦!想要知道目前的 mesg 状态,直接下达『 mesg 』即可

相对于 write 是仅针对一个使用者来传『简讯』,我们还可以『对所有系统上面的用户传送简讯 (广播)』哩~ 如何下达?用 wall 即可

[root@www ~]# wall "I will shutdown my linux server..."

13.6.3 使用者邮件信箱: mail

mailbox 都会放置在 /var/spool/mail 里面,一个帐号一个 mailbox (文件)

举例来说,我以 root 寄信给 vbird1 ,信 件标题是“ nice to meet you ”,则:

[root@www ~]# mail vbird1 -s "nice to meet you"
Hello, D.M. Tsai
Nice to meet you in the network.
You are so nice.  byebye!
.    <==这里很重要喔,结束时,最后一行输入小数点 . 即可!
EOT
[root@study ~]#     <==出现提示字符,表示输入完毕了!

可以先用 vi 将信件内容编好, 然后再以 mail -s "nice to meet you" vbird1 < filename 来将文件内容传输

请将你的主文件夹下的环境变量文件 (~/.bashrc) 寄给自己!答:mail -s "bashrc file content" dmtsai < ~/.bashrc

通过管线命令直接将 ls -al ~ 的内容传给 root 自己!答:ls -al ~ | mail -s "myfile" root

# 接收mail
[vbird1@study ~]$ mail

13.7 CentOS 7 环境下大量创建帐号的方法

13.7.1 一些帐号相关的检查工具

pwck

pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息,与实际的主文件夹是否存在 等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 内 的数据字段错误时,会提示使用者修订。

相对应的群组检查 可以使用 grpck 这个指令

pwconv

这个指令主要的目的是在“将 /etc/passwd 内的帐号与密码,移动到 /etc/shadow 当中!” 早期 的 Unix 系统当中并没有 /etc/shadow 呢,所以,使用者的登陆密码早期是在 /etc/passwd 的 第二栏,后来为了系统安全,才将密码数据移动到 /etc/shadow 内的

使用 pwconv 后,可 以:

  • 比对 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 内存在的帐号并没有对应的 /etc/shadow 密码时,则 pwconv 会去 /etc/login.defs 取用相关的密码数据,并创建该帐 号的 /etc/shadow 数据;

  • 若 /etc/passwd 内存在加密后的密码数据时,则 pwconv 会将该密码栏移动到 /etc/shadow 内,并将原本的 /etc/passwd 内相对应的密码栏变成 x !

一般来说,如果您正常使用 useradd 增加使用者时,使用 pwconv 并不会有任何的动作,因 为 /etc/passwd 与 /etc/shadow 并不会有上述两点问题啊! _。不过,如果手动设置帐号, 这个 pwconv 就很重要

pwunconv

相对于 pwconv , pwunconv 则是“将 /etc/shadow 内的密码栏数据写回 /etc/passwd 当中, 并且删除 /etc/shadow 文件

chpasswd

可以“读入未加密前的密码,并且经过加密后, 将加密后的 密码写入 /etc/shadow 当中。”这个指令很常被使用在大量创建帐号的情况中

可以由 Standard input 读入数据,每笔数据的格式是“ username:password ”

举例来说,我的系统 当中有个使用者帐号为 vbird3 ,我想要更新他的密码 (update) , 假如他的密码是 abcdefg 的话,那么我可以这样做:

[root@study ~]# echo "vbird3:abcdefg" | chpasswd

在默认的情况中, chpasswd 会去读取 /etc/login.defs 文件内 的加密机制,我们 CentOS 7.x 用的是 SHA512, 因此 chpasswd 就默认会使用 SHA512 来 加密!如果你想要使用不同的加密机制,那就得要使用 -c 以及 -e 等方式来处理了

从 CentOS 5.x 开始之后,passwd 已经默认加入了 --stdin 的选项,因此这个 chpasswd 就变得 英雄无用武之地了! 不过,在其他非 Red Hat 衍生的 Linux 版本中,或许还是可以参考这个 指令功能来大量创建帐号

posted @ 2022-11-08 18:08  流星<。)#)))≦  阅读(145)  评论(0编辑  收藏  举报