linux 账户和安全

一:账户及组的概念

Linux系统对账户与组的管理是通过ID号来实现的,我们在登陆系统时,输入用户名与对应的密码,后台系统会将用户名转化为ID号后在判断该账户是否存在,并对比密码是否匹配。Linux中,用户ID号被称为UID,组ID称为GID。其中 UID为0,代表超级管理员,也就是通常所说的root账户,1~499之间的ID号系统会预留下来,这样我们创建的普通用户ID号会从500开始算起。

Linux的组有基本组与附加组之分,一个用户只可以加入一个基本组中,但可以同时加入多个附加组,创建用户时,系统默认会自动创建同名的组,并设置用户加入该基本组中

用户:

超级用户:root,uid为0

系统用户:用来管理和运行服务,系统用户的shell为/sbin/nologin,不让该用户登录,uid为201-999

**一般用户:**1000-60000,添加一般用户时,系统默认为该用户创建主目录和邮箱(/home/用户名)(/var/mail/用户名)

二:创建账户及组

使用系统命令 useradd 可以创建所需要的账户,groupadd命令用来创建组账户,需要注意的是,创建账户及组时需要有管理员权限

2.1 命令:useradd

描述:创建新的linux账户

语法:useradd [选项] 用户名称

选项:

-c 设置账户描述信息,一般为账户全称

-d 设置账户家目录,默认为/home/用户名

-e 设置账户的失效日期,格式为 YYYY-MM-DD

-g 设置账户的基本组

-G 设置账户的附加组,多个附加组中间用逗号隔开

-M 不创建账户家目录,一般与-s结合使用

-s 设置账户的登陆Shell,默认为bash

-u 指定账户UID

[root@rhel8-3 ~]# useradd redhat            #创建普通账户redhat
[root@rhel8-3 ~]# useradd -c administrator -d /home/admin -e 2020-09-15 -g root -G bin,adm,mail admin
    #创建系统账户名称为admin,全名为 administrator,账户家目录为/home/admin ,账户失效日期为 2020年9月15日,账户基本组为root ,附加组为 bin,adm,mail
[root@rhel8-3 ~]# useradd -s /sbin/nologin -M zhangsan  #创建无法登陆系统且没有家目录的用户zhangsan

2.2 命令:groupadd

描述:创建组账户

用法:groupadd [选项] 组名称

选项:

​ -g 设置组ID号

[root@rhel8-3 ~]# groupadd tom                          #创建tom组
[root@rhel8-3 ~]# groupadd -g 1001 jerry        #创建GID为1001的组jerry

2.3 命令:id

描述:显示账户及组信息

语法:id 用户名

[root@rhel8-3 ~]# id redhat
uid=1000(redhat) gid=1000(redhat)=1000(redhat)
[root@rhel8-3 ~]# id root
uid=0(root) gid=0(root)=0(root)

2.4 用户身份切换

我们都知道linux系统中,超级用户root具有超级管理权限。由于权限太大,如果管理不好,就会对系统安全带来严重隐患。在工作场景中,我们只在必要时才使用超级用户root的权限。一般的临时性处都是以普通用户的身份完成的,那么,当普通用户需要超级用户的权限时,是怎么进行切换管理理工作的呢?

这就不得不提到两个重要的用户身份切换命令su和sudo。下面我们就讲解这两个命令是如何完成用户切换工作,达到系统管理目的的?

在linux系统中,每个文件、目录和进程,都是归属于某一个用户的,没有其用户的许可,其它的普通用户是无法操作的,root除外。root用户的特权还表现在root可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改。

命令:su

**描述:**切换用户身份的命令。

**语法:**su [选项] [-c 命令] [username]

选项:

-:单纯使用-如“su -”,代表使用login-shell的变量文件读取方式来登陆系统;若用户名没有写,则代表切换为root用户

-l:与-类似,但后面需要加欲切换的用户账号,也是login-shell的方式

-m:-m与-p是一样的,表示使用目前的环境变量设置,而不读取新用户的配置文件

-c:仅进行一次命令,所以-c后面可以加上命令

比如:我们以普通用户redhat登录到系统后,当要在系统中执行useradd添加用户时,会发现redhat用户没有这个权限,这个权限只能由root权限执行。

解决办法:

一是退出redhat用户,重新以root用户登录。

二是我们直接在redhat用户下,使用su命令来切换到root下进行添加用户的工作,等工作完成后再退出root用户。

毫无疑问,上面两个方法,通过su命令切换是一种比较好的办法。

通过su命令可以在用户之间切换,超级权限用户root向普通或虚拟用户切换不需要密码验证,其他普通用户之间或者普通用户切换到root,都需要切换用户的密码验证。

默认只是切换身份,并没有切换环境变量,环境变量依然是普通用户的, “-” 切换用户身份时,用户的环境变量也切换成新用户的环境变量,所以"-"不能省略,不然有些操作无法执行

命令:sudo

使用su命令切换用户身份虽然简单,但是,也有一些致命的缺点:

1)普通用户必须知道root密码才可以切换到root,这样root密码就泄露了。相当于把“刀把”交给了别人。

  1. 使用su命令切换身份,无法对切换后的身份做精细的控制,拿到超级权限的人可以为所欲为。甚至可以改掉root密码,让真正的管理员无法在拥有root权限。

那么,怎么来解决最高管理员不泄露root密码,而又能让普通用户拥有一定的超级权限来管理系统并且能让超级特权可控呢? 这就要引出sudo命令。

通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细),授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权(管理员真正允许的root权限)。因此,毫不夸张的说,sudo命令相对于su命令来说,在系统用户的分权管理方面进步了很多,使得集权式管理在理论上得到了保证,从而使系统的安全性方面加强了很多。

sudo:使用超级用户来执行命令,一般指的是root用户,想要使用sudo首先得在/ect/sudoers中添加该用户,先利用su - 进入root用户,接着输入vim sudo命令编写sudoers文件

$ vim /etc/sudoers
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL         #root代表的用户,ALL代表主机,括号里的ALL代表以什么身份运行,最后一个ALL代表要执行的命令
redhat  ALL=(ALL) /usr/sbin/useradd
xiaohong  ALL=(ALL)  /usr/sbin/userdel     
%redhat    ALL=(ALL)       ALL      #   %用户组 机器=(授权使用哪个角色的权限) ALL

参数代表含义:

1、用户账号:系统哪个账号可以使用sudo这个命令。默认为root用户。

2、登录者的来源主机名:这个账号由哪台主机连接到本地Linux主机。默认值root可来自任何一台网络主机。

3、可切换的身份:这个账号可以切换成什么身份来执行后续的命令。默认root可以切换成任何人。

4、可执行的命令:这个命令最好使用绝对路径编写。默认root可以切换任何身份且进行任何命令。

ALL是关键字,代表任何身份、主机或命令。

三:修改账户及组

3.1 命令:passwd

描述:更新账户认证信息

用法:passwd [选项] [账户名称]

选项:

-I 锁定账户,仅root可以使用此选项

–stdin 从文件或管道读取密码

-u 解锁账户

-d 快速清空账户密码,仅root可以使用此选项

[root@rhel8-3 ~]# passwd            #修改当前账户密码
[root@rhel8-3 ~]# passwd tom        #修改tom的密码
[root@rhel8-3 ~]# echo "123456" | passwd --stdin tom     #设置tom的密码为123456
[root@rhel8-3 ~]# passwd -I tom     #锁定账户tom
[root@rhel8-3 ~]# passwd -u tom     #解锁账户tom
[root@rhel8-3 ~]# passwd -d tom     #清空账户tom的密码 (无密码可登陆系统)

3.2 命令:gpasswd

描述:修改组密码

用法:gpasswd [选项] [组名]

选项:

-a 添加用户到组

-d 将指定用户移出本组(从附加组移除)

-M设置组成员列表

-A 指定组管理员为哪个用户

-r 删除组密码

3.3 命令:newgrp

描述:登陆一个新组

用法:newgrp [组名]

退出登录的组:exit

3.4 命令:usermod

描述:修改账户信息

语法:usermod [选项] 账户名称

选项:

-d 修改账户家目录

-e 修改账户失效日期

-g 修改账户所属基本组

-G 修改账户所属附加组

-s 修改账户登陆shell

-u 修改账户UID

[root@rhel8-3 ~]# usermod -d /home/tomcat tom       #修改tom的家目录,/home/tomcat目录必须存在
[root@rhel8-3 ~]# usermod -s /bin/bash zhangsan   #修改zhangsan登陆shell为bash
[root@rhel8-3 ~]# usermod -u 1004 tom           #修改tom的UID为1004

3.5 命令:groupmod

描述:修改组信息

语法:groupmod -n 新组名 -g gid 原组名

选项:

-n 指定新组名

-g 修改gid信息

四:删除账户及组

4.1 命令:userdel

描述:删除账户及相关文件

语法:userdel [选项] 账户名称

选项:

