:理解Linux文件权限

Posted zcj仲从建

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:理解Linux文件权限相关的知识,希望对你有一定的参考价值。

6.1 Linux的安全性

6.1.1 /etc/passwd文件

  • /etc/passwd:包含系统用户账户列表以及每个用户的基本配置信息
    • 每个条目有七个字段,每个字段用冒号隔开
      • 登录用户名
      • 用户密码
      • 用户账户的UID
      • 用户账户的GID
      • 用户账户的文本描述
      • 用户HOME目录的位置
rich:x:501:501:Rich Blum:/home/rich:/bin/bash
  • 默认情况下,bash shell启动时会自动处理用户主目录下.bashrc文件中的命令
  • linux系统将用户密码保存在另一个单独的文件中(称为shadow文件,位置在/etc/shadow),只有特定的程序才能访问,如root

6.1.2 /etc/shadow文件

  • /etc/shadow文件为系统上的每个用户账户保存了一条记录
    • 每条记录有9个段:
      • 与/etc/passwd文件中的登录名对应的登录名
      • 加密后的密码
      • 自1970年1月1日(上次修改密码的日期)到当天的天数
      • 多少天后才能更改密码
      • 多少天后必须修改密码
      • 密码过期前提前多少天提醒用户更改密码
      • 密码过期后多少天禁用用户账户
      • 用户账户被禁用的日期,用自1970年1月1日到当天的天数表示
      • 预留字段,给将来使用
rich:$1$.Ffck0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::

6.1.3 添加新用户

  • 命令:useradd
    • 该命令使用系统的默认值以及命令行参数来设置用户账户
    • 可以用useradd命令加-D参数来查看Linux系统上的系统默认参数
      • -D 参数显示了在创建新用户是如果你不在命令行指定的话useradd命令将使用的默认值
        • 新用户会被加到GID为100的公共组
        • 新用户的HOME目录将会位于/home/loginname
        • 新用户账户密码在过期后不会被禁用
        • 新用户账户未被设置为某个日期后就过期
        • 新用户账户将bash shell作为默认shell
        • 系统将/etc/skel目录下的内容复制到用户的HOME目录下
        • 系统为该用户账户在mail目录下创建一个用于接收邮件的文件
      • 倒数第二个意思:useradd命令允许管理员创建一份默认的HOME目录配置,然后把它作为创建用户的HOME目录的模板,这样就能自动在每个新用户的HOME目录里放置默认的系统文件
      • 系统会自动将/etc/skel目录下的这些默认文件复制到你创建的每个用户的HOME目录中
    • useradd命令不会创建HOME目录,加上-m命令行选项后就会创建了
# /usr/sbin/useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#
  • 更改创建新用户时的系统默认的用户值:useradd + -D + 代表要修改值得参数
    • useradd更改默认值得参数:
参数描述
-b更改默认HOME目录
-e更改默认新账户的过期日期
-f更改默认从密码过期到账户被禁用的天数
-g更改默认的组名称或GID
-s更改默认的登录shell

6.1.4 删除用户

命令 userdel

  • 默认情况下,userdel只会删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件
  • -r 参数:userdel会删除用户的HOME目录以及mail目录,然而,系统上仍可能存在有归已删除用户所有的其他文件
  • 注意:在有大量用户使用的环境中使用-r需要小心,因为你永远不知道用户是否在他的HOME目录下存放了其他用户或其他程序要用的重要文件

6.1.5 修改用户

  • 用户账户修改工具
命令描述
usermod修改用户账户的字段,并可以指定主要组以及附加组的所属关系
passwd修改已有用户的密码
chpasswd从文件中读取登录名密码对,并更新密码
chage修改密码的过期日期
chfn修改用户账户的备注信息
chsh修改用户账户的默认登录shell

6.2 使用Linux组

6.2.1 /etc/group文件

  • /etc/group文件包含系统上用到的每个组的信息
    • 包含4个字段:
      • 组名
      • 组密码
      • GID
      • 属于改组的用户列表
root:x:0:root
...

6.2.2 创建新组

命令:groupadd +groupname

  • 默认情况下,没有用户属于该组成员
  • 添加用户到组:usermod -G groupname
  • 注意项:
    • 如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才会生效
    • 将组添加到用户账户时要注意
      • 如果加了-g参数,指定的组名会替换掉该账户的默认组
      • -G则会将改组添加到用户的属组的列表里,而不会影响默认组

6.2.3 修改组

  • groupmod会修改已有组的GID(加-g参数)和组名(加-n参数)
  • 修改组名时GID和组成员不会变,只有组名会改变
    • 因为所有的安全权限都是基于GID的,所以可以任意改变组名而不会影响文件的安全性

6.3 理解文件权限

默认文件权限

  • umask命令用来设置用户创建的文件和目录的默认权限
