鸟哥学习笔记14:Linux账号管理与ACL权限配置

来源:互联网 发布:网络开展学生教育工作 编辑:程序博客网 时间:2024/05/21 17:19

第14章 Linux账号管理与ACL权限配置

1 Linux的账号和用户组

1.1 用户的标识符:UID与GID

  • 每个登录的用户至少会取得两个ID分别是用户ID(User ID)和用户组ID(Group ID);

1.2 用户账号

用户登录到Linux取得Shell的身份认证流程:
1. 查询 /etc/passwd ,判断输入的账号是否存在。如果不存在,则跳出;如果存在,则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来;另外,该账号的家目录与 默认取得的shell 配置也一并读出;
2. 核对口令。这时 Linux 查询/etc/shadow,核对输入的口令与里头的口令是否相符。
3. 取得Shell。


1.2.1 /etc/passwd 文件结构

/etc/passwd文件结构:
- 每一行代表一个账号;
- 每一行由7个字段组成,每个字段由冒号:隔开;
- 每个字段具有特殊的含义;

字段含义
[root@www ~]# head -n 4 /etc/passwdroot:x:0:0:root:/root:/bin/bash  <==等一下做为底下说明用bin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin
  1. 账号名称:与UID所对应的账号名称(即用户名);账号名称必须唯一;
  2. 口令:出于安全考虑,现在的Linux都将口令数据放在/etc/shadow中;
  3. UID:用户标识符(User ID);
  4. GID:用户组标识符(Group ID);GID与用户组组名的对应关系保存于/etc/group;
  5. 用户信息说明:账户的描述信息;使用finger命令可以查看此描述信息;
  6. 家目录:用户的家目录;
  7. Shell:用户登录到系统后默认取得的Shell;
UID范围
ID范围 此ID的用户特性 0 系统管理员账号;不论用户名是否为root,只要UID为0,则该用户就是系统管理员; 1~499 系统账号;该账号通常是不可登录的,所以其Shell字段通常为/sbin/nologin; 这类账号通常又分为两种:1\~99:Linux发行版默认创建的系统账号;100\~499:留给用户创建的系统账号; 500~65535 一般用户;目前Linux内核2.6.x已支持2^32-1个UID;

1.2.2 /etc/shadow 文件结构

早期Linux的用户口令直接放置在/etc/passwd的第2个字段,但出于安全考虑现在已经将加密的口令移到了/etc/shadow中;

/etc/shadow文件结构:
- 每一行代表一个账号;
- 每一行由9个字段组成,每个字段由冒号:隔开;
- 每个字段具有特殊的含义;

字段含义
[root@www ~]# head -n 4 /etc/shadowroot:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7:::  <==底下说明用bin:*:14126:0:99999:7:::daemon:*:14126:0:99999:7:::adm:*:14126:0:99999:7:::
  1. 账号名称:必须与/etc/passwd中的UID对应;
  2. 口令:加密后的口令;
  3. 最近一次修改口令的日期:从1970年1月1日开始累加的天数;
  4. 修改口令后多少天内不能再次变更口令(相对于字段3):这个账号的口令在最近一次被变更后需要经过几天才能再次变更;0表示随时可修改;
  5. 口令过期的日期(相对于字段3):变更口令后多少天内必须再次变更口令,即,最近一次变更口令后,必须要在这个天数内重新变更此账号的口令,否则此账号将会变为“口令过期”状态;99999表示不强制要求变更;
  6. 口令过期前多少天内警告用户(相对于字段5):当账号的口令即将超过有效期限 (字段5)时,系统会依据这个字段,在用户登录时发出“警告”,提醒用户“再过 n 天你的口令就要过期了”;
  7. 口令过期后的宽限天数(相对于字段5):口令过期后,在宽限天数内,账号依然有效,在用户登录时系统会强制要求用户必须要重新变更口令才能继续登录使用;如果用户在宽限天数内没有及时变更口令,那么此账号将变为“账号过期”状态;
  8. 账号失效日期:在此字段规定的日期之后,账号将“过期”,无法再使用;从1970年1月1日开始累加的天数;
  9. 保留:保留字段;

注意:“口令过期”与“账号过期”是两个不同的概念!

注意:可以使用命令man 5 shadow查看配置文件/etc/shadow/中每个字段的具体含义。


1.3 关于用户组

1.3.1 /etc/group 文件结构

