用户
用户一般来说是指使用计算机的人,计算机针对使用其的每一个人给了一个特定的名称,用户就可以使用这些名称来登录使用计算机,除了人之外,一些系统服务也需要含有部分特权的用户账户运行;因此出于安全考虑,用户管理应运而生,它加以明确限制各个用户账户的权限,root在计算机中拥有至高特权,所以一般只作管理用,非特权用户可以通过 SU 或 SUDO 程序来临时获得特权
GNU/Linux 通过用户和用户组实现访问控制----包括对文件访问、设备使用的控制
个人可以拥有很多账户,只不是彼此名称不同,比如root名称已经占用就不能再用了,此外,任意用户可能从属某个用户组,此用户可以加入某些已经存在的组来获得该组的特权
GNU/Linux 系统中的每一个文件都有属一个用户(属主)和一个用户组(属组)。另外,还有三种类型的访问权限:读(read)、写(write)、运行(execute)。
用户账号、用户的分类
liunx识别用户:通过UID (用户的id 号码)
id 语法:
id 用户名
[root@exrcise1 opt]# id #如不接用户名,则显示当前用户名
uid=0(root) gid=0(root) 组=0(root)
[root@exrcise1 opt]# id sshd #接用户名,则显示指定用户名
uid=74(sshd) gid=74(sshd) 组=74(sshd)
[root@home ~]# id abdc #可以识别系统有没有指定
id: abdc: no such user
Linux用户三种角色
超级用户:root 拥有对系统的最高的管理权限 ID=0
普通用户:系统用户 UID:1-999(centos7 版本) 1-499(centos6 版本)
本地用户 UID:1000+ 500+
UID:即每个用户的身份标示,类似于每个人的身份证号码 .
虚拟用户:伪用户 一般不会用来登录系统的,它主要是用于维持某个服务的正常运行 .如:ftp,apache
下图是用户和组的关系:
一对一:一个用户可以存在一个组中;
多对一:多个用户可以存在一个组中;
一对多:一个用户可以存在多个组中;
多对多:多个用户可以存在多个组中;
名称 | 账号信息 | 说明 |
---|---|---|
用户配置文件 | /etc/passwd | 记录了每个用户的一些基本属性,并且对所有用户可读,每一行记录 对应一个用户,每行记录通过冒号进行分隔 |
用户组文件 | /etc/group | 用户组的所有信息存放地,并且组名不能重复 |
用户对应的密码信息 | /etc/shadow | 因为 passwd 文件对所有用户是可读的, 为安全起见把密码从 passwd中分离出来放入这个单独的文件,该文件只有 root 用户拥有 读权限,从而保证密码安全性 |
用户管理
添加用户命令
命令:useradd
useradd -d -u “UID” -g “主组” -G “附加组” -s "登陆的 shell” -c 指定说明信息 用户
参数:
-d :用户主目录路径, 可以指定用户家目录
-m : 如果没有目录,会自动创建新目录并且移到内容到新目录里面
-u : 指定用户ID号
-g :设置用户初始组的名称或数字ID;该组必须是存在的;如果没有设置该选项,useradd会根据/etc/login.defs文件中的 USERGROUPS_ENAB环境变量进行设置。
默认 USERGROUPS_ENAB yes 会用 和用户名相同的名字创建群组,GID 等于 UID.
-G :用户要加入的附加组列表;使用逗号分隔多个组,不要添加空格;如果不设置,用户仅仅加入初始组。(一 个用户只允许有一个主组,可以有多个附属组)
-s :用户默认登录 shell 的路径;启动过程结束后,默认启动的登录 shell 在此处设定;请确保使用的 shell
已经安装,默认是 Bash。有时候需要禁止某些用户执行登录动作,例如用来执行系统服务的用户。将 shell 设置成 /sbin/nologin就可以禁止用户登录。
-c : 附加描述信息
-M : 给创建的用户不创建家目录
-r : 创建系统账户,默认无家目录
添加登录用户
例子:添加一个名为 lin01 的用户,并使用 bash 作为登录的shell
[root@exercise1 ~]# useradd lin01
[root@exercise1 ~]# tail -1 /etc/passwd
lin01:x:1000:1000::/home/lin01:/bin/bash
[root@exercise1 ~]#
说明:此命令会自动创建 lin01 组,并成为 lin01 用户的默认主组,同时默认的登录 shell 是 bash
用户帐户的全部信息被保存在/etc/passwd文件。这个文件以如下格式保存了每一个系统帐户的所有信息 (字 段以“:”分割)
lin01❌1000:1000::/home/lin01:/bin/bash
lin01 :用户名
x :密码占位符
1001 :用户的 UID ,它都是用数字来表示的
1001 :用户所属组的GID ,它都是用数字来表示的
用户描述信息:对用户的功能或其它来进行一个简要的描述
/home/lin01 :用户主目录(shell 提示符中“~”代表的那个)
/bin/bash :用户登录系统后使用的shell
解释二:
/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
#查看系统中,支持哪些shell
[root@exercise1 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
指定用户 UID
[root@exercise1 ~]# useradd -u 1100 oracle
[root@exercise1 ~]# id oracle
uid=1100(oracle) gid=1100(oracle) 组=1100(oracle)
[root@exercise1 ~]# tail -1 /etc/passwd
oracle:x:1100:1100::/home/oracle:/bin/bash
[root@exercise1 ~]# ls /home/oracle/ -a
. .. .bash_logout .bash_profile .bashrc
[root@exercise1 ~]#
指定用户主目录
[root@exercise1 ~]# useradd -d /opt/lin01 lin01
[root@exercise1 ~]# tail -1 /etc/passwd
lin01:x:1101:1101::/opt/lin01:/bin/bash
[root@exercise1 ~]#
指定用户的主组
[root@exercise1 ~]# useradd lin02
[root@exercise1 ~]# id lin02
uid=1102(lin02) gid=1102(lin02) 组=1102(lin02)
[root@exercise1 ~]# useradd -g lin02 abc
[root@exercise1 ~]# id abc
uid=1103(abc) gid=1102(lin02) 组=1102(lin02)
[root@exercise1 ~]#
指定用户的附属组
我们也可以把这个附属组称为补充组,用户可以有 0 个或多个附加组的成员
[root@exercise1 ~]# useradd -G root,lin01,lin02 lin03
[root@exercise1 ~]# id lin03
uid=1104(lin03) gid=1104(lin03) 组=1104(lin03),0(root),1101(lin01),1102(lin02)
[root@exercise1 ~]#
创建用户的另外一个命令(了解)
[root@exercise1 ~]# adduser lin04
[root@exercise1 ~]# id lin04
uid=1105(lin04) gid=1105(lin04) 组=1105(lin04)
[root@exercise1 ~]# which adduser
/usr/sbin/adduser
[root@exercise1 ~]# ll /usr/sbin/adduser
lrwxrwxrwx. 1 root root 7 1月 9 09:29 /usr/sbin/adduser -> useradd 注: adduser 是useradd的软链接
[root@exercise1 ~]#
指定用户默认登录 shell 的路径
[root@exercise1 ~]# useradd -s "/bin/nologin" lin05
[root@exercise1 ~]# su lin05
su: failed to execute /bin/nologin: 没有那个文件或目录
[root@exercise1 ~]#
修改用户信息
语法:usermod 【参数】用户名
常用参数:
-u 指定要修改用户的UID
-g 指定要修改用户的主组 #只有一个(只能修改系统已存在的组)
-G 指定要修改用户的附属组 #可以有多个
-d 指定要修改用户的家目录
-s 指定要修改用户的登录 shell
-c 指定要修改用户的指定说明信息
-a 添加指定成员到附属组中
修改 UID
[root@exercise1 ~]# id oracle
uid=1100(oracle) gid=1100(oracle) 组=1100(oracle)
[root@exercise1 ~]# usermod -u 1111 oracle
[root@exercise1 ~]# id oracle
uid=1111(oracle) gid=1100(oracle) 组=1100(oracle)
[root@exercise1 ~]#
修改附加组
[root@exercise1 ~]# usermod -G 1102 abc #修改的组要存在
[root@exercise1 ~]# id abc
uid=1103(abc) gid=1102(lin02) 组=1102(lin02)
[root@exercise1 ~]#
修改 shell
[root@exercise1 ~]# usermod -s “/bin/nologin” oracle
[root@exercise1 ~]# tail -2 /etc/passwd
oracle❌1111:1100::/home/oracle:/bin/nologin
abc❌1103:1102::/home/abc:/bin/bash
[root@exercise1 ~]#
修改用户主目录
[root@exercise1 ~]# usermod -m -d /opt/abc abc
-m 选项会自动创建新目录并且移到内容到新目录里面
添加说明信息
[root@exercise1 ~]# usermod -c “hello word” abc
[root@exercise1 ~]# tail -2 /etc/passwd
oracle❌1111:1100::/home/oracle:/bin/nologin
abc❌1103:1102:hello word:/opt/abc:/bin/bash
[root@exercise1 ~]#
删除用户
语法: userdel 参数 用户名
选项:-r 删除的时候,会同时删除用户的家目录和/var/mail 下的目录
[root@exercise1 ~]# userdel lin03
[root@exercise1 ~]# userdel -r lin03
提问:如果当有一个用户正在使用
能否删除
[root@home ~]# userdel -r abc
userdel: user abc is currently used by process 19055
[root@home ~]# userdel -r abc
查看用户相关命令
[root@exercise1 ~]# id #用户和组的信息
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 #直接id命令默认查找当前用户啊,id 用户名 才是指定查看用户和组的信息
[root@exercise1 ~]# whoami #查看当前有效用户名
root
[root@exercise1 ~]# who #显示目前登入系统的用户信息
root pts/0 2022-01-17 17:10 (192.168.119.1)
root pts/1 2022-01-17 18:32 (192.168.119.1)
[root@exercise1 ~]# w #w命令用于显示已经登陆系统的用户列表
19:09:59 up 1:53, 2 users, load average: 0.08, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.119.1 17:10 1:39m 0.02s 0.02s -bash
root pts/1 192.168.119.1 18:32 7.00s 0.07s 0.00s w
[root@exercise1 ~]# users #用于显示当前登录系统的所有用户的用户列表
root root
用户的创建流程
提问:为什么创建用户时,普通UID为什么是1000开始?系统用户UID为什么是从201-999?
系统创建用户参考的两个配置文件
/etc/login.defs
/etc/default/useradd
[root@exrcise1 opt]# grep -vE "^#|^$" /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
#定义普通用户的UID范围
UID_MIN 1000
UID_MAX 60000
#定义系统用户的UID范围
SYS_UID_MIN 201
SYS_UID_MAX 999
#定义组的GID范围
GID_MIN 1000
GID_MAX 60000
#定义系统组GID范围
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes #默认创建家目录
UMASK 077
USERGROUPS_ENAB yes #创建用户时都会创建主组
ENCRYPT_METHOD SHA512 #密码加密模式
[root@exrcise1 opt]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1 #是否启用账号过期停权,-1表示不启用
EXPIRE= #账号终止日期,不设置表示不启用
SHELL=/bin/bash
SKEL=/etc/skel #配置新用户家目录的默认文件存放路径
CREATE_MAIL_SPOOL=yes
小结:如果在创建时自行指定了参数,那么优先使用定义的;如果没有定义则使用默认配置文件(/etc/login.defs ;/etc/default/useradd)
解决模板文件被删之后显示不正常的问题
[root@exercise1 ~]# rm -rf /home/abc/.bash*
[root@exercise1 ~]# su - abc
-bash-4.2$ exit #出现这个不完整的 shell 提示符,如何处理?
[root@exercise1 ~]# cp /etc/skel/.bash* /home/abc/ #存放模板的地方,也可以直接cp其他家目录 cp -r /home/oracle /home/abc
[root@exercise1 ~]# chown abc:abc /home/abc/.bash*
[root@exercise1 ~]# su - abc
[root@abc ~]$
用户组管理
/etc/group 用户组信息配置文件
[root@base home]# vi /etc/group
root : x : 0 :
以“:”为分隔符,分为4列:
第1列为用户组
第2列为密码位
第3列为GID
第4列为附属组列表
添加用户组
语法:groupadd 【参数】用户组名
常用参数:
-g 指定新组的GID
[root@exercise1 ~]# groupadd -g 1400 game
[root@exercise1 ~]# tail -1 /etc/group
game:x:1400:
[root@exercise1 ~]#
修改用户组信息
语法:groupmod 【参数】用户组名
常用参数:
-g 修改既有的GID
-n 修改既有的组名
-d 从组中删除某一个成员
用户组切换
语法:newgrp 用户组名
注:想要切换的用户组必须有支持的用户组
[root@exercise1 ~]# newgrp oracle
[root@exercise1 ~]# id
uid=0(root) gid=1100(oracle) 组=1100(oracle),0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@exercise1 ~]#
删除用户组
语法: groupdel 用户组名
注:必须确认/etc/passwd内的账号没有任何人使用该用户组作为主用户组
[root@exercise1 ~]# groupdel oracle
groupdel:不能移除用户“oracle”的主组
[root@exercise1 ~]# groupdel game
[root@exercise1 ~]#
用户组管理员功能
注:只有root能将用户组的主控权交由后面的用户管理
语法:gpasswd 【参数】用户组名
对于root而言,常用参数:
-A 用户名 将该用户组的主控权交由后面的用户管理
-M 用户名 将该用户加入这个用户组里
-r 将用户组的密码删除
例子:
[root@exercise1 ~]# groupdel game
[root@exercise1 ~]# useradd lin05
[root@exercise1 ~]# groupadd game
[root@exercise1 ~]# gpasswd -A lin05 game
[root@exercise1 ~]# gpasswd -M abc game
[root@exercise1 ~]# tail -2 /etc/group
lin05:x:1112:
game:x:1113:abc
[root@exercise1 ~]#
对于用户组管理员而言,常用参数:
-a 用户名 将该用户加入到用户组当中
-d 用户名 将该用户删除出用户组
例子:
[root@exercise1 ~]# gpasswd -a lin05 game
正在将用户“lin05”加入到“game”组中
[root@exercise1 ~]# gpasswd -d lin05 game
正在将用户“lin05”从“game”组中删除
[root@exercise1 ~]# su - lin05
[lin05@exercise1 ~]$ gpasswd -a lin05 game
正在将用户“lin05”加入到“game”组中
[lin05@exercise1 ~]$ gpasswd -d lin05 game
正在将用户“lin05”从“game”组中删除
[lin05@exercise1 ~]$
如果你记不住命令, 那么直接用root权限修改 vi /etc/passwd 也是一样的
密码管理
[root@exercise1 ~]# head -3 /etc/shadow
root:$6$DL36xqQ9Z4lIC96A$TySYbPQmrysstnePos8..QeKSZsAQ.xctrglJVvJDVmL4OmbhtjezPppJWW6c0PijQWeQT5dn9rVaz2rFB9tg.::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
[root@exercise1 ~]#
格式如下
名称 | 说明
name | 登录名称,这个必须是系统中的有效账户名
password | 我们发现所谓的加密算法,其实就是用明文密码和一个叫salt的东西通过函数crypt()完成加密。而所谓的密码域密文也是由三部分组成的,即:$id$salt$encrypted。[注]:tid为1时,采用md5进行加密;id为5时,采用SHA256进行加密;id为6时,采用SHA512进行加密。
lastchange | 最近一次更改密码的日期,以距离 1970/1/1 的天数表示
min-age | 不能更改密码的最少天数,最近更改过后几天才可以更改;如果为 0 表示“最短期限要求”
maxage | 密码过期时间,必须更改密码前的最多天数
warning | 密码即将到期的警告期,以天数表示,0 表示“不提供警告”
inactive | 宽限天数,密码到期后
expire | 账号过期时间,以距离 1970/1/1 的天数计算 (千年虫)
blank | 预留字段
给用户添加密码
注:在默认的情况下,新建账号登陆是暂时封锁的,可以看下/etc/shadow文件的第二个字段
#交互式
[root@exercise1 ~]# passwd oracle #交互(这种方式只能root使用)
更改用户 oracle 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。 #root设置密码可以忽略字典
1.超级管理员
1.1 随意修改任何人的密码
1.2 密码强度可以随意
2.普通用户执行
2.1 仅修改自已的密码,不可以修改其他人;
2.2 密码强度必须要高
#非交互式
[root@exercise1 ~]# echo 123456 | passwd --stdin abc #不交互
更改用户 abc 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@exercise1 ~]#
#(–stdin 可以通过来自前一个管 道的数据,作为密码输入)
创建随机密码
[root@exrcise1 opt]# mkpasswd
-bash: mkpasswd: 未找到命令
[root@exrcise1 opt]# yum provides mkpasswd
已加载插件:fastestmirror
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
expect-5.45-14.el7_1.x86_64 : A program-script interaction and testing utility
源 :local
匹配来源:
文件名 :/usr/bin/mkpasswd
[root@exrcise1 opt]# yum install -y expect
[root@exrcise1 opt]# man mkpasswd
[root@exrcise1 opt]# mkpasswd -l 10 -d 3 -c 3 -C 3 -s 1
3tjVWt3_V7
修改密码
命令:chage
参数:
-m :密码可更改的最小天数。为 0 时代表任何时候都可以更改密码
-M :密码保持有效的最大天数
-W :用户密码到期前,提前收到警告信息的天数
-E :帐号到期的日期。过了这天,此帐号将不可用
-d :上一次更改的日期,为 0 表示强制在下次登录时更新密码
-I : 账号到期后,可以延期的天数
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
例子1:修改用户 abc 密码信息:让这个用户 abc 首次登录系统时必须更改其密码
[root@exercise1 ~]# chage -m 30 abc #将两次改变密码之间相距的最小天数设为30天,从最近修改密码的日期开始的5天内,用户不能再次修改密码
[root@exercise1 ~]# chage -M 30 abc #每隔30天 更新密码
[root@exercise1 ~]# chage -W 7 abc #还有7天密码到期
[root@exercise1 ~]# chage -E '2023-01-01' abc #账号在2023年1月1号到期
[root@exercise1 ~]# chage -d 0 abc
[root@exercise1 ~]# ssh abc@192.168.119.142
The authenticity of host '192.168.119.142 (192.168.119.142)' can't be established.
ECDSA key fingerprint is SHA256:8aWF+QxUsRyxsCUKFPSJLUg+iSZuYpjE8/M4Nl6it38.
ECDSA key fingerprint is MD5:f2:a9:40:4d:28:ac:bb:38:46:dd:2f:98:a0:c3:6a:7e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.119.142' (ECDSA) to the list of known hosts.
abc@192.168.119.142's password:
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again! #提示必须改密码
更改用户 abc 的密码 。
为 abc 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
无效的密码: 这个密码和原来的相同
新的 密码:
无效的密码: 密码与原来的太相似
新的 密码:
重新输入新的 密码:
抱歉,密码不匹配。
passwd: 已经超出服务重试的最多次数
Connection to 192.168.119.142 closed.
[root@exercise1 ~]# chage -I 3 abc #账号到期后,还可以延期3天
例子2:帐户密码策略信息
[root@exercise1 ~]# chage -l abc
最近一次密码修改时间 :密码必须更改
密码过期时间 :密码必须更改
密码失效时间 :密码必须更改
帐户过期时间 :1月 01, 2023
两次改变密码之间相距的最小天数 :30
两次改变密码之间相距的最大天数 :30
在密码过期之前警告的天数 :7
密码过期:设置的密码经过一段的时间后,系统会认为该密码不安全,于是将密码设置为过期状态,用户登录的时候,系统会提示用户进行密码修改
密码失效:经过一段时间,如果用户没有进行密码修改,则系统会将该密码设置为失效状态(此时用户不可通过该密码进行登录)
用户如何提权
往往公司的服务器对外都是禁止root用户直接登灵,所以我们通常使用的都是普通用户,那么问题来了?当我们使用普通用户执行/sbin目录下的命令时,会发现没有权限运行,这种情况下我们无法正常的管理服务器,那如何才能不使用root用户直接登录系统,同时又保证普通用户能完成日常工作?
我们可以使用如下两种方式su、sudo
1.su切换用户,使用普通用户登录,然后使用su命令切换到root。优点简单;缺点:需要知道root密码
2.sudo提权,当需要使用root权限时进行提权,而无需切换至root用户,优点:安全、方便缺点:复杂
用户身份切换
命令:su
语法:su 用户名
[root@exercise1 ~]# su abc
[root@exercise1 ~]# su - abc
在使用su切换前,我们需要了解一些预备知识,比如shell分类、环境变量配置文件有哪些
1.Linux Shell主要分为如下几类
登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种
非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
2.bash shell配置文件介绍文件主要保存用户的工作环境
个人配置文件.:~/.bash_profile ;~/.bashrc。
全局配置文件:/etc/profile ;/etc/profile.d/.sh ;/etc/bashrc
profile类文件,设定环境变量,登陆前运行的脚本和命令。
bashrc类文件,设定本地变量,定义命令别名
注意:如果全局配置和个人配置产生冲突,以个人配置为准。
3.登陆系统后,环境变量配置文件的应用顺序是?
登录式shell配置文件执行顺序/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/bashrc->/etc/bashrc
非登陆shell配置文件执行顺序~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
提问:如何验证
执行前先备份,不然测试完要删好麻烦
echo "echo /etc/profile" >>/etc/profile
echo "echo /etc/profile.d/1.sh" >>/etc/profile.d/1.sh
echo "echo ~/.bash_profile" >>~/.bash_profile
echo "echo ~/.bashrc" >>~/.bashrc
echo "echo /etc/bashrc" >>/etc/bashrc
[root@exrcise1 ~]# su - root
/etc/profile.d/1.sh
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile
[root@exrcise1 ~]# su root
/etc/profile.d/1.sh
/etc/bashrc
/root/.bashrc
4.说了这么多预备知识,那这些和su命令切换用户有什么关系?
su - username,属于登陆式shell,su username,属于非登陆式hell,区别在于加载的环境变量不一样。
普通用户su - 可以直接切换root用户,但需要输入root用户的密码。
超级管理员root用户使用su - username切换普通用户不需要输入任何密码。
小结:区别在于,加载的环境变量不一样(有可能会造成程序运行异常)
5.su 还有一种用法
[root@exrcise1 ~]# useradd abc -r -M
[root@exrcise1 ~]# su - abc -c "ifconfig" #指定让abc执行ifconfig命令
su: 警告:无法更改到 /home/abc 目录: 没有那个文件或目录
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.245.130 netmask 255.255.255.0 broadcast 192.168.245.255
inet6 fe80::250:56ff:fe27:3876 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:27:38:76 txqueuelen 1000 (Ethernet)
RX packets 18885 bytes 6877604 (6.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2123 bytes 232746 (227.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
小结:因为有些程序不支持root直接启动; 必须是普通用户;
1.普通用户不需要登录系统;
2.只是用来完成服务的启动;
3.创建该用户时,一般都创建为一个系统用户;
4.最后通过 su - username -c “command” 来完成服务的启动;
提权命令:sudo
sudo可以让你以root的身份来执行命令
[root@exercise1 ~]# su - abc #切换身份
上一次登录:一 1月 17 20:28:22 CST 2022pts/1 上
[abc@exercise1 ~]$ tail /etc/shadow #以abc用户读取/etc/shadow
tail: 无法打开"/etc/shadow" 读取数据: 权限不够
[abc@exercise1 ~]$ sudo tail /etc/shadow
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] abc 的密码:
对不起,请重试。
[sudo] abc 的密码:
对不起,请重试。
[sudo] abc 的密码:
sudo: 3 次错误密码尝试
[abc@exercise1 ~]$ sudo tail /etc/shadow
abc 不在 sudoers 文件中。此事将被报告。
[abc@exercise1 ~]$ 登出 #Ctrl+D登出回到root会收到邮件
您在 /var/spool/mail/root 中有新邮件
[root@exercise1 ~]# cat /var/spool/mail/root #查看邮件
小结:通过sudo执行的命令,都会记录在/var/log/secure文件里
解决方法
用root用户使用visudo去修改/etc/sudoers ==> vim /etc/sudoers
用户账号 登陆者的来源主机ip地址 可切换的身份 可执行的命令
92 root ALL= (ALL) ALL
99 %wheel ALL=(ALL) ALL #这一行的设置会造成加入wheel组(可自定义用户组)的用户都可以
使用sudo切换身份进行操作
1.快速配置sudo方式
[root@exercise1 ~]# usermod abc -G wheel
2.一般正常配置sudo方式
[root@exercise1 ~]# visudo
93 abc ALL=(ALL) ALL #添加普通用户权限
abc 192.168.245.0=(ALL) ALL #设置某一网段能使用sudo
abc ALL=(ALL) /usr/sbin/useradd #允许使用sudo执行指定命令
abc ALL=(ALL) NOPASSWD:/usr/sbin/useradd #NOPASSWD不需要使用密码
abc ALL=(root) ALL #只可以切换成root用户
修改后语法检测:
[root@exercise1 ~]# visudo -c
测试:
[root@exercise1 ~]# mkdir /test
3.普通用户正常情况下是无法删除test目录的
[abc@exercise1 ~]$ rm -rf /test
4.使用sudo提权,需要输入普通用户的密码
sudo rm -rf /test
5.查看自己有哪些sudo权限
[abc@exercise1 ~]$ sudo -l
提问:提升的权限太大,能否有办法限制仅开启某个命令的使用权限?其他命令不允许?
方法1:使用sudo中自带的别名操作,将多个用户定义成一个组
# 1.使用sudo定义分组,这个系统group没什么关系
User_Alias OPS = abc,xiaohuo
# 2.定义可执行的命令组,便于后续调用
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
# 3.使用sudo开始分配权限
OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE
方法2:使用groudadd添加组,然后给组分配sudo的权限,如果有新用户加入,直接将用户添加到该组
#1.添加真实的系统组
[root@exercise1 ~]# groupadd OPS
#2.使用sudo开始分配权限
[root@exercise1 ~]# visudo
%OPS ALL=(ALL) ALL #添加组,分配sudo权限
#3.添加用户加入OPS组
[root@exercise1 ~]# usermod ming -G OPS