首页 > 代码库 > Linux之权限管理

Linux之权限管理

一、文件基本权限

1) 基本权限的修改

第一位“-”为文件类型(-代表文件;d代表目录;l代表软链接文件即快捷方式),后面每3位一组。

-rw-r--r--

rw-   u所有者

r--   g所属组(相同身份、相同权限)

r--   o其他人

r读 w写 x执行

1、 chmod命令

chmod [选项] 模式 文件名

选项

-R:递归

           模式

                            [ugoa][+-=][rwx]

                            [mode=421]

2、 修改权限的方式

chmod  u+x test.txt(给所有者执行权限)

chmod g+w,o+w test.txt(给所属组和其他人写权限。)

chmod a=rwx text.txt(给所有全部的人读、写、执行权限。)

chmod u-x cangls.av(取消所有者的执行权限。)

chmod g-w,o-w cangls.av(取消所属组和其他人的写权限。)

3、 权限的数字表示

r----4

w----2

x----1

rwxr-xr-x

7  5  5

2) 权限的作用

1、权限对文件的作用

r:读取文件内容(cat  more  tail  head)

w:编辑、新增、修改文件内容(vi  echo)

#但是不包括删除文件

x:可执行

注:

为什么文件有写权限不代表有删权限?因为文件名存在目录储存块(block)里(Linux中一切皆文件),文件数据存在文件储存块里,要删除文件数据,意味着要删除文件名,而文件名储存位置在更高一级(目录中),所以没有删除权限。要想进行删除操作,必须对目录储存块进行操作。

文件夹<----文件<----文件数据

2、权限对目录的作用

r:可以查询目录下文件名  (ls)

w:具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(touch rm mv cp)

x: 可以进入目录   (cd)

总结:

对文件来讲 最高权限是x

对目录来讲 最高权限是w

注:对目录来讲赋予权限,就只有0,5,7,赋其他的权限没有意义。因为只有执行权限才可以进入这个目录,不赋予执行权限其他权限都没有意义,例如:赋4,1,6都是没有意义的权限

3) 其他权限命令

1、 修改文件的所有者

chown 用户名 文件名

例如:chown ds abc.txt

2、 修改文件的所属组

chgrp 组名 文件名

例如:chgrp group1 abc.txt

chown root:root 123

等价于

chown root 123  chgrp root 123

分配文件基本权限时,核心原则:在最小权限情况下能够实现要求即可。

 

二、文件默认权限

1) 查看默认权限的命令

umask

查看默认权限

0022

第一位0:文件特殊权限

022:文件默认权限

2) 文件的默认权限

#文件默认不能建立为执行文件,必须手工赋予执行权限

#所以文件默认权限最大为666

#默认权限需要换算成字母再相减

#建立文件之后的默认权限,为666减去umask值

例如:

文件默认最大权限666  umask值022

-rw-rw-rw-  减去  -----w--w-  等于  -rw-r--r--

例如:

文件默认最大权限666  umask值033

-rw-rw-rw-  减去  -----wx-wx  等于  -rw-r--r--

3) 目录的默认权限

#目录默认权限最大为777

#默认权限需要换算成字母再相减

#建立文件之后的默认权限,为777减去umask值

例如:

文件默认最大权限777  umask值022

-rwxrwxrwx  减去  -----w--w-  等于  -rw-r--r--

4) 修改umask值

临时修改

[root@localhost ~]# umask 0002

永久修改

[root@localhost ~]# vi /etc/profile(该文件称为环境变量配置文件)

三、ACL权限

1) ACL权限简介与开启

1、 ACL权限简介

在linux中文件和文件夹的用户身份就这三个:

所有者、所属组、其他权限。

有时候三个身份不够用,这时候就需ACL权限用来解决用户身份不足的问题。

2、 查看分区ACL权限是否开启

首先我们查看有哪些分区

[zm@localhost ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda3              16G  2.4G   13G  16% /

tmpfs                 935M  228K  935M   1% /dev/shm

/dev/sda1             291M   37M  240M  14% /boot

/dev/sda2             251M   45M  165M  23% /home

其中tmpfs是一种基于内存的文件系统。根分区是sda3

[root@localhost ~]# dumpe2fs -h /dev/sda3

#dumpe2fs命令时查询指定分区详细文件系统信息的命令

选项:

-h  仅显示超级块中信息,而不显示磁盘块的详细信息。

执行中该命令,显示出来的超级块中可以看到有一行

Default mount option :user_xattr acl

从中可以看到包含了acl权限,说明分区支持ACL权限,可以使用ACL命令

3、 临时开启分区ACL权限

[root@localhost ~]# mount -o remount,acl /

#重新挂载根分区,并挂载加入acl权限

4、 永久开启分区ACL权限

[root@localhost ~]# vi /etc/fstab

#该文件会影响linux系统的启动,千万谨慎修改。

UUID=c2ca6f57-b15c-43ea=bca0-f239083d8bd2  /  ext4

Defaults,acl  1(启动是否需要检测) 1(启动是否需要备份)

#加入acl

 

[root@localhost ~]# mount -o remount /

#重新挂载文件系统或重启系统,使修改生效

2) 查看与设定ACL权限