[root@www ~]# head -n 4 /etc/grouproot:x:0:rootbin:x:1:root,bin,daemondaemon:x:2:root,bin,daemonsys:x:3:root,bin,adm

/etc/group文件结构:
- 每一行代表一个用户组;
- 每一行由4个字段组成,每个字段由冒号:隔开;
- 每个字段具有特殊的含义;

字段含义
  1. 组名
  2. 用户组口令
  3. GID:与/etc/passwd中的第4个字段使用的 GID 相对应;
  4. 属于此用户组的账号名称
UID/GID 与口令之间的关系

image


1.3.2 /etc/gshadow 文件结构

[root@www ~]# head -n 4 /etc/gshadowroot:::rootbin:::root,bin,daemondaemon:::root,bin,daemonsys:::root,bin,adm

/etc/gshadow文件结构:
- 每一行代表一个用户组;
- 每一行由4个字段组成,每个字段由冒号:隔开;
- 每个字段具有特殊的含义;

注意:可以使用命令man 5 gshadow查看配置文件/etc/gshadow/中每个字段的具体含义。

字段含义
  1. 组名
  2. 用户组口令:加密口令以!开头表示无口令,所以无用户组管理员;
  3. 用户组管理员的账号
  4. 属于此用户组的账号名称:与/etc/group中的第4个字段内容相同;
功能作用

配置文件/etc/gshadow最大的作用就是用以创建用户组管理员。

用户组管理员:用户组管理员有权将其他账号加入自己管理的用户组中,可以分担系统管理员root的用户组管理工作;


1.3.3 有效用户组(Effective Group)与初始用户组(Initial Group)

  • 初始用户组(Initial Group)
    • 账号的初始组由/etc/passwd中的第4个字段指出,默认是与账号同名的用户组;
    • 用户成功登陆并获得Shell后,立刻就拥有了初始组的相关权限;
  • 非初始用户组
    • 通过向/etc/group中的第4个字段添加账户名来加入的组;
    • 账户成功加入新用户组后,同样也具备了该用户组的相关权限;
  • 有效用户组(Effective Group)
    • 用户在创建文件时,文件的默认所属组;
    • 使用命令groups可以查看当前用户的所有所属组,第一个输出即为账号当前的有效组;
查看账号加入的用户组及其有效组:groups

命令groups的第一个输出的群组即为有效群组 (effective group) 了:

[dmtsai@www ~]$ groupsdmtsai users
切换有效组:newgrp

命令newgrp用以切换账号的有效组:
- 切换的用户组必须是当前账号已经加入的用户组;
- newgrp是通过取得一个子Shell的方式来切换有效组的;

image

用例:

[dmtsai@www ~]$ newgrp users[dmtsai@www ~]$ groupsusers dmtsai[dmtsai@www ~]$ touch test2[dmtsai@www ~]$ ll-rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test-rw-r--r-- 1 dmtsai users  0 Feb 24 17:33 test2

2 账号管理

2.1 新增与移除用户账户,及修改相关配置文件

useradd

[root@www ~]# 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 为永远不失效(口令只会过期而强制于登陆时重新配置而已。)
useradd修改的配置文件
  • /etc/passwd
  • /etc/group
  • /etc/shadow
  • /etc/gshadow
useradd参考的配置文件
  • /etc/default/useradd
  • /etc/login.defs
  • /etc/skel/*
配置文件 /etc/default/useradd
[root@www ~]# useradd -DGROUP=100       <==默认的群组HOME=/home      <==默认的家目录所在目录INACTIVE=-1     <==口令失效日,在 shadow 内的第 7 栏EXPIRE=         <==账号失效日,在 shadow 内的第 8 栏SHELL=/bin/bash     <==默认的 shellSKEL=/etc/skel      <==用户家目录的内容数据参考目录CREATE_MAIL_SPOOL=yes   <==是否主动帮使用者创建邮件信箱(mailbox)[root@CentOS ~]# cat /etc/default/useradd# useradd defaults fileGROUP=100HOME=/homeINACTIVE=-1EXPIRE=SHELL=/bin/bashSKEL=/etc/skelCREATE_MAIL_SPOOL=yes
配置文件 /etc/login.defs
[root@CentOS ~]# cat /etc/login.defs ## Please note that the parameters in this configuration file control the# behavior of the tools from the shadow-utils component. None of these# tools uses the PAM mechanism, and the utilities that use PAM (such as the# passwd command) should therefore be configured elsewhere. Refer to# /etc/pam.d/system-auth for more information.## *REQUIRED*#   Directory where mailboxes reside, _or_ name of file, relative to the#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.#   QMAIL_DIR is for Qmail##QMAIL_DIR      MaildirMAIL_DIR        /var/spool/mail#MAIL_FILE      .mail# Password aging controls:##       PASS_MAX_DAYS   Maximum number of days a password may be used.#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.#       PASS_MIN_LEN    Minimum acceptable password length.#       PASS_WARN_AGE   Number of days warning given before a password expires.#PASS_MAX_DAYS   99999PASS_MIN_DAYS   0PASS_MIN_LEN    5PASS_WARN_AGE   7## Min/max values for automatic uid selection in useradd#UID_MIN                   500UID_MAX                 60000## Min/max values for automatic gid selection in groupadd#GID_MIN                   500GID_MAX                 60000## If defined, this command is run when removing a user.# It should remove any at/cron/print jobs etc. owned by# the user to be removed (passed as the first argument).##USERDEL_CMD    /usr/sbin/userdel_local## If useradd should create home directories for users by default# On RH systems, we do. This option is overridden with the -m flag on# useradd command line.#CREATE_HOME     yes# The permission mask is initialized to this value. If not specified, # the permission mask will be initialized to 022.UMASK           077# This enables userdel to remove user groups if no members exist.#USERGROUPS_ENAB yes# Use SHA512 to encrypt password.ENCRYPT_METHOD SHA512 

passwd

[root@www ~]# passwd [--stdin]  <==所有人均可使用来改自己的口令[root@www ~]# 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 - change user password expiry information

[root@www ~]# chage [-ldEImMW] 账号名选项与参数:-l :列出该账号的详细口令参数;-d :后面接日期,修改 shadow 第三字段(最近一次更改口令的日期),格式 YYYY-MM-DD-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD-I :后面接天数,修改 shadow 第七字段(口令失效日期)-m :后面接天数,修改 shadow 第四字段(口令最短保留天数)-M :后面接天数,修改 shadow 第五字段(口令多久需要进行变更)-W :后面接天数,修改 shadow 第六字段(口令过期前警告日期)

范例一:列出 vbird2 的详细口令参数

[root@www ~]# chage -l vbird2Last password change                               : Feb 26, 2009Password expires                                   : Apr 27, 2009Password inactive                                  : May 07, 2009Account expires                                    : neverMinimum number of days between password change     : 0Maximum number of days between password change     : 60Number of days of warning before password expires  : 7

范例二:创建一个名为 agetest 的账号,该账号第一次登陆后使用默认口令,但必须要更改过口令后,使用新口令才能够登陆系统使用 bash 环境!

[root@www ~]# useradd agetest[root@www ~]# echo "agetest" | passwd --stdin agetest[root@www ~]# chage -d 0 agetest# 此时此账号的口令创建时间会被改为 1970/1/1 ,所以会有问题!# 尝试以 agetest 登陆的情况You are required to change your password immediately (root enforced)WARNING: Your password has expired.You must change your password now and login again!Changing password for user agetest.Changing password for agetest(current) UNIX password:  <==这个账号被强制要求必须要改口令!

usermod - modify a user account

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


2.2 用户功能

finger - user information lookup program

根据/etc/passwd文件中的字段查看用户信息;


chfn - change your finger information


chsh - change your login shell


id - print real and effective user and group IDs


2.3 新增与移除用户组

用户组的增删改实际上都是对/etc/group/etc/gshadow两个配置文件里字段的增删改;

groupadd - create a new group

[root@www ~]# groupadd [-g gid] [-r] 组名选项与参数:-g  :后面接某个特定的 GID ,用来直接给予某个 GID ~-r  :创建系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。范例一:新建一个群组,名称为 group1[root@www ~]# groupadd group1[root@www ~]# grep group1 /etc/group /etc/gshadow/etc/group:group1:x:702:/etc/gshadow:group1:!::# 群组的 GID 也是会由 500 以上最大 GID+1 来决定!

groupmod - modify a group definition on the system

[root@www ~]# groupmod [-g gid] [-n group_name] 群组名选项与参数:-g  :修改既有的 GID 数字;-n  :修改既有的组名范例一:将刚刚上个命令创建的 group1 名称改为 mygroup , GID 为 201[root@www ~]# groupmod -g 201 -n mygroup group1[root@www ~]# grep mygroup /etc/group /etc/gshadow/etc/group:mygroup:x:201:/etc/gshadow:mygroup:!::

groupdel - delete a group

[root@CentOS ~]# groupdel neogroupdel: cannot remove the primary group of user 'neo'[root@CentOS ~]# grep 'neo' /etc/passwdneo:x:500:500::/home/neo:/bin/bash[root@CentOS ~]# grep 'neo' /etc/groupneo:x:500:

注意:当要删除的用户组是其他账号的初始组(Initial Group)时,无法删除此用户组。
所以必须要确认 /etc/passwd 内的账号没有任何人使用该群组作为初始组(initial group):
- 修改相关用户的初始组GID;
- 删除相关用户账号;


gpasswd - administer /etc/group and /etc/gshadow

用户组管理员可以管理哪些账号可以加入/移出该用户组。gpasswd命令可以创建用户组管理员,管理/etc/group/etc/gshadow

# 关于系统管理员(root)做的动作:[root@www ~]# gpasswd groupname[root@www ~]# gpasswd [-A user1,...] [-M user3,...] groupname[root@www ~]# gpasswd [-rR] groupname选项与参数:    :若没有任何参数时,表示给予 groupname 一个口令(/etc/gshadow)-A  :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)-M  :将某些账号加入这个群组当中!-r  :将 groupname 的口令移除-R  :让 groupname 的口令栏失效# 关于群组管理员(Group administrator)做的动作:[someone@www ~]$ gpasswd [-ad] user groupname选项与参数:-a  :将某位使用者加入到 groupname 这个群组当中!-d  :将某位使用者移除出 groupname 这个群组当中。

2.4 账号管理实例


3 ACL的使用

ACL - Access Control List

ACL(Access Control List)可以提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限配置。ACL 可以针对单一使用者,单一用户组,以及单一文件或目录来进行 r,w,x 的权限规范。

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


getfacl - get file access control lists

setfacl - set file access control lists

  • 如果一个文件配置了 ACL 参数后,他的权限部分就会多出一个 + 号。
  • 此时你看到的权限与实际权限可能就会有点误差,准确权限需用getfacl查看。
[root@www ~]# setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名选项与参数:--set :设置文件或目录的ACL。之前的ACL将被新ACL替换!-m :配置后续的 acl 参数给文件使用,不可与 -x 合用;-x :删除后续的 acl 参数,不可与 -m 合用;-b :移除所有的 ACL 配置参数;-k :移除默认的 ACL 参数,关于所谓的『默认』参数于后续范例中介绍;-R :递归配置 acl ,亦即包括次目录都会被配置起来;-d :配置『默认 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值

1.针对特定使用者的方式:

配置规范:『 u:[使用者账号列表]:[rwx] 』,例如针对 vbird1 的权限规范 rx :

[root@www ~]# touch acl_test1[root@www ~]# ll acl_test1-rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1[root@www ~]# setfacl -m u:vbird1:rx acl_test1[root@www ~]# ll acl_test1-rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1# 权限部分多了个 + ,且当前显示权限(654)与原本的权限 (644) 差异很大!
[root@www ~]# setfacl -m u::rwx acl_test1[root@www ~]# ll acl_test1-rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1

无使用者列表,代表配置该文件拥有者,所以上面显示 root 的权限成为 rwx 了!


2. 针对特定群组的方式:

配置规范:『 g:[群组列表]:[rwx] 』,例如针对 mygroup1 的权限规范 rx :

[root@www ~]# setfacl -m g:mygroup1:rx acl_test1[root@www ~]# getfacl acl_test1# file: acl_test1# owner: root# group: rootuser::rwxuser:vbird1:r-xgroup::r--group:mygroup1:r-x  <==这里就是新增的部分!多了这个群组的权限配置!mask::r-xother::r--

3. 针对有效权限 mask 的配置方式:

使用者或群组所配置的权限必须要存在于 mask 的权限配置范围内才会生效,此即『有效权限 (effective permission)』。我们可以透过使用 mask 来限制用户和用户组的最大允许权限。

配置规范:『 m:[rwx] 』,例如针对刚刚的文件规范为仅有 r :

[root@www ~]# setfacl -m m:r acl_test1[root@www ~]# getfacl acl_test1# file: acl_test1# owner: root# group: rootuser::rwxuser:vbird1:r-x        #effective:r-- <==vbird1+mask均存在者,仅有 r 而已!group::r--group:mygroup1:r-x     #effective:r--mask::r--other::r--

4. 针对默认权限的配置方式:

  • 使用默认配置让 acl 在目录底下的文件和子目录都继承当前目录的权限配置;
  • 注意默认权限只对目录有效;

配置规范:『 d:[ug]:使用者列表:[rwx] 』

# 让 myuser1 在 /srv/projecta 底下一直具有 rx 的默认权限![root@www ~]# setfacl -m d:u:myuser1:rx /srv/projecta[root@www ~]# getfacl /srv/projecta# file: srv/projecta# owner: root# group: projectauser::rwxuser:myuser1:r-xgroup::rwxmask::rwxother::---default:user::rwxdefault:user:myuser1:r-xdefault:group::rwxdefault:mask::rwxdefault:other::---[root@www ~]# cd /srv/projecta[root@www projecta]# touch zzz1[root@www projecta]# mkdir zzz2[root@www projecta]# ll -d zzz*-rw-rw----+ 1 root projecta    0 Feb 27 14:57 zzz1drwxrws---+ 2 root projecta 4096 Feb 27 14:57 zzz2# 看吧!确实有继承喔!然后我们使用 getfacl 再次确认看看![root@www projecta]# getfacl zzz2# file: zzz2# owner: root# group: projectauser::rwxuser:myuser1:r-xgroup::rwxmask::rwxother::---default:user::rwxdefault:user:myuser1:r-xdefault:group::rwxdefault:mask::rwxdefault:other::---

4 使用者身份切换

4.1 su

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

范例一:假设你原本是 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=vbird1PATH=/usr/local/bin:/bin:/usr/bin:/home/vbird1/bin  <==这个影响最大!MAIL=/var/spool/mail/vbird1                         <==收到的 mailbox 是 vbird1PWD=/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 rootUSER=rootMAIL=/var/spool/mail/rootPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binPWD=/rootHOME=/rootLOGNAME=root# 了解差异了吧?下次变换成为 root 时,记得最好使用 su - 喔![root@www ~]# exit   <==这样可以离开 su 的环境!

4.2 sudo

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

sudo的运行流程:

  1. 当用户运行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有运行 sudo 的权限;
  2. 若使用者具有可运行 sudo 的权限后,便让使用者“输入用户自己的口令”来确认;
  3. 若口令输入成功,便开始进行 sudo 后续接的命令;
  4. 若欲切换的身份与运行者身份相同,那也不需要输入口令。

配置文件

  • /etc/sudoers

基本使用方法

[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/wwwdrwxr-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 "一串命令" 来运行的!

sudo密码的有效时间

默认情况下,两次运行sudo的间隔在五分钟内不需要重复输入密码!


visudo

visudo利用 vi/etc/sudoers 文件调用出来进行修改。因为 /etc/sudoers 是有配置语法的,如果配置错误那会造成无法使用 sudo 命令的不良后果,所以不建议直接使用 vi 去编辑。因此才会使用 visudo 去修改, 并在结束离开修改画面时,系统会去检验 /etc/sudoers 的语法。

1. 为单一用户启用sudo
root@www ~]# visudo....(前面省略)....root    ALL=(ALL)       ALL  <==找到这一行,默认只有root可以使用sudo;vbird1  ALL=(ALL)       ALL  <==这一行是你要新增的!....(前面省略)....

配置文件/etc/sudoers的语法如下:

使用者账号      登录者的源主机名=(可切换的身份)    可执行的命令root            ALL=(ALL)                            ALL      <==这是默认值

以上配置行中的4个字段含义分别为:
1. 系统中允许使用sudo的账号用户名,默认只有root可以使用sudo
2. 允许此账号用来登录到本Linux的主机名, 这个配置值用来指定授信客户端主机。默认值 root 可来自任何一部网络主机。
3. 此账号可以切换成什么账号来执行后续命令。默认 root 可以切换成任何人。
4. 切换账号后可以执行的命令。可执行的命令务必使用绝对路径书写。 默认 root 可以切换任何身份且进行任何命令之意。


2. 为单一用户组启用sudo

为用户组group1启用sudo,以使例如该用户组的所有用户都能使用sudo切换任何身份来操作任何命令:

[root@www ~]# visudo  <==同样的,请使用 root 先配置....(前面省略)....# %wheel     ALL=(ALL)    ALL <==找到这行,注意 # 为注释,添加时要去掉 #!%group1     ALL=(ALL)    ALL# 在最左边加上 % ,代表后面接的是一个『用户组』![root@www ~]# usermod -a -G group1 user1 <==将 user1 加入 group1 的支持

3. 为单一用户或用户组配置sudo免密码

为单一用户配置sudo免密码:

[root@www ~]# visudo  <==同样的,请使用 root 先配置....(前面省略)....username     ALL=(ALL)   NOPASSWD: ALL

为单一用户组配置sudo免密码:

[root@www ~]# visudo  <==同样的,请使用 root 先配置....(前面省略)....# %wheel    ALL=(ALL)    ALL <==找到这行,注意 # 为注释,添加时要去掉 #!%group1     ALL=(ALL)    NOPASSWD: ALL# 在最左边加上 % ,代表后面接的是一个『群组』之意!改完请储存后离开

注意:重点是那个 NOPASSWD ,该关键词是免除口令输入的意思!


4. 限制用户使用sudo时可执行的命令

当使用者仅能使用 passwd 这个命令协助 root 修改其他用户的口令:

[root@www ~]# visudo  <==注意是 root 身份myuser1 ALL=(root)  /usr/bin/passwd  <==最后命令务必用绝对路径

但这会导致用户myuser1也能够修改root口令!

所以,必须限制用户的命令参数:

[root@www ~]# visudo  <==注意是 root 身份myuser1 ALL=(root)  !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \                    !/usr/bin/passwd root

这样,用户myuser1就不能修改root的口令了!

注意
- 命令字段必须要填写绝对路径才行!
- 当一行写不完时,可以在行尾添加一个反斜杠\来转移换行符,来开启新行!
- 命令前添加感叹号!表示不可运行此命令!


5. 通过别名来为批量账号配置visudo
[root@www ~]# visudo  <==注意是 root 身份User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \                      !/usr/bin/passwd rootADMPW   ALL=(root)  ADMPWCOM

6. 使用各自账号的密码切换为root

使用用户可以使用自己的密码来切换为root:

[root@www ~]# visudoUser_Alias  ADMINS = pro1, pro2, pro3, myuser1ADMINS ALL=(root)  /bin/su -

上述用户 pro1, pro2, pro3, myuser1,只要输入 sudo su - 并且输入“自己的口令”后, 立刻变成 root 的身份!


5 使用者的特殊Shell与PAM模块

5.1 特殊的Shell:/sbin/nologin

特殊Shell /sbin/nologin 的特点:
- 通常系统账号不需要登录,所以系统账号的Shell通常指定为/sbin/nologin
- 无法登录:这个使用者无法获得 bash 或其他 shell 来登录系统;
- 虽然无法获得Shell来登录系统,但此账号依然可以使用其他的系统资源;

配置文件/etc/nologin.txt

  • /etc/nologin.txt 如果某个具有 /sbin/nologin 的用户企图登录系统时,可以给这些用户弹出提示,告诉他们没有权限登录。通过创建这个文件并添加内容,以替换默认提示:

直接以 vi 编辑该文件,内容可以是这样:

[root@www ~]# vi /etc/nologin.txtThis account is system account or mail account.Please DO NOT use this account to login my Linux server.

可以使用 myuser3 (此账号的 shell 是 /sbin/nologin) 来测试:

[root@www ~]# su - myuser3This account is system account or mail account.Please DO NOT use this account to login my Linux server.[root@www ~]#

5.2 PAM 模块简介

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

PAM的特点:
- PAM是提供认证功能的API;
- PAM返回认证结果(成功或失败)给调用它的程序;
- 任何有认证需求的程序都可以调用PAM来进行所需的认证;

5.3 PAM 模块的配置语法

PAM 借由一个与程序同名的配置文件来指定一系列的认证步骤,例如:passwd调用PAM时,PAM会依据配置文件/etc/pam.d/passwd

比如,当你运行 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 配置文件

  • /etc/pam.d/* PAM的配置文件都存放于此目录下,且与调用PAM的程序同名!
  • /lib/security/* 实际存放PAM 模块文件的目录;
  • /etc/security/* 存放其他 PAM 环境的配置文件的目录;
  • /usr/share/doc/pam-*/ 详细的 PAM 说明文件;

