Linux - 用户与用户组管理
目录
用户介绍
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
- 第一列:是用户名
- 第二列:账号的口令,x 代表占位符,实际上加密过了,口令保存在
/etc/shadow
文件中 - 第三列:UID,用户 id 标识号
- 第四列:GID,组标识号
- 第五列:用户描述信息,注释说明。
- 第六列:用户宿主目录或者叫家目录
- 第七列:默认使用的 shell
/etc/shadow
- 第一列:是用户名
- 第二列:加密后的密码,当设置为 !! 就暂时无法登陆系统。
- 第三列:最后一次更改密码的时间。
- 第四列:账户多少天内不可以更改密码,为 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
创建账户默认值的一些信息,后续可以修改。
- 第一行:可以创建普通组
- 第二行:普通用户宿主(家)目录,会在 home 下生成与用户同名的目录,作为用户宿主目录。
- 第三行:是否开启用户过期停止使用权(过期的宽限期限),-1 代表不启用,如果写了整数代表用户过期后还可使用 x 天。
- 第四行:设定过期时间,格式:2018027
- 第五行:设定用户的默认 shell
- 第六行:新用户宿主目录模板目录
- 第七行:是否为用户启用邮件通知功能
/etc/skel
用户宿主(家)目录模板目录,只对新建用户生效。在新建用户后会复制 /etc/skel
目录中的文件到新建用户的宿主目录中。
.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 用户可以执行任何命令:
这里的语法格式是:
用户名 登录机器=可以使用的用户身份 可以执行的命令
用户名是指哪个用户能够使用 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
- 第一列:组名
- 第二列:组密码占位符(在 /etc/ghadow 中保存组的密码)
- 第三列:组ID号(GID)
- 第四列:组成员,不会显示初始化成员(跟组同名的成员)
/etc/gshadow
- 第一列:组名
- 第二列:组密码(!表示密码被锁定)
- 第三列:组管理员(为空表示组内成员都可管理此组)
- 第四列:组成员列表
组操作
添加/删除/修改组
添加组
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(有空再补充)
最近更新:
发布时间: