Kevin_306

04 Linux入门-用户、组合权限20210117

内容概述:Linux的安全模型、用户和组相关文件、用户和组管理命令、理解并设置文件权限 默认权限、特殊权限 文件访问控制列表

1 Linux 安全模型

资源分派:

Authentication:认证,验证用户身份 
Authorization:授权,不同的用户设置不同权限 
Accouting|Audition:审计 

1.1 用户  

Linux中每个用户是通过User Id (UID)来唯一标识的

管理员:root, 0 
普通用户:1-60000 自动分配 
      #1系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后)    对守护进程获取资源进行权限分配 
      #2登录用户:500+   (CentOS6以前), 1000+  (CentOS7以后)    给用户进行交互式登录使用

提示:root之所以权限大,不是因为他的名称叫root,根本原因在于它的ID为0,ID为0的人就是具有最大权限的管理员; 如果有一天把kevin账号的ID改成了0,那么它将拥有root的所有权限,意味着kevin账号就是管理员。系统是根据ID来判断管理员的,不是根据名称来的。  

1.2 用户组

Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。 

管理员组:root, 0 
普通组: 
      #系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配 
      #普通组:500+ (CentOS 6以前), 1000+(CentOS7以后), 给用户使用

1.3 用户和组的关系  

用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建 和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组 
用户的附加组(supplementary group):  一个用户可以属于零个或多个辅助组,附属组

2.用户和组管理命令

用户管理命令
useradd 、usermod、 userdel

组帐号维护命令
groupadd 、groupmod 、groupdel

常见选项:

-u  UID 
-o  配合-u 选项,不检查UID的唯一性 
-g GID  指明用户所属基本组,可为组名,也可以GID 
-c "COMMENT“    用户的注释信息 
-d HOME_DIR 以指定的路径(不存在)为家目录 
-s SHELL    指明用户的默认shell程序,可用列表在/etc/shells文件中 
-G GROUP1[,GROUP2,...]  为用户指明附加组,组须事先存在 
-N  不创建私用组做主组,使用users组做主组 
-r  创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000 
-m  创建家目录,用于系统用户 
-M  不创建家目录,用于非系统用户

2.1 用户创建

2.1.1useradd 命令可以创建新的Linux用户

useradd 命令默认值设定由/etc/default/useradd定义

 创建用户haha

用户是有家目录的,自动创建好了家目录,而且还会自动分配ID1002

2.1.2#getent passwd haha

[root@centos8 ~]# getent passwd haha
haha:x:1002:1002::/home/haha:/bin/bash

可以看到这个账号的属性如下:

 名称/密码信息/账号ID/所属组ID/家目录/组的shell类型

2.1.3 我们可以根据选项修改一些信息;

/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -r -u 89 postfix 2>/dev/null

-d 修改家目录位置;

-s 指定shell类型,也可以使用nologin类型,这个账号是不登录的,来给应用程序使用的,系统开机胡自动使用这个账号身份运行,不需要使用登录shell,版本不同,类型也不一样;

-g 主要组 ;

-G 辅助组 ;

-M 不创建家目录 ;

-r 系统账号 id 1-999之间 ;

-u 89 postfix 用户ID为89 名字为postfix ;

2>/dev/null 如果出错扔到/dev/null ;

比如ls &> /dev/null

 2.1.4关于nologin

centos下是/sbin/nologin是不能登录的,是给应用程序执行使用的;

  ubuntu 下面是/bin/false;

 2.1.5使用#getent passwd 可以查看所有的账号;

[root@centos8 ~]# getent passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

....

 2.1.6查看密码

[root@centos8 ~]# cat /etc/shadow
root:$6$SgUG.s0/nxDFixJT$p1/QgMLNM.2RTvEUnyrHEZbeDHj3QJpLQVeMt5PwIgyklgbunScUyHmbh.5PpbH7gYzcWz.3zfMuD8MHcFesI0::0:99999:7:::
bin:*:18397:0:99999:7:::

 99999表示永不过期

 

 2.1.7 创建mysql账号

加上-M不自动创建家目录,手动创建家目录/data/mysql,

应用自动创建的家目录里面有.bash 相关的文件,这些对于启动服务类的账号不需要这些.bash

 还可以加个 -r,系统账号

 2.2.1usermod 修改shell类型

#usermod -s /sbin/nologin mysql

 

 2.2.2#usrmod --help可以查看帮助选项

 2.3 userdel 删除用户

 2.3.1 userdel haha

 账号删除了,但是删除不彻底,家目录还在

ls /home 还可以看到haha,

id发生了变化,显示1002,

但是一旦创建了新账号xixi使用了1002,

haha 的用户组合用户组里面就变成了xixi;

所以用户和组主要还是根据ID来显示,

ID很重要,用户访问是根据ID来的,不是根据显示名来的。

2.3.2 新生成一个账号,就会有一个对应的邮箱

#ll /var/spool/mail

