Linux 文件或目录的基本权限位是由九个字符来控制的,每三位字符为一组。
| 前三位是用户权限位 | 中三位表示用户组权限位 | 后三位表示其他用户权限位 | 
|---|---|---|
| r w x | r - x | r - x | 
| user(用户) | group(用户组) | others(其他用户) | 
代表字符为 u | 代表字符为 g | 代表字符为 o | 
Linux系统中的权限对于文件和目录来说,是有一定区别的。普通文件对应的权限:
| 权限 | 说明 | 
|---|---|
可读r | 表示具有读取、浏览文件内容(即读取文件实体block)的权限 | 
可写w | 表示具有新增、修改、删除文件内容的权限 | 
可执行x | 表示具有执行文件的权限 | 
【
可读r的特殊说明】
- 如果没有
 可读r的配合,那么使用vim编辑文件时会提示无法编辑(但可强制编辑覆盖文件),可以使用echo等命令进行重定向或追加内容到文件。- 删除、移动或创建文件等的权限是受父目录(上一级目录)的权限控制的(因为文件名没有存放在
 Inode里,而是在上级目录的block里存放着的,若修改上级目录的block(删除文件本体),当然会受到上级目录的Inode的权限控制),与文件本身的权限无关,因此,文件本身的可写w权限,与文件是否能被删除和改名无关。
【
可执行 x的说明】
- 首先文件的本身要能够执行(文件为命令或脚本)。
 - 如果是普通用户,同时还需要具备可读r的权限才能执行文件。
 - 而root用户只要有
 可执行x的权限就能执行文件。
Linux系统中目录的权限和文件的权限有一些细微的区别,下面是目录对应的权限的说明。
| 权限 | 说明 | 
|---|---|
可读r | 表示具有浏览目录下面文件及子目录名的权限,可执行ls 命令查看目录下的内容 | 
可写w | 表示具有增加、删除或修改目录内文件的权限。但是,如果没有可执行x权限的配合,即使有w权限,也无法删除或创建文件 | 
可执行x | 表示具有进入目录的权限,但是无法列表目录下的文件及子目录 | 
【
可读r的特殊说明】
- 虽然可以执行
 ls命令查看目录下的内容。但是如果没有可执行x权限的配合,则不能切换到指定目录里,即无法执行cd命令。- 而且在执行ls命令查看列表时,虽然可以看到所有的文件名,但是会提示无权访问目录下的文件。
 - 执行
 ls -l命令查看列表目录下的文件属性时,所有文件对应的属性都会带有问号,也会提示无权访问目录下的文件,但是依然可以看到所有的文件名。
chmod
chmod命令是用来改变文件或目录权限的命令,但是只有文件的属主和超级用户root才能够执行这个命令。
chmod [选项] [模式] [<文件或目录>] -R:递归处理指定目录以及其子目录下的所有文件。通过
chmod改变文件或目录的权限有两种方法,一种是使用数字方式(常用)来设置权限;一种是通过字母和操作符表达式的方法来设置。
chmod 数字式权限设置chmod使用数字权限设置权限的命令格式如下:chmod [数字组合] 文件/目录名
chmod的数字语法简单直观,用数字表示权限的组合,该组合由3位八进制数来表示文件的3类用户的权限组合。
| 权限 | 二进制 | 八进制 | 
|---|---|---|
| — | 000 | 0 | 
| –x | 001 | 1 | 
| -w- | 010 | 2 | 
| -wx | 011 | 3 | 
| r– | 100 | 4 | 
| r-x | 101 | 5 | 
| rw- | 110 | 6 | 
| rwx | 111 | 7 | 
数字方法计算说明:
可读r对应的数字为4,可写w对应的数字为2,可执行x对应的数字为1,“-”对应的数字为0。根据数字方法表示
rw-rw-r-x表示的数字权限为665;rwxr-xr-x表示的数字权限位755注意:在字符权限排序中
rwx的绝对位置不能变,没有权限时使用-替代。
chmod 665 /data/test.txt       # 设置test.txt文件权限为:rw-rw-r-x chmod 775 /data                # 设置/data目录权限为:rwxrwxr-x  chmod 字符式权限设置chmod字符权限设置格式如下:chmod [用户类型] [+|-|=] [权限字符] 文件名 
chmod的字符式语法相对来说比较简单,文件或目录权限的改变,是通过比较直观的字符形式的改变来完成的。
用户类型字符解释:
u:代表属主用户(owner/user)g:代表属组(group)o:代表其他用户(other)a或者不写:同时代表属主、属组和其他用户,也就是上面三个用户(或组)的所有(all)。操作字符解释:
- ``+:添加权限。
 -:取消权限。=:取消其他所有权限,然后赋予给定的权限权限定义字符:
r:代表读权限,用数字4表示。w:代表写权限,用数字2表示。x:代表执行权限,用数字1表示。-:代表没有权限,用数字0表示。
chmod u-x,g+x,o-rwx test.sh       # 用户位取消x权限;用户组增加x权限;其他用户取消rwx. chmod ugo=rw test.sh              # 所有权限组赋予rw权限 chmod a=rw test.sh                # 同上,所有权限组赋予rw权限  提示:推荐使用数字权限表示法,了解字符权限设置方法即可。
chown
chown命令用于改变文件或目录的用户和用户组。
语法格式: chown [选项参数] [用户:用户组] [文件或目录]
常用授权命令语法格式:
chown 用户 文件或目录      # 仅授权用户 chown :用户组 文件或目录     # 仅授权用户组 chown 用户:用户组 文件或目录    # 同时授权用户和用户组  1)其中的“
:”可以用“.”代替。2)要授权的用户和组名,必须是Linux系统中真实存在的。
当文件及目录的用户或用户组被删除时,对应的用户和用户组位就会显示为如下的数字形式:
ls -ld /test drwxr-xr-t. 2 503 506 4096 Apr 30 13:23 /test解决办法就是重新创建
uid为503的用户,以及gid为506的用户组,具体步骤如下:# 重建用户和用户组 useradd inca -u 503 groupadd -g 506 tech # 重新查看效果 ls -ld /test drwxr-xr-t. 2 inca tech 4096 Apr 30 13:23 /test
Linux的权限是保障Linux下数据安全的重要核心基础,那么,怎样设置权限,数据的安全才能有保障呢?
这是绝大多数网站业务目录的安全临界点,删除文件数据就会造成数据丢失,创建文件将会生成木马病毒危害系统。
 要实现这样的需求,目录的权限最低要设置为755权限,对应字符权限为rwxr-xr-x,而且仅设置权限还不够,还要控制用户和用户组,设置用户和用户组都为root才能达到题目所要求的安全级别。
对于/test目录,要防止普通用户删除和创建文件的具体操作就是:
chmod -R 755 /test            # 防止删除及创建文件安全权限临界点 chown -R root.root /test      # 必须设置合适的用户和用户组,否则设置的权限可以达不到效果  这是绝大多数网站业务文件安全的临界点,如果普通用户可以随便篡改文件内容,那是极其危险和不安全的,要防止文件内容被修改,可利用文件本身的w权限来实现,同时,将文件的用户和用户组相关联,设置用户和用户组都为root,这样才能达到标题所示的要求。
对于/test目录下的文件,防止普通用户篡改文件的具体操作如下:
# 已有测试文件 test.txt chmod 644 /test/test.txt             # 授权文件644权限,文件放修改的安全临界点 chown -R root.root /test/test.txt    # 必须设置合适的用户和用户组,否则设置的权限可以达不到效果  如果安全要求除了不能删除和创建,以及不能修改文件以外,还有更多的需求,那么就要控制r和x权限了。
r权限;如果不希望切换到目录下,就要对目录取消x权限。r权限,如果不希望执行文件,就要对文件取消x权限。不过,这种变态的安全措施,除了不对外备份数据以外,工作中几乎是没有的。
绝大多数业务安全的临界点都是防止删除、创建和篡改操作。所以:
umask
umask是通过八进制的数值来定义用户创建文件或目录的默认权限的。
系统会根据预先设定的umask值计算出默认情况下创建的文件或目录权限。例如:默认文件权限为644,默认创建目录权限为755。
umask [选项] [模式]创建文件默认最大的权限是666(-rw-rw-rw-),其默认创建的文件没有可执行权限x位。
对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减umask的掩码数值。
如果得到的3位数字每一位都是偶数,那么这就是最终结果;
如果有若干位的数字是奇数,那么这个奇数需要加1变成偶数,最后得到全是偶数的结果。
# 假设umask值为022(所有位为偶数) 6 6 6    #《==文件的起始权限值 0 2 2    #《==umask的值 ---------------------- 6 4 4      # 假设umask值为045(有权限位为奇数) 6 6 6    #《==文件的起始权限值 0 4 5    #《==umask的值 ------------------------------- 6 2 1    # 计算所得值,存在奇数,加1 0 0 1    + ------------------------------- 6 2 2    # 最终所得文件权限值  创建目录默认最大的权限为777(-rwx-rwx-rwx),默认创建的目录属主是有可执行权限x的,即允许用户进入。
对于目录来说,umask的设置是在假定文件拥有八进制777权限上进行的,目录八进制权限777减去umask的掩码数值,目录这里不区分奇偶数,即为:
# 假设umask值为022 7 7 7   #《==目录的起始权限值 0 2 2    #《==umask的值 ---------------------- 7 5 5  # 假设umask值为045 7 7 7    #《==目录的起始权限值 0 4 5    #《==umask的值 ------------------------------- 7 3 2    # 最终所得文件权限值  特别注意:目录的话,无论得到的数字是奇偶,运算规则都是
777-umask。
umask命令获取当前用户的umask值。[root@localhost ~]# umask       # 默认情况下,root用户的umask值为022,第一个0忽略。 0022 [test@localhost ~]$ umask       # 普通用户的umask值为002,第一个0忽略。 0002  umask值的设定默认存在于/etc/bashrc文件中,命令如下:[root@localhost ~]# sed -n '70,74p' /etc/bashrc  # sed命令取出文件的第70行到第74行,打印输出,CentOS6是第65行到第69行。      if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then         umask 002     else         umask 022     fi # 提示:当用户UID值大于199,并且用户与用户组名相同时,上述if条件判断成立,umask值就为002,否则就为022。  在一般的生产场景下,运维人员使用特殊权限位知识的情况并不多见,虽然suid、sgid的功能不错,但是会对服务器带来较大的安全隐患,因此,只需了解即可。
Linux系统除了9位基本权限位之外,实际上还有额外的3个权限位,一共是12个权限位。这额外的三个权限位分别是:suid、sgid、sticky。
suid(setuid)位通过S字符标识,存在于基本权限的用户位的x权限对应的位置;
 如果用户位上有x权限,则suid就用小写的s标识,suid的s对应的数字权限为4,完整权限用八进制数4000表示。
