1. 文件权限概述

Linux中每个文件或目录都有一组共9个基础权限位,每三位字符被分为一组,他们分别是属主权限位(占三个字符)、用户组权限位(占三个字符)、其他用户权限位(占三个字符)。比如
rwxr-xr-x,正是这9个权限位来控制文件属主、用户组及其它用户的权限。可通过 ls -l 命令查看文件的权限。
Linux 基础权限 - 图1

2. 权限位说明

r read 可读权限 对应数字 4
w write 可写权限 对应数字 2
x (Execute,执行权限)对应数字1
-(没有任何权限)对应数字0

3. 上图的权限详解:

属主(Owner)权限: 可读、可写、可执行。 对应权限数字 4+2+1=7
用户组(Group)权限:可读、可执行。 对应权限数字 4+0+1=5
其他用户(Other)权限:可读、可执行。 对应权限数字 4+0+1=5
这个文件对应的权限位755

4. Linux系统用户分类:

超级用户:UID为0 代表是root(天神)
普通用户:UID从500-65535,由超级用户或具有超级用户权限的用户创建的用户。
虚拟用户:UID从1-499 存在满足文件或服务启动的需要。一般都不能登录,只是傀儡。
每个文件和进程,都需要对应一个用户和用户组。

5 文件权限实战模拟

5.1 环境模拟

Linux 基础权限 - 图2
1、建立老男孩的家 <=下面几个步骤在天神(root)账号下建立
[root@kali ~]# groupadd incahome
2、创建老男孩并加入到他的家
[root@kali ~]# useradd oldboy -g incahome
[root@kali ~]#id oldboy
uid=1001(oldboy) gid=1001(incahome) groups=1001(incahome)
3、创建老男孩的家庭成员 oldgirl并加入incahome家
[root@kali ~]# useradd oldgirl -g incahome
[root@kali ~]# id oldgirl
uid=1002(oldgirl) gid=1001(incahome) groups=1001(incahome)
4、创建我自己
[root@kali ~]# useradd test
[root@kali ~]# id test
uid=1003(test) gid=1003(test) groups=1003(test)
总结:oldboy是他家的主人,对应权限是——属主(User)
oldgirl是他家的成员,对应权限是——-属组(Gourp)
test 我跟他家没有任何关系,对应权限是——其他人(Other)

5.2 创建文件的测试准备:

[root@kali ~]# mkdir /oldboy -p
[root@kali ~]# echo “echo oldboylinux”>/oldboy/test.sh
[root@kali ~]# chmod +x /oldboy/test.sh
[root@kali ~]# cat /oldboy/test.sh
echo oldboylinux
[root@kali ~]# ls -l /oldboy/test.sh
-rwxr-xr-x 1 root root 17 Aug 9 19:29 /oldboy/test.sh

提示:
上面这几步也需要在天神(root)账号下完成操作,否则无法创建成功。

5.3 实操体会文件权限

1、打开4个窗口,分别使用root、oldboy、oldgirl、test用户登录。
分别测试oldboy、oldgirl、test用户对上述文件test.sh文件的权限。
Linux 基础权限 - 图3
[root@kali oldboy]# ls -l /oldboy/test.sh
-rwxr-xr-x 1 root root 17 Aug 9 19:29 /oldboy/test.sh
结论1:oldboy、oldgirl、test三个用户拥有同样的权限,即 读和执行,没有写的权限。

2、把/oldboy/test.sh的文件User(用户)改为oldboy,Group(组)改为incahome
[root@kali oldboy]# chown oldboy.incahome test.sh
[root@kali oldboy]# ll
total 4
-rwxr-xr-x 1 oldboy incahome 17 Aug 9 19:29 test.sh
oldboy用户:
[oldboy@kali ~]$cat /oldboy/test.sh
echo oldboylinux
[oldboy@kali ~]$ echo "hello">>/oldboy/test.sh
oldgirl用户:
[oldgirl@kali ~]$ cat /oldboy/test.sh
echo oldboylinux
[oldgirl@kali ~]$ echo "hello">>/oldboy/test.sh
-bash: /oldboy/test.sh: Permission denied
test用户:
[test@kali ~]$ cat /oldboy/test.sh
echo oldboylinux
[test@kali ~]$ echo "hello">>/oldboy/test.sh
-bash: /oldboy/test.sh: Permission denied
结论2:
oldboy用户拥有对应用户的权限,即读、写和执行的权限。
oldgir用户拥有对应用户组(incahome)的权限,即读和可执行的权限,没有写的权限。
test用户拥有对应其它用户的权限,即读和可执行的权限,没有写的权限。

3、把/oldboy/test.sh的文件权限改为-rwxrwxr—
[root@kali oldboy]# chmod g+w,o-x /oldboy/test.sh
[root@kali oldboy]# ll
total 4
-rwxrwxr— 1 oldboy incahome 29 Aug 9 20:01 test.sh

oldgirl用户:
[oldgirl@kali ~]$ echo “hello linux”>>/oldboy/test.sh
[oldgirl@kali ~]$ /oldboy/test.sh
oldboylinux
hello linux

test用户:
[test@kali ~]$ echo “hello linux”>>/oldboy/test.sh
-bash: /oldboy/test.sh: Permission denied
[test@kali ~]$ /oldboy/test.sh
-bash: /oldboy/test.sh: Permission denied

5.4 总结测试结论:Linux普通文件的读、写、执行权限说明:

1、可读r:表示具有读取\阅读文件内容的权限;
2、可写w:表示具有新增、修改文件内容的权限;
1)如果没有r配合,那么vi/vim编辑文件会提示没有权限编辑(但可强制编辑),echo可以
重定向追加);
2)特别提示:删除文件(修改文件名等)的权限是受父目录的权限控制,和文件本身的
权限无关;
3、可执行x:表示具有执行文件的权限;
1)文件本身要能够执行。
2)普通用户时同时还要具备r的权限才能执行。
3)天神(root)只要有x的权限就能执行。
win32下可执行文件:.exe,.bat,.com
linux下可执行文件:
.sh,.py,.perl等。

5.5 测试目录的rwx权限

1、在/odboy目录下创建一个test目录
[root@kali ~]# mkdir /oldboy/test
[root@kali ~]# ls -ld /oldboy/test
drwxr-xr-x 2 root root 4096 Aug 9 20:53 /oldboy/test
[root@kali ~]# touch /oldboy/test/tmp.txt

2、x权限测试
oldboy用户:
[oldboy@kali ~]$ cd /oldboy/test/
[oldboy@kali test]$ pwd
/oldboy/test
oldgirl用户:
[oldgirl@kali ~]$ cd /oldboy/test/
[oldgirl@kali test]$ pwd
/oldboy/test
test用户:
[test@kali ~]$ cd /oldboy/test/
[test@kali test]$ pwd
/oldboy/test
3、r权限测试:
[root@kali oldboy]# chmod o=r test
[root@kali oldboy]# ll
total 8
drwxr-xr— 2 root root 4096 Aug 9 20:56 test

test用户:
[test@kali ~]$ cd /oldboy/test
-bash: cd: /oldboy/test: Permission denied
[test@kali ~]$ ls /oldboy/test
ls: cannot access /oldboy/test/tmp.txt: Permission denied
tmp.txt
[test@kali ~]$ ls -l /oldboy/test
ls: cannot access /oldboy/test/tmp.txt: Permission denied
total 0
-????????? ? ? ? ? ? tmp.txt

5.6 总结测试结论:Linux目录的读、写执行权限说明:

1、可读r:表示具有浏览目录下面文件及子目录的权限,即 ls dir。
1)如果没有x权限,不能进到目录里,即无法 cd dir ;
2)如果没有x权限,ls列表时可以看到所有文件名。但是会提示无权访问目录下的文件;
3)如果ls -l列表,所有的属性会带有问号,也会提示无权限访问目录下的文件。
但是可以看到文件名。

2、可写w:表示具有增加、删除或修改目录内文件名(一般指文件名)的权限(需要x权限配合)
3、可执行x:表示具有进入目录的权限;例如:cd dir。
但是没有r无法列出文件或目录,没有w无法新建或删除。

小结:
文件:r(读取预览文件内容),w(修改或删除文件内容),x(执行可执行的文件)
目录:r(列出目录下的文件或目录),w(新增、修改、删除目录下的文件或目录),x(进入目录)

6. 权限修改命令chmod

chmod是用来改变文件或目录权限的命令,但只有文件的属主天神(root)才有这种权限。
通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作符表达式的方法来设置权限;另一种是使用数字方法(常用)来设置权限。

命令格式:
chmod [选项] [参数]
例:
[root@kali ~]# chmod 755 test.txt
[root@kali ~]# ll test.txt
-rwxr-xr-x 1 root root 0 Aug 10 06:19 test.txt

6.1 chmod数字权限方法(推荐)

使用数字权限设置权限的命令格式如下:

chmod [数字组合] 文件名

每个三位的权限代码(分别是属主、属组、其它用户)组合,有8种可能:
八进制数字 权限
0 —-
1 —x
2 -w-
3 -wx
4 r—
5 r-x
6 wr-
7 rwx

6.1.1 数字权限表

权限 二进制 八进制 权限 二进制 八进制
—- 000 0 r— 100 4
—x 001 1 r-x 101 5
-w- 010 2 rw- 110 6
-wx 011 3 rwx 111 7

6.1.2 chmod的数字方法的说明:

r 4
w 2
x 1
- 0
rwxr-xr-x+ 4+2+1=7 4+1+0=5 4+1+0=5 755
该组合由3位8进制数来表示文件的3类用户的权限组合

例1: 改变test目录的权限为715
[root@kali ~]# chmod 715 test
[root@kali ~]# ll -d test
drwx—xr-x 2 root root 4096 Aug 10 06:45 test

例2:改变test.sh文件的权限为311
[root@kali test]# chmod 311 test.sh
[root@kali test]# ll
total 0
—wx—x—x 1 root root 0 Aug 10 06:48 test.sh

例3:递归改变目录及目录下的文件权限为644
[root@kali ~]# chmod 644 test -R
[root@kali ~]# ls -ld test test/
drw-r—r— 2 root root 4096 Aug 10 06:48 test
[root@kali ~]# ll test
total 0
-rw-r—r— 1 root root 0 Aug 10 06:48 test.sh

6.1.3 小结:

rw-rw-r-x 代表数字权限665
—xr-x-wx 代表数字权限153
-wx—x—x 代表数字权限311
rwx—xr-x 代表数字权限715
——-x-w- 代表数字权限012

  1. 如果我们想改变文件目录的同时也需要目录下面的所有子目录及文件同时改变,<br />需要使用**-R**这个参数。

6.2 chmod字符式权限表示法

使用权限字符设置权限的命令格式如下:
chmod [用户类型] [+|-|=] [权限字符] 文件名,用表格表示如下:

chmod 用户类型 操作字符 权限字符


文件或目录
u(user) +(增加) r
g(group) -
o(others) -(减少) w
a(all) =(设置) x

小结:
用户或用户组定义:
u 代表属主用户(owner/user)
g代表属组(group)
o代表其他用户(other)
a代表属主、属组和其它用户,也就是上面三个用户(或组)的所有(all);

6.2.1 权限定义字母:

r 代表读权限,用数字4表示;
w 代表写权限,用数字2表示;
x 代表执行权限,用数字1表示;
- 代表没有权限,用数字0表示

6.2.2 权限增减字符:

● +:添加某个权限。
● -:取消某个权限。
● =:取消其他所有权限赋予给定的权限。

6.2.3 示例:

chmod u-x test.sh
chmod g+w test.sh
chmod u-x,g+w,o-rwx test.sh
chmod ugo=rw test.sh
chmod a=rw test.sh

1、chmod u-x test.sh
[root@kali test]#ll
total 0
-rw-r—r— 1 root root 0 Aug 10 07:21 test.sh
[root@kali test]# chmod u-x test.sh
[root@kali test]# ll
total 0
-rw-r—r— 1 root root 0 Aug 10 07:21 test.sh
2、chmod g+w test.sh
[root@kali test]# ll
total 0
-rw-rw-r— 1 root root 0 Aug 10 07:21 test.sh
3、chmod u-x,g+w,o-rwx test.sh
[root@kali test]# ll
total 0
-rw-rw—— 1 root root 0 Aug 10 07:21 test.sh
4、chmod ugo=rw test.sh
[root@kali test]# chmod ugo=rw test.sh
[root@kali test]# ll
total 0
-rw-rw-rw- 1 root root 0 Aug 10 07:21 test.sh
5、chmod a=rw test.sh
[root@kali test]#ll
total 0
-rw-rw-rw- 1 root root 0 Aug 10 07:21 test.sh

7. 企业网站权限设置案例

web apache nginx
站点目录的文件和目录给什么权限:
默认权限是安全权限的临界点,工作中尽量给这个临界点,或者小于临界点,不要大于临界点权限

默认权限分配的命令umask

[root@kali www]# mkdir html
[root@kali www]# touch index.php
[root@kali www]#ll
total 4
drwxr-xr-x 2 root root 4096 Aug 10 20:48 html <=755
-rw-r—r— 1 root root 0 Aug 10 20:48 index.php <=644
说明:超级用户创建目录默认是755,文件是644。

问题1:为什么默认权限目录755,文件644而不是其他的值呢?

不管是操作系统还是网站站点目录,安全权限的临界点:
1)目录755,文件644是相对安全的权限。
2)并且用户为root以及用户组root。
以上权限兼顾了安全和使用,生产工作中一定要尽量要我们的文件和目录达到以上默认的权限,包括用户属主都是root。

linux系统默认权限的方针:允许浏览,查看,但是禁止创建和修改文件及文件内容以及执行。

单台服务器:
站点目录权限:755 root root
站点文件权限:644 root root
上传目录权限:755 www www
文件和目录的拥有者都是root,组也是root组,上传目录权限组改为当前提供服务的账户。
如果是php站点,ps -ef 检查 php程序是以哪个用户身份运行的。

8. 默认权限控制umask

在linux下文件的默认权限是由umask值决定的。umask是通过八进制的数值来定义用户创建文件或目录的默认权限,umask对应数值表示的是禁止的权限。

系统默认的umask值
[root@kali ~]# umask ==>管理员用户默认值
0022
[root@kali ~]# su - test
[test@kali ~]$ umask ==>普通用户默认值
0002
但实际上是由下面的程序控制的
[test@kali ~]$ sed -n '65,69p' /etc/bashrc
if [ $UID -gt 199 ] && [ “id -gn“ = “id -un“ ]; then
umask 002
else
umask 022
fi

9. 特殊权限位

Linux系统基本权限位为9位权限,但还有额外3位权限位,共12位权限:

suid s(x) S 4 用户对于的权限位(用户对于的3位上)
sgid s(x) S 2 用户组对于的权限位用户组对于的3位上
sticky t(x) T 1 其他用户对于的权限位

10. Linux系统基础优化

把 /etc/passwd,/etc/shadow,/etc/group,/etc/gshaow,/etc/inittab这些文件加锁,
[root@kali ~]# chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
[root@kali ~]# cd /usr/bin/
[root@kali bin]# mv chattr /etc/php.ini.bak