1、 查看ACL命令

[root@localhost ~]# getfacl 文件名     //查看acl权限

# file:av

# owner:tony

# group:stu

user::rwx(所有者)

user:lw:r-x

group::rwx(所属组)

mask::rwx

other::---(其它人)

2、 设定ACL权限的命令

[root@localhost ~]# setfacl 选项 文件名     //设定ACL权限的命令;

选项:

-m:设定ACL权限;

-x:删除指定的ACL权限;

-b:删除所有的ACL权限;

-d:设定默认ACL权限;

-k:删除默认ACL权限;

-R:递归设定ACL权限;

3、 给用户设定ACL权限

[root@localhost ~]# useradd tony

[root@localhost ~]# groupadd stu

[root@localhost ~]# mkdir /av

[root@localhost ~]# chown tony:stu /av

[root@localhost ~]# chmod 770 /av

[root@localhost ~]# useradd lw

[root@localhost ~]# setfacl –m u:lw:rx /av

#给用户st赋予r-x权限,使用“u:用户名:权限”格式

4、 给用户组设定ACL权限

[root@localhost ~]# groupadd tgroup2(添加一个组)

[root@localhost ~]# setfacl -m g:tgroup2:rwx /av

#为组tgroup2分配ACL权限。使用“g:组名:权限”格式

3) 最大有效权限与删除ACL权限

1、 最大有效权限mask

mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和

mask的权限“相与”(逻辑与运算)才能得到用户的真正权限

#逻辑与运算:

A

B

and

r

r

r

r

-

-

-

r

-

-

-

-

 

2、 修改最大有效权限

[root@localhost ~]# setfacl -m m:rx 文件名

#设定mask权限为r-x。使用“m:权限”格式

3、 删除ACL权限

[root@localhost ~]# setfacl -x u:用户名 文件名

#删除指定用户的ACL权限

[root@localhost ~]# setfacl -x g:组名 文件名

#删除指定用户组的ACL权限

[root@localhost ~]# setfacl -b 文件名

#删除文件所有的ACL权限

4) 默认ACL权限和递归ACL权限

1、 递归ACL权限

①    递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。

②    setfacl -m u:用户名:权限 -R 目录名。

③    递归权限仅能赋予目录,不能赋予文件。

2、 默认ACL权限

①    默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。

②    setfacl -m d:u:用户名:权限 -R目录名。

 

四、文件特殊权限

1) SetUID

1、 功能

#只有可以执行的二进制程序才能设定SUID权限

#命令执行者队该程序拥有x(执行)权限

#命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件属主)

#SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

#如果对这个文件没有执行权限,然后赋予SetUID权限,s会变成大S。

[root@localhost ~]# chmod 4644 abc

[root@localhost ~]# ll

-rwSr--r--. 1 root root  1498  7月 1  12:02  abc

#在SetUID权限里,大S是不能正确使用的。

2、 设定SetUID的方法

  • 4代表SUID

         #chmod 4755 文件名

         #chmod u+s 文件名(u代表所有者,s代表SetUID)

         #chmod 0755 文件名(取消SUID权限)

         #chmod u-s 文件名

  • u所有者

g所属组(相同身份、相同权限)

o其他人

u+s:SUID权限

g+s:GUID权限

o+s:SBIT

3、 举例

[root@localhost ~]# ll /etc/shadow   (保存所有用户密码的文件)

----------. 1 root root  1498  7月 1  12:02  /etc/shadow

#权限都为零,可见只有root用户和超级用户才能查看、修改这个文件。

#但普通用户可以修改自己的密码,shadow权限又是零,是怎么做到的呢?

[root@localhost ~]# ll /usr/bin/passwd 

-rwsr-xr-x. 1 root root /usr/bin/passwd

#原因就是passwd这个指令有SetUID权限,权限范围可以看出任何用户都有执行权限。任何用户在执行该命令的时候,会以root身份或者所有者身份来执行。

#也就是说,只有文件具有SetUID权限,命令执行时当前用户身份才会切换到文件的所有者身份(类似灵魂附体)

#既然这样,那不就能修改其他用户的密码了吗?

#实际上linux限制了 passwd后面不能加其他参数,只有根用户才能指定用户名称。普通用户输入passwd 直接回车,修改当前用户的密码

 

                 #cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容

                 [root@localhost ~]# ll /bin/cat

-rwxr-xr-x 1 root root  47976  6月 22  2017  / bin/cat

4、 危险的SetUID

#关键目录应严格控制写权限。比如“/”、“/usr”等

#用户的密码设置要严格遵守密码三原则(复杂性、易记忆性、时效性)

#对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

参考下面SUID与SGID检测脚本:

#!/bin/bash

find / -perm -4000 -o -perm -2000 > /tmp/setuid.check

#搜索系统中所有拥有SUID和SGID的文件,并保存到临时目录中

for i in $(cat /tmp/setuid.check)

#做循环,每次循环取出临时文件中的文件名

do

    grep $i /root/suid.log > /dev/null

    #比对这个文件名是否在模板文件中

    if[ "$?" != "0" ]

    #检测上一个命令的返回值,如果不为0,证明上一个命令报错

then

    echo "$i isn‘t in listfile!" >> /root/suid_log_$(data+%F)

    #如果文件名不在模板文件中,则输出错误信息,并把错误写到日志中

 

     fi

done

 

rm -rf /tmp/setuid.check

#删除临时文件

 

 

2) SetGID

1、 SetGID针对文件的作用

只有可执行二进制程序才能设定SGID权限

命令执行者要对该程序拥有x(执行)权限

命令执行执行程序时,组身份升级为该程序文件的属组

SetGID权限只在程序执行过程中有效

[root@localhost ~]# ll /usr/bin/locate 

-rwx--s--x 1 root slocate   /usr/bin/locate

 

[root@localhost ~]# ll /var/lib/mlocate/mlocate.db 

-rw-r----- 1 root slocate   /var/lib/mlocate/mlocate.db

#/usr/bin/locate是可执行二进制程序,可以赋予SGID

#执行用户lamp对/usr/bin/locate命令拥有执行权限

#执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对

/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库

#命令结束,lamp用户的组身份返回为lamp组

2、 SetGID针对目录的作用

普通用户必须对此目录必须拥有r和x权限,才能进入此目录

普通用户在此目录中的有效组会变成此目录的属组

若普通用户对此目录拥有w权限,新建的文件的默认属组是这个目录的属组

3、 设定SetGID

  • 2代表SGID

chmod g+s 文件名

chmod 2755 文件名

4、 取消SetGID

chmod g-s 文件名

chmod 0755 文件名

3) Sticky BIT

1、 SBIT粘着位作用

  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有w和x权限,即普通用户可以在此目录有写入权限
  • 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

2、 设置粘着位

chmod 1755 目录名

chmod o+t 目录名

3、 取消粘着位

chmod 0777 目录名

chmod o-t 目录名

注:如果没有特殊需求,特殊权限尽量少修改,特别是SetUID和SetGID。

 

五、不可改变位权限

1) chattr命令

charrt [+-=] [选项] 文件名或目录名

[+-=]

+:增加权限

-:删除权限

=:等于某权限

[选项]:常用的选项包括i和a

i(insert):将此文件锁定

如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不能建立和删除文件。

a(append):冻结此文件

如果对文件设置a属性,那么只能在文件中增加数据,但不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但不允许删除。(添加内容只能用 echo >>输出重定向到文件中;禁止用vi,因为不能判断是修改还是增删内容)

2) 查看文件系统属性

lsattr 选项 文件名

选项:

-a 显示所有文件和目录

-d 若目标是目录,仅列出目录本身的属性,而不是子文件的

六、sudo权限

1) sudo权限

1、root把本来只能超级用户执行的命令赋予普通用户执行

2、sudo的操作对象是系统命令

2) sudo使用

1、[root@localhost ~]# visudo  

#实际修改的是/etc/sudoers文件

 

2、运行上述命令,其中有这么一句话

##Allow root to run any commands anywhere

##Allows people in group wheel to run all commands

root  ALL=(ALL)  ALL

#用户名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)

3、 举例1

普通用户(如usr1)是不能执行shutdown命令的。授权普通用户可以重启服务器

[root@localhost ~]# visudo

#在最后面添加以下命令,保存退出

user1  ALL=(ALL) /sbin/shutdown –r now(写的越详细,权限越小)

[root@localhost ~]# su -user1

[root@localhost ~]$ sudo -l(查看可用的sudo命令)

[user1@localhost ~]$ sudo /sbin/shutdown -r now

#普通用户执行sudo赋予的命令

举例2

授权普通用户可以添加其它用户

[root@localhost ~]# visudo

#在最后面添加以下命令,保存退出。授予用户设定密码的权限

user1  ALL=(ALL) /usr/sbin/useradd

user1  ALL=(ALL) /usr/sbin/passwd

                 [user1@localhost ~]$ sudo /usr/sbin/useradd 用户名

                 [user1@localhost ~]$ sudo /usr/sbin/passwd 用户名

           这样授予的权限是很危险的,如果passwd后面不加用户名会以root身份执行

命令,需写详细点,如:

user1 All=/usr/bin/passwd

[A-Za-z]*,  !/usr/bin/passwd "",  !/usr/bin/passwd  root

#该命令中间注意空格,顺序不能颠倒。第一个是正则表达式,第二个感叹号是

取反的意思,双引号里面空格是表达passwd后面不能有空格。

4、# %wheel  ALL=(ALL)  ALL

#%组名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)

Linux之权限管理