PAM 配置文件结构

PAM 配置文件结构:
- 第一行为版本号;
- 每一行代表一个独立认证流程;
- 每一行包含3个字段,分别为:认证类型(type),控制标志(flag),PAM模块及此模块的相关参数;
- 以井号#开始的行为注释;

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

PAM 配置文件字段

字段1:认证类型(Type)

认证类型主要分为4种:
1. auth 认证,用来检验使用者的身份,通常是需要口令来配合校验。后跟用以校验用户身份的PAM模块。
2. account 授权,用以校验使用者是否具有正确的权限。
3. session 管理使用者在此次登录期间,或使用此命令期间,PAM所给予的环境配置。通常用于记录用户登录和注销时的信息。
4. password 通常用于变更口令。

注意:通常这4个认证类型是有顺序的!


字段2:认证控制标志(control flag)

认证控制标志(control flag):表示管控认证的放行标准;

4种认证控制标志字段:
1. required
- 此验证若成功则带有 success (成功) 的标志,若失败则带有 failure 的标志;
- 不论成功或失败都会继续后续的认证流程;
2. requisite
- 若验证失败则立刻回报原程序 failure 的标志,并终止后续的验证流程;
- 若验证成功则带有 success 的标志并继续后续的验证流程;
3. sufficent
- 若验证成功则立刻回传 success 给原程序,并终止后续的验证流程;
- 若验证失败则带有 failure 标志并继续后续的验证流程;
4. optional
- 这个模块控件目大多是在显示信息而已,并不是用在验证方面的;

