linux用户及权限管理

前言

每次使用linux系统我们都需要登录,用户在登录过程中起到重要的作用。本篇博客主要讲解用户及其管理的相关内容。

用户

用户是使用linux的前提,只有经过了linux的用户认证才能正常使用系统。那么在系统内部是怎么实现这样的机制的。

用户和用户组

对于计算机而言,只会识别0和1构成的二进制,对文字识别较差,因此如果用一个数字来表示一个用户的话会比较方便。linux系统是一个多人多任务系统,仅仅只有单个的用户显然是不合理的,多个用户也可以存在某种关系,比如说共同开发一个项目,那么这些成员应该同时属于同一个工作组,共享某些资源,因此也存在组的概念。和用户一样,用户组组也是用唯一的数字标识的。用户用UID标识,用户组使用GID标识。

UID

人和计算机存在认知的差别,计算机只对数字敏感,人对文字敏感,因此在人们使用linux系统的时候通常都是通过用户的名称来进行操作的,而在系统内部都是转化为数字,因此需要在硬盘上记录下用户名和用户标识的对应关系。linux使用/etc/passwd来记录。

/etc/passwd文件内容

打开这个文件,里边有非常多的内容,其中就能看到熟悉的root用户和登录使用的test用户,还有一些伪用户。这些伪用户是为了方便系统管理,满足相应的系统进程对文件属主的要求 ,删除之后可能会导致严重的系统问题,不能将其删除。

在passwd文件中每一行记录一个用户的资料,每一行有7栏分别用‘:’分隔,没有内容的栏位为空。分别表示:

用户名:密码(一般为x,密码单独存储在/etc/shadow):用户标识码(UID):用户组标识码(GID):用户说明:家目录:登录成功后执行的命令

用户名:日常使用系统登录时所使用的名字。使用’用户名’+’密码’即可登录系统。

密码:目前使用的linux一般都不会将密码直接存储在/etc/passwd文件中,考虑到安全问题一般会存放在/etc/shadow文件中。这个栏位一般为’x’或‘*’。

用户标识:在linux系统内部是依靠用户标识(UID)来辨识用户的,每一个用户一般会有唯一一个UID(一般UID为0的可能有多个,都是系统管理员)。并且UID分配具有一定的规律,可以查看/etc/login.defs文件获知,规律如下表所示:

UID范围 用户
0 表示系统管理员,要让其他用户具有root权限,即把该用户的UID改为0即可。一般不建议有多个系统管理员
1~999 系统用户,也就是伪用户,是系统为了使用较小的权限启动某些服务,减少root用户使用。Centos7中伪用户的范围为‘1~999’(其他的一些系统可能是1~499),一般是安装软件或者服务的时候创建。普通用户一般从1000开始,最大已经可以到(2^32-1)。(需要注意的是:1~200是系统自建系统用户的范围,用户自建系统用户一般是201~999)
1000~60000 普通用户

用户组标识:用户组的标识数字。

用户说明:对账户的意义进行说明。

家目录:指定家目录地址。

登录成功后执行的命令:一般指定登录之后使用的shell。

用户密码

上文中说到,在较新的系统里边,密码加密之后存放在/etc/shadow里边。用普通的用户是无法读取该文件的,因为文件的权限为所有人都不允许读写,因此需要通过su -切换到root用户之后读取该文件,强烈不建议修改该文件的权限,因为修改该文件权限可能会导致系统安全问题(如用户密码泄露)。

/etc/shadow文件内容

/etc/shadow文件结构与/etc/passwd类似,每一行记录一个用户内容,用’:’分隔为9个栏位,分别表示:

用户名:密码密文:最近密码修改日期:密码不可修改天数:密码有效天数:密码失效前警告天数:密码失效后宽限天数:用户失效日期:保留

密码密文:用户对应的密码加密之后的密文。在前面加入’*’或者’!’可以暂时禁止用户登录。

最近密码修改日期:最近一次修改密码的日期。

密码不可修改天数:密码修改之后的指定天数内不能再次修改密码。

密码有效天数:据上次密码修改之后指定天数后用户需要修改密码。

密码失效前警告天数:在密码需要修改前指定天数开始警告用户修改密码。

密码失效后宽限天数:在密码过期后的指定天数内还可以使用该密码(宽限修改密码时间)。

用户失效日期:在密码失效日期之后账户将不能再次登录使用。

保留:为未来新功能保留。

GID

GID就是用户组标志。而用户组的基本信息放在/etc/group文件中。该文件中的信息也是一个用户组占一行,用’:’分隔为4栏。

用户组名称:用户组密码:GID:此用户组支援账户名称

用户组名称:该用户组的名称。

用户组密码:该用户组的密码,一般是给用户组管理员设置密码。用户组的密码不会直接记录在该栏位,密文会记录在/etc/gshadow中,该栏位一般记录为’x’。

GID:用户组的ID。

此用户组支援账户名称:加入该用户组的用户名称。

用户组密码

用户组是可以通过用户组管理员进行管理的,通常会给组的管理员设置密码,那么这些内容都是存放在/etc/gshadow文件中的。

和存放用户密码的文件相同,该文件只有root用户可以读取,因此在读取该文件内容前应该先转化为root用户。该文件也是一行保存一个用户组资料,用’:’分隔出4个栏位,分别表示:

用户组名称:密码密文:组管理员:此用户组支援账户名称

用户组名称:用户组的名称,与/etc/group中的名称相对应。

密码密文:该密码是用于组管理员进行组管理的。

组管理员:该用户组的管理员,现在组管理员使用较少了,一般使用sudo一类的指令。

此用户组支援账户名称:和/etc/group中的字段一样。

有效用户组和初始用户组

有效用户组:就是指在创建文件或者路径时填入的所属用户组。

初始用户组:就是在登录用户之后即可获得该用户组权限的用户组。也就是/etc/passwd文件中记录的GID所对应的用户组。

查看自己所属的用户组

使用groups命令即可查看所属的用户组,排在第一位的用户组即为有效用户组

切换有效群组

使用newgrp group即可在新的shell环境中将有效用户组切换为指定用户组,特别需要注意的是,由于是在新环境中切换的有效用户组,在使用结束后要使用exit退出环境。

用户管理

新增

新增用户主要是使用useraddpasswd两个指令。

useradd

以下为useradd的使用:

useradd [-u UID] [-g 初始用户组] [-G 附加用户组] [-mM] [-c 用户说明] [-d 家目录绝对地址] [-s shell] 用户名

解释:
-g 指定该参数之后,即不会创建与用户名同名的用户组;
-m 强制!要创建使用者的家目录(一般用户的预设值);
-M 强制!不要创建使用者的家目录(系统用户的预设值);
-c /etc/passwd中用户说明栏内容,可以随便填入信息,默认为空;
-d 指定新建用户的家目录,一定要使用绝对路径;
-s 这个就是登录成功后执行的命令,指定使用的shell;
-r 指定建立一个系统用户,UID属于系统用户范围,在当前使用的系统中范围为201~999,可通过文档/etc/login.defs查看;
-e 账户失效日期,日期指定格式'YYYY-MM-DD';
-f 账户密码有效天数,-1表示永不用修改密码。

注意:系统一般会有默认的用户添加的设置,在使用'useradd username'命令之后,默认的设置一般为:创建一般用户,新建和用户名相同的用户组并且将此用户组作为该用户的初始用户组,默认没有附加用户组和用户说明,默认使用'/home/username'作为用户的家目录,使用bash作为默认shell。useradd的默认设置也可以通过'useradd -D'命令查看(其实就是/etc/default/useradd文件指定的)。默认操作的文件是:`/etc/passwd`、'/etc/shadow'、'/etc/group'和'/home/username'

useradd命令默认设置,注意:useradd命令执行需要root权限,所以需要在root用户下执行才能查看。