-r 删除账户及相关文件

[root@rhel8-3 ~]# userdel tom           #删除账户tom,但是账户的文件不删除
[root@rhel8-3 ~]# userdel -r tom    #删除账户tom,并删除相应的家目录

4.2 命令:groupdel

描述:删除组账户

语法:groupdel 组名

[root@rhel8-3 ~]# groupdel jerry            #删除组jerry

五:账户与组文件解析

5.1 账户信息文件

账户信息被保存在/etc/passwd文件中,通过命令 cat /etc/passwd 查看文件内容如下:

[root@rhel8-3 ~]# cat /etc/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
...省略...
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

文件以冒号为分隔符

第一列 root 为账户名称,第二列为密码占位符

第二列 x 表示该账户需要密码才可以登陆,为空时,账户无需密码即可登陆

第三列 0 为账户UID

第四列 0 为GID

第五列 root 为账户附加基本信息,一般存储账户名全称、联系方式等信息

第六列 /root 为账户家目录位置

第七列 /bin/bash 为账户登陆shell,/bin/bash为可登陆系统shell,/sbin/nologin表示账户无法登陆系统

5.2 账户密码文件

账户密码信息被保存在 /etc/shadow文件中,通过命令cat /etc/shadow 查看文件内容如下:

[root@rhel8-3 ~]# cat /etc/shadow
root:$6$y47BIosYvWJMDneR$/TFwVTqJkJvYAYvaPlS2.x0g9KLeMH36Ql25sPO0NMLy5yHXmG5gRn7yLgVKsdXfy09e3rH/xmgZ0Re5XzkoS.:18519:0:99999:7:::
bin:*:17784:0:99999:7:::
...中间部分省略...
apache:!!:18508::::::
saslauth:!!:18508::::::
redhat:!!:18519:0:99999:7:::
admin:!!:18519:0:99999:7::18520:
[root@rhel8-3 ~]#

文件以冒号为分隔符

第一列 账户名称

第二列 为密码(账户未设置密码时为 !!,设置密码后加密显示)

第三列 为上次修改密码的时间距离1970年1月1日有多少天

第四列 为密码最短有效天数(密码至少使用多少天,0代表无限制)

第五列 为密码最长有效天数(默认99999可以理解为用不过期)

第六列 为过期前的告警天数(默认过期前提前7天警告,但进去告警日期后仍可以使用旧密码登陆系统)

第七列 为密码过期后的宽限天数(密码过期后,预留几天给账户修改密码,此时已经无法使用旧密码登陆系统)

第八列 为账户失效日期(从1970年01月01日起多少天后账户失效)

第九列 暂时保留未使用

5.3 组账户信息文件

组账户信息被保存在/etc/group 文件中,通过命令cat /etc/group 查看文件内容如下:

[root@rhel8-3 ~]# cat /etc/group
root:x:0:
bin:x:1:admin
daemon:x:2:
sys:x:3:
games:x:20:
...内容省略...
apache:x:48:
saslauth:x:76:
redhat:x:1000:

文件以冒号为分隔符

第一列 组账户名称

第二列 为密码占位符

第三列 为GID

第四列 为组成员信息(注意,这个仅显示附加,基本成员不显示)

5.4 组账户密码文件

组账户密码信息被保存在/etc/gshadow 文件中,通过命令 cat /etc/gshadow 查看内容如下

[root@rhel8-3 ~]# cat /etc/gshadow
root:::
bin:::admin
daemon:::
sys:::
...省略中间内容...
saslauth:!::
redhat:!::

文件以冒号为分隔符

第一列 为组账户名称

第二列 为组密码(一般为组管理员密码)

第三列 为组管理员

第四列 为组成员(与/etc/group 第四列相同)

通过<gpasswd 组名>的方式可以为组设置密码,通过<gpasswd -A 账户名称 组账户名称> 可以为组添加管理员

[root@rhel8-3 ~]# gpasswd admin         #设置组密码
[root@rhel8-3 ~]# gpasswd -A admin admin        #将admin账户设置为组admin的管理员

六:文件及目录权限

6.1 概念

a) 普通权限

Linux权限注意分为读、写、执行三种控制,使用ls -l 命令查看文件或目录信息时,系统会显示为 r (读取权限)、w(写入权限)、x(执行权限),以下ls -l 显示的信息:

[root@rhel8-3 ~]# ls -l  (ll)
总用量 4
-rwx-w----. 1 root root 1213 9月   1 16:50 anaconda-ks.cfg
-rw-r--r--. 1 root root    0 9月  14 16:14 nginx.log

第一列:第一个字符为文件类型:

  • -代表普通文件
  • d 代表目录
  • l 代表链接文件
  • b/c 代表设备

三位一组分别为所有者权限、所属组权限、其他账户权限、rwxrwxrwx 表示文档所有者(user)、组(group)、其他账户(other)权限均为可读、可写、可执行,rwx r-- r-- 表示文档所有者权限为读写执行,所属组权限为只读,其他账户权限为只读。

​ 是和selinux 相关,linux的安全性,selinux也是安全软件

第二列:为链接数量或子目录个数

第三列:为文档的所有者

第四列:为文件的所属组

第五列:为容量

第六列:为最近文档被修改的月份

第七列:为文档被修改的日期

第八列:为文档被修改的时间

第九列:为文件或目录名称

对于权限的表示,除了可以使用比较直观的rwx表示外,还可以使用数字表示

数字字符文件目录
4r查看文件内容查看目录下的文件与目录名称
2w修改文件内容在目录下增、删、改文件与目录名称
1x可执行,一般为程序或脚步可以用cd命令进入该目录
b)特殊权限 SET UID

SUID:u+s,让进程不再属于它的发起者,而是属于程序文件本身。(suid只对二进制文件有效;调用者对该文件有执行权;在执行过程中,调用者会暂时获得该文件的所有者权限;该权限只在程序执行的过程中有效)

**注:**SUID仅可用在二进制文件(binary file),而且对目录无效。

SGID:g+s

SGID可以用在两个方面:

1 文件:如果SGID设置在二进制文件上,无论用户是谁,在执行该程序的时候,它的有效用户组将会变成该程序的用户组所有者

​ 2 目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。

练习题:创建共享目录/test,share组的用户对/test目录里的文件可读可写。

1、创建/test,修改属组为share

2、g+s 共享目录里面新创建的文件属组是share

sticky:o+t,不能够删除其他用户在同目录里创建的文件,可删除自己创建的文件

一般用于目录上,对文件的意义不大。sticky对目录的作用是:在具有t权限的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权利删除。sticky可以理解为防删除位。如果希望用户能够添加文件但同时不能让其他人删除文件,则可以对文件使用sticky位。设置该位后,就算用户对该文件的父目录具有写权限,也不能删除文件。

练习题:

1.创建目录/test

2.添加三个用户

3.让每一个用户在目录里面写文件

4.用户3删除1和2用户的文件

5.目录 o+t

6.重复3、4步操作,验证是否能够删除其他用户在同目录里创建的文件

6.2 修改文档权限

a)命令chmod

描述:改变文件或目录权限

语法:chmod [选项] 权限 文件或目录

选项:

–reference=RFILE #根据参考文档设置权限

-R #递归将权限应用于所有的子目录下的所有文件

chmod 命令参数中,u 代码所有者、g 代码所属组、o 代表其他用户、a 代表所有人。

[root@rhel8-3 ~]# ls -l nginx.log                   # 查看nginx.log 文件权限
-rw-r--r--  . 1 root root 9 9月  14 16:34 nginx.log
[root@rhel8-3 ~]# chmod u=rwx,g=rwx,o=rwx nginx.log         #分别给属主,属组,以及其他添加读写执行权限
[root@rhel8-3 ~]# ls -l nginx.log                   # 查看添加后的 nginx.log 文件权限 
-rwx rwx rwx. 1 root root 9 9月  14 16:34 nginx.log
[root@rhel8-3 ~]# chmod a=rw nginx.log      # 将主 组 其他权限设置为读写权限
[root@rhel8-3 ~]# ls -l nginx.log                   # 查看设置后的 nginx.log 文件权限 
- rw-  rw-  rw-. 1 root root 9 9月  14 16:34 nginx.log

使用字符修改权限的另一种形式是在原有权限的基础上修改权限,方法是使用+/-权限的方式

[root@rhel8-3 ~]# chmod u+x,g-w,o-wr nginx.log      #主加x权限,组减w权限,其他减w,r权限
[root@rhel8-3 ~]# ls -l nginx.log                                   #查看加减后的权限
-rwxr-----. 1 root root 9 9月  14 16:34 nginx.log

chmod 可以使用+符号来增加对于的权限,也可以使用 - 符号来减去相应的权限

除了使用字符的方式修改权限,chmod还可以使用数字的方式进行权限修改

[root@rhel8-3 ~]# chmod 755 nginx.log       #修改权限为 rwxr-xr-x
[root@rhel8-3 ~]# ls -l nginx.log
-rwxr-xr-x. 1 root root 9 9月  14 16:34 nginx.log
[root@rhel8-3 ~]# chmod 600 nginx.log           #修改权限为rw-------
[root@rhel8-3 ~]# ls -l nginx.log
-rw-------. 1 root root 9 9月  14 16:34 nginx.log
[root@rhel8-3 ~]# chmod 700 nginx.log           #修改权限为 rwx------
[root@rhel8-3 ~]# ls -l nginx.log
-rwx------. 1 root root 9 9月  14 16:34 nginx.log

最后以其他文档作为参考修改权限

[root@rhel8-3 ~]# ll
总用量 8
-rw-------. 1 root root 1213 9月   1 16:50 anaconda-ks.cfg
-rwx------. 1 root root    9 9月  14 16:34 nginx.log
[root@rhel8-3 ~]# chmod --reference=anaconda-ks.cfg nginx.log
[root@rhel8-3 ~]# ll
总用量 8
-rw-------. 1 root root 1213 9月   1 16:50 anaconda-ks.cfg
-rw-------. 1 root root    9 9月  14 16:34 nginx.log
b)命令chown

描述:修改文件或目录所有者与所属组

语法:chown [选项] [所有者] [:[所属组]] 文件或目录

选项:

​ -R 递归将权限应用于所有的子目录与文件

[root@rhel8-3 ~]# chown redhat:redhat nginx.log   
[root@rhel8-3 ~]# ll
总用量 4
-rw-------. 1 redhat redhat    9 9月  14 16:34 nginx.log
[root@rhel8-3 ~]# chown :root nginx.log
[root@rhel8-3 ~]# ll
总用量 4
-rw-------. 1 redhat root    9 9月  14 16:34 nginx.log
[root@rhel8-3 ~]# chown root nginx.log
[root@rhel8-3 ~]# ll
总用量 4
-rw-------. 1 root root    9 9月  14 16:34 nginx.log

七:ACL访问控制权限

由于系统的基本权限是针对文档所有者、所属组、或者其他账户进行控制的,无法针对某个单独账户进行控制,所以就有了ACL (Access Control List)访问控制列表的概念,使用ACL可以针对单一账户设置文档的访问权限。

Linux系统使用getfacl 查看文档的ACL权限,使用setfacl来设置文档的ACL权限

a)命令 getfacl

描述:查看文档的ACL权限

语法:getfacl 文件/目录

使用命令getfacl 输出内容如下

image.png

以上输出信息中

第一行 为文件或目录的名称

第二行 为文档所有者

第三行 为文档所属组

第四行 为suid、sgid、sticky权限的标记位

第五行 为文档所有者权限

第六行 为通过ACL指令添加的对账户的访问控制权限

第七行 为文档所属组权限

第八行 为通过ACL指令添加的对组账户的访问控制权限

第九行 为权限掩码行

第十行 为其他账户的权限

其中五、七、十行为系统基本权限信息

[root@rhel8-3 ~]# getfacl nginx.log
# file: nginx.log
# owner: root
# group: root
user::rw-
group::r--
other::r--

这个输出信息看出该文件未设置附加的ACL访问控制条目,仅有基本的文件所有者、所属组、其他账户的访问控制。

b)命令 setfacl

描述:设置文档访问控制列表

语法:setfacl [选项] [{-m|-x} acl条目] 文件或目录

选项:

-b 删除所有附加的acl条目

-k 删除默认的acl

-m 添加acl条目

-x 删除指定的acl条目

-R 递归处理所有的子文件与子目录

[root@rhel8-3 ~]# setfacl -m u:redhat:rw nginx.log      #添加ACL条目,使用户redhat 对nginx.log文件可读可写
[root@rhel8-3 ~]# setfacl -m g:redhat:r nginx.log       #添加ACL条目,使redhat组对nginx.log文件可读
[root@rhel8-3 ~]# setfacl -x g:redhat nginx.log     #删除redhat组的acl条目
[root@rhel8-3 ~]# setfacl -x u:redhat nginx.log     #删除账户redhat的acl条目
[root@rhel8-3 ~]# setfacl -b nginx.log      #删除所有附加的acl条目

八:权限掩码

控制创建文件的权限

查看权限掩码:umask (以数字形式显示) umask -S (以字符形式显示)

当前面第一位为2和4权限就叫强制位,1的权限就是冒险位,2代表GID,4代表的是uid

修改权限掩码:umask 022

普通文件的权限属性:666

目录文件的权限属性:777

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值