Linux 的账号与群组
每个登入的使用者至少都会取得两个 ID,一个是使用者 ID(User ID ,简称UID)、一个是群组ID (Group ID ,简称GID)。
Linux系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何进行呢?
首先,他必须要在计算机前面利用 tty1~tty6 的终端机提供的login接口,并输入账号与密码后才能够登入。那么你输入账号密码后,系统处理了什么呢?
1.先找寻 /etc/passwd 里面是否有你输入的账号,如果没有则跳出,如果有的话则将该账号对应的UID与
GID(在/etc/ group中)读出来,另外,该账号的家目录与shell设定也一并读出;
2.再来则是核对密码表。这时Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下刚
刚输入的密码与里头的密码是否相符。
3.如果一切都OK的话,就进入Shell控管的阶段。
/etc/passwd 文件结构
每一行都代表一个账号,有几行就代表有几个账号在系统中。
不过需要特别留意的是,里头很多账号本来就是系统正常运作所必须要的,我们可以简称他为系统账号,例如 bin, daemon, adm, nobody等等,这些账号请不要随意的杀掉他。
每一行使用【:
】分隔开,共有七个:
1.账号名称:
用来提供给对数字不太敏感的人类使用来登入系统的,需要用来对应UID。例如 root 的UID 对应就是0(第三字段);
2.密码:
早期Unix系统的密码就是放在这字段上,但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取,因此后来就将这个字段的密码数据给他改放到 /etc/shadow中了。所以这里你会看到一个【x 】
3.UID
使用者标识符
4.GID
这个与/etc/group有关,其实letc/group 的观念与letc/passwd 差不多,只是他是用来规范组名与GID的对应而已。
5.用户信息说明栏
来解释这个账号的意义。
6.家目录
可以将账号的家目录移动到其他的硬盘去,可以在这个字段进行修改。默认的用户家目录在/home/yourIDname
7.Shell
当用户登入系统后就会取得一个Shell 来与系统的核心沟通以进行用户的操作任务。那为何预设 shell 会使用 bash呢?就是在这个字段指定的。这里比较需要注意的是,有一个 shell 可以用来替代成让账号无法取得 shell 环境的登入动作,那就是【sbin/nologin】这个东西。
/etc/shadow 文件结构
很多程序的运作都与权限有关,而权限与UID/GID有关。因此各程序需要读取 /etc/passwd 来了解不同账号的权限。因此 /etc/passwd 的权限需设定为-rw-r--r-
这样的情况。
每行有九个字段,以【:】隔开:
1.账号名称:
由于密码也需要与账号对应~因此,这个文件的第一栏就是账号,必须要与letcpasswd 相同才行!
2.密码:
这个字段内的数据才是真正的密码,而且是经过编码的密码(加密)。由于各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同。固定的编码系统产生的密码长度必须一致(改变后就算不出来了)。
3.最近更动密码的日期:
Linux 日期是以1970年1月1日作为1累加(天数)的日期
4.密码不可被更动的天数:(与第3字段相比)
第四个字段记录了:这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是0的话,表示密码随时可以更动的意思。
5.密码需要重新变更的天数:(与第3字段相比)
这个字段可以指定在最近一次更改密码后,在多少天数内需要再次的变更密码才行。
必须要在这个天数内重新设定你的密码,否则这个账号的密码将会【变为过期特性】。
6.密码需要变更期限前的警告天数:(与第5字段相比)
7.密码过期后的账号宽限时间(密码时效日):(与第5字段相比)
密码有效日期为【更新日期(第3字段)】+【重新变更日期(第5字段)】,过了该期限后用户依旧没有更新密码,那该密码就算过期了。虽然密码过期但是该账号还是可以用来进行其他工作的,包括登入系统取得bash。不过如果密码过期了,那当你登入系统时,系统会强制要求你必须要重新设定密码才能登入继续使用喔,这就是密码过期特性。
这个字段的功能是在密码过期几天后,如果使用者还是没有登入更改密码,那么这个账号的密码将会【失效】,亦即该账号再也无法使用该密码登入了。要注意密码过期与密码失效并不相同。
8.账号失效日期:
这个字段表示这个账号在此字段规定的日期之后,将无法再使用。就是所谓的【账号失效】,此时不论你的密码是否有过期,这个【账号】都不能被使用。
9.保留:
最后一个字段是保留的,看以后有没有新功能加入。
关于群组:有效与初始群组、groups,newgrp
/etc/group 文件结构
这个文件记录GID与组名的对应,
分为四栏:
1.组名:基本上需要与第三字段的GID对应
2.群组密码:通常不需要设定,这个设定通常是给【群组管理员】使用的,目前很少有这个机会设定群组管理员。同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会存在一个【x】而已;
3.GID:群组的ID。/etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的。
4.此群组支持的账号名称:一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。
账号相关文件之间的 UID/GID 与密码相关性
有效群组(effective group)与初始群组(initial group)
每个使用者在他的/etc/passwd里面的第四栏有的GID就是所谓的【初始群组(initial group)】也就是说,当用户一登入系统,立刻就拥有这个群组的相关权限的意思。
如果今天我要建立一个新的文件或者是新的目录,新文件的群组是取决于当时的【有效群组(effective group)】。
groups:有效与支持群组的观察
直接输入 groups,可以知道所支持的群组
第一个输出的群组为有效群组。
newgrp:有效群组的切换
使用newgrp是有限制的,那就是你想要切换的群组必须是你已经有支持的群组。
这个指令可以变更目前用户的有效群组,而且是另外以一个 shell 来提供这个功能的。虽然用户的环境设定(例如环境变量等等其他数据)不会有影响,但是使用者的【群组权限】将会重新被计算。但是需要注意,由于是新取得一个 shell ,因此如果想要回到原本的环境中,可以输入 exit 回到原本的 shell。
/etc/gshadow
几乎与 /etc/shadow 一模一样
1.组名
2.密码栏,同样的,开头为!表示无合法密码,所以无群组管理员
3.群组管理员的账号
4.有加入该群组支持的所属账号(与/etc/group内容相同)
以系统管理员的角度来说,gshadow 最大的功能就是建立群组管理员。
什么是群组管理员呢?
由于系统上面的账号可能会很多,但是 root 可能平时太忙碌,所以当有使用者想要加入某些群组时,root 或许会没有空管理。此时如果能够建立群组管理员的话,那么该群组管理员就能够将那个账号加入自己管理的群组中,可以免去 root 的忙碌。
账号管理
新增与移除使用者:useradd,相关配置文件, passwd, usermod, userdel
useradd
useradd [-u UID] [-g 初始数组] [-G 次要数组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号
默认会建立在用户家目录,且权限为700.
CentOs这些默认值主要会帮我们处理几个项目:
1.在/etc/passwd 里面建立一行与账号相关的数据,包括建立UID/GID/家目录等;
2.在/etc/shadow里面将此账号的密码相关参数填入,但是尚未有密码;
3.在/etc/group里面加入一个与账号名称一模一样的组名;
4.在/home底下建立一个与账号同名的目录作为用户家目录,且权限为700;
由于在 /etc/shadow 内仅会有密码参数而不会有加密过的密码数据,因此我们在建立使用者账号时,还需要使用【passwd账号】来给予密码才算是完成了用户建立的流程。
UID一般账号应该是1000号以后,那用户自己建立的系统账号则一般是小干1000号以下的。
建立一个系统账号,加上 -r
,系统会主动将账号与账号同名群组的 UID/GID 都指定小于1000以下。
由于系统账号主要是用来进行运作系统所需服务的权限设定,所以系统账号默认都不会主动建立家目录的。
useradd 参考档
使用 useradd -D
可以输出:
这个数据其实是由 /etc/default/useradd 呼叫出来的。
GROUP=100:新建账号的初始群组使用 GID 为 100 者
系统上面 GID 为 100 者即是 users 这个群组,此设定项目指的就是让新设使用者账号的初始群组为 users 这一个的意思。但CentOS上面并不是这样的,在CentOS上面预设的群组为与账号名相同的群组。举例来说, vbirdl的初始群组为vbirdl 。怎么会这样啊?这是因为针对群组的角度有两种不同的机制所致,这两种机制分别是:
私有群组机制:
系统会建立一个与账号一样的群组给使用者作为初始群组。这种群组的设定机制会比较有保密性,这是因为使用者都有自己的群组,而且家目录权限将会设定为700(仅有自己可进入自己的家目录)之故。使用这种机制将不会参考GROUP=100 这个设定值。代表性的 distributions有 RHEL,Fedora,CentOS,
公共群组机制:
以 GROUP=100 这个设定值作为新建账号的初始群组,因此每个账号都属于 users 这个群组,且默认家目录通常的权限会是【drwxr-xr-x … username users … 】,由于每个账号都属于 users 群组,因此大家都可以互相分享家目录内的数据之故。代表distributions 如 SuSE等。
HOME=/home:用户家目录的基准目录(basedir)
用户的家目录通常是与账户同名的目录,这个目录将会摆放在此设定值的目录后。
INACTIVE=-1:密码过期后是否会失效的设定值
-1 代表永远不会失效。
EXPIRE=:账号失效的日期
SHELL=/bin/bash:默认使用的 shell 程序文件名
系统默认的 shell 写在这里。
SHELL=/etc/skel:用户家目录参考基准目录
指定用户家目录的参考基准目录
CREATE_MAIL_SPOOL=yes:建立使用者的mailbox
passwd
使用useradd建立了账号之后,在预设的情况下,该账号是暂时被封锁的,也就是说,该账号是无法登入的。可以使用 passwd 给他重新设置密码。
passwd [--stdin] [账号名称]
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日数] 账号
passwd 如果不加账号,就是修改 root 自己的密码。
新的 distribution 使用 PAM 模块来管理密码,管理机制写在 /etc/pam.d/passwd 中。
而该文件与密码有关的测试模块就是使用:pam_cracklib.so,这个模块会检验密码相关的信息,并且取代/ etc/login.defs 内的 PASS_MIN_LEN的设定。
chage
详细的密码参数显示功能
chage [-ldEImMW] 账号名
usermod
进行账号相关数据的微调。
usermod [-cdegGlsuLU] username
userdel
删除用户的相关数据
userdel [-r] username
# -r 连同用户的家目录一起删除
用户的数据有:
用户账号/密码相关参数:/etc/passwd,/etc/shadow
使用者群组相关参数:/etc/group,/etc/gshadow
用户个人文件数据:/home/username,/var/spool/mail/username . .
用户功能
id
可以查询某人或自己的相关UID/GID等等的信息。
id [username]
finger
可以查阅很多用户相关的信息。大部分是文件 etc/passwd 中的信息。
finger [-s] username
chfn
change finger 的意思
chfn [-foph] [账号名]
chsh
change shell 的意思
chsh [-ls]
不论是 chfn 与 chsh ,都是能够让一般用户修改 /etc/passwd 这个系统文件的。
新增与移除群组
群组的内容都与这两个文件有关: /etc/group, /etc/gshadow.
groupadd
groupadd [-g gid] [-r] 组名
groupmod
groupmod [-g gid] [-n group_name] 群组名
groupdel
groupdel [groupname]
有某个账号使用该群组时无法删除。
公须要确认 /etc/passwd 内的账号没有任何人使用该群组作为 initial group。
gpasswd:群组管理员功能
如果系统管理员太忙碌了,导致某些账号想要加入某个项目时找不到人帮忙。这个时候可以建立【群组管理员】。
什么是群组管理员呢?就是让某个群组具有一个管理员,这个群组管理员可以管理哪些账号可以加入/移出该群组。
gpasswd 可以建立一个群组管理员。
# 关于系统管理员(root)做的动作:
gpasswd groupname
gpasswd [-A user1,...] [-M user3,...] groupname
gpasswd [-rR] groupname
# 关于群组管理员(Group administrator)做的动作
gpasswd [-ad] user groupname
主机的细部权限规划:ACL 的使用
不同于传统的权限仅有三种身份(owner, group, others)搭配三种权限(r,w,x),ACL这个机制可以单纯的针对某一个使用者或某一个群组来设定特定的权限需求。
ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner, group, others 的 read,, write, execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行 r, w, x 的权限规范,对于需要特殊权限的使用状况非常有帮助。
ACL 主要可以针对几个项目的控制权限:
使用者(user):可以针对使用者来设定权限;
群组(group):针对群组为对象来设定其权限;
默认属性(mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;
ACL 的设定技巧:getfacl, setfacl
getfacl:取得某个文件/目录的 ACL设定项目;
setfacl:设定某个目录/文件的ACL规范。
setfacl 指令用法介绍及最简单的【u:账号:权限】设定
setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
最简单的ACL设定,利用【u:使用者:权限】的方式来设定。如果一个文件设定了ACL参数后,他的权限部分就会多出一个+
号。
getfacl 指令用法
getfacl filename
# 用法基本与setfacl相同
显示的数据前面加上#的,代表这个文件的默认属性,包括文件名、文件拥有者与文件所属群组。
特定的单一群组的权限设定:【g:群组名:权限】
setfacl -m g:mygroup1:rx acl_test1
getfacl acl_test1
针对有效权限设定:【m:权限】
使用者或群组所设定的权限必须要存在于mask的权限设定范围内才会生效,此即【有效权限(effective permission)】
可以使用mask来规范最大允许的权限
可以使用默认权限设定目录未来文件的 ACL 权限继承【d:[u|g]:[user|group]:权限】
想要让 ACL 的属性全部消失可以使用 【setfacl -b 档名】
使用者身份切换
作身份的变换的原因:
1.使用一般账号:系统平日操作的好习惯
2.用较低权限启动系统服务
3.软件本身的限制
一般使用者转换为 root 的两种方式:
1.以【su-】直接将身份变成 root 即可,但是这个指令却需要root的密码,也就是说,如果要以 su 变成 root 的话,一般使用者就必须要有 root 的密码才行;
2.以【sudo】 指令执行 root 的指令串,由于 sudo 需要事先设定妥当,且 sudo 需要输入用户自己的密码,因此多人共管同一部主机时, sudo 要比 su来的好。至少 root 密码不会流出去。
su
su [-lm] [-c 指令] [username]
单纯使用【su】切换成为 root 的身份,读取的变量设定方式为 non-login shell 的方式,这种方式很多原本的变量不会被改变,尤其是 PATH 这个变量,由于没有改变成为 root 的环境,因此很多root惯用的指令就只能使用绝对路径来执行。其他的还有 MAIL 这个变量,输入mail时,收到的邮件竟然还是 feng 的,而不是root本身的邮件。
使用【su -】时,会改变环境。
只执行【一个只有root 才能进行的指令,且执行完毕就恢复原本的身份】,可以加上 -c 这个选项。
执行完后,环境并没有变化。
若要完整的切换到新使用者的环境,必须要使用【su - username 】或【su -l usermname】,才会连同PATH/USER/MAIL,等变量都转成新用户的环境;
如果仅想要执行一次root的指令,可以利用【su - -c “指令串”】的方式来处理;
使用 root 切换成为任何使用者时,并不需要输入新用户的密码;
sudo
相对于 su 需要了解新切换的用户密码(常常是需要 root 的密码),sudo 的执行则仅需要自己的密码即可。甚至可以设定不需要密码即可执行 sudo 。
由于 sudo 可以让你以其他用户的身份执行指令(通常是使用 root 的身份来执行指令),因此并非所有人都能够执行 sudo,而是仅有规范到 etc/sudoers 内的用户才能够执行 sudo 这个指令。
sudo 的指令用法
sudo [-b] [-u 新使用者账号]
sudo 的执行流程:
1.当用户执行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有执行 sudo 的权限;
2.若使用者具有可执行 sudo 的权限后,便让使用者【输入用户自己的密码】来确认;
3.若密码输入成功,便开始进行 sudo 后续接的指令(但root 执行sudo 时,不需要输入密码);
4.若欲切换的身份与执行者身份相同,那也不需要输入密码。
sudo 执行的重点是:【能否使用sudo必须要看 /etc/sudoers 的设定值,而可使用 sudo 者是透过输入用户自己的密码来执行后续的指令串】。
visudo 与 /etc/sudoers
除了 root 之外的其他账号,若想要使用 sudo 执行属于 root 的权限指令,则 root 需要先使用 visudo 去修改 /etc/sudoers,让该账号能够使用全部或部分的 root 指令功能。
为什么要使用 visudo?
因为 /etc/sudoers 是有设定语法的,如果设定错误那会造成无法使用 sudo 指令的不良后果。因此才会使用visudo去修改,并在结束离开修改画面时,系统会去检验 /etc/sudoers的语法。
单一用户可进行 root 所有指令,与sudoers
直接透过修改 /etc/sudoers
visudo
....
root ALL=(ALL) ALL #找到这一行,大约98行左右
feng1 ALL=(ALL) ALL #这一行是新增的
【使用者账号】:系统的哪个账号可以使用sudo 这个指令的意思;
【登入者的来源主机名】:当这个账号由哪部主机联机到本Linux主机,意思是这个账号可能是由哪一部网络主机联机过来的,这个设定值可以指定客户端计算机(信任的来源的意思)。默认值 root 可来自任何一部网络主机;
【(可切换的身份)】:这个账号可以切换成什么身份来下达后续的指令,默认 root可以切换成任何人;
【可下达的指令】:可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。预设root可以切换任何身份且进行任何指令之意。
利用 wheel 群组以及免密码的功能除处理 visudo
使用群组的方式来设定
visudo
....
%wheel ALL=(ALL) ALL #大约106行左右,将# 拿掉
# 在左边加上 % ,代表后面接的是一个群组的意思,改完后离开
上面的设定值会造成【任何加入 wheel这个群组的使用者,就能够使用 sudo 切换任何身份来掉作任何指令】的意思。可以将 wheel 换成自己想要的群组名。
也可以不需要密码即可使用 sudo:
visudo
....
%wheel ALL=(ALL) NOPASWD:ALL
NOPAASSWD 就是免密码输入的意思。
有限的指令操作
上面两点都会让使用者能够利用 root 的身份进行任何事情,这样总是不太好~
如果仅让用户仅能够进行部分系统任务,
visudo
myuser ALL(root) /usr/bin/passwd # 最后指令必须用绝对路径
上面的设定值指的是【myuser1 可以切换成为 root 使用 passwd 这个指令】的意思。其中要注意的是:指令字段必须要填写绝对路径。
myuser1 ALL=(root)!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
在设定值中加上感叹号【!
】代表【不可执行】的意思。因此上面这一行会变成:可以执行【passwd 任意字符】,但是【 passwd 】与【 passwd root 】这两个指令例外。
透过别名建置 visudo
可以通过别名同时加入多个管理员。
visudo 的别名可以是【指令别名、帐户别名、主机别名】等。
visudo
...
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM
可以创立一个帐户别名称为 ADMPW 的名称,然后将这个名称处理一下即可。
透过 User_Alias 建立出一个新账号,这个账号名称一定要使用大写字符来处理,包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名)都需要使用大写字符的。
这个ADMPW代表后面接的那些实际账号。而该账号能够进行的指令就如同 ADMPWCOM 后面所指定的那样上表最后一行则写入这两个别名(账号与指令别名),未来要修改时,只要修改User_Alias 以及Cmnd_Alias 这两行即可。
其实就是定义一个变量赋值而已,,,,,
sudo 的时间间隔问题
使用同一个账号,两次执行 sudo 的间隔在五分钟内,那么再次执行 sudo 时就不需要再次输入密码了。
如果两次 sudo 操作的间隔超过5分钟,那就得要重新输入一次密码了。
sudo 搭配 su 的使用方式
visudo
User_Alias ADMINS = feng1
ADMINS ALI=(root) /bin/su -
feng1 只要输入【sudo su -】并且输入【自己的密码】后,立刻变成 root 的身份。不但root密码不会外流,用户的管理也变的非常方便。
用户的特殊 shell 与 PAM 模块
我们所谓的【无法登入】指的仅是:【这个使用者无法使用bash或其他 shell 来登入系统】而已,并不是说这个账号就无法使用其他的系统资源。
PAM(Pluggable Authentication Modules,嵌入式模块)
PAM 可以说是一套应用程序编程接口(Application Programming Interface,API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知PAM后,PAM就能够回报使用者验证的结果(成功或失败)。
由于 PAM 仅是一套验证的机制,又可以提供给其他程序所呼叫引用,因此不论你使用什么程序,都可以使用 PAM 验证。
PAM是一个独立的 API 存在,只要任何程序有需求时,可以向 PAM 发出验证要求的通知,PAM 经过一连串的验证后,将验证的结果回报给该程序,然后该程序就能够利用验证的结果来进行可登入或显示其他无法使用的讯息。
PAM 用来进行验证的数据称为模块(Modules),每个 PAM 模块的功能都不太相同。
PAM 模块设定语法
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 回传的结果决定下一个动作(重新输入新密码或者通过验证!)
第一栏为验证类别,第二栏为控制标准,第三栏为PAM模块与该模块的参数。
上面出现的 include 这个关键字,代表的是【请呼叫后面的文件来作为这个类别的验证】。
所以,上述的每一行都要重复呼叫/ etc/pam.d/system-auth那个文件来进行验证的意思,每一行 都是一个验证的过程。
第一个字段:验证类别
主要分为四种:
auth
是 authentication (认证)的缩写,所以这种类别主要用来检验使用者的身份验证,这种类别通常是需要密码来检验的,所以后续接的模块是用来检验用户的身份。
account
account(账号)则大部分是在进行 authorization(授权),这种类别则主要在检验使用者是否具有正确的权限。
session
session 是会议期间的意思,所以 session 管理的就是使用者在这次登入(或使用这个指令)期间,PAM所给予的环境设定。这个类别通常用在记录用户登入与注销时的信息。
password
password 就是密码嘛。所以这种类别主要在提供验证的修订工作。
第二个字段:验证的控制旗标(control flag)
简单来说,就是验证通过的标准。主要分为四种控制方式:
required
此验证若成功则带有 success (成功)的标志,若失败则带有 failure 的标志,但不论成功或失败都会继续后续的验证流程。由于后续的验证流程可以继续进行,因此相当有利于资料的登录(log),这也是 PAM最常使用required 的原因。
requisite
若验证失败则立刻回报原程序 failure 的标志,并终止后续的验证流程。若验证成功则带有 success 的标志并继续后续的验证流程。这个项目与 required 最大的差异,就在于失败的时候还要不要继续验证下去?由于 requisite 是失败就终止,因此失败时所产生的 PAM 信息就无法透过后续的模块来记录了。
sufficient
若验证成功则立刻回传 success 给原程序,并终止后续的验证流程;若验证失败则带有 failure 标志并继续后续的验证流程。这玩意儿与requisits 刚好相反。
optional
这个模块控件目大多是在显示讯息而已,并不是用在验证方面的。
程序运作过程中遇到验证时才会去呼叫 PAM ,而 PAM验证又分很多类型与控制,不同的控制旗标所回报的讯息并不相同。如上图所示,requisite 失败就回报了并不会继续,而 sufficient 则是成功就回报了也不会继续。
几个常用的PAM模块
每个PAM模块的功能都不太相同,
/etc/pam.d/*:每个程序个别的PAM 配置文件;
/lib64/security/*:PAM模块文件的实际放置目录;
/etc/security/*:其他 PAM 环境的配置文件;
/usr/share/doc/pam-*/:详细的 PAM说明文件。
pam_securetty.so:
限制系统管理员(root)只能够从安全的(secure)终端机登入;安全的终端机设定写在/etc/securetty这个文件中。
pam_nologin.so:
这个模块可以限制一般用户是否能够登入主机之用。当 /etc/nologin 这个文件存在时,则所有一般使用者均无法再登入系统了。若/etc/nologin存在,则一般使用者在登入时,在他们的终端机上会将该文件的内容显示出来。所以,正常的情况下,这个文件应该是不能存在系统中的。
这个模块对 root 以及已经登入系统中的一般账号并没有影响。(这与/etc/nologin.txt并不相同!)
pam_selinux.so:
SELinux是个针对程序来进行细部管理权限的功能。由于 SELinux 会影响到用户执行程序的权限,因此我们利用PAM模块,将 SELinux 暂时关闭,等到验证通过后,再予以启动。
pam_console.so:
当系统出现某些问题,或者是某些时刻需要使用特殊的终端接(例如RS232之类的终端联机设备)登入主机时,这个模块可以帮助处理一些文件权限的问题,让使用者可以透过特殊终端接口(console)顺利的登入系统。
pam_loginuid.so:
系统账号与一般账号的UID是不同的,一般账号UID均大于1000 才合理。因此,为了验证使用者的UID真的是我们所需要的数值,可以使用这个模块来进行规范。
pam_env.so:
用来设定环境变量的一个模块,如果需要额外的环境变量设定,可以参考 /etc/security/pam_env.conf 这个文件的详细说明。
pam_unix.so:
这是个很复杂且重要的模块,这个模块可以用在验证阶段的认证功能,可以用在授权阶段的账号许可证管理,可以用在会议阶段的登录文件记录等,甚至也可以用在密码更新阶段的检验。
pam_pwquality.so:
可以用来检验密码的强度。包括密码是否在字典中,密码输入几次都失败就断掉此次联机等功能。最早之前其实使用的是 pam_cracklib.so这个模块,后来改成pam_pwquality.so这个模块,但此模块完全兼容于pam_cracklib.so,同时提供了/etc/security/pwquality.conf 这个文件可以额外指定默认值。比较容易处理修改。
login 的 PAM验证机制流程:
1.验证阶段(auth):首先,(a)会先经过 pam_securetty.so判断,如果使用者是root时,则会参/etc/securetty的设定;接下来(b)经过 pam_env.so设定额外的环境变量;再©透过 pam_unix.so检验密码,若通过则回报login程序;若不通过则(d)继续往下以pam_succeed_if.so 判断UID是否大于1000 ,若小于1000则回报失败,否则再往下(e)以pam_deny.so拒绝联机。
2.授权阶段(account):(a)先以 pam_nologin.so 判断 /etc/nologin 是否存在,若存在则不许一般使用者登入;(b)接下来以 pam_unix.so 及 pam_localuser.so进行账号管理,再以© pam_succeed_if.so 判断UID是否小于1000 ,若小于1000 则不记录登录信息。(d)最后以 pam_permit.so允许该账号登入。
3.密码阶段(password):(a)先以 pam_pwquality.so设定密码仅能尝试错误3次; (b)接下来以 pam_unix.so透过sha512, shadow等功能进行密码检验,若通过则回报 login程序,若不通过则©以pam_deny.so拒绝登入。
4.会议阶段(session):(a)先以 pam_selinmux.so 暂时关闭SELinux;(b)使用pam_limits.so 设定好用户能够操作的系统资源; ©登入成功后开始记录相关信息在登录文件中;(d)以 pam_loginuid.so 规范不同的UID权限;(e)开启 pam_selinux.so的功能。
其他相关文件
limits.conf
设定完成就生效了,不用重新启动任何服务
PAM 是在程序呼叫时才予以设定的,因此修改完成的数据,对于已登入系统中的用户是没有效果的,要等他再次登入时才会生效。
/var/log/secure, /var/log/messages
如果发生任何无法登入或者是产生一些无法预期的错误时,由于PAM模块都会将数据记载在/var/log/secure当中,所以发生了问题请务必到该文件内去查询一下问题点;
多重登入的错误可以到/var/log/secure内查阅。
Linux 主机上的用户讯息传递
查询使用者:w, who, last, lastlog
使用者对谈:write, mseg, wall
write 使用者账号 [用户所在终端端口]
如果不想要接受任何讯息,直接下达这个动作:
write 是仅针对于一个使用者来传广播,可以对所有系统上面的用户发送广播。
wall "消息内容"
所有人都会收到,包括发送者自己。
使用者邮件信箱:mail
mail 可以离线传达信息。
寄出信件:
mail -s "邮件标题" username@loccalhost
收信直接mail
即可。
一些账号相关的检查工具
pwck
pwck 这个指令在检查 /etc/passwd 这个账号配置文件内的信息,与实际的家目录是否存在等信息,还可以比对 /etc/passwd /etc/shadow的信息是否一致,另外,如果 /etc/passwd 内的数据字段错误时,会提示使用者修订。一般来说,只是利用这个玩意儿来检查我的输入是否正确就是了。
pwconv
主要的目的是在将 /etc/passwd 内的账号与密码,移动到 /etc/shadow 当中。
比对 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 内存在的账号并没有对应的 /etc/shadow 密码时,则pwconv 会去 /etc/login.defs 取用相关的密码数据,并建立该账号的 /etc/shadow 数据;
若 /etc/passwd 内存在加密后的密码数据时,则 pwconv 会将该密码栏移动到 /etc/shadow 内,并将原本的 /etc/passwd 内相对应的密码栏变成x
。
pwunconv
相对于 pwconv , pwunconv则是将/etc/shadow内的密码栏数据写回/etc/passwd当中,并且删除 /etc/shadow文件。
chpasswd
可以读入未加密前的密码,并且经过加密后,将加密后的密码写入/etc/shadow当中。
它可以由 Standard input 读入数据,每笔数据的格式是【username:password】
《鸟哥的Linux私房菜-基础篇》学习笔记