目录

用户介绍

Linux 是多用户、多任务的系统,这就涉及到权限的问题了,像电影里的一些门禁系统只有一些大 boos 才能进入对吧,那此时大 boos 就具有操作这个门禁的权限了其他人则没有,那权限其实就是用户对相关应用的控制能力(权限隔离机制)。

这么多用户 Linux 是如何区分的?在 Linux 中使用 UID(user id) 来标识。当有多个用户想对某个文件拥有 x 同权限,那么可以给它们分配到同一个组里(逻辑容器 组就是用来包含用户的),组也同样有id标识叫GID(group id)

用户分类:

  • UID=0,管理员用户
  • UID=1000-65535,普通用户,在有些系统可以支持到四亿多个用户
  • UID=1-999,程序/系统用户

组分类:

  • 管理员组/普通组
  • 基本组:Linux 中新建用户时,没有指定隶属于的组,系统会为这个用户建立一个同名的组,作为该用户的基本组。
  • 附加组:方便给用户添加权限

我们知道计算机处理数字的能力比处理字符串快,我们刚好刚好相反,那我们在登录系统时输入的用户名会被 Linux 解析成 UID,在系统有这一系列的数据库,像 /etc/passwd 中存放着用户基本信息、/etc/shadow 存放用户影子口令、/etc/group 存放组基本信息,下面来看看这些文件的作用。

与用户相关的配置文件

/etc/passwd

passwd.PNG

  • 第一列:是用户名
  • 第二列:账号的口令,x 代表占位符,实际上加密过了,口令保存在 /etc/shadow 文件中
  • 第三列:UID,用户 id 标识号
  • 第四列:GID,组标识号
  • 第五列:用户描述信息,注释说明。
  • 第六列:用户宿主目录或者叫家目录
  • 第七列:默认使用的 shell

/etc/shadow

shadow.PNG

  • 第一列:是用户名
  • 第二列:加密后的密码,当设置为 !! 就暂时无法登陆系统。
  • 第三列:最后一次更改密码的时间。
  • 第四列:账户多少天内不可以更改密码,为 0 表示没有限制。
  • 第五列:表示密码到期,到达指定多少天后必须更改密码,留空表示没有限制,默认为 99999。
  • 第六列:假如设置成 5,那么密码到期前倒数 5 天会警告用户密码还剩 5 天即将过期,留空或 0 表示没有限制。
  • 第七列:密码到期过后再宽限多少天,留空表示没有限制,到宽限日期用户不允许登录。
  • 第八列:到期的时间,时间一到用户就不能够登录,留空将永远不过期。
  • 第九列:没有作用,保留以后使用。

第二列是密码,格式是 $id$salt$encrypted,它由三部分组成用 $ 隔开,第一部分为加密算法由数字指明加密算法:

  • 1,标识为 MD5 加密,已经被破解不安全。
  • 2,Blowfish 加密。
  • 2a,Blowfish 加密。
  • 5,SHA-256 加密。
  • 6,SHA-512 加密。

第二部分是随机序列号,第三部分是随机序列号和密码共同加密后的字符串,类似签名。

加密算法分为对称加密和、对称加密和单向加密三种,对称加密也就是加密和解密都是使用同一把钥匙,非对称加密加密和解密使用不同的秘钥(公钥与私钥),单向加密散列加密用于提取数据的特征码,常常用来校验数据完成性,它不可逆其次是定长输出(有规定长度),比如有 md5 是 128 位定长输出(128 指的是 2 进制,通常用 16 进制来表示),sha 是由 160 位、224 位、256 位、384 位、512 位,加密后的数据只要改动就会引起结果(特征码)的巨大变化。

/etc/default/useradd

创建账户默认值的一些信息,后续可以修改。

useradd.PNG

  • 第一行:可以创建普通组
  • 第二行:普通用户宿主(家)目录,会在 home 下生成与用户同名的目录,作为用户宿主目录。
  • 第三行:是否开启用户过期停止使用权(过期的宽限期限),-1 代表不启用,如果写了整数代表用户过期后还可使用 x 天。
  • 第四行:设定过期时间,格式:2018027
  • 第五行:设定用户的默认 shell
  • 第六行:新用户宿主目录模板目录
  • 第七行:是否为用户启用邮件通知功能

/etc/skel

用户宿主(家)目录模板目录,只对新建用户生效。在新建用户后会复制 /etc/skel 目录中的文件到新建用户的宿主目录中。

skel.PNG

