Linux用户管理和权限管理

用户和用户组管理

用户管理

用户分类

  • 超级管理员 root
    uid=0 具有所有权限
  • 虚拟用户
    uid=1-999 管理进程,不能登录系统,没有家目录
  • 普通用户
    uid 1000+ 管理指定数据/进程 可以登录系统,有家目录

用户切换

切换用户 su usersu - user
不加user默认切换到root用户

susu -的区别

  • 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

管理密码和密码策略

passwdchage都可以设置密码和密码策略
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 #别名和环境变量(只针对某个用户) 

作用

    1. 目录中可以存储运维操作规范说明文件
    1. 调整命令提示符信息
      命令提示符:-bash-4.2$报错问题
      原因:家目录中没有了.bash*文件
      处理方法:cp /etc/skel/.bash* /home/user/

用户家目录中的特殊文件

  • .bash_history 历史命令记录文件

曾经输入的历史命令保存在内存中,在退出shell时,将内存中的命令保存到家目录的.bash_history文件中

#查看历史命令
history
#删除历史命令
history -c

.viminfo 自动加载vim样式信息

权限管理

权限概念

文件权限

文件的拥有者对自己的文件具有所有权限,可以更改自己文件的权限

  • r 可以读文件的内容
  • w 可以编辑文件的内容
  • x 执行这个文件(脚本文件)

文件权限配置的结论:

  1. root用户对所有文件有绝对的权限,只要有了执行权限,root用户可以无敌存在
  2. 对于文件来说,写的权限和执行的权限,都需要有读权限配合
  3. 如何想对文件进行操作,必须对文件赋予读的权限

目录权限

  • r 读目录中的文件属性信息
  • w 可以在目录中添加或删除文件数据信息
  • x 是否可以进入到目录中

目录的权限只有3种组合才有意义:--- r-x rwx
目录权限配置的结论:

  1. root用户对目录信息有绝对权限
  2. 对于目录来说,写的权限和读的权限,都需要有执行权限配合
  3. 如何想对目录进行操作,必须对目录赋予执行的权限

权限的十进制表示法

r = 4,w =2,x =1

默认权限

一个普通文件默认权限: 644 保证属主用户对文件可以编辑 保证其他用户可以读取文件内容
一个目录文件默认权限: 755 保证属主用户对目录进行编辑 保证其他用户可以读取目录中的信息,可以进入到目录中

默认权限是怎么生成的?

默认权限受umask值影响,默认root用户的umask0022,普通用户的umask0002

默认文件权限: 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

你可能感兴趣的:(Linux用户管理和权限管理)