2.3.3 如果想删除用户信息,家目录,邮箱信息,-r 选项可以执行,但是生产中慎用!

#userdel -r xixi

2.4 组账号相关的三个命令

groupadd 、 groupmod 、groupdel

2.4.1用户信息

cat /etc/passwd

2.4.2密码信息

cat /etc/shadow

2.4.3组信息

cat /etc/group

2.4.4组密码

cat /etc/gshadow

  

18700

#echo `date +%s`/3600/24 | bc  计算改完密码的时间

0 表示多少天不能修改密码,改成3就是3天内不可以修改;

99999基本上是表示永不过期了;18700+99999天?(300多年...)

7表示提前7天通知修改密码;

7后面的:后面的数字,假设是10,那就是宽限期 10天

3.权限

 文件属性图示

r=4 w=2 x=1

 

3.1.1举例 查看权限

 

 all.log这个文件保护了3部分的权限,owner 、group 、other

owner是读写

group是读

other是读

3.1.2举例:修改权限

chown -R mysql.mysql /data/mysql

3.1.3此处有个危险的提示

-R 慎用

 执行此命令的时候千万小心,mysql后面的data前面不能有空格,有的话就相当于把根下面的文件的权限都改变了;

[root@rocky8 ~]# ls -R / | wc -l

 

此处可能涉及20多万个根下的文件被修改了权限;

--------------

3.1.4 模式法:

chmod who opt per files

who: u,g,o,a

opt: +,-,=

per: r,w,x

3.1.5 数字法:

rwx 7

rw- 6

r-x 5

r-- 4

--- 0

rw-r----- file 110 100 000 6 4 0

 chmod 640 file

-----------------

3.1.6:file 

666-umask
如果:奇数+1,偶数不变,结果默认权限

666-022=644和默认的文件权限一致

 

3.1.7 dir 
777-umask=default

777-022=755 和dir1的默认执行权限是一致的

 

 3.1.8 umask可以修改

umask 123

 

 直接回车就改变了umask的值

创建之后新的文件和目录的权限如图

666-123=543(有奇数加1,5+1,3+1)结果是644=rw-r--r--

777-123=654   654=rw-r-xr--

 

umask这个是临时修改,如果要保存,需要vim .bashrc,手动修改,然后执行. .bashrc才能生效,这个值一般很少改;

1#centos8中修改

2#Rocky 8.4中修改umask

3.1.9#工作小技巧

# ( umask 777;touch app2.key;touch app3.key )

[root@rocky8 ~]# ( umask 777;touch app2.key;touch app3.key )

 

4 Linux文件系统上的特殊权限

前面介绍了三种常见的权限:r, w, x  还有三种特殊权限:SUID, SGID, Sticky

4.1 特殊权限SUID
前提:进程有属主和属组;文件有属主和属组

1. 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限;
2. 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组; 
3. 进程访问文件时的权限,取决于进程的发起者:
  (a) 进程的发起者,同文件的属主:则应用文件属主权限;
  (b) 进程的发起者,属于文件属组;则应用文件属组权限;
  (c) 应用文件“其它”权限。

二进制的可执行文件上SUID权限功能:

任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限;
启动为进程之后,其进程的属主为原程序文件的属主;
SUID只对二进制可执行程序有效;
SUID设置在目录上无意义

SUID权限设定

chmod u+s FILE...

chmod 6xxx FILE

chmod u-s FILE...

举例:

[root@rocky8 ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33544 Mar 15 2021 /usr/bin/passwd

 

 

 

4.2 特殊权限SGID

二进制的可执行文件上SGID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限 启动为进程之后,其进程的属组为原程序文件的属组;
SGID权限设定:

chmod g+s FILE...

chmod 2xxx FILE

chmod g-s FILE...

目录上的SGID权限功能: 默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有 写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录;
SGID权限设定:

chmod g+s DIR...

chmod 2xxx DIR

chmod g-s DIR...

4.3 特殊权限 Sticky

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权 在目录设置Sticky 位,只有文件的所有者或root可以删除该文件 sticky 设置在文件上无意义 Sticky权限设定:

chmod o+t DIR...

chmod 1xxx DIR

chmod o-t DIR...

举例:[root@rocky8 ~]# ll -d /tmp

drwxrwxrwt. 15 root root 4096 Oct 5 20:18 /tmp

4.3.1特殊权限数字法  

范例:
000 0

001 1

010 2

011 3

100 4

101 5

110 6

111 7

实例:

chmod 4777 /tmp/a.txt

 4.3.2权限位映射:

SUID: user,占据属主的执行权限位

    s:属主拥有x权限

    S:属主没有x权限

SGID: group,占据属组的执行权限位

    s: group拥有x权限

    S:group没有x权限

Sticky: other,占据other的执行权限位

    t:other拥有x权限

    T:other没有x权限 

4.4新建的账号是锁定状态的,无法直接正常登录,

!!表示锁定状态;

如果用vim删除了!!,就相当于空口令了,是可以正常登陆的;

 4.2.1需要创建密码:

 交互式和非交互式的创建办法分别如下

举例:

[root@rocky8 ~]# cat /etc/shadow

#方法1交互式创建密码成功

[root@rocky8 ~]# passwd haha
Changing password for user haha.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.

#方法2非交互式创建密码成功(注:只支持centos,不支持ubuntu)
[root@rocky8 ~]# echo 123456 | passwd --stdin haha
Changing password for user haha.
passwd: all authentication tokens updated successfully.
[root@rocky8 ~]#

4.2.2 ubuntu除了可以使用方法1外,还可以使用逐行重定向来设置密码

root@ubuntu1804:~# useradd ma
root@ubuntu1804:~# echo -e '123456\n123456'| passwd ma

Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

5.设定文件特殊属性

设置文件的特殊属性,可以访问 root 用户误操作删除或修改文件

不能删除,改名,更改
chattr +i file

只能追加内容,不能删除,改名
chattr +a file

显示特定属性:

lsattr

 ------------------------------------

6 账户直接的快速切换

su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令

不完整的切换:su kevin;把root的路径也显示出来了

 

完整的切换:su - kevin

显示的pwd路径和path变量的值都有差别

[root@rocky8 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@rocky8 ~]# su - kevin
Last login: Wed Oct  6 01:54:31 CST 2021 on pts/1
[kevin@rocky8 ~]$ id
uid=1001(kevin) gid=1001(kevin) groups=1001(kevin)
[kevin@rocky8 ~]$ pwd
/home/kevin
[kevin@rocky8 ~]$ echo $PATH
/home/kevin/.local/bin:/home/kevin/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

centos \ rocky切换 

 ubuntu中切换

kevin@kevin:~$ su root
Password: 
su: Authentication failure
kevin@kevin:~$ sudo -i
[sudo] password for kevin: 
root@kevin:~# 

  root@ubuntu1804:~# su - kevin  #切换回来kevin账户
  kevin@ubuntu1804:~$ pwd
  /home/kevin
  kevin@ubuntu1804:~$ echo $PATH
  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

exit登出

[kevin@rocky8 ~]$ exit
logout

 

 

#mkdir -p 可以在新的子目录中创建一个新的子目录,如果想看看mkdir到底做了什么,可以添加选项“-v”,

  显示目录树 tree    删除空目录 rmdir

[root@centos8 ~]# mkdir -pv /data/dir1/dir2/dir3/ (#mkdir -p 可以在新的子目录中创建一个新的子目录,如果想看看mkdir到底做了什么,可以添加选项“-v”,)
mkdir: created directory '/data/dir1'
mkdir: created directory '/data/dir1/dir2'
mkdir: created directory '/data/dir1/dir2/dir3/'
[root@centos8 ~]# tree /data         (#看一下结构)
/data
└── dir1
    └── dir2
        └── dir3

3 directories, 0 files
[root@centos8 ~]# rmdir /data/dir1/dir2/dir3/  (#删除dir3)
[root@centos8 ~]# tree /data
/data
└── dir1
    └── dir2

2 directories, 0 files
[root@centos8 ~]# rmdir /data/dir1/   (#删除dir1)
rmdir: failed to remove '/data/dir1/': Directory not empty  (#删除失败,文件夹不能为空,因为dir1里面还有个dir2,)
[root@centos8 ~]# ls /data
dir1
[root@centos8 ~]# rm -rf /data/dir1  #使用此命令可以不提示直接删除,这条命令很霸道,不要轻易使用!
[root@centos8 ~]# ls /data
[root@centos8 ~]#   

(#显示为空,说明还是可以删除的,即使是有dir2还存在dir1的里面,也可以删除,慎用~!)

 

 另外:我还测试了一次,安装顺序一个一个的删除dir文件,是可以一个一个的删除完整的。

 1 [root@centos8 ~]# tree /data
 2 /data
 3 └── dir1
 4     └── dir2
 5         └── dir3
 6 
 7 3 directories, 0 files
 8 [root@centos8 ~]# rmdir /data/dir1/dir2/dir3/
 9 [root@centos8 ~]# tree /data
10 /data
11 └── dir1
12     └── dir2
13 
14 2 directories, 0 files
15 [root@centos8 ~]# ^C
16 [root@centos8 ~]# rmdir /data/dir1/dir2/
17 [root@centos8 ~]# tree /data
18 /data
19 └── dir1
20 
21 1 directory, 0 files
22 [root@centos8 ~]# rmdir /data/dir1/
23 [root@centos8 ~]# tree /data
24 /data
25 
26 0 directories, 0 files

 注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树,但是此命令谨慎使用

 


1 umask 2 特殊权限 了解 3 chattr +i +a 4 facl了解 5 su - 6 vim 三种切换, visual replace 搜索替代 复制 粘贴 删除

202101005renew~~~

 

posted on 2021-01-17 23:44  熊猫小虾  阅读(253)  评论(0编辑  收藏  举报

导航