$ touch newfile
$ ls -al newfile
-rw-r--r-- 1 rich rich 0 Sep 20 19:16 newfile
$
$ umask
0022
$
  • umask命令的理解
    • 第1位:代表了一项特别的安全特性,叫作粘着位
    • 后面3个数组表示文件和目录的umask的八进制值
      • 对于rwx,每个位置代表一个二进制,有相关权限就置1,否则为0,如:r–转换为二进制位100,八进制为4
    • umask值是个掩码,它会屏蔽掉不想授予安全级别的权限
      • umask值会从对象的全权限值中减掉,所以在例子中,一开始的权限是666,然后umask值是022,剩下的文件权限就成了644了
        • 文件的全权限值是666(所有用户都有读和写权限),目录的全权限是777(所有用户都有读写和执行权限)
  • umask的值会在/etc/profile启动文件中设置,可以用umask命令为默认umask设置指定一个新值

6.4 改变安全性设置

6.4.1 改变权限

chmod命令

  • 该命令用来设置文件和目录的安全性设置
  • 用法:chmod options mode file

    • mode参数后可跟八进制模式或符号模式来设置安全性设置
    • options参数为chmod命令提供了另外一些功能
      • -R:可以让权限的改变递归地作用到文件和目录
  • 八进制模式略

  • chmod在指定符号模式下指定权限的格式:[ugoa…][+-=][rwxXstugo]
    • 第一组定义了权限的作用对象
      • u:用户
      • g:组
      • o:其他
      • a:上述所有
    • 第二组是想要在现有权限基础上增加权限(+),还是移除(-),还是将权限设置成后面的值(=)
    • 最后一组代表作用到设置上的权限,这个值比rwx多,额外的设置有一下几项
      • X:如果对象时目录或者它已有执行权限,赋予执行权限
      • s:运行时重新设置UID或GID
      • t:保留文件或目录
      • u:将权限设置为跟属主一样
      • g:将权限设置为跟属组一样
      • o:将权限设置为跟其他用户一样
$ chomd o+r newfile
$ ls -l newfile
-rwxrw-r-- 1 rich rich 0 Sep 20 19:16 newfile
$
  • 可以在指定文件名时用通配符将权限的更改通过一个命令作用到多个文件上

6.4.2 改变所属关系

有时会你会改变文件的属主,比如在有人离职或者开发人员创建了一个在产品环境中运行时需要归属在系统账户下的应用

chown命令

  • 用来改变文件的属主
  • 格式:chown options owner[.group] file
    • -R参数:递归地改变子目录和文件的所属关系
    • -h参数:改变文件的所有符号链文件的所属关系
  • 可用登录名和UID来指定文件的新属主
# chown dan newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile
#

-chown命令也支持改变文件的属主和属组

# chown dan.shared newfile
# ls -l newfile
-rw-rw-r-- 1 dan shred 0 Sep 20:16 newfile
#
  • 改变一个目录的默认属组
# chown .rich newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20:16 newfile
#
  • 如果Linux系统采用和用户登录名匹配的组名,则可以用一个条目改变二者
# chown test. newfile
# ls -l newfile
-rw-rw-r-- 1 test test 0 Sep 20:16 newfile
#
  • 注意:
    • 只有root用户才能改变文件的属主
    • 任何属主都可以改变文件的属组,但前提是属主必须是源和目标属组的成员

chgrp命令

  • 可以很方便的改变文件或目录的默认属组
$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r-- 1 rich shared 0 Sep 20 19:16 newfile
$
  • 通过上面的修改,现在shared组的任意一个成员都可以写这个文件了,这是Linux系统共享文件的一个途径

6.5 共享文件

  • Linux为每个文件和目录存储了额外的信息
    • 设置用户ID(SUID):当文件被用户使用过时,程序会以文件属主的权限运行
    • 设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录默认属组作为默认属组
    • 粘着位:进程结束后文件还会在内存中
  • SGID对文件共享非常重要,是能了SGID位,就能让在一个共享目录下创建的新文件都属于该目录的属组,也就是每个用户的组
    • SGID通过chmod来设置,它会加到标准3位八进制值之前(组成4位八进制值),或者在符号模式下用符号s
  • 修改SGID位置位,使在共享目录中新创建的文件都能沿用目录的属组
$ mkdir testdir
$ chgrp shared testdir
$ chmod g+s testdir
$ unask 002
$ cd testdir 
$ touch testfile
$ ls -l
-rw-rw-r-- 1 rich shared 0 Sep 20 23:13 testfile

以上是关于:理解Linux文件权限的主要内容,如果未能解决你的问题,请参考以下文章

Linux文件权限设置

Linux的文件权限

Linux 权限的理解

Linux 权限的理解

Linux提权-suid提权

:理解Linux文件权限