zoukankan      html  css  js  c++  java
  • 权限管理

    权限概述

    Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者)、group(和所有者同组的用户)、others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身份各有read(读)、write(写)、execute(执行)等权限。
     
    权限介绍
     
    什么是权限?
    在多用户(可以不同时)计算机系统的管理中,权限是指某个特定的用户具有特定的系统资源使用权力,像是文件夹、特定系统指令的使用或存储量的限制。
     
    在Linux中分别有读、写、执行权限:
    读权限:
    对于目录来说,读权限影响用户是否能够列出目录结构(ls)
    对于文件来说,读权限影响用户是否可以查看文件内容
     
    写权限:
    对目录来说,写权限影响用户是否可以在文件夹下“创建/删除/复制到/移动到”文档(mkdri mv rm cp touch)
    对于文件来说,写权限影响用户是否可以编辑文件内容
     
    执行权限:
    对于目录来说:执行权限影响用户是否可以执行cd操作(cd)
    对于文件来说,特别脚本文件。执行权限影响文件是否可以运行。
     
    身份介绍
     
    Owner身份(文件所有者,默认为文档的创建者)
    由于Linux是多用户、多任务的操作系统,因此可能常常有多人同时在某台主机上工作,但每个人均可在主机上设置文件的权限,让其成为个人的“私密文件”,即个人所有者。因为设置了适当的文件权限,除本人(文件所有者)之外的用户无法查看文件内容。
     
    Group身份(与文件所有者同组的用户)
    与文件所有者同组最有用的功能就体现在多个团队在同一台主机上开发资源的时候。例如主机上有A、B两个团体(用户组),A中有a1,a2,a3三个成员,B中有b1,b2两
    个成员,这两个团体要共同完成一份报告F。由于设置了适当的权限,A、B团体中的成员都能互相修改对方的数据,但是团体C的成员则不能修改F的内容,甚至连查看
    的权限都没有。同时,团体的成员也能设置自己的私密文件,让团队的其它成员也读取不了文件数据。在Linux中,每个账户支持多个用户组。如用户a1、b1即可属于A用户组,也能属于B用户组【主组和附加组】。
     
    Others身份(其他人,相对于所有者与同组用户)
    这个是个相对概念。打个比方,大明、二明、小明一家三兄弟住在一间房,房产证上的登记者是大明(owner所有者),那么,大明一家就是一个用户组,这个组有大明、二明、小明三个成员;另外有个人叫张三,和他们三没有关系,那么这个张三就是其他人(others)了。
    同时,大明、二明、小明有各自的房间,三者虽然能自由进出各自的房间,但是小明不能让大明看到自己的情书、日记等,这就是文件所有者(用户)的意义。
     
    Root用户(超级用户)
    在Linux中,还有一个神一样存在的用户,这就是root用户,因为在所有用户中它拥有最大的权限 ,所以管理着普通用户。
     
     Linux权限介绍
     
    要设置权限,就需要知道文件的一些基本属性和权限的分配规则。在Linux中,ls命令常用来查看文件的属性,用于显示文件的文件名和相关属性。
     

    标红的部分就是Linux的文档权限属性信息。
    Linux中存在用户(owner)、用户组(group)和其他人(others)概念,各自有不同的权限,对于一个文档来说,其权限具体分配如下:
     
    十位字符表示含义:
    第1位:表示文档类型,取值常见的有“d表示文件夹”、“-表示文件”、“l表示软连接”、“s表示套接字”、“c表示字符设备”、“b表示块状设备”等等;
    第2-4位:表示文档所有者的权限情况,第2位表示读权限的情况,取值有r、-;第3位表示写权限的情况,w表示可写,-表示不可写,第4位表示执行权限的情况,取值有x、-。
    第5-7位:表示与所有者同在一个组的用户的权限情况,第5位表示读权限的情况,取值有r、-;第6位表示写权限的情况,w表示可写,-表示不可写,第7位表示执行权限的情况,取值有x、-。
    第8-10位:表示除了上面的前2部分的用户之外的其他用户的权限情况,第8位表示读权限的情况,取值有r、-;第9位表示写权限的情况,w表示可写,-表示不可写,第10位表示执行权限的情况,取值有x、-。
     
    权限分配中,均是rwx的三个参数组合,且位置顺序不会变化。没有对应权限就用 – 代替。
     
    权限设置
     
    语法:#chmod 选项 权限模式 文档
    注意事项:
    常用选项:
    -R:递归设置权限 (当文档类型为文件夹的时候)
    权限模式:就是该文档需要设置的权限信息
    文档:可以是文件,也可以是文件夹,可以是相对路径也可以是绝对路径。
    注意点:如果想要给文档设置权限,操作者要么是root用户,要么就是文档的所有者。
     
    1、字母形式
     
    给谁设置:
    u:表示所有者身份owner(user)
    g:表示给所有者同组用户设置(group)
    o:表示others,给其他用户设置权限
    a:表示all,给所有人(包含ugo部分)设置权限
    如果在设置权限的时候不指定给谁设置,则默认给所有用户设置
     
    权限字符:
    r:读
    w:写
    x:表示执行
    -:表示没有权限
     
    权限分配方式:
    +:表示给具体的用户新增权限(相对当前)
    -:表示删除用户的权限(相对当前)
    =:表示将权限设置成具体的值(注重结果)【赋值】
     
    例如:需要给/root/anaconda-ks.cfg文件(-rw-------.)设置权限,要求所有者拥有全部的权限,同组用户拥有读和写权限,其他用户只读权限。
    答案:
    所有者:全部权限(rwx)
    同组用户:读写(rw)
    其他:只读(r)
    [root@ken ~]# chmod u+x,g+rw,o+r anaconda-ks.cfg
     
    2、数字形式
    经常会在一些技术性的网页上看到类似于#chmod  777  a.txt  这样的一个权限,这种形式称之为数字形式权限(777)。
     
    读:r        4
    写:w       2
    执行:x    1
    没有任何权限:0   对应---
     
     
    例如:需要给anaconda-ks.cfg设置权限,权限要求所有者拥有全部权限,同组用户拥有读执行权限,其他用户只读。
    所有者权限 = 全部权限 = 读 + 写 +执行 = 4 + 2 + 1 = 7
    同组用户权限 = 读权限 + 执行权限 = 4 + 1 = 5
    其他用户权限 = 读权限 = 4
    最终得出的结果是754
    [root@ken ~ ]# chmod 754 anaconda-ks.cfg
     
     
    面试题:用超级管理员设置文档的权限命令是#chmod -R 731 aaa,请问这个命令有没有什么不合理的地方?
    所有者 = 7 = 4 + 2 + 1 = 读 + 写 + 执行
    同组用户 = 3 = 2 + 1 = 写 + 执行 
    其他用户 = 1 = 执行
    问题在权限731中3表示写+执行权限,但是写又不必须需要能打开之后才可以写,因此必须需要具备读权限,因此权限不合理。以后建议各位在设置权限的时候不要设置这种“奇葩权限”。
    单独出现2、3的权限数字一般都是有问题的权限
     
    属主和属组设置
     
    属主:所属的用户(文件的主人),文档所有者
    属组:所属的用户组

    前面的那个root就是属主
    后面的那个root就是属组
     
    这两项信息在文档创建的时候会使用创建者的信息(用户名放在前面的root、用户所属的主组名称放在后面的root)。
     
    之所以需要设置这个:如果有时候去删除某个用户,则该用户对应的文档的属主和属组信息就需要去修改(类似离职之前的工作交接)。
     
    1、chown
    作用:更改文档的所属用户(change owner)
    语法:#chown  -R  新的username 文档路径
     
    -R:表示选项  文件不需要-R
    目录需要加-R
    如果你要对目录进行操作,加参数  -R
     
    案例:
    chown user:group filename   比如:chown hr:san a.txt  把文件的属主和属组改为hr,san
    chown user filename  比如:chown san a.txt  把文件的属主改为san用户
    chown :group filename  比如: chown :miao a.txt   把文件的属组改为miao这个组
    chown user: filename 比如:chown san: a.txt  自动继承这个用户所有的组
    chgrp hr filename 比如: chgrp hr f.txt  
    -R :递归(目录下的所有内容都更改,否则只修改目录)
     
    文件的特殊权限
     
    suid  sgid和文件扩展权限ACL
    其实文件与目录设置不止这些,还有所谓的特殊权限。由于特殊权限会拥有一些“特权”.
     
    特殊权限:suid sgid
     
    1、SUID(set uid设置用户ID):限定:只能设置在二进制可执行程序上面。对目录设置无效
    功能:程序运行时的权限从执行者变更成程序所有者的权限
     
    2、SGID:限定:既可以给二进制可执行程序设置,也可以对目录设置
    功能:在设置了SGID权限的目录下建立文件时,新创建的文件的所属组会,继承上级目录的所属组
    SUID SGID
    u+s或u=4 g+s或g=2
    SUID属性一般用在可执行文件上,当用户执行该文件时,会临时拥有该执行文件的所有者权限。使用”ls -l” 或者”ll” 命令浏览文件时,如果可执行文件所有者权限的第三位是一个小写的”s”,就表明该执行文件拥有SUID属性。
     
     例如现在普通用户不能查看/etc/shadow文件
    [root@ken ~]# su - ken
    Last login: Wed Feb 27 22:26:26 CST 2019 on pts/0
      [ken@ken ~]$ cat /etc/shadow
      cat: /etc/shadow: Permission denied
     
    现在赋予文件passwd特殊权限suid
    [root@ken ~]# chmod u+s `which cat`
    [root@ken ~]# ls -l `which cat`
    -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/cat
     
    [ken@ken ~]$ cat /etc/shadow
    root:$6$9XC/lEl96ujGI9c8$E55wvS9amcKFj7/0HmblYg0j28FHwfymL.mQliqQNSElicrQKkZLurkSvVAv6NXM/KiJW
     
    SGID
     
    限定:既可以给二进制可执行程序设置,也可以给目录设置。
    [root@ken ~]# mkdir test1
    [root@ken ~]# ls -ld test1
    drwxr-xr-x 2 root root 6 Feb 27 22:38 test1
    [root@ken ~]# chmod g+s test1
    [root@ken ~]# chown :ken test1
    [root@ken ~]# touch test1/test.txt
    [root@ken ~]# ls -ls test1/test.txt
    0 -rw-r--r-- 1 root ken 0 Feb 27 22:40 test1/test.txt

     
    SBIT
     
    对于设置sbit权限的文件,用户只能删除自己创建的文件,无法删除其他用户的文件
    对目录/tmp添加sbit权限,删除文件的时候显示拒绝操作

    [root@ken ~]# chmod o+t /tmp
    [root@ken ~]# useradd t1
    [root@ken ~]# useradd t2
    [root@ken ~]# su - t1
    Last login: Thu Mar 14 14:04:37 CST 2019 on pts/1
    [t1@ken ~]$ touch /tmp/t1
    [t1@ken ~]$ exit
    logout
    [root@ken ~]# su - t2
    Last login: Thu Mar 14 14:03:59 CST 2019 on pts/1
    [t2@ken ~]$ touch /tmp/t2
    [t2@ken ~]$ rm -rf /tmp/t1
    rm: cannot remove ‘/tmp/t1’: Operation not permitted

     
    去掉sbit权限之后,再次删除即可
    [root@ken ~]# chmod o-t /tmp
    [root@ken ~]# su - t2
    Last login: Fri Mar 15 12:49:54 CST 2019 on pts/4
    [t2@ken ~]$ rm -rf /tmp/t1
     
    文件扩展权限ACL
     
    扩展ACL  :access control list
    例:设置用户ken对文件a.txt拥有的rwx权限 ,ken不属于a.txt的所属主和组,ken是other。怎么做?
    [root@ken ~]# setfacl -m u:ken:rwx a.txt
    -m表示设置的意思
     
    [root@ken ~]# getfacl a.txt
    # file: a.txt
    # owner: root
    # group: root
    user::rw-
    user:ken:rwx
    group::r--
    mask::rwx
    other::r--

     
    去除权限
    [root@ken ~]# setfacl -R -m u:ken:rw- testdirectory/  #-R一定要在-m前面,表示目录下所有文件
    [root@ken ~]# setfacl -x u:ken /tmp/a.txt # 去掉单个权限
    [root@ken ~]# setfacl -b /tmp/a.txt # 去掉所有acl权限
     
    实战sudo
     
    问题:reboot、shutdown、init、halt、user管理,在普通用户身份上都是操作不了,但是有些特殊的情况下又需要有执行权限。又不可能让root用户把自己的密码告诉普通用户,这个问题该怎么解决?
     
    该问题是可以被解决的,可以使用sudo(switch user do)命令来进行权限设置。Sudo可以让管理员(root)事先定义某些特殊命令谁可以执行。
     
    默认sudo中是没有除root之外用户的规则,要想使用则先配置sudo。
     
    Sudo配置文件:/etc/sudoers
    该文件默认只读,不允许修改,因此不能直接修改。
     
    a. 配置sudo文件请使用“#visudo”,打开之后其使用方法和vim一致
       
    b. 配置普通用户的权限

    Root表示用户名,如果是用户组,则可以写成“%组名”
    ALL:表示允许登录的主机(地址白名单)
    (ALL):表示以谁的身份执行,ALL表示root身份
    ALL:表示当前用户可以执行的命令,多个命令可以使用“,”分割
     
    案例:创建ken用户,本身ken用户不能添加用户,要求使用sudo配置,将其设置为可以添加用户。
     
    [root@ken ~]# su - ken
    Last login: Wed Feb 27 22:34:04 CST 2019 on pts/0
    [ken@ken ~]$ useradd test
    -bash: /usr/sbin/useradd: Permission denied
     
     
    修改sudo文件

    注意:在写sudo规则的时候不建议写直接形式的命令,而是写命令的完整路径。
    路径可以使用which命令来查看
    语法:#which 指令名称
     
    在添加好对应的规则之后就可以切换用户,切换到普通用户ken,再去执行:
     
    此时要想使用刚才的规则,则以以下命令进行:
    #sudo 需要执行的指令

    [root@ken ~]# su - ken
    Last login: Wed Feb 27 22:51:26 CST 2019 on pts/0
    [ken@ken ~]$ useradd test #需要加上sudo
    -bash: /usr/sbin/useradd: Permission denied
    [ken@ken ~]$ sudo useradd test1
    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 ken:

     
    在输入sudo指令之后需要输入当前的用户密码进行确认的操作(不是root用户密码),输入之后在接下来5分钟内再次执行sudo指令不需要密码。
    权限管理5月10号
    Linux身份分为三个类别
    Owner(拥有者),group(和所有者同组的用户)、others(其他人,除了所有者,除了同组的用户以及除了超级管理员)
    目录读权限:ls
    目录的写权限:mv rm touch mkdir cp
    目录的执行权限:cd
    三种读权限:
    Read:(读) -r
    Write:(写)-w
    Execute:(执行)-x
    -:表示没有权限
    字母形式
    u:表示所有者身份(user)
    g:表示给所有者同组用户设置()
    o:表示,给其他用户设置权限
    a:表示all,给所有人(包含ugo部分)设置权限
    数字形式

    读:r 4
    写:w 2
    执行:x 1
    没有任何权限:0 对应---


    十位字符表示含义
    第1位:表示文档类型 d表示文件夹 - 表示文件 l表示软连接
    第2-4位:owner (属主)
    第5-7位:group(属组)
    第8-10位:others(其他人)
    Chmod 更改 u g o
    Chown 属主:属组
    补充
    目录创建时默认权限为:777-022=755 (创建目录默认权限是755,022表示umask值)
    普通文件创建时默认权限为:666-022=644
    补充:
    chmod +r test #表示对test文件的ugo三类用户都添加r读权限
    chmod +w test #表示对test文件的u属主添加w写权限,属组和其他人无写权限
    chmod +x test #表示对test文件的ugo三类用户都添加x执行权限

    更改文档的所属用户
    -R:表示选项
    添加root附属组给ken以便查看文件:
    3. 更改test文件属组和属组为root
    三种方法:
    [root@ken ~]# chown root: test
    [root@ken ~]# chown root:root test
    [root@ken ~]# chown root.root test
    四类特殊权限

    SUID,SGID,SBIT,ACL

    1.SUID: 在设置了SUID权限的命令之上,其它用户在执行该命令的时候其实是以root身份在运行
    不能设置在目录上面
    添加权限: chmod u+s `which cat`

    测试:
    [root@ken ~]# chmod u+s `which cat`
    [root@ken ~]# su – ken
    Last login: Fri May 10 11:29:52 CST 2019 on pts/1
    [ken@ken ~]$ cat /etc/shadow
    root:$6$aeEfcI9h$3pgIzTHQyVi5ChkTCzxFdzYsQKGs1Ey/.CoYRseAfLVW1Jq0TFsLyqB4kglKCFLXauml49Hla9jOmGbSMDOQc0:17969:0:99999:7:::
    bin:*:17632:0:99999:7:::
    daemon:*:17632:0:99999:7:::
    注意:其他人需要拥有执行权限

    2,SGID
    添加: chmod g+s mdirname

    测试:
    [root@ken ~]# chmod g+s test
    [root@ken ~]# ll
    total 0
    drwxr-sr-x 2 root root 6 May 10 11:22 test
    [root@ken ~]# chown :ken test
    [root@ken ~]# useradd ken1
    [root@ken ~]# su – ken1
    [ken1@ken ~]$ cd /root/test
    [ken1@ken test]$ mkdir test1
    mkdir: cannot create directory ‘test1’: Permission denied
    [ken1@ken test]$ cd ..
    [ken1@ken root]$ ls -ld test
    drwxr-sr-x 2 root ken 6 May 10 11:22 test
    [ken1@ken root]$ exit
    logout
    [root@ken ~]# chmod -R o+w test
    [root@ken ~]# su – ken1
    Last login: Fri May 10 11:34:56 CST 2019 on pts/1
    [ken1@ken ~]$ cd /root/test
    [ken1@ken test]$ mkdir tes1
    [ken1@ken test]$ ls -l
    total 0
    drwxrwsr-x 2 ken1 ken 6 May 10 11:36 tes1

    3.SBIT: 文件只能被属主删除,其他人无权删除其他人创建的文件
    添加:chmod o+t dirname
    测试:
    [root@ken tmp]# su – ken
    Last login: Fri May 10 11:30:34 CST 2019 on pts/1
    [ken@ken ~]$ touch /tmp/ken
    [ken@ken ~]$ su – ken1
    Password:
    Last login: Fri May 10 11:35:55 CST 2019 on pts/1
    [ken1@ken ~]$ touch /tmp/ken1
    [ken1@ken ~]$ su – ken
    Password:
    Last login: Fri May 10 11:39:09 CST 2019 on pts/1
    r[ken@ken ~]$ rm -rf /tmp/ken1
    rm: cannot remove ‘/tmp/ken1’: Operation not permitted
    [ken@ken ~]$ ls -ld /tmp
    drwxrwxrwt. 8 root root 193 May 10 11:39 /tmp

    [root@ken ~]# chmod o-t /tmp
    [root@ken ~]# su – ken
    Last login: Fri May 10 11:39:39 CST 2019 on pts/1
    [ken@ken ~]$ rm -rf /tmp/ken1
    [ken@ken ~]$ ls /tmp
    ken systemd-private-78aa908103c244d7b64c0fbbde1fea0e-httpd.service-h8aYd8

    acl权限:
    添加权限
    [root@ken ~]# setfacl -m u:ken:r ken
    查看权限:
    [root@ken ~]# getfacl ken
    # file: ken
    # owner: root
    # group: root
    user::rw-
    user:ken:r–
    group::r–
    mask::r–
    other::rw-

    测试:
    [root@ken ~]# su – ken
    Last login: Fri May 10 11:43:19 CST 2019 on pts/1
    [ken@ken ~]$ echo “123” >> ken
    [ken@ken ~]$ echo “123” >> /root/ken
    -bash: /root/ken: Permission denied
    [ken@ken ~]$ cat /root/ken
    123
    123

    取消权限:
    [root@ken ~]# setfacl -b ken
    [root@ken ~]# getfacl ken
    # file: ken
    # owner: root
    # group: root
    user::rw-
    group::r–
    other::rw-
    [root@ken ~]# su – ken
    Last login: Fri May 10 11:45:42 CST 2019 on pts/1
    [ken@ken ~]$ echo “123” >> /root/ken
    [ken@ken ~]$ cat /root/ken
    123
    1

    sudo用法

    visudo打开配置
    跳转到92行处修改
    root ALL=(ALL) ALL

    root: 允许执行命令的用户
    ALL: 可以从那台主机登录
    (ALL): 以属主(root)身份运行
    ALL: 可执行的命令

    实例:
    ken ALL=(ALL) /usr/sbin/useradd
    表示ken可以在任何主机之上以root身份执行useradd命令

    测试:
    [root@ken ~]# su – ken
    Last login: Fri May 10 11:49:03 CST 2019 on pts/1
    [ken@ken ~]$ useradd kenken
    -bash: /usr/sbin/useradd: Permission denied
    [ken@ken ~]$ sudo useradd kenken
    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 ken:
    [ken@ken ~]$ id kenken
    uid=1003(kenken) gid=1003(kenken) groups=1003(kenken)

  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/itzhao/p/11242208.html
Copyright © 2011-2022 走看看