上图参数解释:
GROUP=100表示的是在创建用户时使用的初始用户组的ID为100也就是users用户组,这个根据不同发行版而有不同的设置,总的来说就是两种用户组的机制不同。CentOS系统采用的是私有用户组机制:即在创建用户的时候会新建一个同名的用户作为该用户的初始用户组,且家目录的权限设置为700,除该路径的所有者外其他用户都不能使用该目录,使用这种机制不会考虑GROUP=100这个设定,较为安全。还有一种机制是公共用户组机制:即会参考GROUP=100这个设定,将users用户组作为新建用户的初始用户组。一般家目录预设的权限为:755,大家都可以分享家目录的内容。比如说:SuSE系统就是使用公共用户组策略。

HOME=/home:这个参数指定的是创建家目录的基准目录。一般家目录与用户名同名。

INACTIVE=-1:这个参数指定的是用户密码失效,0表示每次登录都要重新设定密码,-1表示密码永不失效,30表示设定的密码30天之后失效。

EXPIRE:表示账户默认失效日期,为空的话表示账户永不失效。

SHELL=/bin/bash:指定创建账户默认使用的SHELL。不允许用户登录系统则是使用/bin/nologin

SKEL=/etc/skel:表示新建家目录的参考基准目录,直接将目录中的内容拷贝到新目录中。
新建家目录基准目录

CREATE_MAIL_SPOOL=yes:该参数指定是否建立使用者的邮箱

/etc/login.defs文件内容

/etc/login.defs文件内容

在文件中的参数大多数都有相应的解释,着重需要注意的几个参数就是:

MAIL_DIR /var/spool/mail # 用户邮箱默认放置路径

PASS_MAX_DAYS 9999 # 密码需要变更的最长时间
PASS_MIN_DAYS 0    # 密码需要变更的最短时间
PASS_MIN_LEN 5     # 密码的最小长度,已被pam模组取代,该参数已经失效,PAM模块相关资料:https://www.cnblogs.com/kevingrace/p/8671964.html
PASS_WARN_AGE 7    # 密码失效前天数进行警告

UID_MIN 1000       # 一般用户的起始UID
UID_MAX 60000      # 一般用户最大UID
SYS_UID_MIN 201    # 系统用户的起始UID
SYS_UID_MAX 999    # 系统用户的最大UID
GID_MIN 1000       # 用户组起始GID
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删除用户时,删除初始用户组
ENCRYPT_METHOD SHA512# 密码使用SHA512加密算法。