suid位也是通过chmod命令进行设置的,可以利用字符权限以及数字权限来实现,示例代码如下:
[root@localhost ~]# touch test.txt  # 创建测试文件,目录也是一样的。 [root@localhost ~]# ls -l test.txt  -rw-r--r--. 1 root root 12 Apr 30 14:38 test.txt  # 默认权限为644。 [root@localhost ~]# chmod u+s test.txt # 在用户组位增加sgid权限。 [root@localhost ~]# ls -l test.txt  -rwSr--r--. 1 root root 12 Apr 30 14:38 test.txt # 查看设置结果,因为用户位没有x权限,所以是大写的S,被设置为suid的文件显示的背景是黄色,文件名是黑色。  简单地说,suid的作用就是让普通用户可以在执行某个设置了suid位的命令或程序时,拥有和root管理员一样的身份和权限(默认情况)。
常见的passwd命令文件就有suid权限,所以属主数组都是root的shadow文件,普通用户也可以修改。就是普通用户通过suid权限获得了root管理员的身份和权限。
根据基本权限的知识,普通用户无法修改shadow文件,但是因为passwd具有suid权限,因此,当普通用户执行passwd时,就可以取得root管理员的身份和权限(实际上是获取passwd对应用户的身份),所以就可以修改原本普通用户没权限修改的/etc/shadow了(修改过程中是以root身份操作的,这就是suid的作用)。
suid可以使得普通用户在执行某个命令时拥有超越本身权限的能力,suid的核心是对命令进行设置,其与su和sudo命令的功能是不同的。
sgid(setgid)位同样是通过S字符来标识,但是,sgid位存在于用户组权限位的x权限对应的位置,如果用户组有x权限,则sgid就用小写的s标识,suid的s对应的数字权限为2,完整的权限用八进制数2000表示。
sgid位同样是通过chmod命令来设置的,也可以利用字符权限以及数字权限来实现,示例代码如下:
[root@localhost ~]# touch test.txt  # 创建测试文件,目录也是一样的。 [root@localhost ~]# ls -l test.txt  -rw-r--r--. 1 root root 12 Apr 30 14:38 test.txt  # 默认权限为644。 [root@localhost ~]# chmod g+s test.txt # 在用户组位增加sgid权限。 [root@localhost ~]# ls -l test.txt -rw-r-Sr--. 1 root root 12 Apr 30 14:38 test.txt  # 查看设置结果,因为用户组位没有x权限,所以是大写的S,被设置为sgid的文件显示的背景是黄色,文件名是黑色。  对于二进制命令或者程序来说,sgid的功能与suid基本相同,唯一的区别是,suid是获得命令所属用户的身份和权限,而sgid是获得命令所属用户组的身份和权限。
sgid主要用于目录中,在为某个目录设置了setgid位以后,在该目录中新创建的文件具有该目录的所属组权限,而不是创建该文件的用户的默认所有者。这就使得在多个用户之间共享一个目录中的文件变得简单。
sticky(粘滞)位通过字符T标识,存在于其他用户位对应的x权限位上,如果其他用户位有x权限,则sticky(粘滞)位通过小写的t标识,对应的数字权限是1,完整的权限用八进制数1000表示。
 被设置了sticky(粘滞)位权限的文件会显示黑字绿底,最典型的带sticky(粘滞)位权限的目录就是/tmp。
