最新消息:博主的视频课程:Django高级实战教程 开发企业级问答网站开发

鸟哥Linux基础篇-Linux账号管理与ACL权限设置

Linux liaogx 来源:西部世界 827浏览 0评论

13.1.2 使用者帐号

当你输入帐号密码后,系统的处理流程?

  1. 先找寻 /etc/passwd 里面是否有你输入的帐号?如果没有则跳出,如果有的话则将该帐号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该帐号的主文件夹与 shell 设置也一并读出;
  2. 这时 Linux 会进入 /etc/shadow 里面找出对应的帐号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
  3. 如果一切都 OK 的话,就进入 Shell 控管的阶段 。

/etc/passwd 文件结构

[root@localhost ~]# head -n 5 /etc/passwd

root:$1$boV8Ik0W$uNnfiRlRP0u1CxT7tO4xK/:0:0:root:/root:/bin/bash

bin:*:1:1:bin:/bin:/sbin/nologin

daemon:*:2:2:daemon:/sbin:/sbin/nologin

adm:*:3:4:adm:/var/adm:/sbin/nologin

lp:*:4:7:lp:/var/spool/lpd:/sbin/nologin

  1. 帐号名称:例如 root 的 UID 对应就是 0 (第三字段);
  2. 密码: 早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。所以这里你会看到一个“ x ”
  3. UID: 这个就是使用者识别码,通常 Linux 对于 UID 有几个限制需要说给您了解一下:

| id 范围 | 该 ID 使用者特性 |

| 0(系统管理员) | 当 UID 是 0 时,代表这个帐号是“系统管理员”! 所以当你要让其他的帐号名称也具有 root 的权限时

| 1~999(系统帐号) | 保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有不一样。默认 1000 以下的

| 1000~60000(可登陆帐号) | 给一般使用者用的。事实上,目前的 linux 核心 (3.10.x 版) 已经可以支持到 4294967

  1. GID: 这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,只是他是用来规范群组名称与 GID 的对应而已!
  2. 使用者信息说明栏: 这个字段基本上并没有什么重要用途,只是用来解释这个帐号的意义而已!不过,如果您提供使用 finger 的功能时,这个字段可以提供很多的讯息。
  3. 主文件夹: 这是使用者的主文件夹,root 的主文件夹在 /root,root 登陆之后就会立刻跑到 /root 目录里头,可以在这个字段进行修改,默认的使用者主文件夹在 /home/yourIDname
  4. Shell: 当使用者登陆系统后就会取得一个 Shell 来与系统的核心沟通以进行使用者的操作任务。默认 shell 就是在这个字段指定的,这里比较需要注意的是,/sbin/nologin shell 可以用来替代成让帐号无法取得shell 环境的登陆动作!

/etc/shadow 文件结构

[root@localhost etc]# head -n 5 /etc/shadow

root:$1$boV8Ik0W$uNnfiRlRP0u1CxT7tO4xK/:17277:0:99999:7:::

bin:*:16372:0:99999:7:::

daemon:*:16372:0:99999:7:::

adm:*:16372:0:99999:7:::

