Linux学习笔记:权限管理

目录

文件/目录的基本属性
  更改文件/目录属性
    1. chown:更改属主
    2. chgrp:更改属组
    3. chmod:更改权限属性
      数字类型更改权限
      符号类型更改权限
      特殊权限:setuid、setgid、粘滞位
用户管理
  用户分类
  创建用户
    创建新的用户信息
    设置用户密码
  修改用户
  删除用户
用户切换和提权
  用户切换(su)
  用户提权(sudo)
    第一步:root授权(visudo)
    第二步:普通用户行权(sudo)

 




 

文件/目录的基本属性

Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定,控制系统不同用户对数据管理能力。

首先我们来看Linux系统中目录和文件的基本属性。

我们可以使用 ls –l (可简写为 ll)命令来显示一个文件/目录的属性、所属的用户和组以及最后更改时间,如:

[root@test testfile]# ll
total 4
-rw-r--r--. 1 root root 4 Sep 26 11:40 a.txt
drwxr-xr-x. 2 root root 6 Sep 26 11:39 adir

文件/目录属性信息包括几个部分:

第一部分(左边10个字符):文件/目录的属性(详见下文介绍)。

第二部分(中间3组):链接数,用户名,用户所在的组名。

第三部分(后面5组):文件/目录大小,最后更改时间,文件/目录名。

 

每个文件/目录的属性由左边第一部分的 10 个字符来确定:

  • 第0位:确定文件类型,- 表示文件,d 表示目录。
  • 第1-3位:确定属主(该文件/目录的所有者)拥有该文件/目录的权限。
  • 第4-6位:确定属组(所有者的同组用户)拥有该文件/目录的权限。
  • 第7-9位:确定其他用户拥有该文件/目录的权限。

第1-9位字符中,以三个为一组,且均为 rwx 的三个参数的组合。

  • r 代表可读(readable),具有读取查看权限
  • w 代表可写(writable),具有编辑修改权限
  • x 代表可执行(executable),具有执行或运行权限
  • - 代表没有权限

对于文件来说,必须要具有的是读权限(特殊文件除外),只有在具有读权限前提下,写权限和执行权限才能发挥作用,并且对于一般文件只有属主具有编写权限,其他用户和属组用户均只有查看权限或执行权限。

对于目录来说,必须要具有的是执行权限(特殊文件除外),只有在具有执行限前提下,写权限和读权限才能发挥作用,并且对于一般目录只有属主具有编写权限,其他用户和属组用户均只有查看权限或执行权限。

 

更改文件/目录属性

1. chown:更改属主

语法:

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

例1:进入 /root 目录(~)将install.log的拥有者改为bin这个账号:

[root@test ~] cd ~
[root@test ~]# chown bin install.log
[root@test ~]# ls -l
-rw-r--r--  1 bin  users 68495 Sep 26 11:53 install.log

例2:将install.log的拥有者与群组改回为root:

[root@test ~]# chown root:root install.log
[root@test ~]# ls -l
-rw-r--r--  1 root root 68495 Sep 26 11:53 install.log

2. chgrp:更改属组

语法:

chgrp [-R] 属组名 文件名

参数-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

3. chmod:更改权限属性

Linux文件属性有两种设置方法,一种是数字,一种是符号。

——数字类型改变文件权限——

语法:

chmod [-R] xyz 文件或目录名

选项与参数:

  • xyz : 数字类型的权限属性,为三种身份的 rwx 属性数值的相加。
  • -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

可以使用数字来代表各个权限,各权限的分数对照表如下:

  • r=4
  • w=2
  • x=1
  • -=0

每种身份(owner/group/others)各自的权限(r/w/x/-)分数是需要累加的,例如当权限为: -rwxrwx--- 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= --- = 0+0+0 = 0

所以设定权限的变更时,该文件的权限数字就是 770:

# ls -al test1   // 查看 test1 权限
-rwxr-xr-- 1 root root 0 Sep 26 12:35 test1
# chmod 770 test1    // 修改 test1 权限
# ls -al test1   // 查看 test1 权限
-rwxrwx--- 1 root root 0 Sep 26 12:35 test1

如果要将权限变成 -rwxr-xr-- ,那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。 

——符号类型改变文件权限——

语法:

chmod 用户+权限 文件或目录名

用户的符号:

  • u:代表user,即用户
  • g:代表group,即组
  • o:代表others,即其他用户
  • a:代表all,即全部以上三种用户

权限就是上面介绍的无权限、读取、写入和执行:-、r、w、x。

用户和权限之间用符号连接:

  • +:代表加入权限
  • -:代表除去权限
  • =:代表设定权限

例:

# touch test1    // 创建 test1 文件
# ls -al test1    // 查看 test1 默认权限
-rw-r--r-- 1 root root 0 Sep 26 12:32 test1
# chmod u=rwx,g=rx,o=r  test1    // 修改 test1 权限
# ls -al test1
-rwxr-xr-- 1 root root 0 Sep 26 12:32 test1
# chmod  a-x test1   //拿掉全部人的可执行权限
# ls -al test1
-rw-r--r-- 1 root root 0 Sep 26 12:32 test1

4.特殊权限概念

以上介绍是常规权限:-、r、w、x,还有以下几种特殊权限

——setuid——

对于命令文件赋予特殊权限,让所有普通用户可以拥有属主用户能力。

//赋予setuid的方式:
chmod u+s /目录/文件

//例:
//普通用户在加s权限前,cat命令文件权限为:-rwxr-xr-x
//加s权限:
chmod u+s /usr/bin/cat
//普通用户在加s权限后,cat命令文件权限为:-rwsr-xr-x
//用户加s权限后,在x位显示,原来有x权限的显示为小s,原来无x权限的显示为大S
//取消权限用 u-s 即可
【请勿随意操作授权!】

——setgid——

对于命令文件赋予特殊权限,让所有用户组可以拥有属组权限能力

chmod g+s /目录/文件

——粘滞位Stickybit——

将一些设置共享权限的目录赋予粘滞位,只有共享数据的用户或者root才能删除或移动该文件,其他人只能进行查看,不能有删除或者重命名操作。

 

//给共享文件夹设置粘滞位:
chmod o+t /目录/
//例:
//在加t权限前,共享文件夹share权限为:drwxr-xrwx
//给其他用户other加t权限:
chmod o+t /share/
//加t权限后,共享文件夹share权限为:drwxr-xrwt
//取消权限用 o-t 即可

实际应用中,粘滞位一般用于/tmp/目录,以防止普通用户删除或移动其他用户的文件。

注:粘滞位权限只能针对⽬录设置,对于⽂件⽆效。

 

用户管理

Linux系统是一个多用户多任务的分时操作系统,要使用系统资源,必须有一个账号进入系统。每个用户账号都拥有一个唯一的用户名和各自的口令。用户的角色是通过UID和GID识别的,UID相当于我们的身份证号,用户名就相当于我们的名字。

Linux系统有以下三种用户:

  • 超级用户:默认是root用户,其UID和GID均是0。root为超级管理员账号,可以操作系统中任何文件和命令,拥有最高的管理权限。
  • 虚拟用户:UID值为1-999,安装系统后默认存在,且默认情况大多数不能登录系统。主要是方便系统管理,满足相应的系统进程对文件属主的要求。
  • 普通用户:UID值为1000-65535,普通用户可以登录系统,但仅具有操作自己家目录中的文件及目录的权限。

 

创建用户

——创建新的用户信息——

语法:

useradd 选项 用户名

参数说明:

  • 选项:

    • -c comment 指定一段注释性描述。
    • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
    • -g 用户组 指定用户所属的用户组。
    • -G 用户组,用户组 指定用户所属的附加组。
    • -s Shell文件 指定用户的登录Shell。
    • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
  • 用户名: 

    指定新账号的登录名。

例:

# useradd –d  /home/test1 -m test1
//此命令创建了一个用户test,其中-d和-m选项用来为登录名test产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。

# useradd -s /bin/sh -g group –G adm,root test2
//此命令新建了一个用户test2,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

 

——设置用户密码——

用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用。超级用户root可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。

语法:

passwd 选项 用户名

选项:

  • -l 锁定口令,即禁用账号。
  • -u 口令解锁。
  • -d 使账号无口令。
  • -f 强迫用户下次登录时修改口令。

例:

[root@test ~]# passwd test1    //给指定用户设置密码信息,只能root用户进行操作
Changing password for user test1.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

[root@test ~]$ passwd    //给当前登录系统用户设置密码,所有用户均可使用     
Changing password for user root.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

普通用户修改自己的密码时,passwd命令会先询问原密码,验证后再要求用户输入两遍新密码,如果两次输入的密码一致,则将这个新密码指定给用户;而超级用户为用户指定密码时,就不需要知道原密码。

 

修改用户

根据实际情况可以更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

语法:

usermod 选项 用户名

常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。

例:

usermod -s /bin/ksh -d /home/test –g aaa test
//此命令将用户test的登录Shell修改为ksh,主目录改为/home/test,用户组改为aaa。

 

删除用户

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

语法:

userdel 选项 用户名

userdel 即 user delete,删除用户,常用的选项是 -r,把用户及其主目录一起删除。

例:

userdel test       //只删除用户信息,不会删除用户产生的数据文件信息
userdel -r test    //彻底删除用户信息,以及用户产生的数据文件信息

 

 

用户切换和提权

在Linux系统中,超级管理用户root的权限太大,如果管理不好,就会带来严重的系统安全隐患。因此在工作场景中,只有在必要时才使用超级用户权限。一般临时性工作处理,都是以普通用户的身份完成的。当普通用户需要具有超级用户的权限时,可以通过两种方式改变普通用户权限,以达到对系统的控制权。

 

方式一:用户切换(su)

su(英文全拼:swith user)命令可以在用户之间进行切换。除root向普通用户切换不需要密码验证外,普通用户之间切换或者从普通用户切换到root都需要目标用户的密码验证。

语法:

su 选项 用户名
//若命令后面的用户名省略了,则默认切换为root用户
//从root用户切换到普通用户时,不需要密码验证
//从普通用户切换到root用户时,需要输入root密码验证

选项说明:

  • -,-l:使一个shell成为登录的shell,并且使用该用户对应的环境变量配置
  • -c:切换到一个shell下,执行一个命令,然后退出所切换的用户环境
  • -p:切换用户时,不需要重置用户环境变量
  • -m:同-p,为su的默认值,一般较少使用
  • -s:如果/etc/shells允许,则运行指定的shell

在生产场景中,su命令比较常用的参数为"-"和"-c",其他的参数很少用到。更多选项说明可执行 man su 进行查看。

例:

[root@test ~]# su - aa    //root用户切换为普通用户时,无需密码验证,直接进行切换
[aa@test ~]$ whoami    //查看当前用户名
aa
[aa@test ~]$ su - bb    //普通用户切之间的切换,需要密码验证
密码:
[bb@test ~]$ whoami    //查看当前用户名
bb
[bb@test ~]$ su -        //普通用户切换为root用户,需要密码验证
密码:
[root@test ~]# whoami    //查看当前用户名
root

 

方式二:用户提权(sudo)

root可以有针对性地将不同命令或程序授予指定的普通用户,让普通用户不需要知道root密码就可以执行相应的命令。也就是说,经由 sudo 所执行的命令就好像是root亲自执行,前提是需要root授权相应的命令。

——第一步:root授权(visudo)——

root授权可以使用visudo命令进行配置管理,visudo命令是专门用来编辑/etc/sudoers这个文件的,同时它还提供了语法检查等功能。此命令执行相当于执行 vim /etc/sudoers 编辑,但使用此命令方式更安全,推荐此种方式。

语法:

visudo 选项

选项说明:

  • -c:手动执行语法检查

例:执行visudo命令,即可打开sudo的配置文件进行编辑。在/etc/sudoers文件的大约第92行下面添加需要提升为root权限的普通用户名及对应权限:

//将aa用户提权为root身份
93 aa  ALL=(ALL)       ALL
//授权bb用户使其可以以root身份添加和删除用户权限
94 bb ALL=(ALL)       /usr/sbin/useradd, /usr/sbin/userdel
//添加NOPASSWD信息,表示在普通用户使用特权时,可以不用输入密码信息
95 cc  ALL=(ALL)       NOPASSWD: ALL

//上述授权配置内容对应说明如下所示:
//编号    待授权的用户或组    机器=(授权角色)    可以执行的命令
//94   bb           ALL=(ALL)      /usr/sbin/useradd, /usr/sbin/userdel

通过visudo命令进行系统的授权管理的目的是,既能让运维人员正常工作,又不会威胁到系统的安全,还可以审计用户使用sudo的提权操作命令,默认的用户是无法获得root权限的。

为了管理方便,工作中可以为某一个普通用户授权为ALL权限,既可管理整个系统,平时也可以使用用户处理工作,而无需使用root用户。

语法检查:

[root@test ~]# visudo -c
/etc/sudoers: parsed OK

有的时候,运维管理员并不是使用visudo编辑sudoers文件,而是使用vim或者echo命令编辑的sudoers文件,此时就需要执行如下命令检查编辑文件的语法是否正确。

——第二步:普通用户行权(sudo)——

语法:

sudo 选项

选项说明:

  • -l:列出当前用户可以执行的命令,只有sudoers文件里的用户才能使用该选项
  • -u:可以指定用户的身份执行命令。后面是除root之外的用户,可以是用户名,也可以是uid
  • -k:清除时间戳上的时间,下次再使用sudo时还需要再次输入密码
  • -b:在后台执行指定的命令
  • -c:不执行命令,而是修改文件,相当于命令 sudo edit

例:已经对bb用户进行了授权,此时再以bb用户的身份登录系统,就可以通过执行类似sudo ls -l /root(sudo后面加上正常命令)的命令来以root用户的权限管理系统了:

[aa@test ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
//可以看到,aa用户是无法直接访问/root家目录的
[aa@test ~]$ sudo ls /root
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for aa: 
//如果授权配置中含有NOPASSWD,则执行时将不提示密码,否则会要求输入当前用户的密码

对于Linux系统bash的内置命令,一般无法进行sudo授权,例如,cd命令。

 

posted @ 2020-09-26 23:27  101010101  阅读(344)  评论(0)    收藏  举报