.bash_logout    #用户注销时执行的命令
.bash_profile    #用户登录系统时执行的命令(用户变量)
.bashrc    #用户登录新shell时执行的命令

/etc/login.defs

关于密码的一些限制是在这个文件配置的

MALL_DIR        /var/spool/mail    #用户系统邮件存放目录
PASS_MAX_DAYS   9999               #密码最长使用期限
PASS_MIN_DAYS   0                  #最短使用期限(至少使用x天才可以更改密码),0代表不受限制
PASS_MIN_LEN    5                  #密码最小长度
PASS-WARN_AGE   7                  #密码过期前的警告时间(如果密码最长使用时间是30天,这个会在到期前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                #是否创建宿主(home)目录
UMASK           077                #权限反掩码
USERGROUPS_ENAB yes                #删除用户时是否删除组
ENCRYPT_METHOD  SHA512             #用户密码加密方式

用户相关操作

添加删除用户

语法:useradd [options] 用户名

下面是它的选项:

  • -c ,添加注释信息,内容用双引号包起来。
  • -d ,手工指定宿主目录,默认在 /home。
  • -e ,新建用户时,设置用户默认过期时间,格式:YYYY-MM-DD。
  • -g ,指定用户基本组(不适用该选项,新建用户会自动创建同名组作为用户基本组)
  • -G ,新建用户时指定用户的附加组,附加组可以有多个用逗号隔开。
  • -m ,创建宿主目录时,和-k一起使用。
  • -M ,创建用户时,不为用户创建宿主目录。
  • -p ,创建用户时,为用户设置加密的密码(不推荐使用,history 可以查看历史命令)
  • -r ,创建系统用户(不会建立宿主目录,UID和GID使用系统用户 ID,取值范围:1-999)
  • -s ,指定默认 Shell(所指定的 Shell 需要系统支持,/etc/shells 存放着系统支持的 Shell)
  • -u ,自定义 UID
  • -D ,查看和改变默认的值(修改的 /etc/default/useradd 文件中的选项和值)
  • -g,修改组
  • -b,修改宿主目录
  • -f,修改过期是否停用
  • -e,修改过期时间
  • -s,修改默认 shell

添加一个用户 aaa 指定它 UID 是 0:

useradd -o -u 0 aaa

语法:userdel [options] user_name

  • -r,删除用户时删除宿主目录

设置密码

用户建立过后是没有密码的,我们需要手动设置。
语法:passwd [options] 用户名
下面是一些选项,不加选项则设置修改当前登录用户的密码。普通用户则需要验证当前密码。

  • -l,锁定用户,暂时会无法登陆系统,锁定会在密码开头加上!!
  • -u,解锁用户
  • -S,查看用户状态,显示 /etc/shadow 字段内容
  • --stin,标准输入,经常在 shell 脚本编程中为用户自动设置密码
  • -d,删除用户密码,删除后允许空密码登录(很危险)
  • -e,设置密码过期,在下次用户登录时会提示密码过期并重新设置密码。
  • -n,设置密码最少使用多少天才可更改密码,修改 /etc/shadow 第四列
  • -x,设置密码最长使用期限,设置修改 /etc/shadow 第五列
  • -w,设置密码到期前警告时间,修改 /etc/shadow 第六列
  • -i,修改过期宽限天数,修改 /etc/shadow 第七列

显示更改用户属性和信息

语法:usermod [options] user_name

命令每次修改的是 /etc/passwd。

  • -c,更改用户的 comment(注释说明)
  • -d,更改用户宿主目录
  • -e,更改用户过期时间,格式:YYYY-MM-DD。
  • -f,修改用户过期宽限天数
  • -g,修改用户基本组
  • -G,修改用户附加组
  • -l,修改用户登录名,只改变 shadow 与 passwd 文件用户名
  • -s,修改用户的 shell,需要系统已经安装的 shell
  • -L,锁定用户
  • -U,解锁用户

用户更改用户的 shell

语法:chsh [options] user_name

  • -s,后面跟上 shell
  • -l,显示当前系统支持的 shell,可以查看 /etc/shells 文件

用户基本信息(finger 待补充)

finger [options] user_name,显示用户基本信息,系统可能没安装需要 yum -y install finger

chfn [options] user_name,修改用户基本信息:

  • -o,修改办公室
  • -p,修改办公室phone
  • -h,修改家庭电话号码
  • -f,修改用户名