注意:如果出现 include system-auth 就转到 system-auth 文件中的相同类别,去取得额外的验证流程就是了。


这些控制旗标以图示的方式配合成功与否的条件绘图:

image


字段3:PAM模块
PAM模块的存放位置
  • /lib/security/* PAM 模块文件的实际放置目录;

5.4 常用模块:

  • pam_securetty.so 限制系统管理员 (root) 只能够从安全的 (secure) 终端机登陆;
  • pam_nologin.so 这个模块可以限制一般用户是否能够登陆主机之用。
  • pam_selinux.so 由于 SELinux 会影响到用户运行程序的权限,因此我们利用 PAM 模块,将 SELinux 暂时关闭,等到验证通过后, 再予以启动!
  • pam_loginuid.so 验证使用者的 UID 真的是我们所需要的数值;
  • pam_env.so 用来配置环境变量的一个模块,如果你有需要额外的环境变量配置,可以参考 /etc/security/pam_env.conf 这个文件的详细说明。
  • pam_cracklib.so 用来检验口令的强度(包括口令是否在字典中),口令输入几次都失败就断掉此次联机等功能;
  • pam_limits.so 提供ulimit命令的功能;还有更多细部的配置可以参考: /etc/security/limits.conf 内的说明。
  • pam_unix.so 可用在验证阶段的认证功能、授权阶段的账号许可证管理、会议阶段的登录文件记录等,甚至也可以用在口令升级阶段的检验!

5.5 PAM其他相关文件

  • /etc/security/limits.conf PAM模块pam_limits.so的配置文件。pam_limits.so模块将ulimit命令的限制、nice优先级、同时登陆的会话数限制(即一个用户组同时可以有几个用户登录系统)应用于用户登录会话。详细语法可以查看man limits.conf
  • /var/log/secure 如果发生任何无法登录或其他错误,PAM会将日志记录到/var/log/secure
  • /var/log/messages

6 Linux主机上的用户信息传递

6.1 查询用户: w,who,last,lastlog

  • w 显示登录系统的用户,以及他们正在做什么。
  • who 显示登录系统的用户。
  • last 显示最近登录的用户的列表。相关日志文件/var/log/wtmp
  • lastlog 报告所有用户或指定用户的最近登录记录。相关日志文件/var/log/lastlog

6.2 用户对话:write, mesg, wall

当确认当前由其他用户登录到系统时,可以使用一下命令向其他用户发送消息:
- write 发送消息给其他用户。
- mesg 控制其他人是否可以通过命令write向你的终端发送消息。
- wall 向所有人的终端发送消息。

注意只有其他用户在线时,才能使用以上命令向其发送消息。发送消息前先使用命令wwho来确认用户是否在线。

6.3 用户邮件信箱:mail

系统中的每个用户都有一个用以存放邮件的mail文件,其位于目录/var/spool/mail/下,例如用户neo的mail文件为/var/spool/mail/neo,而用户root的mail文件为/var/spool/mail/root.


7 手动增加用户

7.1 相关检查工具

  • pwck: 检查/etc/passwd/etc/shadow中的所有条目是否具有正确的格式和有效的数据。
  • grpck: 检查/etc/group/etc/gshadow中的所有条目是否具有正确的格式和有效的数据。
  • pwconv: 将/etc/passwd中的账号与口令移动到/etc/shadow中。
  • pwunconv: 将/etc/shadow中的口令写回到/etc/passwd当中,并删除/etc/shadow
  • chpasswd: 读入/etc/passwd中未加密的口令,然后将口令加密,再将加密后的口令写入/etc/shadow当中。

7.2 手动创建用户账号的步骤

  1. 先创建所需要的群组 ( vi /etc/group );
  2. 将 /etc/group 与 /etc/gshadow 同步化 ( grpconv );
  3. 创建账号的各个属性 ( vi /etc/passwd );
  4. 将 /etc/passwd 与 /etc/shadow 同步化 ( pwconv );
  5. 创建该账号的口令 ( passwd accountname );
  6. 创建用户家目录 ( cp -a /etc/skel /home/accountname );
  7. 更改用户家目录的属性 ( chown -R accountname.group /home/accountname )。

9 本章习题

root 的 UID 与 GID 是多少?而基于这个理由,我要让 test 这个账号具有 root 的权限,应该怎么作?

root 的 UID 与 GID 均为 0 ,所以要让 test 变成 root 的权限,那么就将 /etc/passwd 里面, test 的 UID 与 GID 字段变成 0 即可!

假设我是一个系统管理员,我有一个用户最近不乖,所以我想暂时将他的账号停掉, 让他近期无法进行任何动作,等到未来他乖一点之后,我再将他的账号激活,请问:我可以怎么作比较好??

由于这个账号是暂时失效的,所以不能使用 userdel 来删除,否则很麻烦!那么应该如何配置呢?再回去瞧一瞧 /etc/shadow 的架构,可以知道有这几个可使用的方法:

  • 将 /etc/passwd 的 shell 字段写成 /sbin/nologin ,即可让该账号暂时无法登陆主机;
  • 将 /etc/shadow 内的口令字段,添加一个 * 号在最前面,这样该账号亦无法登陆!
  • 将 /etc/shadow 的第八个字段关于账号取消日期的那个,配置小于目前日期的数字,那么他就无法登陆系统了!

我在使用 useradd 的时候,新增的账号里面的 UID, GID 还有其他相关的口令控制,都是在哪几个文件里面配置的?

在 /etc/login.defs 还有 /etc/default/useradd 里面规定好的!
我希望我在配置每个账号的时候( 使用 useradd ),默认情况中,他们的家目录就含有一个名称为 www 的子目录,我应该怎么作比较好?
由于使用 useradd 的时候,会自动以 /etc/skel 做为默认的家目录,所以,我可以在 /etc/skel 里面新添加一个名称为 www 的目录即可!

简单说明系统账号与一般用户账号的差别?

一般而言,为了让系统能够顺利以较小的权限运行,系统会有很多账号, 例如 mail, bin, adm 等等。而为了确保这些账号能够在系统上面具有独一无二的权限, 一般来说 Linux 都会保留一些 UID 给系统使用。在 CentOS 5.x 上面,小于 500 以下的账号 (UID) 即是所谓的 System account。

简单说明,为何 CentOS 5.x 创建使用者时,他会主动的帮使用者创建一个群组,而不是使用 /etc/default/useradd 的配置?

不同的 linux distributions 对于使用者 group 的创建机制并不相同。主要的机制分为:
Public group schemes: 用户将会直接给予一个系统指定的群组,一般来说即是 users , 可以 SuSE Server 9 为代表;
Private group schemes: 系统会创建一个与账号一样的组名!以 CentOS 5.x 为例!

如何创建一个使用者名称 alex, 他所属群组为 alexgroup, 预计使用 csh, 他的全名为 “Alex Tsai”, 且他还得要加入 users 群组当中!

  • groupadd alexgroup
  • useradd -c "Alex Tsai" -g alexgroup -G users -m alex
    务必先创建群组,才能够创建使用者喔!

由于种种因素,导致你的用户家目录以后都需要被放置到 /account 这个目录下。 请问,我该如何作,可以让使用 useradd 时,默认的家目录就指向 /account ?

最简单的方法,编辑 /etc/default/useradd ,将里头的 HOME=/home 改成 HOME=/account 即可。

我想要让 dmtsai 这个使用者,加入 vbird1, vbird2, vbird3 这三个群组,且不影响 dmtsai 原本已经支持的次要群组时,该如何动作?

usermod -a -G vbird1,vbird2,vbird3 dmtsai

0 0
原创粉丝点击