lp:*:16372:0:99999:7:::

  1. 帐号名称: 由于密码也需要与帐号对应,因此,这个文件的第一栏就是帐号,必须要与 /etc/passwd 相同才行!
  2. 密码: 这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密) 的,你只会看到有一些特殊符号的字母就是了!需要特别留意的是,虽然这些加密过的密码很难被解出来, 但是“很难”不等于“不会”,所以,这个文件的默认权限是“-rw——-”或者是“———-”,亦即只有 root 才可以读写就是了!你得随时注意,不要不小心更动了这个文件的权限呢!另外,由于各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同。 举例来说,旧式的 DES, MD5 编码系统产生的密码长度就与目前惯用的 SHA 不同[2]!SHA 的密码长度明显的比较长些。由于固定的编码系统产生的密码长度必须一致,因此“当你让这个字段的长度改变后,该密码就会失效(算不出来) ”。 很多软件通过这个功能,在此字段前加上 ! 或 * 改变密码字段长度,就会让密码“暂时失效”了。
  1. 最近更动密码的日期: 这个字段记录了“更动密码那一天”的日期,计算 Linux 日期的时间是以 1970 年 1月 1 日作为 1 而累加的日期,1971 年 1 月 1 日则为 366 !
  2. 密码不可被更动的天数:(与第 3 字段相比) 第四个字段记录了:这个帐号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是 0 的话, 表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的!如果设置为 20 天的话,那么当你设置了密码之后, 20 天之内都无法改变这个密码!
  3. 密码需要重新变更的天数:(与第 3 字段相比) 经常变更密码是个好习惯!为了强制要求使用者变更密码,这个字段可以指定在最近一次更改密码后, 在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设置你的密码,否则这个帐号的密码将会“变为过期特性”。 而如果像上面的 99999 (计算为 273 年) 的话,那就表示,呵呵,密码的变更没有强制性之意。
  4. 密码需要变更期限前的警告天数:(与第 5 字段相比) 当帐号的密码有效期限快要到的时候 (第 5 字段) ,系统会依据这个字段的设置,发出“警告”言论给这个帐号,提醒他“再过 n 天你的密码就要过期了,请尽快重新设置你的密码呦!”,如上面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。
  5. 密码过期后的帐号宽限时间(密码失效日) :(与第 5 字段相比) 密码有效日期为“更新日期(第3字段) ”+“重新变更日期(第5字段) ”,过了该期限后使用者依旧没有更新密码,那该密码就算过期了。 虽然密码过期但是该帐号还是可以用来进行其他工作的,包括登陆系统取得 bash 。不过如果密码过期了, 那当你登陆系统时,系统会强制要求你必须要重新设置密码才能登陆继续使用喔,这就是密码过期特性。那这个字段的功能是什么呢?是在密码过期几天后,如果使用者还是没有登陆更改密码,那么这个帐号的密码将会“失效”, 亦即该帐号再也无法使用该密码登陆了。要注意密码过期与密码失效并不相同。
  1. 帐号失效日期: 这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设置。表示这个帐号在此字段规定的日期之后,将无法再使用。 就是所谓的“帐号失效”,此时不论你的密码是否有过期,这个“帐号”都不能再被使用! 这个字段会被使用通常应该是在“收费服务”的系统中,你可以规定一个日期让该帐号不能再使用。
  2. 保留: 最后一个字段是保留的,看以后有没有新功能加入。

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

/etc/group文件结构

[root@localhost ~]# head -n 5 /etc/group

root:x:0:

bin:x:1:

daemon:x:2:

sys:x:3:

adm:x:4:

[root@localhost ~]#

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

/etc/passwd里面的第四栏有所谓的GID就是所谓的“初始群组(initial group)”!也就是说,当使用者一登陆系统,立刻就拥有这个群组的相关权限。

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

[root@localhost ~]# groups

root liao

[root@localhost ~]#

第一个输出的群组即为有效群组 (effective group),也就是说,我的有效群组为root时,如果以touch去创建一个新文件,例如:“touch test”,那么这个文件的拥有者为root,而且群组也是root,通常有效群组的作用是在新建文件。

newgrp: 有效群组的切换

[root@localhost ~]# newgrp liao

[root@localhost ~]# groups

liao root

[root@localhost ~]#

/etc/gshadow文件结构

[root@localhost ~]#head -n 5 /etc/gshadow

t:$1$boV8Ik0W$uNnfiRlRP0u1CxT7tO4xK/:17277:0:99999:7:::

bin:*:16372:0:99999:7:::

daemon:*:16372:0:99999:7:::

adm:*:16372:0:99999:7:::

lp:*:16372:0:99999:7:::

[root@localhost ~]#

  1. 群组名称
  2. 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员
  3. 群组管理员的帐号 (相关信息在 gpasswd 中介绍)
  4. 有加入该群组支持的所属帐号 (与 /etc/group 内容相同!)

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

useradd

[root@study ~]# 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 为永远不失效(密码只会过期而强制于登陆时重新设置而已。)

1.其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单的使用“ useradd 帐号 ”来创建使用者即可。 CentOS 这些默认值主要会帮我们处理几个项目:

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

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

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

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

2.使用 useradd 创建使用者帐号时,其实会更改不少地方,至少我们就知道下面几个文件:

① 使用者帐号与密码参数方面的文件:/etc/passwd, /etc/shadow

② 使用者群组相关方面的文件:/etc/group, /etc/gshadow

③ 使用者的主文件夹:/home/帐号名称

3.useradd 的默认值可以使用下面的方法调用出来:

[root@localhost ~]# useradd -D

GROUP=100

HOME=/home  #使用者主文件夹的基准目录(basedir)

INACTIVE=-1  #密码过期后是否会失效的设置值,如果是0代表密码过期立刻失效,如果是-1则是代表密码永远不会失效,如果是数字x,则代表过期x天后才失效

EXPIRE=  #帐号失效的日期,就是 shadow 内的第八字段,通常不会设置此项目,但如果是付费的会员制系统,或许这个字段可以设置

SHELL=/bin/bash  #默认使用的shell程序文件名,假如你的系统为mail server,你希望每个帐号都只能使用email的收发信件功能, 而不许使用者登陆系统取得shell,那么                             可以将这里设置为/sbin/nologin ,如此一来,新建的使用者默认就无法登陆! 也免去后续使用usermod进行修改的手续!

SKEL=/etc/skel  #使用者主文件夹参考基准目录。root主文件夹/home/root内的各项数据,都是由/etc/skel所复制过去的~所以呢,未来如果我想要让新增使用者时,该使用者的环境变量 ~/.bashrc就设置妥当的话,您可以到/etc/skel/.bashrc去编辑一下,也可以创建/etc/skel/www这个目录,那么未来新增使用者后,在他的主文件夹下就会有 www 那个目录了!

CREATE_MAIL_SPOOL=yes  #创建使用者的mailbox

[root@localhost ~]#

GROUP=100:新建帐号的初始群组使用GID为100者

系统上面GID为100者即是users这个群组,此设置项目指的就是让新设使用者帐号的初始群组为users这一个的意思。 但是我们知道CentOS上面并不是这样的,在 CentOS上面默认的群组为与帐号名相同的群组。这是因为针对群组的角度有两种不同的机制所致, 这两种机制分别是:

① 私有群组机制:系统会创建一个与帐号一样的群组给使用者作为初始群组。 这种群组的设置机制会比较有保密性,这是因为使用者都有自己的群组,而且主文件夹权限将会设置为 700 (仅有自己可进入自己的主文件夹) 之故。使用这种机制将不会参考GROUP=100这个设置值。代表性的distributions 有 RHEL, Fedora, entOS 等;

② 公共群组机制:就是以 GROUP=100 这个设置值作为新建帐号的初始群组,因此每个帐号都属于 users 这个群组, 且默认主文件夹通常的权限会是“ drwxr-xr-x …username users…”,由于每个帐号都属于users群组,因此大家都可以互相分享主文件夹内的数据之故。代表 distributions 如SuSE等。

4.除了这些基本的帐号设置值之外,UID/GID还有密码参数要看一下/etc/login.defs

[root@localhost ~]# grep -v ‘^#’ /etc/login.defs | grep -vn ‘^$’

2:MAIL_DIR        /var/spool/mail

4:PASS_MAX_DAYS        99999

5:PASS_MIN_DAYS        0

6:PASS_MIN_LEN        5

7:PASS_WARN_AGE        7

9:UID_MIN                  1000

10:UID_MAX                 60000

11:SYS_UID_MIN               201

12:SYS_UID_MAX               999

14:GID_MIN                  1000

15:GID_MAX                 60000

16:SYS_GID_MIN               201

17:SYS_GID_MAX               999

20:CREATE_HOME        yes

22:UMASK           077

24:USERGROUPS_ENAB yes

26:ENCRYPT_METHOD MD5

28:MD5_CRYPT_ENAB yes

[root@localhost ~]#

mailbox 所在目录:使用者的默认 mailbox 文件放置的目录在 /var/spool/mail

shadow 密码第 4, 5, 6 字段内容: 通过 PASSMAX_DAYS 等等设置值来指定的!所以你知道为何默认的 /etc/shadow 内每一行都会有 0:99999:7 存在!不过要注意的是,由于目前我们登陆时改用 PAM 模块来进行密码检验,所以那个 PASS_MIN_LEN是失效的

