1.基本权限与对用户的权限管理
1.首先我们要想对用户进行权限管理,就要知道如何查看一个文件的权限,我们可以用ll命令或者ls -l 命令查看某个文件的权限,如下图:
我们可以看到使用ll命令列出了/app下文件的一些信息一共7列,这7列表示了/app下文件的详细信息:
?(1)第一列一共有11个字符,第一位显示的是文件类型,linux下文件一共分为7类:
1.- 普通文件
2.d 目录文件
3.b 块设备文件
4.c 字符设备
5.l 符号链接文件
6.p 管道文件
7.s 套件字文件
这是linux下7中不同的文件类型,然后接下来的9位就是我们将要介绍到的权限,这9位权限分为3组,每组3位,每位上有两种情况,如上图,第一组是rwx,代表的就是可读可写可执行,如果,r代表可读,如果是-就表示不可读,w代表可写,-代表不可写,x代表可执行,-代表不可执行。这三组权限第一组代表的是文件所有者即owner的权限,第二组代表的是文件所有组即group的权限,第三组代表的是其他人即other的权限。最后一个.表示的是启用selinux,这里不再赘述。
?(2)第二列只有一个数字,表示该文件的连接数,如上3就是表示该文件有三个链接。
?(3)第三列表示的是文件的所有者,即owner的名字,如上root即是表示该文件属于root这个用户。
?(4)第四列表示的是文件的所有组,即group的名字,如上root即是表示该文件属于root这个群组。
?(5)第五列表示的是文件的大小。
?(6)第六列表示文件的更新时间。
?(7)第七列表示文件名
??
2.现在我们引入一个概念:安全的上下文
??如果我们要复制/etc/passwd到目录/app下,我们需要哪些权限哪?这条复制命令是?cp /etc/passwd /app
?那么要想复制一个文件,我们首先要拥有使用cp这条命令的权限,如果我们根本没有权限使用cp命令,那复制根本无从谈起;其次,想要复制一个文件,我们要能够读这个文件,如果没不能够读这个文件,就没有了复制源,自然无法复制;最后我们还要能在目的地能够写,这样才能够复制文件。我们的一切操作都是需要权限进行控制,这个就叫做安全的上下文。
??
3.具体什么权限能够实现的操作呢?
??我们对文件能够实现的操作无非就是读,写,执行,以及他们的组合权限:创建,删除,修改(能写自然就能修改);3位权限,无非就是r,w,x,rw,rx,wx,rwx这其中组合。虽然文件有7种,但我们将目录文件区分出来,下文中用目录代替目录文件,用文件代表其他文件。
??对文件来说:
????r权限:表示可以读该文件的内容,使用cat或者less。
????w权限:表示可以修改文件的内容,使用vim,vi等。
????x权限:无任何作用。
????rw权限:表示可以对文件进行读写操作。
????wx权限:相当于w权限,只能写。
????rx权限:表示可以读该文件并能执行他。
????rwx权限:表示可读,可写,可执行,为最高权限。
??
??对目录来说:
????r权限:表示可以短列出目录的内容(子文件名,子目录名)。
????w权限:无作用。
????x权限:可以进入该目录。
????rw权限:相当于r权限。
????rx权限:可以长列出目录的内容,可以进入目录。
????wx权限:可以创建,删除文件或目录。
????rwx权限:可以列出,创建,删除,进入目录。
??
4.那么如何修改权限,什么人有权利修改文件或者目录的权限呢?
??修改权限是通过chmod命令完成的。
对所有者权限修改 chmod u+/-r/x/w/rx/rw/wx/rwx +文件名
对群组权限修改 chmod g+/-r/x/w/rx/rw/wx/rwx +文件名
对其他用户权限修改 chmod o+/r/x/w/rx/rw/wx/rwx +文件名
? ?同时我们也可以用二进制的方法来表示文件的权限。对于每一组权限,每一位上只有两种可能,即是有或无,我们可以用1表示有,0表示无。就会是下面这样:
r-- 100 =4
\-w- 010 =2
\--x 001 =1
rw- 110 =6
r-x 101 =5
\-wx 011=3
rwx 111=7
\--- 000 =0
因为可以用数字可以来表示权限,那么我们就有了更简单的方法来改变文件的权限:
chmod 777 /app/house
或者chmod 数字表示的权限 加文件,这样可以一次性改变文件的所有权限。
? ?实验看看谁能够修改文件的权限,root用户是超级用户,是可以修改所有的权限的,此处不再实验。
? ?现在在创建用户liubei,guanyu,zhangfei,caocao,创建群组shuguo,设置群管理员为guanyu,设置组成员为liubei,guanyu,caocao;在app下创建目录test,修改权限为777,修改所属组为shuguo,切换用户为刘备,在/test下创建一个test.file,命令如下:
useradd liubei
useradd guanyu
useradd zhangfei
useradd caocao
groupadd shuguo
gpasswd -A guanyu shuguo
gpasswd -M liubei,guanyu,zhangfei
cd /app
mkdir test
chmod 777 test
su - liubei
cd /app/test
touch test.file
ll
结果如下图:
??现在liubei是test.file的owne,guanyu是群组sanguo的管理员,liubei,zhangfei,guanyu是shuguo的群成员,caocao是other现在测试owner,群组成员,群管理员,其他人能否修改test.file的权限。
liubei是owner:
guanyu是shuguo的群管理
zhangfei是shuguo的群成员
caocao不是shuguo的群成员
由此可知只有root和文件的所有者能修改文件的权限,别人谁都不能修改。
????
5.那么文件的所有者属于一个群组,但所有者自己没有权限读该文件,但是群组有权限读时,那么该用户能读吗?同时一个人属于群组,但群组没有读权限,其他人有读权限,那么能读吗?(实验当一个用户访问文件时,去和应用权限。)
??修改文件test.file的权限为070,命令如下
chmod 070 test.file
??liubei是test.file的owner
??修改文件test.file的权限为007,命令如下
chmod 007 test.file
??zhangfei是shuguo的组员
由此可以看出,当一个用户访问一个文件时,会首先判断该用户是不是owner,如果是,应用owner位权限,即是是群组成员,也不会应用group位权限,如果不是owner,则判断是不是群组成员,如果是,应用group位权限,不会应用other位权限,如果不是,应用other位权限。
6.umask
我们可以在test中创建几个文件和目录如下,并查看他们的权限,然后回到/app,同样创建几个文件和目录如下:
touch {1..5}
mkdir -p /a/b
ll
cd ..
mkdir -p /1/2/3
ll
cd 2
ll
cd 3
ll
??
??
??
??
??
我们可以发现文件的权限都是660,目录的权限都是771,这是为什么呢,在linux,创建文件时,时默认不能执行的,所以最高权限是666,目录的最高权限是777,我们用777-771=006;用666-660=006;运行umask,可以看到umask值就是006;
由此可知文件的默认权限是666-umask,目录的默认权限是777-umask。
??
现在设置umask的值为011,命令如下:
umask 011
创建一个目录can,创建一个文件ca;然后查看权限,命令如下:
mkdir can
touch ca
ll
??
??可以看到文件的权限是666,而目录的权限是766;我们会发现,666-011=655,这是为什么呢?655的权限是多少呢 是rw-r-xr-x,是可执行文件,而文件被创建时是不被允许可被执行的,所以当umask是1,3,5时,对应的位,应该加1,这样才能保证文件的不可执行。
??
7.特殊权限位s
??特殊权限位s可以作用在ower位上,即为sgid,也可以作用在group,即为sgid。
??suid:对于一个可执行文件作用了suid权限后,任何人执行该文件后,临时拥有其所有人的权限。
我们用命令touch来实验:首先查看touch权限是755,然后切换到liubei,创建文件liubei1.file;然后修改权限为750,切换到liubei下,创建文件liubei2.file;然后修改权限,加上u+s,切换到liubei,创建liubei3.file;修改权限为751,并加suid权限;切换到liubei,创建liubei4.file;最后修改权限为755,去掉suid权限;部分代码如下:
ll /bin/touch
su - liubei
touch liubei1.file
su
chmod 750 /bin/touch
su - liubei
touch liubei2.file
su
chmod u+s /bin/touch
su - liubei
touch liubei3.file
su
chmod 751 /bin/touch
chmod u+s /bin/touch
su - liubei
touch liubei4.file
结果如下:
????
创建liubei1.file
创建liubei2.file
创建liubei3.file
创建liubei4.file
??由此可以看出,liubei1.file,与liubei4.file是创建成功的,liubei3.file,liubei.2file没有创建成功,liubei1.file是因为liubei是other对touch有5权限,能够读touch内容,也能执行,所以能创建;liubei2.file不成功是因为other是0权限,liubei是other身份,自然不能创建;liubei3.file不成功的原因是liubei是other身份,我们先前介绍过安全的上下文,想要创建,首先能读touch,这里有suid权限,liubei临时获得了root的权限,所以可以读touch命令,然后要看对目的地有没有权限,最后看能不能用读到的touch写,这里liubei只有0权限,虽然读到touch,但是没有执行权限,所以无法创建;liubei4.file有root的读权限,自己也能执行touch,所以创建成功。
??sgid:1.当对一个可执行的二进制文件作用了sgid后,任何人在执行该文件时临时拥有其所有组的权限。
?????2.当对一个目录作用了sgid权限后,任何人在该目录下创建的文件的所属组,均与该目录的所属组相同。
??????
??1和suid相同,这里不再赘述,我们直接实验2;在/app下创建目录house,修改该目录的权限为777,然后加上sgid,权限,分别切换到liubei,guanyu,zhangfei下,在house下创建文件liubeitest1,guanyutest,zhangfeitest1,创建目录liubeitest1,guanyutest1,zhangfeitest1;查看所属组。代码如下:
cd /app
mkdir house
chmod g+s house
su - liubei
cd /app/house
mkdir liubeitest1
touch liubeitest2
su - guanyu
cd /app/house
mkdir guanyutest1
touch guanyutest2
su - zhangfei
cd /app/house
mkdir zhangfeitest1
touch zhangfeitest2
su
ll /app/house
其结果如下:
所有创建的文件和目录都没有继承其owner的主组,而是继承了house的所属组root。
????
8.特殊权限位t
??stisky:对一个目录作用了stisky权限,该目录下的文件仅其所有人和目录的所属人及root可以删除。
??将之前创建的所有文件删除;在/app下创建test目录,修改权限为777,然后刘关张分别创建目录liubei1,guanyu1,zhangfei1,文件liubei2,guanyu2,zhangfei2;然后切换到刘备下,删除所有,再创建回来,修改test权限为o+t,再切换到张飞,删除所有。部分代码如下。
chmod 777 /app/test
切换用户,创建文件目录;
su - liubei
rm -rf /app/test/*
切换用户,创建文件目录;
chmod o+t /app/test
su - zhangfei
rm -rf /app/test/*
注:将目录文件权限全改为754
其结果如下:
创建文件:
其他用户不能进入别人的目录:
zhangfei删除
重新建回来:
修改权限other位加t
关羽删除:
????
我们可以看到当不加t权限时,即使不能进入别人的目录,但却可以删掉别人的文件,但是加上t后,只能删除自己的文件,不能删除别人的文件。但是作为目录的所属人,是可以改变目录的权限的,这样他可以去掉t权限,所有可以修改别人的文件。
??
9.attr权限
attr权限是root用户为了限制自己权利而设置的特殊权限,但是自己是可以修改的;
???? chattr +a 表示不能删除,不能覆盖,可以追加
??? ?chattr+i 表示不能删除,不能覆盖,不能追加
lsattr 查看attr权限
去掉attr权限
????chattr -i
????chattr -a
因为工作很少用root,不再验证。
原文地址:http://blog.51cto.com/13412442/2148106