精华内容
下载资源
问答
  • ACL详解 Cisco

    2020-05-25 00:30:22
    访问控制列表简称为ACL: 访问控制列表使用包过滤技术,在路由器上读取第三层及第四层包头中的信息如源地址,目的地址,源端口,目的端口等,根据预先定义好的规则对包进行过滤,从而达到访问控制的目的。该技术...

    访问控制列表简称为ACL:

           访问控制列表使用包过滤技术,在路由器上读取第三层及第四层包头中的信息如源地址,目的地址,源端口,目的端口等,根据预先定义好的规则对包进行过滤,从而达到访问控制的目的。该技术初期仅在路由器上支持,近些年来已经扩展到三层交换机,部分最新的二层交换机也开始提供ACL的支持了

    访问控制列表的原理:

           对路由器接口来说有两个方向:
           出:已经经路由器的处理,正离开路由器接口的数据包
           入:已经到达路由器接口的数据包,将被路由器处理
           匹配顺序为:“自上而下,依次匹配”,默认为拒绝

    访问控制列表的类型:


           标准访问控制列表:一般应用在out出站接口,建议配置在离目标端最近的路由上
           扩展访问控制列表:配置在离源端最近的路由上,一般应用在入站in方向
           命名访问控制列表:允许在标准和扩展访问列表中使用名称代替表号

    访问控制列表使用原则:


           1:最小特权原则:只给受控对象完成任务所必须的最小的权限。也就是说被控制的总规则是各个规则的交集,只满足部分条件的是不容许通过规则的
           2:最靠近受控对象原则:所有的网络层访问权限控制,也就是说在检查规则时是采用自上而下在ACL中一条条检测的,只要发现符合条件了就立刻转发,而不继续检测下面的ACL语句
           3:默认丢弃原则:在CISCO路由交换设备中默认最后一句为ACL中加入了deny any any,也就是丢弃所有不符合条件的数据包,这一点要特别注意,虽然我们可以修改这个默认,但未改前一定要引起重视

           由于ACL是使用包过滤技术来实现的,过滤的依据又仅仅只是第三层和第四层包头中的部分信息,这种技术具有一些固有的局限性,如无法识别到具体的人,无法识别到应用内部的权限级别等,因此,要达到端到端的权限控制目的,需要和系统级及应用级的访问权限控制结合使用

    一:标准访问列表

           访问控制列表ACL分很多种,不同场合应用不同种类的ACL,其中最简单的就是标准访问控制列表,标准访问控制列表是通过使用IP包中的源IP地址进行过滤,使用访问控制列表号1到99来创建相应的ACL
          它的具体格式:
          access-list access-list-number [permit|deny] [sourceaddress][wildcard-mask]
          access-list-number 为1-99 或者 1300-1999之间的数字,这个是访问列表号
          例如:access-list 10 deny host 192.168.1.1这句命令是将所有来自192.168.1.1地址的数据包丢弃
          当然我们也可以用网段来表示,对某个网段进行过滤,命令如下:access-list 10 deny 192.168.1.0 0.0.0.255
          通过上面的配置将来自192.168.1.0/24的所有计算机数据包进行过滤丢弃,为什么后头的子网掩码表示的是0.0.0.255呢?这是         因为cisco规定在ACL中用反向掩玛表示子网掩码,反向掩码为0.0.0.255的代表他的子网掩码为255.255.255.0
          提示:对于标准访问控制列表来说,默认的命令是host,也就是说access-list 10 deny 192.168.1.1表示的是拒绝192.168.1.1这台主机数据包通讯,可以省去我们输入host命令
          标准访问列表配置实例:
          r1(config)#access-list 10 deny 192.168.2.0 0.0.0.255
          r1(config)#access-list 10 permit any
          r1(config)#int f0/0
          r1(config-subif)#ip access-group 10 out
         上面配置的含义是阻止来自网段192.168.2.0的机器从int f0/0端口出去,访问列表在配置好之后,要把它在端口上应用,否则配置了还是无效的
         注意事项:
         1、标准访问列表,一般来说配置尽量靠近目的端
         2、配置的第二条命令中的any相当于 0.0.0.0 255.255.255.255
         3、一定要加pemint any,使其他的网络可通
         4、访问列表是从上到下一条一条进行匹配的,所以在设置访问列表的时候要注意顺序,如果从第一条匹配到最后一条还是不知道要怎么做,路由器就会丢弃这个数据包,也就是为什么上面的例子中上一定要加permit any
         5、如果只阻止一个主机,那可以用 host 192.168.1.12 或者 192.168.1.12 0.0.0.0,这两种配置是等价的
         删除已建立的标准ACL
         r1(config)#no access-list access-list-number
         对标准的ACL来说,不能删除单个ACL语句,只能删除整个ACL
        总结:标准ACL占用路由器资源很少,是一种最基本最简单的访问控制列表格式,应用比较广泛,经常在要求控制级别较低的情况下使用,如果要更加复杂的控制数据包的传输就需要使用扩展访问控制列表了,他可以满足我们到端口级的要求

    二:扩展访问控制列表


          上面我们提到的标准访问控制列表是基于IP地址进行过滤的,是最简单的ACL,那么如果我们希望将过滤细到端口怎么办呢?或者希望对数据包的目的地址进行过滤,这时候就需要使用扩展访问控制列表了,使用扩展IP访问列表可以有效的容许用户访问物理LAN而并不容许他使用某个特定服务(例如WWW,FTP),扩展访问控制列表使用的ACL号为100到199
          扩展访问控制列表的格式:
    access-list access-list-number {permit/deny} protocol +源地址+反码 +目标地址+反码+operator operan(It小于,gt大于,eq等于,neq不等于;具体可?)+端口号
          1、扩展访问控制列表号的范围是100-199或者2000-2699
          2、因为默认情况下,每个访问控制列表的末尾隐含deny all,所以在每个扩展访问控制列表里面必须有:access-list 110 permit ip any any
          3、不同的服务要使用不同的协议,比如TFTP使用的是UDP协议
          4、更多注意事项可以参考上面标准访问控制列表部分
         实例一:access-list 101 deny tcp any host 192.168.1.1 eq www //将所有主机访问192.168.1.1这个地址网页服务(WWW)TCP连接的数据包丢弃
         提示:同样在扩展访问控制列表中也可以定义过滤某个网段,当然和标准访问控制列表一样需要我们使用反向掩码定义IP地址后的子网掩码
         扩展访问控制列表配置实例:
         r2(config)#access-list 110 deny tcp any host 192.168.1.12 eq www
         r2(config)#access-list 110 deny tcp any host 192.168.1.12 eq ftp
         r2(config)#int f0/0
         r2(config-if)#ip access-group 110 out
        上面配置的含义是拒绝访问192.168.1.12的www和ftp服务
         实例二:
         路由器连接了二个网段,分别为172.16.4.0/24,172.16.3.0/24,在172.16.4.0/24网段中有一台服务器提供WWW服务,IP地址为172.16.4.13,
         要求:禁止172.16.3.0的计算机访问172.16.4.0的计算机,包括那台服务器,不过惟独可以访问172.16.4.13上的WWW服务,而其他服务不能访问
         路由器配置命令:
         access-list 101 permit tcp any 172.16.4.13 0.0.0.0 eq www  //设置ACL 101,容许源地址为任意IP,目的地址为172.16.4.13主机的80端口即WWW服务,由于cisco默认添加deny any的命令,所以ACL只写此一句即可
         进入相应端口
         ip access-group 101 out //将ACL 101应用到端口
         设置完毕后172.16.3.0的计算机就无法访问172.16.4.0的计算机了,就算是服务器172.16.4.13开启了FTP服务也无法访问,惟独可以访问的就是172.16.4.13的WWW服务了
         删除已建立的扩展标准ACL
         删除和标准一样,不能单条删除,只能删除整个ACL
         总结:扩展ACL功能很强大,他可以控制源IP,目的IP,源端口,目的端口等,能实现相当精细的控制,扩展ACL不仅读取IP包头的源地址/目的地址,还要读取第四层包头中的源端口和目的端口的IP,不过他存在一个缺点,那就是在没有硬件ACL加速的情况下,扩展ACL会消耗大量的路由器CPU资源,所以当使用中低档路由器时应尽量减少扩展ACL的条目数,将其简化为标准ACL或将多条扩展ACL合一是最有效的方法

    三:命名访问控制列表


           不管是标准访问控制列表还是扩展访问控制列表都有一个弊端,那就是当设置好ACL的规则后发现其中的某条有问题,希望进行修改或删除的话只能将全部ACL信息都删除,也就是说修改一条或删除一条都会影响到整个ACL列表,这一个缺点影响了我们的工作,为我们带来了繁重的负担,不过我们可以用基于名称的访问控制列表来解决这个问题
           命名访问控制列表格式:
    ip access-list {standard/extended} access-list-name(可有字母,数字组合的字符串)
          例如:ip access-list standard softer //建立一个名为softer的标准访问控制列表
          命名访问控制列表使用方法:
          r1(config)#ip access-list standard 自定义名
          r1(config-std-nac1)#11 permit host +ip //默认情况下第一条为10,第二条为20,如果不指定序列号,则新添加的ACL被添加到列表的末尾
          r1(config-std-nac1)#deny any
         对于命名ACL来说,可以向之前的ACL中插入ACL,删除也可以删除单条ACL,
         如:r1(config)#ip access-list standard benet
         r1(config-std-nasl)#no 11
         使用show access-lists可查看配置的ACL信息
         总结:如果设置ACL的规则比较多的话,应该使用基于名称的访问控制列表进行管理,这样可以减轻很多后期维护的工作,方便我们随时进行调整ACL规则

    四:反向访问控制列表


           反向访问控制列表属于ACL的一种高级应用,他可以有效的防范病毒,通过配置反向ACL可以保证A.B两个网段的计算机互相PING,A可以PING通B而B不能PING通A
          说得通俗些的话就是传输数据可以分为两个过程,首先是源主机向目的主机发送连接请求和数据,然后是目的主机在双方建立好连接后发送数据给源主机,反向ACL控制的就是上面提到的连接请求
          反向访问控制列表的格式:
          反向访问控制列表格式非常简单,只要在配置好的扩展访问列表最后加上established即可
          反向访问控制列表配置实例:
          路由器连接了二个网段,分别为172.16.4.0/24,172.16.3.0/24,在172.16.4.0/24网段中的计算机都是服务器,我们通过反向ACL设置保护这些服务器免受来自172.16.3.0这个网段的病毒攻击
          要求:禁止病毒从172.16.3.0/24这个网段传播到172.16.4.0/24这个服务器网段
          路由器配置命令:
    access-list 101 permit tcp 172.16.3.0 0.0.0.255 172.16.4.0 0.0.0.255 established //定义ACL 101,容许所有来自172.16.3.0网段的计算机访问172.16.4.0网段中的计算机,前提是TCP连接已经建立了的,当TCP连接没有建立的话是不容许172.16.3.0访问172.16.4.0的
         进入路由相应端口
         ip access-group 101 out //将ACL 101应用到端口
         设置完毕后病毒就不会轻易的从172.16.3.0传播到172.16.4.0的服务器区了,因为病毒要想传播都是主动进行TCP连接的,由于路由器上采用反向ACL禁止了172.16.3.0网段的TCP主动连接,因此病毒无法顺利传播
         提示:检验反向ACL是否顺利配置的一个简单方法就是拿172.16.4.0里的一台服务器PING在172.16.3.0中的计算机,如果可以PING通的话再用172.16.3.0那台计算机PING172.16.4.0的服务器,PING不通则说明ACL配置成功
         通过上文配置的反向ACL会出现一个问题,那就是172.16.3.0的计算机不能访问服务器的服务了,假如图中172.16.4.13提供了WWW服务的话也不能正常访问,解决的方法是在established那句前头再添加一个扩展ACL规则

         例如:access-list 101 permit tcp 172.16.3.0 0.0.0.255 172.16.4.13 0.0.0.0 eq www
         这样根据“最靠近受控对象原则”即在检查ACL规则时是采用自上而下在ACL中一条条检测的,只要发现符合条件了就立刻转发,而不继续检测下面的ACL语句,172.16.3.0的计算机就可以正常访问该服务器的WWW服务了,而下面的established防病毒命令还可以正常生效

    五:定时访问控制列表


           设置步骤:
           1、定义时间段及时间范围
           2、ACL自身的配置,即将详细的规则添加到ACL中
           3、宣告ACL,将设置好的ACL添加到相应的端口中
           定义时间范围的名称:
           r1(config)#time-range time-range-name定义一个时间周期
           r1(config-time-range)#periodic(周期) days-of-the-week hh:mm to [days-of-the-week] hh:mm
           其中days-of-the-week的取值有
           Monday Tuesday Wednesday Thursday Friday Saturday Sunday{周一到周日}
           daily(每天)weekdays(在平日)weekend(周末)
           定义一个绝对时间:
           r1(config)#time-range time-range-name
           r1(config-time-range)#absolute [start hh:mm day month year] [end hh:mm day month year]
           在扩展ACL中引入时间范围
           r1(config)#access-list access-list-number {permit|deny} protocol {source ip + 反码 destination ip + 反码 +operator+time-range+time-range-name}
           定时访问控制列表实例:
           路由器连接了二个网段,分别为172.16.4.0/24,172.16.3.0/24,在172.16.4.0/24网段中有一台服务器提供FTP服务,IP地址为172.16.4.13,
           要求:只容许172.16.3.0网段的用户在周末访问172.16.4.13上的FTP资源,工作时间不能下载该FTP资源
           路由器配置命令:
           time-range softer //定义时间段名称为softer
           periodic weekend 00:00 to 23:59 //定义具体时间范围,为每周周末(六,日)的0点到23点59分。当然可以使用periodic  weekdays定义工作日或跟星期几定义具体的周几
           access-list 101 permit tcp any 172.16.4.13 0.0.0.0 eq ftp time-range softer //设置ACL,禁止在时间段softer范围内访问172.16.4.13的FTP服务
           access-list 101 deny ip any any //设置ACL,容许其他时间段和其他条件下的正常访问
           进入相应端口。
           ip access-group 101 out //应用到端口
           基于时间的ACL比较适合于时间段的管理,通过上面的设置172.16.3.0的用户就只能在周末访问服务器提供的FTP资源了,平时无法访问

    六:访问控制列表流量记录


           网络管理员就是要能够合理的管理公司的网络,俗话说知己知彼方能百战百胜,所以有效的记录ACL流量信息可以第一时间的了解网络流量和病毒的传播方式,下面这篇文章就为大家简单介绍下如何保存访问控制列表的流量信息,方法就是在扩展ACL规则最后加上LOG命令
           实现方法:
           log 192.168.1.1 //为路由器指定一个日志服务器地址,该地址为192.168.1.1
           access-list 101 permit tcp any 172.16.4.13 0.0.0.0 eq www log //在希望监测的扩展ACL最后加上LOG命令,这样就会把满足该条件的信息保存到指定的日志服务器192.168.1.1中
           提示:如果在扩展ACL最后加上log-input,则不仅会保存流量信息,还会将数据包通过的端口信息也进行保存,使用LOG记录了满足访问控制列表规则的数据流量就可以完整的查询公司网络哪个地方流量大,哪个地方有病毒了,简单的一句命令就完成了很多专业工具才能完成的工作

    展开全文
  • Linux的ACL配置

    2021-05-10 18:11:45
    一、 为什么要使用ACL首先,在 linux下,对一个文件可以进行的操作的对象分别为user(文件的拥有者),group(组,注意不一定是文件拥有者所在的组), other (其他)而对于每一对象的操作又有了读 写 执行 (这里不讨论SUID, ...

    一、 为什么要使用ACL

    首先,在 linux下,对一个文件可以进行的操作的对象分别为user(文件的拥有者),group(组,注意不一定是文件拥有者所在的组), other (其他)而对于每一对象的操作又有了读  写  执行 (这里不讨论SUID, SGID以及Sticky bit的设置)

    通过ls -l命令就我们就可以列出一个文件的权限(看一下就行了,不需要操作)

    代码:

    [leonard@localhost ~]$ ls -l

    -rw-rw---- 1 leonard admin 0 Jul 3 20:12 test.txt

    在这里说明了对于test.txt这个文件leonard用户(user)拥有read & write权限. 所有属于admin 组的用户(group)拥有read & write 权限. 其他任何用户(other)

    对于文件没有任何的权限

    如果我们现在希望john这个用户也可以对test.txt文件进行读写操作. 我自己大概会想到以下几种办法 (这里假设john不属于admin组)

    1. 给文件的other类别增加读和写的权限. 这样由于john会被归为other类别,那么他也将拥有读写的权限。

    2. 将john加入到admin group. 那么john会被归为group类别,那么他将拥有读写的权限。

    第一种做法的问题在于所有用户都将对test.txt拥有读写操作,显然这种做法不可取

    第二种做法的问题在于john被赋予了过多的权限.所有属于admin组的文件,john都可以拥有其等同的权限了。

    对于以上不安全的情况,我们可以用Linux的Access Control List (ACL)来帮助我们解决当然,要讨论ACL你必须要安装上ACL的RPM包,而且,在安装完成后,还要磁盘分区的支持。

    以我为例,我的分区默认并没有支持ACL功能,如果要让分区支持ACL,有以下几种办法:

    1.使用tune2fs命令让分区永久支持ACL功能             语法: tune2fs  -o  acl  分区

    如:[root@localhost ~]# tune2fs -o acl /dev/sda2         #如果不知道目录所在的分区,可以看我的一篇相关文章

    tune2fs 1.41.12 (17-May-2010)                              http://blog.chinaunix.net/uid-30212356-id-5077530.html

    配置完成后,可以通过tune2fs  -l  分区     查看,如我的:

    [root@localhost ~]# tune2fs -l /dev/sda2

    tune2fs 1.41.12 (17-May-2010)

    Filesystem volume name:   Last mounted on:          /

    Filesystem UUID:          eafb2027-525e-4a4d-8df7-f7123a9fe637

    Filesystem magic number:  0xEF53

    Filesystem revision #:    1 (dynamic)

    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize

    Filesystem flags:         signed_directory_hash

    #在“Default mount options:”的值中包括“acl”就说明该分区支持ACL功能。

    Default mount options:    user_xattr acl

    Filesystem state:         clean

    Errors behavior:          Continue

    Filesystem OS type:       Linux............

    2.使用mount命令让分区临时支持ACL功能(重启开机后ACL失效)

    mount   -o    remount    分区     或者        mount    -o    acl    分区    挂载点

    注意:使用mount命令让一个分区临时支持ACL功能时,可以使用以上二种方式。第一种使用在分区已经被挂载的情况,也就是说这个分区已经在使用但还不支持ACL功能,在不影响分区使用的情况下重新挂载分区使其支持ACL功能;第二种使用在一开始挂载分区时就使其支持ACL功能。

    [root@srv ~]# mount -o remount /dev/sda13

    [root@srv ~]# mount -o acl  /dev/sda14  /media/sda14(此为引用,我没有再去试验)

    [root@srv ~]# mount   #使用mount命令查看。

    #如果分区支持ACL功能时,在挂载信息中会显示出来。

    /dev/sda13 on /media/sda13 type ext3 (rw,acl)

    /dev/sda14 on /media/sda14 type ext3 (rw,acl)

    3.修改/etc/fstab文件,使分区永久支持ACL功能。在/etc/fstab文件中在需要支持ACL功能分区的挂载选项列中加上“,acl”即可使分区永久支持ACL功能。(这里是引用的,懒,没测试)

    如:[root@srv ~]# cat /etc/fstab

    LABEL=SWAP-sda9

    swap

    swap

    defaults

    0 0

    /dev/sda10

    /media/sda10

    ext3

    defaults,acl

    0 0

    在启用了acl参数之后重新加载/data分区

    # mount -o remount   分区            即可!

    提示:通过tune2fs命令使分区支持ACL功能后,通过mount命令是无法查看到的,通过修改/etc/fstab使分区支持ACL功能后,通过mount命令可以查看到分区支持ACL功能

    二:ACL的名词定义

    ACL 是由一系列的Access Entry所组成的. 每一条Access Entry定义了特定的类别可以对文件拥有的操作权限. Access Entry有三个组成部分: Entry tag type, qualifier ,(optional), 权限

    我们先来看一下最重要的Entry tag type, 它有以下几个类型

    ACL_USER_OBJ: 相当于Linux里file_owner的权限

    ACL_USER: 定义了额外的用户可以对此文件拥有的权限

    ACL_GROUP_OBJ: 相当于Linux里group的权限

    ACL_GROUP: 定义了额外的组可以对此文件拥有的权限

    ACL_MASK: 定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 (这个我下面还会专门讨论)

    ACL_OTHER: 相当于Linux里other的权限

    举个例子说明一下吧. 下面我们就用getfacl命令来查看一个已经定义好了的ACL文件

    [root@zyq-server data]# getfacl test.txt

    # file: test.txt

    # owner: root

    # group: family

    user::rw-

    user:zyq:rw-

    group::rw-

    group:jackuser:rw-

    mask::rw-

    other::---

    前面三个以#开头的定义了文件名,文件所有者和文件拥有组. 这些信息没有太大的作用,我们可以用 --omit-header参数(即getfacl -c tset.txt命令)来省略掉

    user::rw- 定义了ACL_USER_OBJ, 说明文件拥有者拥有读和写的权限

    user:zyq:rw- 定义了ACL_USER,这样用户zyq就拥有了对文件的读写权限

    group::rw- 定义了ACL_GROUP_OBJ,说明文件的group拥有read和write 权限

    group: jackuser:rw- 定义了ACL_GROUP,使得jackuser组拥有了对文件的read 和write权限

    mask::rw- 定义了ACL_MASK的权限为read and write

    other::--- 定义了ACL_OTHER的没有任何权限操作此文件

    从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组具有对文件的具体功能;

    三、 如何设置ACL文件

    首先我们讲一下设置ACL文件的格式. 从上面的例子中我们可以看到每一个Access Entry都是由三个:号分隔开的字段所组成.

    第一个就是Entry tag type

    user 对应了ACL_USER_OBJ和ACL_USER

    group 对应了ACL_GROUP_OBJ和ACL_GROUP

    mask 对应了ACL_MASK

    other 对应了ACL_OTHER

    第二个字段称之为qualifier.也就是上面例子中的zyq和jackuser组.它定义了特定用户和用户组

    对于文件的权限.这里我们也可以发现只有user和group才有qualifier,其他的都为空

    第三个字段就是我们熟悉的权限了. 它和Linux的权限一样定义,这里就不多讲了

    一开始文件没有ACL的额外属性

    [root@localhost mnt]# ll

    总用量 4

    drwxr-xr-x. 2 root root 4096 3月  14 07:00 hgfs

    -rw-r--r--  1 root root    0 6月  10 05:50 test.txt

    [root@zyq-server data]# getfacl test.txt

    # file: test.txt

    # owner: root

    # group: root

    user::rw-

    group::r--

    other::r--

    我们先让用户abc拥有对test.txt文件的读写权限

    [root@localhost mnt]# setfacl -m u:abc:rw test.txt

    [root@localhost mnt]# getfacl -c test.txt

    user::rw-

    user:abc:rw-

    group::r--

    mask::rw-

    other::r--

    这时我们就可以看到abc用户在ACL里面已经拥有了对文件的读写权限. 这个时候如果我们查看一下linux的权限我们还会发现一个不一样的地方

    [root@localhost mnt]# ll

    总用量 4

    drwxr-xr-x. 2 root root 4096 3月  14 07:00 hgfs

    -rw-rw-r--+ 1 root root    0 6月  10 05:50 test.txt

    在文件权限的最后多了一个+号. 当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后,我们就可以称它为ACL文件.这个+号就是用来提示我们的.

    我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义;

    接下来我们来设置ABC组拥有read 权限

    [root@localhost mnt]# setfacl -m g:ABC:r test.txt

    [root@localhost mnt]# getfacl -c test.txt

    user::rw-

    user:abc:rw-

    group::r--

    group:ABC:r--

    mask::rw-

    other::r--

    [root@localhost mnt]# setfacl -m g:ABC:r test.txt

    [root@localhost mnt]# getfacl -c test.txt

    user::rw-

    user:abc:rw-

    group::r--

    group:ABC:r--

    mask::rw-

    other::r--

    [root@localhost mnt]# setfacl -m g:ABC:r test.txt

    [root@localhost mnt]# getfacl -c test.txt

    user::rw-

    user:abc:rw-

    group::r--

    group:ABC:r--

    mask::rw-

    other::r--

    [root@localhost mnt]# setfacl -m g:ABC:r test.txt

    [root@localhost mnt]# getfacl -c test.txt

    user::rw-

    user:abc:rw-

    group::r--

    group:ABC:r--

    mask::rw-

    other::r--

    [root@localhost mnt]# ll test.txt

    -rw-rw-r--+ 1 root root 0 6月  10 05:50 test.txt

    四、ACL_MASK 和 Effective 权限

    这里需要重点讲一下ACL_MASK, 因为这是掌握ACL的另一个关键

    在Linux 文件权限里面大家都知道比如对于rw-rw-r--来说, 第二组中的那个rw-是指文件组的权限. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立. 如果文件有ACL_MASK值,那么当中那个rw-代表的就是mask值而不再是group 权限了;

    例如:[root@localhost mnt]# ll test.sh

    -rwxrw-r-- 1 root family 1 6月  10 06:28 test.sh

    这里说明test.sh文件只有文件拥有者 root拥有read, write, execute 权限. family

    组只有读和写的权限。现在我们想让用户abc也对test.sh具有和root一样的权限。

    [root@localhost mnt]# setfacl -m u:abc:rwx test.sh

    [root@localhost mnt]# getfacl -c test.sh

    user::rwx

    user:abc:rwx

    group::rw-

    mask::rwx

    other::r--

    这里我们看到abc已经拥有了rwx的权限. mask值也被设定为rwx.那是因为它规定了ACL_USER, ACL_GROUP和ACL_GROUP_OBJ的最大值(也就是权限的最大值)

    现在我们再来看test.sh的Linux 权限, 它已经变成了

    [root@localhost mnt]# ll test.sh

    -rwxrwxr--+ 1 root family 1 6月  10 06:28 test.sh

    那么如果现在family组的用户想要执行test.sh的程序会发生什么情况呢? 它会被权限 deny.原因在于实际上family组的用户只有读和写的权限.这里当中显示的rwx是ACL_MASK的值而不是group的权限

    所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的权限,以免发生混淆

    下面我们再来继续看一个例子

    假如现在我们设置test.sh的mask为read only,那么family组的用户还会有write 权限吗?

    [root@localhost mnt]# setfacl -m mask::r test.sh

    [root@localhost mnt]# getfacl -c test.sh

    user::rwx

    user:abc:rwx #effective:r--

    group::rw- #effective:r--

    mask::r--

    other::r--

    这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r--, 这是什么意思呢?让 我们再来回顾一下ACL_MASK的定义. 它规定了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限.那么在我们这个例子中他们的最大权限也就是read only.虽然我们这里给ACL_USER和ACL_GROUP_OBJ设置了其他权限,但是他们真正有效果的只有read权限也就是mask的权限.

    这时我们再来查看test.sh的Linux 文件权限时它的group 权限也会显示其mask的值

    [root@localhost mnt]# ll test.sh

    -rwxr--r--+ 1 root family 1 6月  10 06:28 test.sh

    五、 Default ACL

    上面我们所有讲的都是Access ACL, 也就是对文件而言. 下面讲的是Default ACL.,Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL

    我希望所有在此目录下建立的文件都可以被smbuser用户所访问. 那么我们就应该对mydir目录设置Default ACL

    首先利用root用户在/mnt/创建一个dir的文件夹,然后将这个文件夹的default user权限设置为smbuser可以rw-

    以root身份在dir目录下创建一个test.txt的文件。其他的不做限制,然后切换到smbuser。发现smbuser用户可以修改 test.txt文件中的内容但是无法在dir目录中创建和删除文件/文件夹

    [root@localhost mnt]# mkdir dir

    [root@localhost mnt]# id

    uid=0(root) gid=0(root) groups=0(root)

    [root@localhost mnt]# ll dir/

    total 0

    [root@localhost mnt]# getfacl dir

    # file: dir

    # owner: root

    # group: root

    user::rwx

    group::r-x

    other::r-x

    [root@localhost mnt]# setfacl -m d:smbuser:rw dir/

    [root@localhost mnt]# getfacl dir/

    # file: dir/

    # owner: root

    # group: root

    user::rwx

    group::r-x

    other::r-x

    default:user::rwx

    default:user:smbuser:rw-

    default:group::r-x

    default:mask::rwx

    default:other::r-x

    此时我们可以看到ACL定义了default选项, smbuser用户拥有了default的read, write, excute/search 权限.但是却无法删除和创建文件,这里还必须将mydir目录的ACL_USER修改为smbuser后,切换到smbuser用户才能够在 mydir目录中创建和删除文件/文件夹

    [root@localhost mnt]# setfacl -m u:smbuser:rwx dir/

    [root@localhost mnt]# getfacl -c dir/

    user::rwx

    user:smbuser:rwx

    group::r-x

    mask::rwx

    other::r-x

    default:user::rwx

    default:user:smbuser:rw-

    default:group::r-x

    default:mask::rwx

    default:other::r-x

    此时测试

    [root@localhost mnt]# cd dir/

    [root@localhost dir]# touch test.txt

    [root@localhost mnt]# cd dir/

    [root@localhost dir]# su - smbuser

    [smbuser@localhost ~]$ cd /mnt/dir/

    [smbuser@localhost dir]$ touch a

    [smbuser@localhost dir]$ ll

    total 0

    -rw-rw-r--+ 1 smbuser smbuser 0 Jun 10 07:38 a

    -rw-rw-r--+ 1 root    root    0 Jun 10 07:34 test.txt

    [smbuser@localhost dir]$ rm * -rf

    [smbuser@localhost dir]$

    下面的试验我们看到在dir下建立的文件或文件夹都自动的加上了default的权限

    [smbuser@localhost dir]$ touch test.txt

    [smbuser@localhost dir]$ getfacl test.txt

    # file: test.txt

    # owner: smbuser

    # group: smbuser

    user::rw-

    user:smbuser:rw-

    group::r-x #effective:r--

    mask::rw-

    other::r--

    [smbuser@localhost dir]$ mkdir testdir

    [smbuser@localhost dir]$ getfacl testdir/

    # file: testdir/

    # owner: smbuser

    # group: smbuser

    user::rwx

    user:smbuser:rw-

    group::r-x

    mask::rwx

    other::r-x

    default:user::rwx

    default:user:smbuser:rw-

    default:group::r-x

    default:mask::rwx

    default:other::r-x

    [smbuser@localhost dir]$ ll

    total 4

    drwxrwxr-x+ 2 smbuser smbuser 4096 Jun 10 07:43 testdir

    -rw-rw-r--+ 1 smbuser smbuser    0 Jun 10 07:41 test.txt

    六:总结

    从上面的例子可以看到,getfacl命令是用来读取文件的ACL, setfacl是用来设定文件的Acess ACL. 这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL. 他的用法很多, 这里只提及一下chacl  -B. 它可以彻底删除文件或者目录的ACL属性(包括Default ACL). 比如你即使用了setfacl -x 删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.所以正确的删除方法应该是用chacl -B

    用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告

    mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告

    如果用chmod命令改变Linux 文件权限的时候相应的ACL值也会改变.反之改变ACL的值,相应的文件权限也会改变

    这篇博客我先看了几篇相关内容,然后自己动手又做了完整的测试,已经实现了ACL的功能,希望看到的人也自己亲自测试一下,遇到跟着片博客不符的情况可以找资料解决,这样才能进步,才能提升自己的能力。

    阅读(415) | 评论(0) | 转发(0) |

    展开全文
  • linux acl详细介绍

    2021-05-16 14:17:02
    1. 为什么要使用ACL先让我们来简单地复习一下Linux的file permission.在linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者), group(组,注意不一定是文件拥有者所在的组), other ...

    1. 为什么要使用ACL

    先让我们来简单地复习一下Linux的file permission.

    在linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者), group(组,注意不一定是文件拥有者所在的组), other (其他)

    而对于每一类别又分别定义了read, write and execute/search permission (这里不讨论SUID, SGID以及Sticky bit的设置)

    通过ls -l命令就我们就可以列出一个文件的permission

    代码:# ls -l

    [leonard@localhost ~]$ ls -l

    -rw-rw---- 1 leonard admin 0 Jul3 20:12 test.txt

    在这里说明了对于test.txt这个文件leonard用户(由于是file owner)拥有read & write permission.所有属于admin group的用户(group)拥有read & write permission.其他任何用户(other)对于文件没有任何的permission

    如果我们现在希望john这个用户也可以对test.txt文件进行读写操作. 我自己大概会想到以下几种办法 (这里假设john不属于admin group)

    1. 给文件的other类别增加read and write permission. 这样由于john会被归为other类别,那么他也将拥有读写的权限

    2. 将john加入到admin group. 那么john会被归为group类别,那么他将拥有读写的权限

    3. 设置sudo, 使john能够以leonard的身份对test.txt进行操作,从而获得读写权限

    第一种做法的问题在于所有用户都将对test.txt拥有读写操作,显然这种做法不可取

    第二种做法的问题在于john被赋予了过多的权限.所有属于admin组的文件,john都可以拥有其等同的权限了

    第三种做法虽然可以达到只限定john用户一人拥有对test.txt文件的读写权限.但是需要对sudoers文件进行严格的格式控制. 而且当文件数量和用户很多的时候,这种方法就相当地不灵活了

    来好像都没有一个很好的解决方案. 其实问题就出在Linux file

    permission里面,对于other的定义过于广泛,以至于很难把permission限定于一个不属于file

    owner和group的用户身上. 那么Access Control List (ACL)就是用来帮助我们解决这个问题的.

    简单地来说ACL就是可以设置特定用户或者用户组对于一个文件的操作权限. 需要掌握的命令也只有三个: getfacl, setfacl, chacl

    在接下去讨论之前大家可以先安装上ACL的RPM包

    代码:

    # rpm -ivh libacl-2.2.39-1.1 acl-2.2.39-1.1.i386.rpm

    2. ACL的名词定义

    先来看看在ACL里面每一个名词的定义.这些名词我大多从man page上摘下来虽然有些枯燥,但是对于理解下面的内容还是很有帮助的

    ACL

    是由一系列的Access Entry所组成的. 每一条Access Entry定义了特定的类别可以对文件拥有的操作权限. Access

    Entry有三个组成部分: Entry tag type, qualifier (optional), permission

    我们先来看一下最重要的Entry tag type, 它有以下几个类型

    ACL_USER_OBJ: 相当于Linux里file_owner的permission

    ACL_USER: 定义了额外的用户可以对此文件拥有的permission

    ACL_GROUP_OBJ: 相当于Linux里group的permission

    ACL_GROUP: 定义了额外的组可以对此文件拥有的permission

    ACL_MASK: 定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 (这个我下面还会专门讨论)

    ACL_OTHER: 相当于Linux里other的permission

    让我们来据个例子说明一下. 下面我们就用getfacl命令来查看一个定义好了的ACL文件

    代码:

    [leonard@localhost ~]$ getfacl ./test.txt

    # file: test.txt

    # owner: leonard

    # group: admin

    user::rw-

    user:john:rw-

    group::rw-

    group:dev:r--

    mask::rw-

    other::r--

    前面三个以#开头的定义了文件名,file owner和group.这些信息没有太大的作用,接下来我们可以用--omit-header来省略掉

    user::rw-定义了ACL_USER_OBJ,说明file owner拥有read and write permission

    user:john:rw-定义了ACL_USER,这样用户john就拥有了对文件的读写权限,实现了我们一开始要达到的目的

    group::rw-定义了ACL_GROUP_OBJ,说明文件的group拥有read and write permission

    group:dev:r--定义了ACL_GROUP,使得dev组拥有了对文件的read permission

    mask::rw-定义了ACL_MASK的权限为read and write

    other::r--定义了ACL_OTHER的权限为read

    从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组的功能. 那么接下来我们就来看一下如何设置一个文件的ACL

    3. 如何设置ACL文件

    首先我们还是要讲一下设置ACL文件的格式. 从上面的例子中我们可以看到每一个Access Entry都是由三个被:号分隔开的字段所组成. 第一个就是Entry tag type

    user 对应了ACL_USER_OBJ和ACL_USER

    group 对应了ACL_GROUP_OBJ和ACL_GROUP

    mask 对应了ACL_MASK

    other 对应了ACL_OTHER

    第二个字段称之为qualifier.也就是上面例子中的john和dev组.它定义了特定用户和拥护组对于文件的权限.这里我们也可以发现只有user和group才有qualifier,其他的都为空

    第三个字段就是我们熟悉的permission了. 它和Linux的permission一样定义,这里就不多讲了

    下面我们就来看一下怎么设置test.txt这个文件的ACL让它来达到我们上面的要求

    一开始文件没有ACL的额外属性

    代码:

    [leonard@localhost ~]$ ls -l

    -rw-rw-r-- 1 leonard admin 0 Jul3 22:06 test.txt

    [leonard@localhost ~]$ getfacl --omit-header ./test.txt

    user::rw-

    group::rw-

    other::r--

    我们先让用户john拥有对test.txt文件的读写权限

    代码:[leonard@localhost ~]$ setfacl -m user:john:rw- ./test.txt

    [leonard@localhost ~]$ getfacl --omit-header ./test.txt

    user::rw-

    user:john:rw-

    group::rw-

    mask::rw-

    other::r--

    这时我们就可以看到john用户在ACL里面已经拥有了对文件的读写权限. 这个时候如果我们查看一下linux的permission我们还会发现一个不一样的地方

    [leonard@localhost ~]$ ls -l ./test.txt

    -rw-rw-r--+ 1 leonard admin 0 Jul3 22:06 ./test.txt

    在文件permission的最后多了一个+号.当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件.这个+号就是用来提示我们的

    我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义

    接下来我们来设置dev组拥有read permission

    代码:[leonard@localhost ~]$ setfacl -m group:dev:r-- ./test.txt

    [leonard@localhost ~]$ getfacl --omit-header ./test.txt

    user::rw-

    user:john:rw-

    group::rw-

    group:dev:r--

    mask::rw-

    other::r--

    到这里就完成了我们上面讲到的要求.是不是很简单呢

    4. ACL_MASK和Effective permission

    这里需要重点讲一下ACL_MASK, 因为这是掌握ACL的另一个关键

    在Linux file permission里面大家都知道比如对于rw-rw-r--来说, 当中的那个rw-是指文件组的permission. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立. 如果文件有ACL_MASK值,那么当中那个rw-代表的就是mask值而不再是group permission了

    让我们来看下面这个例子

    代码:

    [leonard@localhost ~]$ ls -l

    -rwxrw-r-- 1 leonard admin 0 Jul3 23:10 test.sh

    这里说明test.sh文件只有file owner: leonard拥有read, write, execute/search permission. admin组只有read and write permission

    现在我们想让用户john也对test.sh具有和leonard一样的permission

    代码:

    [leonard@localhost ~]$ setfacl -m user:john:rwx ./test.sh

    [leonard@localhost ~]$ getfacl --omit-header ./test.sh

    user::rwx

    user:john:rwx

    group::rw-

    mask::rwx

    other::r--

    这里我们看到john已经拥有了rwx的permission. mask值也被设定为rwx.那是因为它规定了ACL_USER, ACL_GROUP和ACL_GROUP_OBJ的最大值

    现在我们再来看test.sh的Linux permission,它已经变成了

    代码:

    [leonard@localhost ~]$ ls -l

    -rwxrwxr--+ 1 leonard admin 0 Jul3 23:10 test.sh

    那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢?它会被permission deny.原因在于实际上admin组的用户只有read and write permission.这里当中显示的rwx是ACL_MASK的值而不是group的permission

    所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的permission,以免发生混淆

    下面我们再来继续看一个例子

    假如现在我们设置test.sh的mask为read only,那么admin组的用户还会有write permission吗?

    代码:

    [leonard@localhost ~]$ setfacl -m mask::r-- ./test.sh

    [leonard@localhost ~]$ getfacl --omit-header ./test.sh

    user::rwx

    user:john:rwx#effective:r--

    group::rw-#effective:r--

    mask::r--

    other::r--

    这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r--,这是什么意思呢?

    让我们再来回顾一下ACL_MASK的定义.它规定了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限.那么在我们这个例子中他们的最大权限也就是read only.虽然我们这里给ACL_USER和ACL_GROUP_OBJ设置了其他权限,但是他们真正有效果的只有read权限.

    这时我们再来查看test.sh的Linux file permission时它的group permission也会显示其mask的值

    代码:

    [leonard@localhost ~]$ ls -l

    -rwxr--r--+ 1 leonard admin 0 Jul3 23:10 test.sh

    5. Default ACL

    上面我们所有讲的都是Access ACL,也就是对文件而言.下面我简单讲一下Default ACL. Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL

    同样我们来做一个试验说明

    比如现在leonard用户建立了一个dir目录

    代码:

    [leonard@localhost ~]$ mkdir dir

    他希望所有在此目录下建立的文件都可以被john用户所访问. 那么我们就应该对dir目录设置Default ACL

    代码:

    [leonard@localhost ~]$ setfacl -d -m user:john:rw ./dir

    [leonard@localhost ~]$ getfacl --omit-header ./dir

    user::rwx

    group::rwx

    other::r-x

    default:user::rwx

    default:user:john:rwx

    default:group::rwx

    default:mask::rwx

    default: other::r-x

    这里我们可以看到ACL定义了default选项, john用户拥有了default的read, write, excute/search permission.所有没有定义的default都将从file permission里copy过来

    现在leonard用户在dir下建立一个test.txt文件

    代码:

    [leonard@localhost ~]$ touch ./dir/test.txt

    [leonard@localhost ~]$ ls -l ./dir/test.txt

    -rw-rw-r--+ 1 leonard leonard 0 Jul3 23:46 ./dir/test.txt

    [leonard@localhost ~]$ getfacl --omit-header ./dir/test.txt

    user::rw-

    user:john:rw-

    group::rwx#effective:rw-

    mask::rw-

    other::r--

    这里我们看到在dir下建立的文件john用户自动就有了read and write permission

    6. ACL相关命令

    前面的例子中我们都注意到了getfacl命令是用来读取文件的ACL, setfacl是用来设定文件的Acess ACL.这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL.它的具体参数大家可以去看man page.我只想提及一下chacl -B.它可以彻底删除文件或者目录的ACL属性(包括Default ACL).比如你即使用了setfacl -x删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.所以正确的删除方法应该是用chacl -B

    用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告

    mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告

    7. 需要注意的几点

    如果你的文件系统不支持ACL的话,你也许需要重新mount你的file system

    mount -o remount, acl [mount point]

    如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变.反之改变ACL的值,相应的file permission也会改变

    展开全文
  • ACL – 权限控制

    2021-04-26 12:51:19
    在身份认证中,我们已经知道了人是谁,现在这里就介绍yangzie如何控制这些人能做什么,yangzie是基于ACL来实现授权功能的,那么这里需要先阐明几个概念:1.1.Access Control ObjectACO访问控制对象,也就是ARO要请求...

    1.权限控制

    权限控制顾名思义就是控制什么“人”能(不能)访问什么(“操作”)。在身份认证中,我们已经知道了人是谁,现在这里就介绍yangzie如何控制这些人能做什么,yangzie是基于ACL来实现授权功能的,那么这里需要先阐明几个概念:

    76b73c91f2be00f2fa7ab341cbcfbaf6.png

    1.1.Access Control Object

    ACO访问控制对象,也就是ARO要请求访问的对象,在yangzie中也就是M/C/A(见yangzie基本原则),每个具体的ACO也有一个标识,就按照M/C/A的格式进行标识,比如order模块下面的增加订单add,假如他都组织在index控制器下(index_controller),action为add;那么该ACO的标识就是:/order/index/add;

    根据具体的业务要求,ACO可以定义到某个具体的Action级别,或者Controller级别或者整个module级别

    1.2.Access Request Object

    ARO访问请求对象,也就是要请求ACO的对象,通常他指“人”,各种各样的类型的人,每种“类型”有一个唯一的标识,用于区别一类人,比如某种角色的,也可以唯一标识一个人;

    这个标识yangzie的设计是从大类/小类/具体某个用户id然后以/进行分割,举个例子,假如系统中存在这这几种角色,超级管理员,普通管理员,销售;可能这几种角色的ARO标识看起来是这个样子:

    超级管理员:/admin/root

    普通管理员:/admin/normal

    销售:/salesman

    管理员A:/admin/normal/12344

    为什么要这样设计,是因为在进行授权时可以把权限分配给组或者具体某个类型或者具体某个人;然后具体的某个用户,如上面的管理员A,在验证权限时,再从具体id到大类来逐一验证,直到找到具体的权限是允许还是拒绝为止。

    1.3.ACL

    ARO和ACO分别定义了“操作”和“人”,那么剩下的就是把这两个关联起来,从而达到什么人能访问什么的目的;这个关联的地方就是AccessControlList;在yangzie中它是一个配置文件,位于app/__aros_acos__.php;默认的内容如下:

    function yze_get_aco_desc($aconame) {

    foreach ( ( array ) yze_get_acos_aros () as $aco => $desc ) {

    if (preg_match ( "{^" . $aco . "}", $aconame )) {

    return @$desc ['desc'];

    }

    }

    return '';

    }

    function yze_get_ignore_acos() {

    return array();

    }

    function yze_get_acos_aros() {

    $array = array (

    "/" => array (//module/controller/action

    "deny" => "",

    "allow" => array (

    "*" //aro

    ),

    "desc" => ""//功能说明

    )

    );

    return $array;

    }

    该文件主要包含3个函数:

    yze_get_acos_aros:该方法返回ACL列表

    yze_get_ignore_acos:该方法返回忽略权限控制的ACO,当ARO请求这些内容时忽略权限控制

    yze_get_aco_desc: 助手方法,返回ACO功能的描述,

    2.ACL的格式

    ACL是一个数组,格式如下:

    array (

    "ACO1 name" => array (

    "deny" => "",//拒绝的ARO

    "allow" => array (

    "*" //允许的ARO

    ),

    "desc" => ""//ACO功能说明

    ),

    "ACO2 name" => array (

    "deny" => "",//拒绝的ARO

    "allow" => "*", //允许的ARO,

    "desc" => ""//ACO功能说明

    ),

    );

    ACO name是ACO的标识,根据权限控制的级别可以具体定义到Action级别,或者只定义到Module级别;

    deny定义黑名单,拒绝里面列出的ARO的访问;allow定义白名单,允许里面列出的ARO

    ACL定义规则

    ACO和ARO都可以使用正则表达

    黑名单优先级大于白名单

    两者都可以采用”*”来代表所有

    如果要指定具体的aro,deny和allow中以数组的形式列出ARO

    一个真实的例子:

    function yze_get_ignore_acos() {

    return array(

    "/card/front",

    "/package/package/grab",

    "/package/package/grabfail",

    "/package/front",

    "/zb/middlepage/view",

    "/wxbbs/front",

    "/zbad/front",

    );

    }

    function yze_get_acos_aros() {

    $array = array (

    "/admin" => array (

    "deny" => "*",

    "allow" => array (

    "/admin"

    ),

    "desc" => "后端管理"

    ),

    "/sp/consumers" => array (

    "deny" => "*",

    "allow" => array (

    "/sp"

    ),

    "desc" => "粉丝管理"

    )

    );

    if (YDWXP_TYPE == YDWXP_TYPE_MARKET || YDWXP_TYPE == YDWXP_TYPE_ALL) {

    $array ['/card'] = array (

    "deny" => "*",

    "allow" => array ("/sp"),

    "desc" => "卡券管理"

    );

    $array ['/card/card/*consume'] = array (

    "deny" => "*",

    "allow" => array ("/sp"),

    "desc" => "卡券核销"

    );

    $array ['/card/merchants'] = array (

    "deny" => "*",

    "allow" => array ("/sp/super","/sp/common"),

    "desc" => "商户管理"

    );

    }

    return $array;

    }

    3.ARO怎么定义

    ACO是根据M/C/A来定义的,这很明确和具体,但ARO标识怎么根据用户来定义?这也是通过hook来实现的,在app/hooks/auth.php中已经定义注册了该hook,开发者只需要实现即可,这里有一个真实的例子:

    YZE_Hook::add_hook ( YZE_FILTER_GET_USER_ARO_NAME, function ( $data ) {

    if ( !@$_SESSION [ 'admin' ] )return "/";

    if(is_a($_SESSION['admin'], "\\app\\sp\\Consumer_Model")){

    return "/consumer";

    }

    if($_SESSION [ 'admin' ]->sp_id) {

    //是否子商户

    if ( ! isset($_SESSION [ 'is_sub_merchant' ]) ) {

    $_SESSION [ 'is_sub_merchant' ] = YZE_Hook::do_hook(YDMARKET_IS_SUB_MERCHANT, $_SESSION [ 'admin' ]->sp_id);

    }

    if ($_SESSION [ 'is_sub_merchant' ]) {

    return "/".$_SESSION [ 'admin' ]->user->type."/sub/".$_SESSION [ 'admin' ]->type;

    }

    }

    return "/".$_SESSION [ 'admin' ]->user->type."/".$_SESSION [ 'admin' ]->type;

    } );

    根据自己的业务系统的用户类型,自行设计自己的ARO标识接口。

    4.能灵活的配置权限吗?

    ACL列表属于事先硬编码的控制列表,但在实际的业务环节中很多权限都是需要动态分配的,比如给某中角色设置权限,给具体某个人设置权限;这在yangzie中如何做呢?

    yangzie有两个预留函数get_permissions($aroname),get_user_permissions();

    这两个函数由开发者实现,分别返回指定aroname的acl或者返回某个具体用户的acl,这通常是具体的业务要求决定的,返回的仍然是acl数组结构。这两个函数放在任意的自动包含文件中(见__config__.php说明),但要注意

    这两个函数必须属于顶级命名空间

    当有这两个函数的实现时,他们的返回结果将覆盖ACL里面的控制

    5.ACL的效果是什么

    当配置好ACL后,如果一个用户访问被deny的内容,如某个action,某个controller或者某个module;yangzie将会抛出YZE_Permission_Deny_Exception异常,开发者可以通过hook YZE_FILTER_YZE_EXCEPTION来监听然后做响应的处理,默认情况下将显示500页面;

    这就是说yangzie会根据ACL来验证用户的权限,如果用户没有权限就会立即抛出异常,这在进入开发者的业务逻辑之前就已经处理,开发者无需在自己的功能代码中去验证当前用户是谁,是否有权限方法;开发者就只关注自己的业务逻辑即可。

    6.GET和POST的特殊情况

    yangzie的Action包含两种情况,get方式和post方法,比如一个增加用户的例子,假如M/C/A是:users/index/add;那么他对应的post action就是users/index/post_add,会多一个post前缀,如果在ACL需要针对这两种情况单独控制,比如允许get但不允许post,也就是允许看,但不允许提交,那在ACL中需要分配针对两个action(add,post_add)进行处理

    7.如何通过ACL来控制输出

    在实际的业务系统中,通常需要根据权限来控制输出的响应中某些部分用户可见,某些部分用户不可见,那么这可以通过两种方式来实现。

    方法一:通过YZE_ACL::get_instance()->check_byname($aroname, $aconame)来判断并输出

    if(YZE_ACL::get_instance()->check_byname($aroname, $aconame)){

    // your output html

    }

    方法二:通过YZE_ACL::get_instance()->begin_check_permission($id, $aroname, $aconame)….YZE_ACL::get_instance()->end_check_permission($id, $aroname, $aconame)来输出

    YZE_ACL::get_instance()->begin_check_permission($id, $aroname, $aconame)

    // your output html

    YZE_ACL::get_instance()->end_check_permission($id, $aroname, $aconame)

    根据你的习惯来选择,如果你不喜欢跨度很大的if(){},那用第二种方式是个好选择

    展开全文
  • POSIX ACL详解

    千次阅读 2018-07-18 10:36:47
    一、 为什么要使用ACL 先让我们来简单地复习一下Linux的文件权限。 在 linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者),group(组,注意不一定是文件拥有者所在的组), other ...
  • ACL的基本原理ACL过滤原理ACL命令1、标准ACL2、扩展ACL3、命名ACL4、将ACL表应用到接口上5、查看列出所有ACL表 接上(点我前往) ACL过滤原理 ACL表格式: 条件 动作 XXX permit/deny ACL表配置完毕后,...
  • 在前两篇博客中,我们分别介绍文件的基础权限和特殊权限,也一直在强调权限的重用性,但是传统的权限仅有三种身份(ower、group、others)搭配读、写、执行(r、w、x)三种权限...这时我没就不得不使用ACL(访问控制列表...
  • ACL及NAT

    2021-03-19 13:36:26
    ACL(访问控制列表) 读取第三层,第四层包头信息 根据预先定义好的规则对包头进行过滤 访问控制列表在接口应用的方向 出口:已经经过路由器的处理,正离开路由器接口的数据包 入口:已经到达路由器接口的数据 包...
  • 如果不想让显示则可以使用chacl -B 用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告 mv命令将会默认地移动文件的ACL属性. 同样如果操作...
  • 华为设备的ACL

    千次阅读 2019-04-20 15:03:16
    ** 实验题目和需求 ACL(Access Control List)就是为了控制访问权限,是应用在路由器接口的指令列表。 直接给个图吧,题目写在了图中。...2.R1只许网管设备远程,所以ACL应该除了网管设备其他都应该屏...
  • ACL拓展扩展ACL(100--199)建立扩展ACL的操作步骤:1)建表2).用表 扩展ACL(100–199) 总结扩展ACL访问列表语法: Router(config)#access-list 100 permit (IP) 大协议 源...扩展列表控制OSI七层模型的第三
  • ACL与NAT

    2021-12-09 18:37:46
    一、ACL 1.1.ACL的作用 1.2.ACL的工作原理 1.3.ACL种类: 1.4.应用规则 1.5.acl的配置 二、NAT 2.1.NAT的工作原理 2.2.NAT的功能以及优缺点 2.2.1.NAT的功能 2.2.2.NAT优缺点 2.3.静态NAT 2.3.1.静态NAT...
  • ACL原理、NAT

    2021-12-09 20:17:40
    1、ACL原理 2、ACL两种作用 3、访问控制列表(ACL) 4、ACL种类 5、ACL(访问控制列表)的应用原则 6、应用规则 7、ACL指令配置 1、NAT简概 2、NAT的工作原理 3、NAT功能 4、静态NAT 5、NAT配置 1、...
  • Spring Security(19)——对Acl的支持

    千次阅读 2017-06-17 10:32:37
    Acl的全称是Access Control List,俗称访问控制列表,是用以控制对象的访问权限的。其主要思想是将某个对象的某种权限授予给某个用户,或某种GrantedAuthority(可以简单的理解为某种角色),它们之间的关系都是多对...
  • linux中的ACL权限

    2021-05-10 10:18:46
    在Linux的权限中只有所有者,所属组和其他人三类,...为避免别的人员看到教学目录里的内容,其他人权限设为0,现在又来了一个试听学员,只想给读和执行权限,不给写权限,这时三类权限就满足不了我们的需求了,ACL...
  • acl

    2017-02-14 11:57:19
    1. 为什么要使用ACL 先让我们来简单地复习一下Linux的file permission. 在linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者), group(组,注意不一定是文件拥有者所在的组),...
  • ACL

    2016-04-17 12:27:31
    LINUX ACL 学习笔记 一、 为什么要使用ACL先让我们来简单地复习一下Linux的文件权限。在 linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者),group(组,注意不一定是文件...
  • 原标题:Linux权限管理之ACL权限最全解读Linux权限管理是Linux很重要的一项内容,重则引起用户信息泄露,轻则导致文件错乱和丢失。企业服务器里有些目录下面的东西暂时保密,不希望别人可以进入目录并查看。有些文件...
  • linux acl详细讲解

    2021-05-17 18:48:22
    Linux ACL 详细讲解用户权限管理始终是 Unix 系统管理中最重要的环节。大家对 Linux/Unix 的 UGO 权限管理方式一定不陌生,还有最常用的 chmod 命令。为了实现一些比较复杂的权限管理,往往不得不创建很多的组,并...
  • 整理 | 夕颜出品|AI科技大本营(ID:rgznai100)【导读】11 月 25 日,ACL Fellow官网公布了 2019 ACL Fellow 5 位入选名单,其中来自中...
  • #tune2fs-o+acl/dev/sdb1 现在,通过运行以下命令来动态修改选项: #mount-o remount,acl/app 再次运行 tune2fs 命令来看选项中是否有 acl 了: #tune2fs-l/dev/sdb1|grepoptions Defaultmountoptions:acl 嗯,...
  • ACL 知识梳理

    2021-04-30 21:31:08
    ACL (Access Control List) 访问控制列表 1. ACL 是一种包过滤技术。 2. ACL 是基于 IP 包头的 ip 地址,四层(TCP/UDP)头部的端口号,【5 层数据】 3. ACL 在路由器上配置,也可以在防火墙上配置(一般称之为策略...
  • 04-Linux系统ACL控制

    2021-05-19 04:37:33
    设定acl只能是root管理员用户. 相关命令: getfacl , setfaclacl基本用法//环境准备[root@localhost ~]# cp /etc/passwd /root/passwd//文件在没有设定acl, 看到的和传统权限是一样[root@localhost ~]# ll passwd-rw-...
  • AWS security group 和 network ACL都定义了网络访问规则,用于控制哪些inbond和outbond traffic被允许或者被禁止。不同之处在于: AWS security group:应用于主机的流量访问控制。同一个security group可以跨不同...
  • 就如实验1,PC1无法与PC3通信,但是可以和PC4通信。 简单理解:有deng时,就要用到inbound(拒绝) permit时,就要用到 outbound(允许) 关于inbound和outnound简单理解 (inbound)是用来有拒绝,无法访问这类的问题。 ...
  • 演示setfacl (我本地已经创建个zhangsan、lisi两个用户) 1、相信zhangsan是不能修改install.log文件的,那我怎么让可以修改呢?[root@centos /]# setfacl -m u:zhangsan:rw /install.log [root@centos /]...
  • acl权限

    2019-10-01 13:04:12
    ACL权限 引言 前面的内容中,我们讲到传统的权限仅有三种身份(owner,group,others)搭配三种权限(r,w,x)以及三种特殊的权限(SUID,SGID,SBIT),随着应用的发展,这些权限组合已不能适应现在复杂的文件系统权限控制...
  • ACL的运用

    2019-10-28 15:09:18
    ACL的运用 –IP ACL(IP访问控制列表或IP访问列表)是实现对流经路由器或交换机的数据包根据一定的规则进行过滤,从而提高网络可管理性和安全性. —IP ACL分为两种: 标准IP访问列表和扩展IP访问列表. —当做完access-...
  • ACL 权限

    2019-06-16 13:24:37
    文章目录一、简介与开启1.1简介1.2 开启 ACL 权限1.2.1 临时开启1.2.2 永久开启二、查看与设定2.1 设定 ACL 权限2.2 查看文件的 ACL 权限三、最大有效权限四、删除 ACL 权限五、递归 ACL 权限六、默认 ACL 权限 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,993
精华内容 8,797
关键字:

他acl