[root@localhost ~]# ls -ld /tmp drwxrwxrwt. 3 root root 4096 Apr 30 08:26 /tmp # /tmp目录默认就有sticky权限,绿底黑字显示。 [root@localhost ~]# ls -ld /test drwxr-xr-x. 2 root root 4096 Apr 30 13:09 /test [root@localhost ~]# chmod o+t /test # 在其他用户位增加sticky权限。 [root@localhost ~]# ls -ld /test drwxr-xr-t. 2 root root 4096 Apr 30 13:09 /test # 查看设置结果,因为其他用户位有x权限,所以是小写的t,文件显示的背景是蓝色,文件名是白色。  粘滞位(sticky bit)的功能现在已经很少用了,不过对于像/tmp目录这样的,因为其是整个系统用户的临时文件存放地,因此还是有点意义的。
一个目录即使它的所有权限都开放了,即权限为rwxrwxrwx,而同时设置了粘滞位,那么除非目录的属主和root用户都有权限删除它,除此之外其他用户是不能删除这个目录的。
粘贴位的用途一般是将一个文件夹的权限都打开,然后共享该文件,像/tmp目录一样。
粘滞位的功能虽然方便,但是同时也带来了一定的安全隐患,生产环境中应禁止设置粘滞位权限。
| 类别 | suid | sgid | sticky | 
|---|---|---|---|
| 表示字符 | S | S | T | 
| 占据位置 | 用户x位 | 用户组x位 | 其他用户x位 | 
| 基本权限位有x | s | s | t | 
| 数字表示 | 4 | 2 | 1 | 
| 八进制表示 | 4000 | 2000 | 1000 | 
| 作用 | 作用于用户位 | 作用于用户组位 | 作用于其他用户位 | 
# 特殊权限位的4 2 1,加和放在基础权限数字的前面。 # 修改方法: [root@localhost /test]# chmod 7755 abc # 预测:-rwsr-sr-t [root@localhost /test]# chmod 7755 abc [root@localhost /test]# ls -l abc -rwsr-sr-t 1 root root 0 Oct  7 23:42 abc  [root@localhost /test]# chmod 7644 abc [root@localhost /test]# ls -l abc -rwSr-Sr-T 1 root root 0 Oct  7 23:42 abc  lsattr
lsattr命令可用于查看文件扩展属性。
lsattr [选项] [<文件或目录>] 
lsattr命令以及后面选项和文件,每个元素之间都至少要有一个空格。
| 参数选项 | 解释说明 | 
|---|---|
| -R | 递归查看目录的扩展属性 | 
| -a | 显示所有文件包括隐藏文件的扩展属性 | 
| -d | 显示目录的扩展属性 | 
[root@localhost ~]# lsattr file1.txt     #<==查看文件默认的扩展属性。 -------------e- file1.txt [root@localhost ~]# chattr +i file1.txt [root@localhost ~]# lsattr file1.txt ----i--------e- file1.txt             #<==可以看到文件具有i属性。  [root@localhost data]# ll -d dir2 drwxr-xr-x 2 root root 4096 Nov  4 17:26 dir2 [root@localhost data]# lsattr -d dir2    #<==使用-d选项查看目录的扩展属性。 -------------e- dir2 [root@localhost data]# chattr +i dir2    #<==也可以对目录加锁。 [root@localhost data]# lsattr -d dir2 ----i--------e- dir2  chattr
chattr命令用于改变文件的扩展属性。与chmod命令相比,chmod只是改变了文件的读、写、执行权限,更底层的属性控制是由chattr来改变的。
chattr [选项] [模式] [<文件或目录>]
chattr命令以及后面的选项和文件,每个元素之间都至少要有一个空格。
| 参数选项 | 解释说明 | 
|---|---|
| -R | 递归更改目录属性 | 
| -V | 显示命令执行过程 | 
| mode | |
| + | 增加参数 | 
| - | 移除参数 | 
| = | 更新为指定参数 | 
| A | 告诉系统不要修改这个文件的最后访问时间 | 
| a | 只能向文件中添加数据,而不能删除,多用于服务器日志文件安全 | 
| i | 设定文件不能被删除、改名、写入或新增内容 | 
i:如果对文件设置i属性,那么不允许对文件进行增删改、也不能改名;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。这种属性常用于设置在系统或关键服务中的配置文件对提升系统安全性有帮助。a:如果对文件设置a属性,那么只能在文件中追加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除。
利用-a和-i参数讲解chattr在生产中的应用:
.bash_history历史记录文件或者重定向到/dev/null,又因为系统需要向这个文件写入历史记录,因此采用追加模式,只增不减。[root@localhost ~]# chattr +a .bash_history     # 对历史纪录文件加上只能追加的属性。  [root@localhost ~]# chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab  # 锁定系统关键文件 [root@localhost ~]# useradd kk  # 添加用户的命令,后面将详细讲解。 useradd: cannot open /etc/passwd  # 解锁命令,具体如下: chattr -i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab