四、用户身份切换

1.su:将身份变成root

使用方式如下:

[root@study ~]# su [-lm] [-c 命令] [username]

选项与参数:

-:单纯使用-如『su-』代表使用login-shell的变量文件读取方式来登入系统;若使用者名称没有加上去,则代表切换为root的身份。

-l:与-类似,但后面需要加欲切换的使用者账号!也是login-shell的方式。

-m:-m与-p是一样的,表示『使用目前的环境设定,而不读取新使用者的配置文件』

-c:仅进行一次指令,所以-c后面可以加上指令喔!

平时我在使用su的时候,一般都是直接输入su,但是这样只是部分内容切换为root,读取的变量设定方式还是non-login shell,所以很多东西还是原来的xiaoao帐号。因此要使用“su -”。

具体来说,

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

(2)如果仅想要执行一次root的指令,可以利用『su - -c "指令串"』的方式来处理;

(3)使用root切换成为任何使用者时,并不需要输入新用户的密码。

2.sudo:执行root身份的命令

sudo的执行只需要输入自己的密码即可,甚至可以设置不需要密码即可执行sudo。sudo是让你以其它用户的身份执行命令(通常是root的身份),因此并非所有的用户都可以执行suo,只是在/etc/sudoers内的用户才可以执行

(1)sudo的用法

一开始系统预置只有root可以执行sudo

sudo的使用方式如下:

[root@study ~]# sudo [-b] [-u 要使用的用户帐号名称]

选项与参数:

-b:将后续的指令放到后台中让系统自行执行,而不与目前的shell产生影响

-u:后面可以接欲切换的用户,若无此项则代表切换身份为root。

(2)visudo与/etc/sudoers

除了root之外的其他账号,若想要使用sudo执行属于root的权限指令,则root需要先使用visudo去修改/etc/sudoers,让该账号能够使用全部或部分的root指令功能。

一般来说,visudo的设置有几种简单的方法:

①单一用户可使用root所有指令与sudoers文件语法:假如我们要让vbird1可以使用root任何指令,有两种方法,第一种是直接修改/etc/sudoers,方法如下:

[root@study ~]# visudo

....(前面省略)....

root    ALL=(ALL)       ALL  <==找到这一行。

vbird1  ALL=(ALL)       ALL  <==這一行是你要新增的!

....(底下省略)....

这里面4个部分的涵义如下:

vbird1ALL=(ALL)ALL
用户帐号用户来源主机(可切换身份)可下达指令

②利用whheel用户组及免密码的功能处理visudo

[root@study ~]# visudo  <==同樣的,請使用 root 先設定

....(前面省略)....

%wheel ALL=(ALL) ALL

#在最左边加上%,代表后面接的是一个群组的意思。改完请储存后离开。

[root@study ~]# usermod -a -G wheel pro1#将pro1加入wheel

上面这句话的意思就是任何加入wheel这个用户组的用户,就能够使用sudo切换任何身份来操作任何命令。

免密码使用sudo,只需要在上面的“ALL=(ALL)”后面的“ALL”修改为“NOPASSWD: ALL”。

③用限制的命令操作。上面两点都会让使用者能够利用root的身份进行任何事情。如果我想要让用户仅能够进行部分系统任务,就需要这样去做(命令一定要使用绝对地址)。

[root@study ~]# visudo  <==注意是root身份

myuser1  ALL=(root)  !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

在设定值中加上惊叹号『!』代表『不可执行』的意思。因此上面这一行会变成:可以执行『passwd任意字符』,但是『passwd』与『passwdroot』这两个指令例外。

④通过别名建立visudo

visudo的别名可以是『指令别名、帐户别名、主机别名』等。这里仅介绍帐号别名。

假设我的pro1,pro2,pro3与myuser1,myuser2要加入上述的密码管理员的sudo列表中,那我可以创立一个帐户别名称为ADMPW的名称,然后将这个名称处理一下即可。处理的方式如下:

[root@study ~]# visudo  <==注意是 root 身份

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

这个账号名称一定要使用大写字符来处理,包括Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名)都需要使用大写字符的。

⑤sudo的时间间隔问题:两次sudo操作间隔不超过5分钟,则在第二次sudo操作的时候不需要再次输入密码,若超出5分钟,就需要重新输入。

⑥sudo搭配su的使用方式:

[root@study ~]# visudo

User_Alias  ADMINS = pro1, pro2, pro3, myuser1

ADMINS ALL=(root)  /bin/su -

只要输入“sudo su-”并且输入『自己的密码』后,立刻变成root的身份!不但root密码不会外流,用户的管理也变的非常方便。

 

五、用户的特殊shell与PAM模组

如果我想建立一个仅能够使用mail server相关邮件服务的帐号,而该账号并不能登录Linux主机,该怎么办呢?

1.特殊的shell/sbin/nologin

在passwd文件结构里面有说过系统账号这个东西,它是不需要登录也无法登陆的,即用户无法使用bash或其它shell来登录系统,但是它却可能能够使用其它的系统资源。如果我们让某个具有/sbin/nologin的用户知道它们不能登录账户级,可以建立“/etc/nologin.txt”这个文件,并且在这个文件说明不能登录的原因。比如,我在myuser3的nologin.txt写入:

This account is system account or mail account.

Please DO NOT use this account to login my Linux server.

那当我在终端中运行su - myuser3的时候,会显示上面这段话。

 

2.PAM模块简介

在过去,我们想要对一个使用者进行认证(authentication),是需要用户输入账号密码,然后通过自行撰写的程序来判断该账号密码是否正确。也因为如此,我们常常得使用不同的机制来判断账号密码,所以搞的一部主机上面拥有多个各别的认证系统,也造成账号密码可能不同步的验证问题!为了解决这个问题因此有了PAM (Pluggable Authentication Modules, 嵌入式模块)的机制。

PAM可以说是一套API,他提供了一连串的验证机制,只要使用者将验证阶段的需求告知PAM后,PAM就能够回报使用者验证的结果(成功或失败)。由于PAM仅是一套验证的机制,又可以提供给其他程序所调用引用,因此不论你使用什么程序,都可以使用PAM来进行验证,如此一来,就能够让账号密码或者是其他方式的验证具有一致的结果,也让程序设计师方便处理验证的问题。

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

 

3.PAM模块设置语法:验证类别(type)、控制标准(flag)、模块与参数

PAM通过一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们以passwd这个命令调用PAM。当执行passwd后,这个程序调用PAM的流程是:

①用户开始执行/usr/bin/passwd这个程序,并输入密码;

②passwd呼叫PAM模块进行验证;

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

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

⑤将验证结果(成功、失败以及其他信息)回传给passwd这个程序;

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

我们来看一下/etc/pam.d/里面的配置文件内容是什么。

[root@study ~]# cat /etc/pam.d/passwd

#%PAM-1.0  <==PAM版本的说明

auth       include      system-auth   <==每一行都是一个验证过程

account    include      system-auth

password   substack     system-auth

-password   optional    pam_gnome_keyring.so use_authtok

password   substack     postlogin

验证类型   控制标准     PAM模块与该模块的参数

文件内容每一行分为三个部分:验证类型、控制标准和PAM模块与该模块的参数。上面出现include这个关键字,代表的是“调用后面的文件来作为这个类别的验证”。所以上述的每一行都要重复调用/etc/padm.d/system-auth文件来进行验证。下面来介绍下前两项内容的涵义。

(1)验证类型

验证类型主要分为四种,分别是:

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

②account:account(账号)则大部分是在进行authorization(授权),这种类别则主要在检验使用者是否具有正确的权限。

③session:session管理的就是使用者在这次登入(或使用这个指令)期间,PAM所给予的环境设置。这个类别通常用在记录用户登入与注销时的信息。

④password:password就是密码嘛!所以这种类别主要在提供验证的修订工作,比如修改密码。

这四个验证的类型通常是有顺序的。

(2)验证的控制标志:验证通过的标准。这个字段中管控该验证的放行方式,也分为四种:

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

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

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

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

简单来说,整个步骤如图5.1所示。

图5.1 PAM控制标志的流程图

程序运行过程中遇到验证才会去调用PAM,然后PAM再进行不同类型的验证与控制,不同的控制标志返回的信息不同,根据需要来返回信息。

 

4.常用模块简介:securettynologinpam_pwqualitylogin流程

常用的几个目录:

①/etc/pam.d/*:每个程序个别的PAM配置文件;

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

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

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

这里介绍几个简单的模块。

①pam_securetty.so:限制系统管理员(root)只能够从安全的(secure)终端机登入;那什么是终端机?例如tty1,tty2等就是传统的终端机装置名称。那么安全的终端机设定呢?就写在/etc/securetty这个文件中。你可以查阅一下该文件,就知道为什么root可以从tty1~tty7登入,但却无法透过telnet登入Linux主机了!

②pam_nologin.so:这个模块可以限制一般用户是否能够登入主机之用。当/etc/nologin这个文件存在时,则所有一般使用者均无法再登入系统了!若/etc/nologin存在,则一般使用者在登入时,在他们的终端机上会将该文件的内容显示出来!所以,正常的情况下,这个文件应该是不能存在系统中的。但这个模块对root以及已经登入系统中的一般账号并没有影响。(注意喔!这与/etc/nologin.txt并不相同!)

③pam_selinux.so:SELinux是个针对程序来进行细部管理权限的功能,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这个文件可以额外指定默认值!比较容易处理修改!

 

5.其它相关文件:limits.conf

除了修改使用者的~/.bashrc配置文件之外,其实系统管理员可以统一藉由PAM来管理的!那就是/etc/security/limits.conf这个文件的设定。

使用举例如图5.2所示。

图5.2 使用举例

六、Linux主机上的用户信息传递

1.查询用户:w,who,last,lastlog

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

 

2.用户交流:write,mesg,wall

使用write的方式:write 用户名 [用户所在终端]。结束时,请按下 [ctrl]-d 来结束输入。

如果不想被打扰,那么可以运行“mesg n”。不过这样的功能对于root发送的信息是无效的。但是如果root设置了这个功能,那么其他用户就无法给root发送信息。如果再写接收信息,输入“mesg y”就可以了。

wall是类似于广播,可以对系统上所有的用户传送信息。语法是“wall “传送信息””。

 

3.用户邮件信箱:mail

可以使用这样的格式来发送mail:mail -s "邮件标题" username@localhost。但是基本上,如果是给本机的用户,则可以省略@localhost。我们以一封邮件来举例介绍格式。

[root@study ~]# mail -s "nice to meet you" vbird1

Hello, D.M. Tsai

Nice to meet you in the network.

You are so nice.  byebye!

.    <==这里很重要喔,结束时,最后一行输入小数点 . 即可!

EOT

[root@study ~]#  <==出现提示字符,表示输入完毕了!

收信的话直接在终端输入“mail”就可以看到了。如果我想要知道这个mail内部的指令有哪些,可以在&之后输入『?』。

几个比较常见的命令有:

指令意义
h列出信件标头。如果要查阅40封信件左右的信件标头,可以输入“h40”。
d删除后续接的信件号码,删除单封是“d10”,删除20~40封则为“d20-40”。不过,这个动作要生效的话,必须要配合q这个指令才行(参考底下说明)!
s将信件储存成档案。例如我要将第5封信件的内容存成~/mail.file:“s5~/mail.file
x或者输入exit都可以。这个是『不作任何动作离开mail程序』的意思。不论你刚刚删除了什么信件,或者读过什么,使用exit都会直接离开mail,所以刚刚进行的删除与阅读工作都会无效。
q相对于exit是不动作离开,q则会实际进行你刚刚所执行的任何动作(尤其是删除!)