用户和用户组管理
用户管理
用户分类
- 超级管理员 root
uid=0 具有所有权限 - 虚拟用户
uid=1-999 管理进程,不能登录系统,没有家目录 - 普通用户
uid 1000+ 管理指定数据/进程 可以登录系统,有家目录
用户切换
切换用户 su user
或su - user
不加user
默认切换到root
用户
su
和su -
的区别
-
su
部分环境变量切换用户有变化 -
su -
全部环境变量切换为新用户,建议使用su -
系统用户相关命令
创建用户命令 useradd
默认会创建家目录和邮箱
# 创建普通用户
useradd username
# 创建虚拟用户
useradd username -M -s /sbin/nologin
# 创建一个用户,名称是username,uid是1200,主要组是root,附加组是mysql,注释信息是notes
useradd username -u 1200 -g root -G mysql -c "notes"
参数
- -M 不创建家目录
- -s 指定使用的shell方式
- -u uid
- -g 用户所属的主要组信息
- -G 用户所属的附属组信息
- -c 注释信息
修改用户信息 usermod
- -s修改用户的登录方式
- -g修改用户的主要的组信息
- -G修改用户的附属组信息
- -aG 添加一个额外的附属组
- c修改用户的注释信息
# 将附加组更改为group
usermod -G group user
# 将group2添加到附加组
usermod -aG group2 user
删除用户信息 userdel
userdel username
直接删除会保留家目录和邮箱,后续创建相同名称用户时可能存在问题
userdel -r username
-
-r
彻底删除用户以及用户的家目录和邮件
用户信息查看命令
- 显示用户信息
id
[root@localhost ~]# id hzz
uid=1002(hzz) gid=1003(hzz) groups=1003(hzz),1002(xzz)
- 显示曾经和正在登录系统的用户 last
- 显示用户最后一次登录记录 lastlog
[root@localhost ~]# last
root pts/0 10.0.0.1 Tue Nov 24 22:29 still logged in
reboot system boot 3.10.0-957.el7.x Tue Nov 24 21:55 - 22:29 (00:34)
root pts/2 10.0.0.1 Tue Nov 24 18:23 - crash (03:31)
root pts/1 10.0.0.1 Tue Nov 24 17:36 - crash (04:18)
# lastlog会展示所有用户的最后一次登录记录
[root@localhost ~]# lastlog
Username Port From Latest
root pts/0 10.0.0.1 Tue Nov 24 22:29:19 -0800 2020
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
- 显示正在登录系统的用户 w
[root@centos7test ~]# w
##### ## 10:58:40 up 18 days, 18:45, 2 users, load average: 0.00, 0.01, 0.05
##### ## USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
##### ## root pts/0 10.0.0.1 Mon16 0.00s 0.20s 0.09s w
##### ## root pts/1 10.0.0.1 Mon17 17:34m 0.06s 0.06s -bash
# 结果包含7列
01 02 03 04 05 06 07
* 01. 什么用户登录到了系统中
* 02. 登录的方式
pts/x 远程登录系统
tty1本地登录
给其他登录到系统上的用户发消息
[root@loalhost ~]# echo "请不要修改恢复hosts文件配置" >/dev/pts/1
* 03. 从哪连接的服务器
* 04. 登录时间
* 05. IDLE 空闲时间
* 06. 用户操作系统 消耗的CPU资源时间
* 07. 用户在干什么
-bash 表示在执行脚本
密码管理
设置密码
root用户可以修改任何其他用户的密码。普通用户只能修改自己的密码,并且需要输入当前密码。
# 交互式设置密码
passwd user
# 非交互设置密码
echo 123456|passwd --stdin oldboy
管理密码和密码策略
passwd
和chage
都可以设置密码和密码策略
passwd
不能设置上次修改密码的时间信息,可以对账号进行锁定和解锁。
chage(change age)
,可以设置密码修改时间,不能对账号进行锁定和解锁。
# 设置密码策略
[root@localhost ~]# useradd test
# 查看当前密码状态
[root@localhost ~]# passwd -S test
test LK 2020-11-24 0 99999 7 -1 (Password locked.)
# 用户名 账号状态 时间? 密码最小有效期 密码最大有效期 密码到期前警告时间 密码到期后宽限时间 (密码状态)
# 锁定状态 LK账号已锁定 PS状态正常 NP空密码
# -n 密码最小有效期,-x 密码最大有效期,-w 密码到期前警告时间,-i 密码到期后宽限时间
passwd -n 1 -x 10 -w 3 -i 2 test
Adjusting aging data for user test.
passwd: Success
[root@localhost ~]# passwd -S test
test LK 2020-11-24 1 10 3 2 (Password locked.)
# -l 锁定账号 -u 解锁账号
[root@localhost ~]# passwd -l test
Locking password for user test.
passwd: Success
[root@localhost ~]# passwd -S test
test LK 2020-11-24 1 10 3 2 (Password locked.)
[root@localhost ~]# passwd -u test
Unlocking password for user test.
passwd: Success
[root@localhost ~]# passwd -S test
test PS 2020-11-24 1 10 3 2 (Password set, MD5 crypt.)
# -e 设置密码过期
[root@localhost ~]# passwd -e test
Expiring password for user test.
passwd: Success
# -d 删除密码
[root@localhost ~]# passwd -d test
Removing password for user test.
passwd: Success
[root@localhost ~]# passwd -S test
test NP 2020-11-24 1 10 3 2 (Empty password.)
[root@localhost ~]# useradd test2
[root@localhost ~]# chage -l test2
Last password change : Nov 25, 2020
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
# -m 密码最小有效期 -M 密码最大有效期 -W 密码过期前的提醒时间 -I 密码过期宽限日期
[root@localhost ~]# chage -m 1 -M 10 -W 7 -I 2 test2
# -l 查看密码信息
[root@localhost ~]# chage -l test2
Last password change : Nov 25, 2020
Password expires : Dec 05, 2020
Password inactive : Dec 07, 2020
Account expires : never
Minimum number of days between password change : 1
Maximum number of days between password change : 10
Number of days of warning before password expires : 7
# -d 上次修改密码的时间 一般设置为0,表示让用户下次登录必须修改密码
# -E 设置密码过期时间
[root@localhost ~]# chage -d 2020-11-10 test2
[root@localhost ~]# chage -E 2020-11-30 test2
用户组管理
概念
用户组包括以下三种:
- private group 私有组
- primary group 主要组
- attached group 附加组
如果在创建用户时没有指定主要用户组,那么系统就会为该用户创建一个同名的组,这个组叫做用户的私有组。
一个用户只能属于一个主要组,但是可以属于多个附加组。
可以将任意用户组作为任意用户的附加组,但是应该尽可能地不将私有组作为某个用户的附加组。
用户组相关的命令
# groupadd 创建用户组
[root@localhost ~]# groupadd python
[root@localhost ~]# useradd python -g python
[root@localhost ~]# id python
uid=1005(python) gid=1005(python) groups=1005(python)
# groupmod 修改用户组信息
[root@localhost ~]# groupmod -g 1006 python
# groupdel 删除用户组信息
# 当组是某个用户的主要组时,不能删除组
[root@localhost ~]# groupdel python
groupdel: cannot remove the primary group of user 'python'
[root@localhost ~]# groupadd python2
[root@localhost ~]# usermod -aG python2 python
[root@localhost ~]# id python
uid=1005(python) gid=1006(python) groups=1006(python),1007(python2)
[root@localhost ~]# groupdel python2
# gpassswd 修改组成员
## 将用户添加到一个附加组
[root@localhost ~]# gpasswd -a python python2
Adding user python to group python2
[root@localhost ~]# id python
uid=1005(python) gid=1006(python) groups=1006(python),1007(python2)
## 将用户从附加组中删除
[root@localhost ~]# gpasswd -d python python2
Removing user python from group python2
[root@localhost ~]# id python
uid=1005(python) gid=1006(python) groups=1006(python)
组密码和切换组
切换用户组,切换后创建的文件所属组更改为新的组
设置组密码之后,可以使不属于该用户组的用户,切换到该组。用户切换到自己的附属组不需要输入组密码。
# gpasswd group 设置组密码
# newgrp group 切换组
用户和用户组管理相关文件
系统中和用户相关的文件
-
/etc/passwd 记录系统用户信息文件
root:x:0:0:root:/root:/bin/bash
用户名:用户密码信息:uid:主要组的gid:用户的注释信息:家目录:用户登录系统方式
# 用户密码信息都是x
# 用户登录系统方式
## /bin/bash --- 通用的解释器
## /usr/bin/sh --- 等价于/bin/bash
## /usr/bin/bash
## /sbin/nologin --- 无法登录系统
## /usr/sbin/nologin --- 无法登录系统
-
/etc/shadow 系统用户密码文件
[root@localhost ~]# grep mysql /etc/shadow
mysql:$6$Dr5cm/sBgqf$K4RTrTMXkX95u35ZWold7NQva85tnVmqpnwpwP1aK28lFH9tkzlUkEDOAoeuORCUEf3WKZtYJCiI6nMDv0WyY0:18130:0:60:0:::
#用户名:算法生成的密码:上次修改密码的时间:密码最小有效期:密码最大有效期:密码到期前提前多少天警告:密码到期后的宽限日期:账号失效日期:保留
# 1.mysql:用户名
# 2.$6$Dr5cm/sBgqf$K4RTrTMXkX95u35ZWold7NQva85tnVmqpnwpwP1aK28lFH9tkzlUkEDOAoeuORCUEf3WKZtYJCiI6nMDv0WyY0:密码
# 3.18130:上次修改密码的时间 数值表示的是1970.01.01到修改密码日期的时间
##前面有两个!!表示账号被锁定了
##账号被锁定的情况下,除了root账号,其他用户不能切换到该账号
# 4.0:密码最小有效期
# 5.60:密码最大有效期
# 6.0:密码到期前提前多少天警告
# 7.:密码到期后宽限日期
# 8.:账号失效日期
# 9 保留
# 密码信息详解
## $6$ 表示算法种类 第二个到第三个$之间存放的时间信息:
## 密码加密算法 在/etc/login.defs里面有设置
[root@localhost ~]# grep encrypt -i /etc/login.defs
# Use SHA512 to encrypt password.
ENCRYPT_METHOD MD5
-
/etc/group 组用户记录文件
[root@localhost ~]# tail -2 /etc/group
python:x:1006:
python2:x:1007:python
# 组名:x:组id:"组成员"
# 只有组是成员的附加组时,才会将成员加入到/etc/group文件中。
# 密码信息都是x,表示密码存放在/etc/gshadows文件里
-
/etc/gshasow 组用户密码信息
# 组密码的第二列记录的是组密码信息
# 默认的组和默认的用户一样没有密码
[root@localhost ~]# grep python /etc/gshadow
python:!::
python2:$1$wJ5tFNas$.bazxx2bH1HmuXny/C31n1::python
用户创建参数默认行为 /etc/login.defs
[root@localhost ~]# grep -v "^#" /etc/login.defs|grep -v "^$"
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD MD5
MD5_CRYPT_ENAB yes
系统中的特殊目录 /etc/skel
在创建用户时,会在用户的家目录中创建/etc/skel目录中的文件
[root@localhost ~]# ll /etc/skel/ -a
total 24
drwxr-xr-x. 3 root root 78 Apr 10 2018 .
drwxr-xr-x. 141 root root 8192 Nov 24 23:20 ..
-rw-r--r--. 1 root root 18 Oct 30 2018 .bash_logout #当系统退出登录状态会执行的命令
-rw-r--r--. 1 root root 193 Oct 30 2018 .bash_profile #别名和环境变量(只针对某个用户)
-rw-r--r--. 1 root root 231 Oct 30 2018 .bashrc #别名和环境变量(只针对某个用户)
作用
-
- 目录中可以存储运维操作规范说明文件
-
- 调整命令提示符信息
命令提示符:-bash-4.2$
报错问题
原因:家目录中没有了.bash*
文件
处理方法:cp /etc/skel/.bash* /home/user/
- 调整命令提示符信息
用户家目录中的特殊文件
-
.bash_history 历史命令记录文件
曾经输入的历史命令保存在内存中,在退出shell时,将内存中的命令保存到家目录的.bash_history
文件中
#查看历史命令
history
#删除历史命令
history -c
.viminfo 自动加载vim样式信息
权限管理
权限概念
文件权限
文件的拥有者对自己的文件具有所有权限,可以更改自己文件的权限
- r 可以读文件的内容
- w 可以编辑文件的内容
- x 执行这个文件(脚本文件)
文件权限配置的结论:
- root用户对所有文件有绝对的权限,只要有了执行权限,root用户可以无敌存在
- 对于文件来说,写的权限和执行的权限,都需要有读权限配合
- 如何想对文件进行操作,必须对文件赋予读的权限
目录权限
- r 读目录中的文件属性信息
- w 可以在目录中添加或删除文件数据信息
- x 是否可以进入到目录中
目录的权限只有3种组合才有意义:--- r-x rwx
目录权限配置的结论:
- root用户对目录信息有绝对权限
- 对于目录来说,写的权限和读的权限,都需要有执行权限配合
- 如何想对目录进行操作,必须对目录赋予执行的权限
权限的十进制表示法
r = 4,w =2,x =1
默认权限
一个普通文件默认权限: 644
保证属主用户对文件可以编辑 保证其他用户可以读取文件内容
一个目录文件默认权限: 755
保证属主用户对目录进行编辑 保证其他用户可以读取目录中的信息,可以进入到目录中
默认权限是怎么生成的?
默认权限受umask
值影响,默认root
用户的umask
值0022
,普通用户的umask
值0002
默认文件权限: 666 - 022 = 644
umask数值是奇数 666 - 033 = 633 + 11 = 644
umask数值是偶数 666 - 022 = 644
+11的原因是
666=rw-rw-rw-
033=----wx-wx
666-033=rw-r--r-- (原本没有x权限,减掉x权限还是没权限)
默认目录权限: 777 - 022 = 755
umask数值是奇数 777 - 033 = 744
umask数值是偶数 777 - 022 = 755
如何修改默认权限
#临时修改
umask 033
#永久修改
vim /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022 #修改这部分就可以永久修改umask数值
fi
文件数据读取原理
解释了ll
时除文件名称外显示???
的原因
文件读取顺序:
文件的inode
存放了文件的属性信息和指向block
的指针信息
文件的block
存放了文件的名称信息
文件读取时从根目录(/
)开始读取
假设要查询/tmp/test/test_dir/中的内容
根目录/ 具有r-x权限
2. 子目录/ rx
/ inode(555 r_x)--block(/tmp)
tmp inode(555 r_x)--block
test inode(7 rwx)
test_dir inode (4 r--) --block (目录中的文件名称) 没有x权限,无法进入目录,目录中的文件inode信息文件无法获取,目录中文件的属性信息显示为???
设置权限
修改文件的属主,属组
# 修改属主和属组
chown user:group file
# 修改属主
chown user file
# 修改属组
chown :group file
chgrp group file
设置普通权限
# 使用+-=设置权限
# u 属主,g 属组,o 其他用户
# = 设置权限 + 增加权限 - 减少权限
chmod u=r,g+x,o-w file
# 使用十进制数字设置权限
chmod 777 file
chmod 655 file
设置特殊权限位
特殊权限:
- setuid 将文件属主拥有的能力分配给所有用户
一般赋予给可执行文件,在执行文件时可以临时获取文件属主的权限 - setgid 将文件属组拥有的能力分配给所有用户
- 粘滞位(sticky bit)设置共享目录
# set uid
chmod u+s file
chmod 4755 file
# setgid
chmod g+s file
chmod 2755 file
# 粘滞位(sticky bit)
chmod o+t dir
chmod 1777 dir
# 当目录权限为777时,所有用户都能对里面的文件进行修改,修改后属主变更,原始内容丢失,不安全
# 粘滞位可以将不同用户信息放置到共享目录中,实现不同用户数据可以互相查看,但是不可以随意修改
/tmp 是系统中的默认共享目录
给文件加锁
给文件加上锁头可以让root
用户也不能修改文件
# 查看文件锁状态
[root@localhost ~]# lsattr /etc/passwd
---------------- /etc/passwd
# 加锁
[root@localhost ~]# chattr +i /etc/passwd
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2502 Nov 24 23:05 /etc/passwd
# 加锁后第5位为i
[root@localhost ~]# lsattr /etc/passwd
----i----------- /etc/passwd
# 解锁
[root@localhost ~]# chattr -i /etc/passwd
[root@localhost ~]# lsattr /etc/passwd
---------------- /etc/passwd
ACL权限
ACL( Access Control List)
访问控制列表
可以通过ACL
让指定的某个用户或用户组对某个文件设置特别的权限
ACL
是由上至下匹配的,匹配到之后就停止匹配
文件的ACL权限的设置
# 添加
setfacl -m u:user:--- file
setfacl -m g:group:r-- file
#删除
setfacl -x u:user file
# 删除后文件权限列中的+仍然存在,需要使用-b移除ACL权限
# 移除所有ACL设置
setfacl -b
目录的ACL权限设置
针对目录设置ACL
权限,不是用来进行访问控制的,而是设置目录中创建文件的权限继承
# 设置用户oth对文件test只有读权限
setfacl -m d:u:oth:r test
ACL权限的查看
权限列后面的+
表示该文件具有ACL
权限
# 查看文件的ACL权限
[root@localhost ~]# getfacl file
# file: file # 文件名
# owner: mysql # 所属用户
# group: mysql # 所属组
user::rwx # owner的权限
user:oth:--- # 用户oth的权限
group::rwx # 所属组的权限
group:oth:r-- # 组oth的权限
mask::rwx # 表示该文件acl的最大权限other::rwx #其他人的权限
# 查看文件夹的ACL权限
[root@localhost ~]# getfacl dir
# file: test_dir/
# owner: root
# group: root
user::rwx
group::r-x
mask::rwx
other::r-x
# default后面指定目录中新建文件的默认权限,default:mask表示目录中创建文件时最大的权限,即使其他默认权限比mask大,也不能超过mask的权限
default:user::rw-
default:user:hzz:r--
default:group::r-x
default:mask::rwx
default:other::r-x
权限提升 sudo
sudo允许普通用户临时使用root账号来执行命令,使用sudo command
来进行权限提升,需要输入当前普通用户的密码。也可以设置为不需要输入密码。
设置sudo权限
visudo = vi /etc/sudoers
visudo
有语法检查功能,也可以使用visudo -c
检查配置文件是否有语法错误
[root@localhost ~]# grep root /etc/sudoers
## the root user, without needing the root password.
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## cdrom as root
#user用户可以执行任何命令
user ALL=(ALL) ALL
#group组内的用户可以执行任何命令
%group ALL=(ALL) ALL
# /usr/sbin/* 授权目录下的多个命令
# !/user/sbin/visudo 排除指定命令
# NOPASSWD: 不需要输入密码
user ALL=(ALL) NOPASSWD: /usr/sbin/*,!/user/sbin/visudo/usr/bin/rm
验证账号的sudo权限
sudo -l