系统默认权限的设定
我们已经学习了文件权限的相关基本内容,包括如何查看,如何修改,以及针对不同用户主体怎样修改。
但是,有没有考虑过,当我们新建一个文件或者文件夹时,并没有设定关于权限的任何参数,那么它的权限是多少呢?又是从哪里来呢?
我们可以很容易的看到,新建文件的权限是644,而新建目录的权限是755.(喜欢用数字代表权限……)
为什么会是755而不是其他权限?这些权限是从哪里来的呢?
Linux内有一种机制叫做系统默认权限,当我们执行新建操作时,文件权限就由此获得。
默认权限当然能更改,可以临时修改,也可以永久修改。
先用umask查看默认权限
权限等于022,那么跟755有什么关系呢?
文件满权限是rwxrwxrwx,也就是777,777-022=755
这当然不是生掰硬套了……umask代表的值是系统保留权限,满权限去除保留权限,就是现在新建文件夹时的默认权限啦。
同样利用umask命令可以临时修改保留权限
永久修改涉及到两个文件,/etc/bashrc和/etc/profile,必须两个文件同时修改。
修改后,执行source filename命令重新读取,就可以永久设定啦。
值得注意的是,虽然可以修改系统默认权限,但需要根据实际情况调整,毕竟开放权利越大,对系统安全性的挑战也越大。
文件的控制访问(acl列表)
acl = access control
指定特殊用户对特殊文件具有特殊权限
比如,我们之前建立的文件夹,要允许给xiaoxinxin执行和修改权限,就可以通过acl列表来实现。
常用的命令是getfacl和setfacl
getfacl filename 查看文件的访问列表
文件权限信息可以轻松读取到。
那如何实现刚刚说的那个小需求呢?给xiaoxinxin增加执行和修改权限?
你也许会说,把文件所有者改成xiaoxinxin不就行啦,再不济,给加到文件所有组也可以啊。
风险点在于:
1,当文件所有者更改后,其他用户读取这个文件会有影响。这个文件夹之前的所有者是root,其他普通用户无法读取其中的内容,当修改成xiaoxinixn之后,其他普通用户会有越权风险。
2,当文件所有组更改后,想象一下,原本root组的用户可以看到一些“机密文件”,执行一些“特殊操作”,把xiaoxinxin加到root组,是否意味着,他也可以进行同样的操作?
这两点风险,都是有关乎产品安全性的问题。
而acl列表的方式,相对于普通修改权限的方式,则解决了这种特殊情况。针对于特定文件(package)为特定用户(xiaoxinxin)提供特殊操作(增加执行和修改权限)
具体的设定方式是:
setfacl -m <u|g>:<username|groupname>:权限 文件|目录
-m #设定
u #用户
g #组
同样也可以对特定组增加对特定文件的特定操作,自己试试啦~
删除列表也是可以的,命令是:
setfacl -x <u|g>:<username|groupname> 文件|目录
假如给一个文件增加了多个acl列表,不想用的时候,难道要一个一个删么?
setfacl -b 文件|目录
一条搞定,你值得拥有。
文件权限列表中有一个属性叫做mask,是权限掩码,也就是能赋予用户的最大权限,这个值当然也是可以改变的,改过之后,再执行setfacl去添加的时候,权限只能大于等于权限掩码。
(effective 代表有效权限)
acl列表还有一个常用的性质在于,可以设定默认权限。
也就是说,给了xiaoxinxin对package文件夹的读写权限,当package文件夹中有新建的文件时,这个属性也能默认继承。
setfacl -m d:<u|g>:<username|groupname>:rwx 文件夹
特殊权限
普通的文件权限有三位:u位,g位,o位
特殊的文件权限也有三位:suid(冒险位),sgid(强制位),sticky(粘制位)
suid
运用目标:二进制可执行文件
结果:文件内所记录的程序产生的进程的所有人为文件所有人,与进程发起者无关。
设定方式: chmod u+s filename (又因为suid=4,所以数字修改方式是 chmod 4XXX filename)
sgid
运用目标:二进制可执行文件或目录
结果:
对二进制可执行文件,任何人运行该文件,程序产生的进程的所有组都是文件的所有组,和进程发起人的组无关。
对目录,目录中新建的所有文件的所有组都自动归属到目录的所有组之中,和文件建立者所在的组无关。
设定方式:chmod g+s filename (又因为sgid=2,所以数字修改方式是 chmod 2XXX filename)
sticky
运用目标:目录
结果:当一个目录上添加了t权限之后,目录中的文件只能被文件的所有者删除。
设定方式:chmod o+t directory (又因为sticky=1,所以数字修改方式是 chmod 1XXX driectory)