UID/GID 指定数值:  UID_MIN 指的就是可登陆系统的一般帐号的最小 UID ,至于 UID_MAX则是最大 UID 之意。要注意的是,系统给予一个帐号 UID 时,他是先参考 UID_MIN 设置值取得最小数值; 由 /etc/passwd 搜寻最大的 UID 数值, 将两值相比,找出最大的那个再加一就是新帐号的 UID 了

使用者主文件夹设置值:为何我们系统默认会帮使用者创建主文件夹?就是这个“CREATE_HOME = yes”的设置值,这个设置值会让你在使用 useradd 时,主动加入“ -m ”这个产生主文件夹的选项!如果不想要创建使用者主文件夹,就只能强制加上“-M ”的选项在 useradd 指令执行时,至于创建主文件夹的权限设置呢?就通过 umask这个设置值!因为是 077 的默认设置,因此使用者主文件夹默认权限才会是“ drwx—— ”

使用者删除与密码设置值:使用“USERGROUPS_ENAB yes”这个设置值的功能是: 如果使用 userdel 去删除一个帐号时,且该帐号所属的初始群组已经没有人隶属于该群组了, 那么就删除掉该群组。

ENCRYPT_METHOD MD5则表示使用MD5来加密密码明文

5.使用useradd这支程序在创建Linux上的帐号时,至少会参考/etc/default/useradd,/etc/login.defs,/etc/skel/* 这些文件,不过最重要的其实是创建/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow还有使用者主文件夹就是了~所以,如果你了解整个系统运行的状态,也是可以手动直接修改这几个文件就是了。

passwd

[root@study ~]# passwd [–stdin] [帐号名称] <==所有人均可使用来改自己的密码

[root@study ~]# 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 字段,密码失效日期

chage

[root@study ~]# chage [-ldEImMW] 帐号名

选项与参数:

-l :列出该帐号的详细密码参数;

-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期) ,格式 YYYY-MM-DD

-E :后面接日期,修改 shadow 第八字段(帐号失效日) ,格式 YYYY-MM-DD

-I :后面接天数,修改 shadow 第七字段(密码失效日期)

-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)

-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)

-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)

usermod

[root@study ~]# 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

[root@study ~]# userdel [-r] username

选项与参数:

-r :连同使用者的主文件夹也一起删除

这个功能就太简单了,目的在删除使用者的相关数据,而使用者的数据有:

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

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

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

13.2.2 使用者功能

id

[root@study ~]# id [username]

范例一:查阅liao的相关ID信息

[root@localhost ~]# id liao

uid=1000(liao) gid=1000(liao) groups=1000(liao)

[root@localhost ~]#

finger

[root@study ~]# finger [-s] username

选项与参数:

-s :仅列出使用者的帐号、全名、终端机代号与登陆时间等等;

-m :列出与后面接的帐号相同者,而不是利用部分比对 (包括全名部分)

范例一:观察liao的使用者相关帐号属性

[root@localhost ~]# finger liao

Login: liao                                   Name: liao

Directory: /home/liao                       Shell: /bin/bash

Last login Sun Apr 23 11:19 (CST) on pts/0

No mail.

No Plan.

[root@localhost ~]#

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

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

Directory:就是主文件夹了;

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

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

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

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

chfn

[root@study ~]# chfn [-foph] [帐号名]

选项与参数:

-f :后面接完整的大名;

-o :您办公室的房间号码;

-p :办公室的电话号码;

-h :家里的电话号码!

chsh

[vbird1@study ~]$ chsh [-ls]

选项与参数:

-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!

-s :设置修改自己的 Shell

范例一:用 vbird1 的身份列出系统上所有合法的 shell,并且指定 csh 为自己的 shell

[root@localhost ~]# chsh -l

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

/bin/tcsh

/bin/csh

[root@localhost ~]# chsh -s /bin/csh

Changing shell for root.

Shell changed.

[root@localhost ~]#

13.2.3 新增与移除群组

groupadd

[root@study ~]# groupadd [-g gid] [-r] 群组名称

选项与参数:

-g :后面接某个特定的 GID ,用来直接给予某个 GID

-r :创建系统群组,与 /etc/login.defs 内的 GID_MIN 有关

groupmod

[root@study ~]# groupmod [-g gid] [-n group_name] 群组名

选项与参数:

-g :修改既有的 GID 数字;

-n :修改既有的群组名称

groupdel

[root@study ~]# groupdel [groupname]

当有某个帐号(/etc/passwd)的initial group使用该群组时,将无法删除。如果一定要删除此群组,你必须要确认/etc/passwd内的帐号没有任何人使用该群组作为”initial group”才行!你可以修改vbird1的GID或删除这个使用者。

gpasswd:群组管理员功能

[root@study ~]# gpasswd groupname

[root@study ~]# gpasswd [-A user1,…] [-M user3,…] groupname

[root@study ~]# gpasswd [-rR] groupname

选项与参数:

:若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)

-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)

-M :将某些帐号加入这个群组当中!

-r :将 groupname 的密码移除

-R :让 groupname 的密码栏失效

# 关于群组管理员(Group administrator) 做的动作:

[someone@study ~]$ gpasswd [-ad] user groupname

选项与参数:

-a :将某位使用者加入到 groupname 这个群组当中!

-d :将某位使用者移除出 groupname 这个群组当中。

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

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

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

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

13.3.2 ACL 的设置技巧:getfacl setfacl

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

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

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

[root@study ~]# setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名

选项与参数:

-m :设置后续的 acl 参数给文件使用,不可与 -x 合用;

-x :删除后续的 acl 参数,不可与 -m 合用;

-b :移除“所有的” ACL设置参数;

-k :移除“默认的” ACL参数,关于所谓的“默认”参数于后续范例中介绍;

-R :递回设置acl,亦即包括次目录都会被设置起来;

-d :设置“默认acl参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值

2.getfacl指令用法

[root@study ~]# getfacl filename

选项与参数:

getfacl 的选项几乎与 setfacl 相同

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

# 设置规范:“ g:[群组列表]:[rwx] ”,例如针对 mygroup1 的权限规范 rx :

[root@study ~]# setfacl -m g:mygroup1:rx acl_test1

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

# 设置规范:“ m:[rwx] ”,例如针对刚刚的文件规范为仅有 r :

[root@study ~]# setfacl -m m:r acl_test1

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

# 设置规范:“ d:[ug]:使用者列表:[rwx] ”

# 让 myuser1 在 /srv/projecta 下面一直具有 rx 的默认权限!

[root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta

13.4 使用者身份切换

su

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

选项与参数:

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

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

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

-c :仅进行一次指令,所以 -c 后面可以加上指令若要完整的切换到新使用者的环境,必须要使用“su – username”或“su -l username”才会连同 PATH/USER/MAIL 等变量都转成新使用者的环境;如果仅想要执行一次 root 的指令,可以利用“ su – -c “指令串” ”的方式来处理;使用 root 切换成为任何使用者时,并不需要输入新使用者的密码;

sudo

[root@study ~]# sudo [-b] [-u 新使用者帐号]

选项与参数:

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

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

sudo默认仅有root能使用,执行是这样的流程:

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

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

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

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

visudo /etc/sudoers

一、单一使用者可进行 root 所有指令,与 sudoers 文件语法:

为什么要使用 visudo 呢?这是因为 /etc/sudoers 是有设置语法的,如果设置错误那会造成无法使用 sudo 指令的不良后果。因此才会使用 visudo 去修改, 并在结束离开修改画面时,系统会去检验 /etc/sudoers 的语法就是了。使用者帐号登陆者的来源主机名称=(可切换的身份) 可下达的指令root ALL=(ALL) ALL <==这是默认值

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

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

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

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

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

二、利用 wheel 群组以及免密码的功能处理 visudo

我们在本章前面曾经创建过 pro1, pro2, pro3 ,这三个用户能否通过群组的功能让这三个人可以管理系统? 可以的,而且很简单!同样我们使用实际案例来说明:

[root@study ~]# visudo <==同样的,请使用 root 先设置

….(前面省略) ….

%wheel ALL=(ALL) ALL <==大约在 106 行左右,请将这行的 # 拿掉!

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

[root@study ~]# usermod -a -G wheel pro1 <==将 pro1 加入 wheel 的支持上面的设置值会造成“任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令”的意思。你当然可以将 wheel 换成你自己想要的群组名

三、有限制的指令操作:

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

myuser1 ALL=(root) /usr/bin/passwd <==最后指令务必用绝对路径上面的设置值指的是“myuser1 可以切换成为 root 使用 passwd 这个指令”的意思。其中要注意的是: 指令字段必须要填写绝对路径才行!否则 visudo 会出现语法错误的状况发生! 此外,上面的设置是有问题的!我们使用下面的指令操作来让您了解:

[myuser1@study ~]$ sudo passwd myuser3 <==注意,身份是 myuser1

[sudo] password for myuser1: <==输入 myuser1 的密码

Changing password for user myuser3\. <==下面改的是 myuser3 的密码喔!这样是正确的

New password:

Retype new password:

passwd: all authentication tokens updated successfully.

[myuser1@study ~]$ sudo passwd

Changing password for user root. <==见鬼!怎么会去改 root 的密码?

竟然让 root 的密码被 myuser1 给改变了!下次 root 回来竟无法登陆系统…

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

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

在设置值中加上惊叹号“ ! ”代表“不可执行”的意思。因此上面这一行会变成:可以执行“passwd 任意字符”,但是“ passwd ”与“ passwd root ”这两个指令例外! 如此一来 myuser1 就无法改变 root 的密码了!这样这位使用者可以具有 root 的能力帮助你修改其他用户的密码,而且也不能随意改变 root 的密码。

四、通过别名创建 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

我通过 User_Alias 创建出一个新帐号,这个帐号名称一定要使用大写字符来处理,包括Cmnd_Alias(命令别名) 、Host_Alias(来源主机名称别名) 都需要使用大写字符的!这个ADMPW 代表后面接的那些实际帐号。 而该帐号能够进行的指令就如同 ADMPWCOM 后面所指定的那样!上表最后一行则写入这两个别名 (帐号与指令别名) , 未来要修改时,我只要修改 User_Alias 以及 Cmnd_Alias 这两行即可!

五、sudo 的时间间隔问题:

两次执行 sudo 的间隔在五分钟内,那么再次执行 sudo 时就不需要再次输入密码了, 这是因为系统相信你在五分钟内不会离开你的作业,所以执行 sudo 的是同一个人!

六、sudo 搭配 su 的使用方式:

[root@study ~]# visudo

User_Alias ADMINS = pro1, pro2, pro3, myuser1

ADMINS ALL=(root) /bin/su –

接下来,上述的 pro1, pro2, pro3, myuser1 这四个人,只要输入“ sudo su – ”并且输入“自己的密码”后, 立刻变成 root 的身份!不但 root 密码不会外流,使用者的管理也变的非常方便!这也是实务上面多人共管一部主机时常常使用的技巧。

13.5.1 特殊的shell /sbin/nologin

1.有些系统帐号是不需要登陆的!所以我们就给他这个无法登陆的合法 shell。所谓的“无法登陆”指的仅是:“这个使用者无法使用 bash 或其他 shell 来登陆系统”而已,并不是说这个帐号就无法使用其他的系统资源喔! 举例来说,各个系统帐号,打印工作由 lp 这个帐号在管理, WWW 服务由 apache 这个帐号在管理, 他们都可以进行系统程序的工作,但是“就是无法登陆主机取得互动的 shell”而已。

2.如果我想要让某个具有 /sbin/nologin 的使用者知道,他们不能登陆主机时, 其实我可以创建“ /etc/nologin.txt ”这个文件, 并且在这个文件内说明不能登陆的原因,那么下次当这个使用者想要登陆系统时, 屏幕上出现的就会是 /etc/nologin.txt 这个文件的内容,而不是默认的内容了!

13.5.2 PAM 模块简介

PAM 可以说是一套应用程序接口 (Application Programming Interface, API) ,他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败) 。由于 PAM 仅是一套验证的机制,又可以提供给其他程序所调用引用,因此不论你使用什么程序,都可以使用 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 回传的结果决定下一个动作 (重新输入新密码或者通过验证!)

从上头的说明,我们会知道重点其实是 /etc/pam.d/ 里面的配置文件,以及配置文件所调用的PAM 模块进行的验证工作! 既然一直谈到 passwd 这个密码修改指令,那我们就来看看/etc/pam.d/passwd 这个配置文件的内容:

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

#%PAM-1.0

auth       include        system-auth

account    include        system-auth

password   substack        system-auth

-password   optional        pam_gnome_keyring.so use_authtok

password   substack        postlogin

[root@localhost ~]#

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

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

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

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

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

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

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

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

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

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

4.optional 这个模块控制项目大多是在显示讯息而已,并不是用在验证方面的。

13.5.4 常用模块简介

每个模块的功能都不太相同,详细的模块情报可以在你的系统中找到:

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

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

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

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

login 的 PAM 验证机制流程是这样的:

  1. 验证阶段(auth) :首先,

(a)会先经过 pam_securetty.so判断,如果使用者是 root时,则会参考 /etc/securetty 的设置;

(b)经过 pam_env.so 设置额外的环境变量;

(c)通过 pam_unix.so 检验密码,若通过则回报 login 程序;若不通过则

(d)继续往下以 pam_succeed_if.so 判断 UID 是否大于 1000 ,若小于 1000则回报失败,否则再往下

(e)以 pam_deny.so 拒绝连线。

  1. 授权阶段(account) :

(a)先以 pam_nologin.so 判断 /etc/nologin 是否存在,若存在则不许一般使用者登陆;

(b)接下来以 pam_unix.so 及pam_localuser.so 进行帐号管理,再以

(c)pam_succeed_if.so 判断 UID 是否小于 1000 ,若小于 1000 则不记录登录信息。

(d)最后以 pam_permit.so 允许该帐号登陆。

  1. 密码阶段 (password) :

(a) 先以 pam_pwquality.so 设置密码仅能尝试错误 3 次;

(b) 接下来以 pam_unix.so 通过 sha512, shadow 等功能进行密码检验,若通过则回报login 程序,若不通过则

(c) 以 pam_deny.so 拒绝登陆。

  1. 会议阶段 (session) :

(a)先以 pam_selinux.so 暂时关闭 SELinux;

(b)使用pam_limits.so 设置好使用者能够操作的系统资源;

(c)登陆成功后开始记录相关信息在登录文件中;

(d)以 pam_loginuid.so 规范不同的 UID 权限;

(e)打开pam_selinux.so 的功能。

limits.conf

我们在第十章谈到的 ulimit 功能中, 除了修改使用者的 ~/.bashrc 配置文件之外,其实系统管理员可以统一借由 PAM 来管理的! 那就是 /etc/security/limits.conf 这个文件的设置了。

范例一:vbird1 这个用户只能创建 100MB 的文件,且大于 90MB 会警告

[root@study ~]# vim /etc/security/limits.conf

vbird1 soft fsize 90000

vbird1 hard fsize 100000

#帐号 限制依据 限制项目 限制值

# 第一字段为帐号,或者是群组!若为群组则前面需要加上 @ ,例如 @projecta

# 第二字段为限制的依据,是严格(hard) ,还是仅为警告(soft) ;

# 第三字段为相关限制,此例中限制文件大小,

# 第四字段为限制的值,在此例中单位为 KB。

# 若以 vbird1 登陆后,进行如下的操作则会有相关的限制出现!

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

范例二:限制 pro1 这个群组,每次仅能有一个使用者登陆系统 (maxlogins)

[root@study ~]# vim /etc/security/limits.conf

@pro1 hard maxlogins 1

# 如果要使用群组功能的话,这个功能似乎对初始群组才有效喔!而如果你尝试多个 pro1 的登陆时,

# 第二个以后就无法登陆了。而且在 /var/log/secure 文件中还会出现如下的信息:

# pam_limits(login:session) : Too many logins (max 1) for pro1

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

如果发生任何无法登陆或者是产生一些你无法预期的错误时,由于 PAM 模块都会将数据记载在 /var/log/secure 当中,所以发生了问题请务必到该文件内去查询一下问题点!举例来说,我们在 limits.conf 的介绍内的范例二,就有谈到多重登陆的错误可以到 /var/log/secure 内查阅了! 这样你也就知道为何第二个 pro1 无法登陆。

13.6.1 查询使用者:w  who  last lastlog

[root@localhost ~]# w

 17:53:32 up  7:14,  2 users,  load average: 0.00, 0.01, 0.05

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     :0       :0               10:47   ?xdm?   4:35   0.32s gdm-session-worker [

root     pts/0    :0               16:56    4.00s  0.15s  0.00s w

[root@localhost ~]# who

root     :0           2017-04-23 10:47 (:0)

root     pts/0        2017-04-23 16:56 (:0)

[root@localhost ~]# lastlog | tail -n 10

tcpdump                                    **Never logged in**

liao             pts/0                     Sun Apr 23 16:44:39 +0800 2017

systemd-bus-proxy                           **Never logged in**

systemd-network                            **Never logged in**

geoclue                                    **Never logged in**

setroubleshoot                             **Never logged in**

apache                                     **Never logged in**

postgres                                   **Never logged in**

mysql                                      **Never logged in**

www                                        **Never logged in**

[root@localhost ~]# last liao | head -n 3

liao     pts/0        :0               Fri Apr 21 15:33 – 22:56  (07:22)

liao     :0           :0               Fri Apr 21 15:33 – 22:57  (07:23)

liao     pts/1        :0               Wed Jan 27 07:18 – 07:18  (00:00)

[root@localhost ~]#

13.6.2 使用者对谈:write  mesg  wall

[root@study ~]# write 使用者帐号 [使用者所在终端接口]  #结束时,请按下 [crtl]-d 来结束输入

[vbird1@study ~]$ mesg n  #关闭消息接收功能

[vbird1@study ~]$ mesg  #查看消息接收功能状态

is n

#mesg 的功能对 root 传送来的讯息没有抵挡的能力!所以如果是 root 传送讯息,所有用户都得收下。

[root@study ~]# wall “I will shutdown my linux server…”  #广播消息给所有在线用户

13.6.3 使用者邮件信箱:mail

[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 ~]#

<message list> 指的是每封邮件的左边那个数字,而几个比较常见的指令是:

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

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

pwck

pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息,与实际的主文件夹是否存在等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 内的数据字段错误时,会提示使用者修订。 一般来说,我只是利用这个玩意儿来检查我的输入是否正确就是了。

[root@localhost ~]# pwck

user ‘ftp’: directory ‘/var/ftp’ does not exist

user ‘saslauth’: directory ‘/run/saslauthd’ does not exist

user ‘avahi-autoipd’: directory ‘/var/lib/avahi-autoipd’ does not exist

user ‘pulse’: directory ‘/var/run/pulse’ does not exist

user ‘gnome-initial-setup’: directory ‘/run/gnome-initial-setup/’ does not exist

user ‘apache’: directory ‘/usr/share/httpd’ does not exist

user ‘mysql’: directory ‘/home/mysql’ does not exist

pwck: no changes

[root@localhost ~]#

pwconv

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

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

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

pwunconv

相对于 pwconv,pwunconv 则是“将 /etc/shadow 内的密码栏数据写回 /etc/passwd 当中,并且删除 /etc/shadow 文件。”这个指令最好不要使用, 因为他会将你的/etc/shadow 删除!

chpasswd

chpasswd是个挺有趣的指令,他可以“读入未加密前的密码,并且经过加密后,将加密后的密码写入/etc/shadow 当中。”这个指令很常被使用在大量创建帐号的情况中喔! 他可以由Standard input读入数据,每笔数据的格式是“ username:password ”。举例来说,我的系统当中有个使用者帐号为 vbird3,我想要更新他的密码(update),假如他的密码是abcdefg的话,那么我可以这样做:[root@study ~]# echo “vbird3:abcdefg” | chpasswd

练习题

如何设置某个账号使其无法登陆系统?

1.将 /etc/passwd 的 shell 字段写成 /sbin/nologin ,即可让该帐号暂时无法登陆主机;

2.将 /etc/shadow 内的密码字段,增加一个 * 号在最前面,这样该帐号亦无法登陆;

3.将 /etc/shadow 的第八个字段关于帐号取消日期的那个,设置小于目前日期的数字,那么他就无法登陆系统了。

转载请注明:西部世界 » 鸟哥Linux基础篇-Linux账号管理与ACL权限设置

发表我的评论
取消评论

表情