所以使用useradd时默认会参考/etc/default/useradd/etc/login.defs/etc/skel/*这几个文件。

passwd

以下为passwd命令的使用:

passwd [--stdin] [username]  # 所有用户都可以通过这样的方式修改自己的密码,当不指定用户时,默认修改自己的账号密码
passwd [-l] [-u] [--stdin] [-S] [-n天数] [-x天数] [-w天数] [-i天数] 账户  # 只有root用户可用
# 参数及选项
# --stdin 可以透过来自前一个管线的资料
# -l lock的意思,会在/etc/shadow中的密码密文前加!,封锁该用户登录
# -u unlock的意思,解除用户的封锁
# -S 列出密码相关参数,即/etc/shadow档案中的大部分资料
# -n天数 不可修改密码天数
# -x天数 密码有效天数
# -w天数 密码失效前警告天数
# -l天数 用户账户失效天数
# -d 删除用户的密码

例如如果要让test1用户7天修改一次密码的话,那么可以设置为:passwd -x 7 test1

修改

chage

chage用法:

chage -[ldEImMW] 用户名
# 选项说明
# -l 列出该用户的详细密码参数
# -d 日期 设置/etc/passwd中修改密码的时间,一般是以1970年1月1日到想要日期的天数
# -E 日期 格式为YYYY-MM-DD,账户失效日期
# -I 天数 密码修改的宽限天数
# -m 天数 密码不可修改的天数
# -M 天数 密码有效天数
# -W 天数 密码失效前天数警告

假如我们希望用户在登陆的时候设置新密码,就可以这样创建用户,useradd username && echo ‘username’ | passwd --stdin username && chage -M 0 -d 0 username创建用户之后登录需要重新设置密码才能使用账户。

创建一个在登录时必须要重设密码的账户

usermod

当使用useradd命令设置了错误的参数或者遗忘了设置某种参数时,可以使用usermod命令,微调用户的参数。

usermod [-cdegGlsuLU] username
# 选项解释
# -c 修改用户说明;
# -m 将原家目录中的内容移到新家目录中,与-d一起使用;
# -d home_path 修改用户登录后的家目录;
# -e YYYYMMDD 指定用户账户失效日期;
# -f 天数 用户密码失效之后宽限日期;
# -g group 设置初始用户组;
# -a 添加附加用户组,只能与-G选项一起用;
# -G group[,group[,group[...]]] 设置账户所支援的群组;
# -l username 设置用户新的用户名;
# -u uid 设置用户的uid;
# -o 设置非唯一的uid,与-u选项一起使用;
# -p passwd 修改用户密码,不推荐这种方式修改密码,因为这种方式需要自己确保密码符合系统的密码策略;
# -s shell 指定账户使用的shell
# -L username 锁定用户账号
# -U username 解锁用户账号

删除

userdel

在linux系统中,删除用户账号使用userdel命令,用法如下:

userdel [-fr] username
# 参数解释
# -f 强制删除用户,即使用户处于在线状态。同时也会删除用户的家目录和mail spool;
# -r 删除账户的同时也删除家目录和mail spool.

用户自查

id

id命令用于查询用户的uid和gid。

id [选项] user
# 选项解释
# -

ACL权限

在linux的传统权限管理分为三种身份:所有者、用户组和其他。在设置限制或者允许单个用户访问文件时,存在着限制。

ACL时Access Control Lists的缩写,是Unix-Like系统的额外支援项目,主要是提供相较传统权限管理更加细粒的管理。主要是通过以下三个方面进行控制权限:

  1. 使用者(user):针对使用者进行权限限制;
  2. 群组(group):针对群组进行权限限制;
  3. 预设属性(mask):设置目录下新建使用的默认权限。

在目前linux常用的分区类型(ext2/ext3/ext4/xfs等)默认acl挂载。虽然分区一般默认支持acl,但是还是需要相应的工具才能完全使用,一般使用setfaclgetfacl,如果提示找不到命令,在CentOS系统中可以在root用户下使用命令yum install acl安装。

开启分区ACL权限

临时开启分区ACL权限

重新挂载根分区:

mount -o remount,rcl /

临时开启acl分区在重启系统之后恢复到初始状态。

永久开启分区ACL权限

修改/etc/fstab文件,在默认参数中添加acl选项。

添加acl选项

保存修改后,重载分区或者重启系统生效。

ACL权限设置

一般使用getfaclsetfacl两个工具完成ACL权限设置。

setfacl

setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file
# 参数与选项
# -m 从命令行输入ACL条目进行更改
# -M 从文件中读取ACL条目进行更改
# -x 从命令行输入移除ACL条目
# -X 从文件中读取ACL条目,并移除
# -b 移除所有文件和目录的拓展ACL权限,仅保留所有者、群组和其他人权限设置;
# -k 移除预设ACL权限;
# -n 不重计算有效掩码
# --mask 重计算有效掩码
# -d 所有操作应用到ACL中
# -R 应用到所有文件和路径
# -L 按照系统逻辑,跟随符号连接
# -P 按照自然逻辑,不跟随符号连接
# -v 版本信息
# -h help
# --resotre 恢复权限备份
# --test 测试模式,不修改任何权限
# -- 命令模式结束标志
# - 如果文件名称为‘-’,那么从标准输入读取文件列表。

# ACL权限条目
[d[efault]:] [u[ser]:]uid [:perms]
# 设置用户权限

[d[efault]:] g[roup]:gid [:perms]
# 设置群组权限

[d[efault]:] m[ask][:] [:perms]
# 设置掩码

[d[efault]:] o[ther][:] [:perms]
# 设置其他人权限
例子

使用root创建test.txt文件,setfacl设置test的rw权限,代码如下:

root用户执行:

touch test.txt
setfacl -mu:test:rw test.txt

使用root用户创建文件,并且设置test用户的读写acl权限

从上图中可以看出当设置了acl权限之后,权限部分最后变成了‘+’。

使用test账户测试,尝试写入以及读取test.txt文件

设置群组、其他人的权限类似。

getfacl

getfacl命令用于获取文件或则目录的acl权限信息。命令用法如下:

getfacl path

查看test.txt的acl信息

有效掩码

有效掩码设置方式setfacl -mm:mask path,有效掩码即在强制限制权限赋予范围,当赋予的权限不属于有效权限时则该权限无效。注意:默认在修改ACL权限时会重新计算有效掩码,可加入’-n’选项避免重新计算有效掩码

有效掩码限制权限发放

注意:权限只有所有者有权限修改(chmod)。而修改文件所有者(chown)只有root有权限修改。

预设ACL权限

预设权限使得权限可以继承。如果一个目录设置了预设ACL权限,那么子目录下的权限都将继承预设权限。

例子

root用户创建一个test文件夹,给test用户设置该目录预设读取权限,root在该目录下创建test.txt文件,并写入’hello world!’内容。然后退出root用户使用test用户读取该文件内容。

目录中的文件继承了预设ACL权限

用户身份切换

在linux系统使用过程中,有时会使用不同的用户,就会使用到用户切换命令。

切换身份的原因

  1. 日常使用系统,使用一般用户;为了系统的安全,使用一般用户进行日常作业,当需要设定系统环境时,切换到root用户,这样操作相对安全,避免一些严重的误操作,例如rm -rf /
  2. 使用较低较少的权限启动系统服务;例如系统安装apache软件,使用单独的apache用户,即使程序被攻破,系统还不至于崩溃。
  3. 软件本身的限制。在早期的talnet,程序预设是不允许root登录的,talnet会判断登录者的UID,如果登录者的UID为0,直接拒绝登入。因此只能使用一般用户登录系统。

一般用户切换为root用户方法

  1. su -,这个指令能从一般用户切换到root用户,但是需要输入root用户的密码,就是一般用户需要知道root用户的密码。
  2. sudo指令执行root指令,sudo使用需要事先进行设置,sudo使用的是自身账户的密码。在多人同时管理同一台linux系统时,使用sudo更加合适,可以有效避免root用户泄露。

su

su是最简单的身份切换指令,可以进行任何身份的切换。使用方法如下:

su [-lm] [-c指令] [username]
# 选项和参数讲解
# - 表示是以与真实登录类似的方式切换用户,清除目前的变量,重设主目录、当前shell、当前用户、登录名称、PATH变量;设置当前路径为主目录。
# -l 和-类似,后面需要接欲切换的用户账号,也就是login-shell方式
# -m -m和-p是类似的,表示使用目前的环境设定,不读取新用户的设定。
# -c 进行一次指令执行,所以-c接上指令。
# 默认情况下,su为以nologin-shell方式登录,PATH等变量都不会改变。
# root用户切换到其他用户,不需要使用任何密码。

sudo

sudo使用方法如下:

sudo [-b] [-u新使用账号]
# 选项和参数讲解
# -b 将后续的指令放到背景中执行    而不会与当前的shell产生联系。
# -u 后面接欲切换的用户,无指定则切换为root用户。

sudo执行流程

  1. 当使用sudo时,首先查询/etc/sudoers档案,查看该用户是否具有执行sudoers的权限;
  2. 当具有权限之后,让用户输入用户密码进行确认;
  3. 如果密码输入成功之后,便使用sudo执行后续指令(root使用sudo不需要输入密码);
  4. 如果想切换的身份与执行者的身份相同时,不需要输入密码。

sudo设置

visudo和/etc/sudoers

是否具有sudo的权限是由/etc/sudoers文档决定的,所以要想给用户添加sudo权限就需要更改/etc/sudoers文件,由于文档有一定的语法并且设置错误会导致严重的错误,所以一般使用visudo进行设置。一般在退出设定时会检查文档的语法是否有错误。

visudo设置的方法有两种:

  1. 对单一使用者设置sudo。
    使用visudo命令打开sudo的配置文件:

    # 在root ALL=(ALL)ALL后一行添加如下内容:
    test ALL=(ALL)ALL
    # 参数讲解
    # 例如已有的: root ALL=(ALL)ALL
    # 用户名 登入者的来源主机名称=(可切换的身份)可下达的指令
  2. 使用wheel群组和免密码功能处理visudo

    使用visudo命令打开sudo的配置文件:

    # 将%wheel ALL=(ALL)ALL的注释去掉即可使wheel群组的用户都具有sudo权限,而新的用户只需添加到该群组就行.
    # 去除密码的设置如: %wheel ALL=(ALL) NOPASSWD: ALL

注意:在指定能下达指令时,要使用绝对路径,并且多个命令使用英文逗号,分开.

有限制的指令操作

比如赋予了sudo能执行passwd的权限,但是如果直接给passwd命令权限则可能将root用户的密码修改导致root用户不能登录,因此需要限制用户修改root用户的密码.具体设置如下:

test ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
# !表示不能执行的指令,不能执行/usr/bin/passwd和/usr/bin/passwd root两个命令.
通过别名建置visudo

如果有15个用户需要添加到sudo权限中的话,除了使用用户组进行管理以外,还能通过别名建置获得sudo权限.假设需要将test1、test2、test3…test15一共15个用户添加到sudo中,并限制只能修改除root用户外用户的密码,除了使用用户组或者单个添加以外,还能使用如下设置:

User_Alias TESTS=test1,test2,test3,test4,test5,test6,test7,test8,test9,test10,test11,test12,test13,test14,test15
Cmnd_Alias TESTSCMD=!/usr/bin/passwd,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
TESTS ALL=(root) TESTSCMD

添加之后即可使用户具有修改密码权限。

sudo时间间隔

两条sudo命令连着使用都需要输入密码,可以设置使用时间间隔不超过5分钟,不需要重新输入用户密码。设置如下:

# 将默认的Defaults env_reset改为设置(5分钟为超时时间):
Defaults env_reset , timestamp_timeout=5
通过sudo将用户切换到root用户(非信任用户切勿使用)
User_Alias ADMINS=test1,test2
ADMINS ALL=(root) /bin/su -

特殊的SHELL

在安装linxu系统之时,会默认创建许多许多系统用户,例如,负责管理邮箱的mail用户等等,mail用户只是用于使用相关的资源,而不是用于登录linux系统,因此设置mail用户的密码,同时设置mail用户登录使用的shell为/sbin/nologin,这个shell为无法登录的合法shell。输入正确的账号密码登录之后会提示:

This account is currently not available.

PAM模组

在以前,如果需要对用户进行认证,需要专门的程序判断用户和密码是否正确,那么就存在在同一个主机上存在多个不同的认证系统,可能会造成账户和密码不同步的问题,从而引入了PAM(Pluggable Authentication Modules,可插拔认证模块)机制。PAM是一整套应用程序接口(Application Program Interface,API),提供一连串验证机制。PAM可实现使用者将验证过程的需求告知PAM,PAM即可返回相应的验证的结果。PAM既是一套验证机制,也可以提供其他软件调用验证,让账户的验证具有一致性。

PAM验证结构

在系统中PAM作为API存在,需要PAM认证的程序即可调用该接口,经过一系列验证之后将结果返回,程序可以根据验证的结果做出相应的反应。PAM进行验证的信息成为模块(Modules),每个PAM模块的功能不同。

PAM模块设定语法

PAM由一个和程序名相同的设定文档确定认证流程。当执行passwd后,PAM运行的流程为:

  1. 使用者调用passwd,并输入密码;
  2. passwd程序调用PAM进行认证;
  3. PAM到/etc/pam.d/中找与程序(passwd)同名的设定档;
  4. 依据/etc/pam.d/passwd文档的设定,调用相应的PAM模块进行验证;
  5. 将验证结果返回passwd程序;
  6. passwd根据返回的结果做出相应的反应。

因此,PAM中最重要的是验证的模块和/etc/pam.d/目录下的设定文档。以passwd的设定档(/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

每一行都是一个独立的验证流程,每一行都可以分为三个部分,分别是验证类别(type)、控制标识(flag)和PAM模块和该模块的参数。

验证类别(type)

验证类别主要分为4种:

  • auth:authentication的缩写,通常用于验证使用者的身份验证,通常需要使用密码来验证,所以后续接的模块一般验证使用者身份的。
  • account:account(账户)一般是用于authorization(授权),主要用于检验使用者是否具有正确的使用权限。
  • session:session就是会话的意思,所以session管理的是使用者在此次登入(或这个指令)期间,PAM所给予的环境设定。session一般会记录使用者登入和登出时的信息。比如,使用su命令和sudo命令可以在/var/log/secure中找到很多关于pam的说明。记录的资料都是session open和session close等。
  • passwd:这种类别主要提供验证的修订工作,比如修改/变更密码等。

控制标识(control flag)

控制标志是指验证的过程中通过的标准,控制验证的放行标准,一般分为4中控制标志:

  • required:如果验证成功则带success标志,验证失败则带failure标志,无论验证成功还是验证失败都会进行后续的验证流程。由于后续的流程可以继续进行,相当于有利于资料的登录(log),这也是经常使用required的原因。
  • requisite:如果验证失败立刻返回原程序failure标志,并且终止后续的验证流程。如果验证成功则带success标志并继续后续验证流程。
  • sufficient:如果验证成功则立刻回传success给原程序。并终止后续验证流程:如果验证失败则带failure标志并继续后续验证流程。
  • optional:大多数用在显示讯息,不用于验证。

控制标志的验证流程

常用的PAM模块

经常我们需要通过各种方式登入系统,因此看一下登入所需的PAM流程,即/etc/pam.d/login文档中的内容:

#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

在login文档中使用了很多次system-auth模块,此模块(/etc/pam.d/system-auth)的配置内容为:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

详细的模块的信息在linux中都可以找到,常见的模块:

  • 每个程序的个别PAM设定档:/etc/pam.d/*;
  • PAM模块实际放置位置:/lib64/security/*;
  • 其他PAM环境设定文档:/etc/security/*;
  • 详细的PAM说明文档:/usr/share/doc/pam-*;

这里列举几个常用的PAM模块:

  • pam_securetty.so:限制root用户只能从安全终端登录,而常见的安全的终端就是TTY1,TTY2等终端机装置名称。而安全的终端机设定是由/etc/securetty文档决定的。
  • pam_nologin.so:限制一般使用者能否登入主机,当/etc/nologin这个文档存在时,则所有一般用户都不能登入系统,并且将其中的内容输出到登录的终端上。在正常的系统中不存在,但是该模块不能限制root及已经登录的用户。
  • pam_selinux.so:SELinux是针对程序进行细部权限管理的功能,由于SELinux会影响到使用者执行程序的权限,因此我们利用PAM模块,暂时将SELinux暂时关闭,验证通过后再打开。
  • pam_console.so:当系统出现问题或者需要通过特殊终端登陆系统时,该模块可以处理一些档案的权限问题,让使用者可以通过特殊终端登入系统。
  • pam_loginuid.so:通过用户UID,验证一般账号和系统账号。
  • pam_env.so:用于设定环境变量的模块,如果你有需要额外的环境变量设定,可以参考/etc/security/pam_env.conf这个档案。
  • pam_unix.so:该模组很复杂也很重要,该模组可以用于验证阶段的认证功能,可以用在授权阶段的用户授权管理,也可以用在会话阶段的登录档记录,甚至可以用在密码更新阶段的检验。
  • pam_pwquanlity.so:该模块用于检验密码强度。包括密码是否存在于字典中,密码输入几次失败就断掉此次连线的功能,都可以由该模块提供的。最早之前使用的是pam_cracklib.so这个模组,后改为pam_pwquanlity.so模组。但是该模组完全兼容于之前的pam_cracklib.so模组。
  • pam_limits.so:提供ulimit功能,设定档参考/etc/security/limits.conf。
limits.conf

limits.conf这个文件对用户使用的资源进行限制。一般账号资源限制格式如下:

test soft fsize 1000
test hard fsize 9000

账号限制栏分为4栏,第一栏为账号,如果是群组限制则在群组名称前加@符号;

第二栏为对限制的要求,soft为警告,hard为严格。

第三栏为限制的内容,这里使用的限制档案的容量。

第四栏为限制的值,这里使用的单位为KB。

限制test用户登录的最大连接数为1,设置为:

test hard maxlogins 1

因为PAM只用在验证的时候才使用,对于已经登入的用户没有作用。所以修改过的资料需要用户重新登入才能使设置生效。

使用者的信息传递

使用同一台电脑的不同用户之间的沟通,查看不同用户的信息。

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

通过w或者who命令就可以查询到目前在线的用户。

想要查询到最近用户的登录的时间,可以使用lastlog命令,该指令是去读去/var/log/lastlog文档。

使用者之间交流,write,mesg,wall

利用write指令可以直接将信息传递给接受者。命令格式如下:

write 用户名称 [用户所使用的终端]

当在该指令中输入消息,回车之后会立马将该消息传递给指定用户,如果用户在做其他任务,突然出现的消息会将工作打乱,因此可以通过mesg n命令选择不接收消息。即使选择不接收消息,但是对于root用户的消息不受该选项的影响,会直接传递给用户。

广播则使用wall指令,命令使用的方法:

wall '消息内容'

使用者的邮箱

使用write、wall命令都需要用户在线才能接收到消息,除此以外还能通过mail传递信息到用户。使用mail -s "邮件标题" username@localhost命令即可开始编写邮件并发送邮件,编辑完邮件之后使用单独一行.表示邮件内容的结束。

mail常使用的命令:

命令 含义
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 则会实际进行你刚刚所执行的任何动作(尤其是删除!)

Centos下建立大量账号

在Linux下创建大量的用户,需要检查用户创建是否存在问题,那么这个时候就需要使用工具进行辅助设置。

一些用户相关的检查工具

pwck

这个指令用于检查/etc/passwd文档中用户的设定信息,以及家目录实际存在等等信息。甚至还可以比对/etc/passwd、/etc/shadow中的信息是否一致,如果存在问题,则提示修改。

pwck指令检查结果

以上为pwck检查结果,检查结果为系统用户存在部分错误,这些错误属于正常的错误,不用解决。对应的群组检查命令使用grpck命令。

pwconv

这个命令主要用于将/etc/passwd中的密码信息移动到/etc/shadow中,一般用在较旧的系统上,为了安全考虑,将密码从/etc/passwd中转移到/etc/shadow中。

pwunconv

这个命令恰好相反,将/etc/shadow中的密码写回到/etc/passwd中,并且删除/etc/shadow档案。

chpasswd

这个命令可以读入未加密的密码,并把这个密码写入到/etc/shadow中去,这个命令常常使用在大量建构用户的工作中去。读入资料的格式为”用户名:密码”。例如:

echo 'test:123456' | chpasswd

大量建置用户的办法(passwd –stdin)

可以通过脚本使用passwd --stdin大量建置用户

参考资料

伪用户资料:https://blog.csdn.net/Add_a_cat/article/details/97614942

开启分区ACL权限:https://www.cnblogs.com/ysocean/p/7801329.html

setfacl参数详解:https://www.cnblogs.com/ftl1012/p/setfacl.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qinzhtao@163.com

文章标题:linux用户及权限管理

文章字数:9.4k

本文作者:捌叁壹伍

发布时间:2019-11-17, 11:58:41

最后更新:2019-12-18, 14:11:07

原始链接:http://qzt8315.github.io/2019/11/17/linux用户及权限管理/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