id [options] user_name,显示用户和组的 id,不加选项则显示用户ID、所有组ID:

  • -a,忽略其他系统版本区别
  • -Z,显示安全上下文内容,涉及 selinux。
  • -g,打印基本组 id
  • -u,显示用户 id
  • -G,显示所有组的 id
  • -n,不显示组号,显示组名。与 -u 一起使用

chage [options] user_name,修改用户密码的时间信息,最终会改动 /etc/shadow 文件:

  • -l,显示用户详细密码参数
  • -d,修改 /etc/shadow 第三列,格式:YYYY-MM-DD。
  • -m,修改 /etc/shadow 第四列,跟天数
  • -M,修改 /etc/shadow 第五列,跟天数
  • -W,修改 /etc/shadow 第六列,跟天数
  • -I,修改 /etc/shadow 第七列,跟天数
  • -E,修改 /etc/shadow 第八列,格式:YYYY-MM-DD。

w,查看哪些用户已登录系统,并且在做什么。

临时使用其他用户身份执行命令和切换用户

sudo [s|i] execute_command 是临时使用 root 权限来执行命令。

当用户或组没有权限执行命令或查看文件时,用这个命令可以暂时提升到 root 权限,前提是在 /etc/sudoers 中有添加用户名或组名,并指定那些命令可以给用户使用。这种机制是白名单,只要在清单中用户能证明自己身份就让你用。

visudo 编辑 /etc/sudoers 文件,而不是其他编辑器,原因是它会自己检测语法,给添加个 gbb 用户可以执行任何命令:

sudoers.png

这里的语法格式是:

用户名 登录机器=可以使用的用户身份 可以执行的命令

用户名是指哪个用户能够使用 sudo 命令,等号左边登录机器是限制能够从哪个 host 登录到当前机器(没错 sudo 还能登录机器去),等号右边是可以使用哪个用户身份执行命令,最后一个是能够执行什么命令。

假如我添加:

gbbtest ALL=(root, gbb) /bin/bash, ip

这就是 gbbtest 可以使用 sudo 命令,运行从任何 host 登录当前系统,能够使用 root 和 gbb 身份执行 /bin/bash 和 /bin/ip 命令。

这只是对用户做 sudo 设置,如果想对组做设置只需在前面加上百分号。

%wheel ALL=(ALL) ALL

这代表 whell 组内所有成员允许以任何用户身份执行任何命令。

使用 sudo -l 就能够查看当前用户的 sudo 权限:

[gbbtest@iZ2ze3excf14rd7l4rsgn3Z root]$ sudo -l
[sudo] password for gbbtest: 
Matching Defaults entries for gbbtest on iZ2ze3excf14rd7l4rsgn3Z:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User gbbtest may run the following commands on iZ2ze3excf14rd7l4rsgn3Z:
    (root, gbb) /bin/bash, /sbin/ip

sudo -l -l 查看更美观格式的输出,也能用 sudo -ll 简写:

[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -ll
[sudo] password for gbbtest: 
Matching Defaults entries for gbbtest on iZ2ze3excf14rd7l4rsgn3Z:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User gbbtest may run the following commands on iZ2ze3excf14rd7l4rsgn3Z:

Sudoers entry:
    RunAsUsers: root, gbb
    Commands:
    /bin/bash
    /sbin/ip

当一个用户不在 sudoers 里去使用 sudo 命令,会自动发一封 mail 告诉 root 说有人干坏事儿:

[gbb@iZ2ze3excf14rd7l4rsgn3Z root]$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for gbb: 
Sorry, user gbb may not run sudo on iZ2ze3excf14rd7l4rsgn3Z.
[gbb@iZ2ze3excf14rd7l4rsgn3Z root]$ sudo ip -a
[sudo] password for gbb: 
gbb is not in the sudoers file.  This incident will be reported.

可以看到在命令执行还需要对当前用户的密码做验证。如果不像这么麻烦 在执行命令冒号前加上 NOPASSWD,表明不需要密码即可执行命令。

gbbtest ALL=(root, gbb) NOPASSWD:/bin/bash, ip

如果想限制只能执行某些命令,可在命令开头加上感叹号就是禁止使用:

gbbtest ALL=(gbb) /bin/find, !/bin/whoami

此时只能运行 /bin/find 命令:

[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -ll
[sudo] password for gbbtest: 
Matching Defaults entries for gbbtest on iZ2ze3excf14rd7l4rsgn3Z:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME
    HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User gbbtest may run the following commands on iZ2ze3excf14rd7l4rsgn3Z:

Sudoers entry:
    RunAsUsers: gbb
    Commands:
    /bin/find
    !/bin/whoami
[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -u gbb find /etc -iname passwd -exec echo 12 > /tmp/tmptext  \;
find: ‘/etc/grub.d’: Permission denied
find: Failed to change directory: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: Failed to change directory: Permission denied
find: ‘/etc/ntp/crypto’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: failed to restore initial working directory: Permission denied
[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ ll /tmp/tmptext 
-rw-rw-r-- 1 gbbtest gbbtest 0 Dec  7 22:43 /tmp/tmptext

执行 whoami 和 ls 则提示不允许执行。

[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -u gbb whoami
Sorry, user gbbtest is not allowed to execute '/bin/whoami' as gbb on iZ2ze3excf14rd7l4rsgn3Z.

[gbbtest@iZ2ze3excf14rd7l4rsgn3Z ~]$ sudo -u gbb ls -l /tmp/tmptext 
Sorry, user gbbtest is not allowed to execute '/bin/ls -l /tmp/tmptext' as gbb on iZ2ze3excf14rd7l4rsgn3Z.

sudo -s 直接切换到 root 来使用,但是只能是白名单中指定用户才能,它和 sudo -i 作用一致,直接用 sudo 会有 5 分钟缓存时间,时间一过必须重新使用 sudo 再次执行命令,这样就比较麻烦,不如切到 root。

su 后面不跟任何选项参数直接是切换到 root,su username 是直接切换到对应用户但是当前目录不改变,su - username 是直接切换到此用户家目录。

su 和 sudo 区别在于 su 只要你能证明口令就行(只看口令不看人),哨兵正站岗抖着腿,看到有人要过哨,哨兵即刻说:天王盖地虎;他说:宝塔正河妖,哟自己人您请。

sudo 是设置一个白名单,在这个名单中的用户只要证明你是本人(看了口令又看人)就能使用,上回仅仅核实口令,这回哨兵不仅对过口号还拿着肖像(sudoers)核对了这人模样。

组管理

在前面有介绍组的分类在这里再细分一下

组分类:

  • 管理员组/普通用户组/系统用户组
  • 基本组:Linux 中新建用户时,没有指定隶属于的组,系统会为这个用户建立一个同名的组,作为该用户的基本组(初始化的组)。
  • 附加组:方便给用户添加权限,除了初始化的组在后面添加的都是附加组(也称附属组)。举个例子~你在一家公司运维部了入职,组长需要给你申请一个系统管理账号,敲得飞快说着:新建了账号不具备使用系统的权限,所以得把你的账号添加到运维部管理组内,这样就能够正常工作了。刚上任同事就调到了开发组借用几天,组长说:你去把他账户从运维组移出(这样这位同事的账号就不具有使用运维组机器的权限了),添加到开发组。

与组相关的配置文件

/etc/group

group.PNG

  • 第一列:组名
  • 第二列:组密码占位符(在 /etc/ghadow 中保存组的密码)
  • 第三列:组ID号(GID)
  • 第四列:组成员,不会显示初始化成员(跟组同名的成员)

/etc/gshadow

gshadow.PNG

  • 第一列:组名
  • 第二列:组密码(!表示密码被锁定)
  • 第三列:组管理员(为空表示组内成员都可管理此组)
  • 第四列:组成员列表

组操作

添加/删除/修改组

添加组

groupadd

  • -g,创建组指定组ID
  • -r,添加系统组

删除组

groupdel user_name

组必须为空才能删除,其次删除用户时系统会删除同名基本组

修改组的属性

groupmod [options] group_name

  • -g,修改组ID(GID)
  • -n,修改组名

为组设置密码,设置组的管理员,添加组成员

gpasswd [options] group_name
不添加选项,为组添加密码

  • -A,为组设置管理员(为空表示组内成员都可管理此组)
  • -a,为组添加成员(组管理员可以操作的命令)
  • -M,批量添加用户,用逗号隔开
  • -d,删除组成员(组管理员可以操作的命令)
  • -r,删除组密码
  • -R,限制成员访问组(把组内成员权限冻结?),会组密码设置为!,我好像没有找到恢复选项,那是不是要重新设定密码?,删除密码会把!删除掉

为用户修改附加组

用户切换到其他组以其他组身份工作,那你创建文件或目录属组就成了你修改的附加组,切换时会提示你输入组密码,只在当前 shell 生效
newgrp group_name
exit退出当前shell

为组添加成员

显示组成员列表

groupmems(有空再补充)

最近更新:

发布时间:

摆哈儿龙门阵