1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter7-理解 Linux 文件权限

【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter7-理解 Linux 文件权限

时间:2024-07-18 21:47:23

相关推荐

【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter7-理解 Linux 文件权限

七、理解 Linux 文件权限
Linux 的安全性 Linux 安全系统的核心是用户账户。每个能访问 Linux 系统的用户都会被分配一个唯一的用 户账户。用户对系统中各种对象的访问权限取决于他们登录系统时所用的账户。用户权限是通过创建用户时分配的用户 ID(user ID,UID )来跟踪的。 UID 是个数值, 每个 用户都有一个唯一的 UID。但用户在登录系统时是使用登录名(login name )来代替 UID 登录的。 登录名是用户用来登录系统的最长 8 字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。Linux 系统使用特定的文件和工具来跟踪及管理系统的用户账户。 /etc/passwd 文件 Linux 系统使用一个专门的文件/etc/passwd 来匹配登录名与对应的 UID 值。该文件包含了一 些与用户有关的信息。root 用户账户是 Linux 系统的管理员, 为其固定分配的 UID 是 0。

$ cat /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin...rich:x:500:500:Rich Blum:/home/rich:/bin/bash...

Linux 系统会为各种各样的功能创建不同的用户账户,我们称其为系统账户,它们是系统中运行的各种服务进程访问资源使用的特殊账 户。所有运行在后台的服务都需要通过一个系统用户账户登录到 Linux 系统中。Linux 为系统账户预留了 500 以下的 UID。有些服务甚至要用特定的 UID 才能正常工作。 为普通用户创建账户时,大多数 Linux 系统会从 500 开始,将第一个可用 UID 分配给这个账户。 (并非所有的 Linux 发行版都是这样,比如 Ubuntu 就是从 1000 开始的。)/etc/passwd 文件中包含的内容远不止用户的登录名和 UID。该文件各个字段的含义如下: 登录用户名用户密码用户账户的 UID (数字形式)用户账户的组 ID (数字形式)用户账户的文本描述(称为备注字段)用户$HOME 目录的位置用户的默认 shell /etc/passwd 文件中的密码字段都被设置为 x,这可不是说所有的用户账户都使用相同的密码。现在,绝大多数 Linux 系统将用户密码保存在单独的文件(称为 shadow 文件,位于/etc/shadow) 中。只有特定的程序(比如登录程序)才能访问该文件。 /etc/shadow 文件 /etc/shadow 文件对Linux 系统密码管理提供了更多的控制。只有root 用户才能访问/etc/shadow 文件。/etc/shadow 文件为系统中的每个用户账户都保存了一条记录。记录就像下面这样:

rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::

/etc/shadow 文件中的每条记录共包含 9 个字段。 登录名, 对应于/etc/passwd 文件中的登录名。加密后的密码。自上次修改密码后已经过去的天数(从 1970 年 1 月 1 日开始计算)。多少天后才能更改密码。多少天后必须更改密码。密码过期前提前多少天提醒用户更改密码。密码过期后多少天禁用用户账户。用户账户被禁用的日期(以从 1970 年 1 月 1 日到当时的天数表示)。预留给以后使用的字段。 添加新用户

用来向 Linux 系统添加新用户的主要工具是 useradd。该命令可以一次性轻松创建新用户账 户并设置用户的$HOME 目录结构。 useradd 命令使用系统的默认值以及命令行参数来设置用户 账户。要想查看所使用的 Linux 发行版的系统默认值,可以使用加入了-D 选项的 useradd 命令。

# useradd -DGROUP=100HOME=/homeINACTIVE=-1EXPIRE=SHELL=/bin/bashSKEL=/etc/skelCREATE_MAIL_SPOOL=yes

useradd 命令的默认值使用/etc/default/useradd 文件设置。另外,进一步的安全设置在 /etc/login.defs 文件中定义。可以调整这些文件,改变 Linux 系统默认的安全行为。

-D 选项显示了在命令行中创建新用户账户时, 如果不明确指明具体值, useradd 命令所使用的默认值。这些默认值的含义如下。

新用户会被添加到 GID 为 100 的公共组。新用户的主目录会位于/home/loginname。新用户账户密码在过期后不会被禁用。新用户账户不设置过期日期。新用户账户将 bash shell 作为默认 shell。系统会将/etc/skel 目录的内容复制到用户的$HOME 目录。系统会为该用户账户在 mail 目录下创建一个用于接收邮件的文件。

useradd 命令允许管理员创建默认的 H O M E 目录配置,然后将其作为创建新用户 HOME 目录配置,然后将其作为创建新用户 HOME目录配置,然后将其作为创建新用户HOME 目录的模板。这样就能自动在每个新用户的$HOME 目录里放置默认的系统文件了。

/etc/skel 目录下是bash shell 环境的标准启动文件。系统会自动将这些默认文件复制到你创建的每个用户的$HOME 目录。

对很多 Linux 发行版而言, useradd 命令默认并不创建 H O M E 目录,但是 − m 命令行选项会使其创建 HOME 目录,但是-m 命令行选项会使其创建 HOME目录,但是−m命令行选项会使其创建HOME 目录。可以在/etc/login.defs 文件中更改该行为。

用户账户管理命令需要以 root 用户账户登录或者通过 sudo 命令运行。

要想在创建新用户时改变默认值或默认行为,可以使用相应的命令行选项(但如果总是需要改动某个值, 则最好还是修改一下系统默认值),useradd 命令行选项如下:

可以使用-D 选项来修改系统默认的新用户设置。相应的选项如下:

修改默认值非常简单,例如需要 useradd 命令将 tsch shell 作为所有新建用户的默认登录 shell:

# useradd -D -s /bin/tsch# useradd -DGROUP=100HOME=/homeINACTIVE=-1EXPIRE=SHELL=/bin/tschSKEL=/etc/skelCREATE_MAIL_SPOOL=yes#

删除用户 如果想从系统中删除用户, userdel 可以满足这个需求。在默认情况下, userdel 命令只 删除/etc/passwd 和/etc/shadow 文件中的用户信息,属于该账户的文件会被保留。如果加入-r 选项,则 userdel 会删除用户的$HOME 目录以及邮件目录。然而,系统中仍 可能存有已删除用户的其他文件。 修改用户

用户账户修改工具:

usermod 命令是用户账户修改工具中最强大的一个, 提供了修改/etc/passwd 文件中大部分 字段的相关选项,只需指定相应的选项即可。大部分选项与 useradd 命令的选项一样(比如-c 用于修改备注字段, -e 用于修改过期日期, -g 用于修改默认的登录组)。除此之外,还有另外 一些也许能派上用场的选项。

-l:修改用户账户的登录名。-L:锁定账户,禁止用户登录。-p:修改账户密码。-U:解除锁定,恢复用户登录。-L 选项尤为实用。该选项可以锁定账户,使用户无法登录,无须删除账户和用户数据。 要恢复账户, 只需使用-U 选项即可。

passwd 命令可以方便地修改用户密码。如果只使用 passwd 命令, 则修改的是你自己的密码。系统中的任何用户都能修改自己的密 码,但只有 root 用户才有权限修改别人的密码。

-e 选项可以强制用户下次登录时修改密码。你可以先给用户设置一个简单的密码,之后强 制用户在下次登录时改成他们能记住的更复杂的密码。

chpasswd 命令可以为系统中的大量用户修改密码。chpasswd 命令能从标准输入自动读取一系列以冒号分隔的登录名和密码对偶(login name and password pair), 自动对密码加密, 然后为用户账户设置密码。你也可以用重定向命令将包含 username:password 对偶的文件重定向给该命令。

# chpasswd < users.txt

chsh、chfn 和 chage 用于修改特定的账户信息。 chsh 命令可以快速修改默认的用户登录 shell。使用时必须用 shell 的全路径名作为参数, 不能只用 shell 名。

# chsh -s /bin/csh testChanging shell for test.Shell changed.

chfn 命令提供了在/etc/passwd 文件的备注字段中保存信息的标准方法。chfn 命令会将用于 Unix 的 finger 命令的信息存入备注字段, 而不是简单地写入一些随机文本(比如名字或昵称之 类), 或是干脆将备注字段留空。

finger 命令可以非常方便地查看 Linux 系统的用户信息。出于安全性的考虑,大多数Linux 发行版没有默认安装 finger命令。请注意,安装该命令可能会使你的系统受到攻击漏洞的影响。

如果使用 chfn 命令时不加任何选项,则会询问你要将哪些内容写入备注字段:

chage 命令可用于帮助管理用户账户的有效期。相关选项如下:

chage 命令的日期值可以用下面两种方式中的任意一种表示:

YYYY-MM-DD 格式的日期代表从 1970 年 1 月 1 日起的天数

chage 命令的一个好用的功能是设置账户的过期日期。有了它,就可以创建在特定日期自动过期的临时用户,再也不用操心删除用户了。过期的账户跟锁定的账户类似:账户仍然存在,但用户无法用其登录。

使用 Linux 组 组权限允许多个用户对系统对象(比如文件、目录或设备等) 共享一组权限。Linux 发行版在处理默认组的成员关系时略有差异。有些 Linux 发行版会创建一个组,将所 有用户都作为该组的成员。遇到这种情况要特别小心, 因为你的文件有可能对于其他用户也是可 读的。有些发行版会为每个用户创建一个单独的组,这样会更安全一些。每个组都有唯一的 GID,和 UID 类似,该值在系统中是唯一的。除了 GID ,每个组还有一个唯一的组名。 Linux 系统中有一些组工具可用于创建和管理组。组可以包含一个或多个用户以支持对系统资源的共享访问。 /etc/group 文件 与用户账户类似,组信息也保存在一个文件中。 /etc/group 文件包含系统中每个组的信息。

root:x:0:rootbin:x:1:root,bin,daemon...rich:x:500:...

对于系统账户组,为其分配的 GID 值低 于 500,而普通用户组的 GID 则从 500开始分配。 /etc/group 文件有 4 个字段。 组名组密码GID属于该组的用户列表 组密码允许非组内成员使用密码临时性地成为该组成员。这个功能用得不多, 但确实存在。使用 usermod 命令向组中添加用户。在将用户添加到不同的组之前,必须先创建组。用户账户列表多少有些误导人。你会发现列表中的一些组没有任何用户。这并不是说这些组没有成员。当一个用户在/etc/passwd 文件中指定某个组作为主要组时,该用户不会作为该组成员再出现在/etc/group 文件中。 创建新组 groupadd 命令可用于创建新组。

-在创建新组时, 默认不为其分配任何用户。groupadd 命令没有提供向组中添加用户的选项, 但可以用 usermod 命令来解决。usermod 命令的-G 选项会把这个新组添加到该用户账户的组列表中。如果更改了已登录系统的用户所属的组,则该用户必须注销后重新登录,这样新的组关系才能生效。为用户分配组时要格外小心。如果使用了-g 选项,则指定的组名会替换掉在/etc/passwd 文件中为该用户分配的主要组。 -G 选项则会将该组加入该用户的属组列表,不会影响主要组。 修改组 roupmod 命令可以修改已有 组的 GID (使用-g 选项) 或组名(使用-n 选项)。修改组名时, GID 和组成员保持不变,只有组名会改变。由于所有的安全权限均基于 GID,因此可以随意改变组名,不会影响文件的安全性。 使用文件权限符号 ls 命令输出结果的第一个字段就是描述文件和目录权限的编码。

$ ls -ltotal 68-rw-rw-r-- 1 rich rich 50 -09-13 07:49 file1.gz...

这个字段的第一个字符表示对象的类型。 代表文件 d 代表目录l 代表链接c 代表字符设备b 代表块设备p 代表具名管道s 代表网络套接字 之后是 3组三字符的编码。每一组定义了 3 种访问权限。 r 代表对象是可读的w 代表对象是可写的x 代表对象是可执行的 如果没有某种权限, 则在该权限位会出现连字符。这 3 组权限分别对应对象的 3 个安全级别。 对象的属主对象的属组系统其他用户 举例子说明:

-rwxrwxr-x 1 rich rich 4882 -09-18 13:58 myprog

文件 myprog 具有以下 3 组权限。 rwx:属主( rich )权限。rwx:属组( rich )权限。r-x:系统其他用户权限。 这些权限表明用户 rich 可以读取、写入以及执行该文件(有全部权限)。类似地, rich 组的 成员也可以读取、写入以及执行该文件。然而, 不属于 rich 组的其他用户只能读取和执行该文件: w 被连字符取代了,说明这个安全级别没有写入权限。 默认文件权限 你可能会问这些文件权限从何而来, 答案是 umask。umask 命令用来设置新建文件和目录的默认权限。touch 命令使用分配给当前用户的默认权限创建了新文件。 umask 命令可以显示和设置默认权限。

$ touch newfile$ ls -al newfile-rw-r--r-- 1 richrich 0 Sep 20 19:16 newfile$ umask0022

umask 第一个数位(digit)代表了一项特别的安全特性。接下来的 3个数位表示文件或目录对应的 umask 八进制值(如果读权限是唯一置位的权限, 则权限值是 r–,转换成二进制值就是 100,代表的八进制值是 4)。 Linux 文件权限编码umask 值只是个掩码, 它会屏蔽掉不想授予该安全级别的权限。要把 umask 值从对象的全权限值(full permission)中减掉。对文件而言, 全权限值是 666 (所有用户都有读取和写入的权限); 对目录而言, 全权限值则是 777 (所有用户都有读取、写入 和执行权限)。所以,在上面的例子中,文件一开始的权限是 666,减去 umask 值 022 之后,剩下的文件 权限就成了 644。umask 值通常会被设置在/etc/profile 启动文件中。可以使用 umask 命令指定其他的 umask 默认值。

$ umask 026$ touch newfile2$ ls -l newfile2-rw-r----- 1 rich rich 0 Sep 20 19:46 newfile2

将 umask 值设成 026 后,默认的文件权限变成了 640,因此现在对组成员来说新文件是只 读的,而系统其他用户则没有任何权限。 修改权限 chmod 命令可以修改文件和目录的安全设置。只有文件的属主才能修改文件或目录的权限。 但 root 用户可以修改系统中任意文件或目录的安全设置。该命令的格式如下:

chmod options mode file

mode 参数允许使用八进制模式或符号模式来进行安全设置。八进制模式设置非常直观,直接用打算赋予文件的标准 3 位八进制权限编码即可。 符号模式的权限就没这么简单了。与通常用到的 3组权限字符不同, chmod 命令采用的是另一种方法。下面是在符号模式下指定权限的格式:

[ugoa...][[+-=][rwxXstugo...]

第一组字符定义了权限作用的对象: u 代表用户g 代表组o 代表其他用户a 代表上述所有 接下来的符号表示你是想在现有权限基础上增加权限(+)、移除权限(-),还是设置权限(=)。最后,第三个符号代表要设置的权限。可取的值要比通常的 rwx 多。这些额外值如下: X:仅当对象是目录或者已有执行权限时才赋予执行权限。s:在执行时设置 SUID 或 SGID。t:设置粘滞位(sticky bit)。u:设置属主权限。g:设置属组权限。o:设置其他用户权限。 具体用法如下:

$ chmod o+r newfile$ ls -l newfile-rwxrw-r-- 1 rich rich 0 Sep 20 19:16 newfile$ chmod u-x newfile$ ls -l newfile-rw-rw-r-- 1 rich rich 0 Sep 20 19:16 newfile

不管其他用户先前在该安全级别具有什么样的权限, o+r 都为其添加了读取权限。u-x 移除了属主已有的执行权限。如果某个文件具有执行权限, 则 ls 命令的-F 选项 会在该文件的名称后面加上一个星号。 options 为 chmod 命令提供了额外的增强特性。 -R 选项能够以递归方式修改文件和目录的权限。你可以使用通配符指定多个文件名,然后用单个命令批量修改权限。 改变所属关系 chown 和 chgrp,前者可以修改文件的属主,后者可以修改文件的默认属组。chown 命令的格式如下:

chown options owner[.group] file// 可以使用登录名或 UID 来指定文件的新属主:# chown dan newfile# ls -l newfile-rw-rw-r-- 1 danrich 0 Sep 20 19:16 newfile// chown 命令也支持同时修改文件的属主和属组:# chown dan.shared newfile# ls -l newfile-rw-rw-r-- 1 danshared 0 Sep 20 19:16 newfile// 可以只修改文件的默认属组:# chown .rich newfile# ls -l newfile-rw-rw-r-- 1 danrich 0 Sep 20 19:16 newfile// 如果你的 Linux 系统使用与用户登录名相同的组名,则可以同时修改二者:# chown test. newfile# ls -l newfile-rw-rw-r-- 1 test test 0 Sep 20 19:16 newfile

-R 选项与通配符相配合可以递归地修改子目录和 文件的所属关系。 -h 选项可以修改文件的所有符号链接文件的所属关系。只有 root 用户能修改文件的属主。任何用户都可以修改文件的属组, 须是原属组和新属组的成员。chgrp 命令可以方便地修改文件或目录的默认属组:

// shared 组的任意成员都可以写入该文件:$ chgrp shared newfile$ ls -l newfile-rw-rw-r-- 1 richshared0 Sep 20 19:16 newfile

共享文件

Linux 系统中共享文件的方法是创建组。

创建新文件时, Linux 会用默认的UID 和 GID来给文件分配权限。要想让其他用户也能访问文件,要么修改所有用户一级的安全权限, 要么给文件分配一个包含其他用户的新默认属组。

如果想在大范围内创建并共享文件, 这会很烦琐。幸好有一种简单的解决方法。Linux 为每个文件和目录存储了 3 个额外的信息位。

SUID(set user ID):当用户执行该文件时,程序会以文件属主的权限运行。SGID(set group ID):对文件而言,程序会以文件属组的权限运行;对目录而言,该目录中创建的新文件会以目录的属组作为默认属组。粘滞位(sticky bit):应用于目录时,只有文件属主可以删除或重命名该目录中的文件。

SGID 位对文件共享非常重要。启用 SGID 位后,可以强制在共享目录中创建的新文件都属 于该目录的属组,这个组也就成了每个用户的属组。

SGID 位会强制某个目录下新建文件或目录都沿用其父目录的属组,而不是创建这些文件的用户的属组。这便于系统用户之间共享文件。

可以通过 chmod 命令设置 SGID,将其添加到标准 3 位八进制值之前(组成 4 位八进制值),或者在符号模式下用符号 s。

SUID 、SGID 和粘滞位的八进制值

要创建一个共享目录,使目录中的所有新文件都沿用目录的属组,只需设置该目录的 SGID 位。

$ mkdir testdir$ ls -ldrwxrwxr-x 2 rich rich 4096 Sep 20 23:12 testdir/$ chgrp shared testdir$ chmod g+s testdir$ ls -ldrwxrwsr-x 2 rich shared 4096 Sep 20 23:12 testdir/$ umask 002$ cd testdir$ touch testfile$ ls -ltotal 0-rw-rw-r-- 1 rich shared 0 Sep 20 23:13 testfile

首先,使用 mkdir 命令创建希望共享的目录。然后,通过 chgrp 命令修改目录的默认属组, 使其包含所有需要共享文件的用户。最后,设置目录的 SGID 位,保证目录中的新建文件都以 shared 作为默认属组。为了让这个环境正常工作, 所有组成员都要设置他们的 umask 值,使文件对属组成员可写。 在先前的例子中, umask 被改成了 002,所以文件对属组是可写的。完成上述步骤后,新文件 testfile 沿用了目录的默认属组,而不是用户账户的默认属组。现在 shared 组的所有用户都能访问这个文件了。 访问控制列表 对于文件和目录,不同的组需要不同的权限,基本权限方法解决不了这个问题。访问控制列表(access control list, ACL)允许指定包含多个用户或组的列表以及为其分配的权限。和基本安全方法一样, ACL 权限使用相同的读取、写入和执行权限位, 但现在可以分配给多个用户和组。可以使用 setfacl 命令和 getfacl 命令在 Linux 中实现 ACL 特性。getfacl 命令能够查看分配给文件或目录的 ACL:

$ touch test$ ls -ltotal 0-rw-r----- 1 rich rich 0 Apr 19 17:33 test$ getfacl test# file: test# owner: rich# group: richuser::rw-group::r--other::---$

setfacl 命令可以为用户或组分配权限:

setfacl [options] rule filenames

setfacl 命令允许使用-m 选项修改分配给文件或目录的权限,或使用-x 选项删除特定权 限。可以使用下列 3 种格式定义规则: u[ser]:uid:permsg[roup]:gid:permso[ther]::perms 要为用户分配权限, 可以使用 user 格式; 要为组分配权限, 可以使用 group 格式; 要为其他用户分配权限, 可以使用 other格式。对于 uid 或gid,可以使用数字值或名称。

// 为 test 文件添加了 sales 组的读写权限。$ setfacl -m g:sales:rw test$ ls -ltotal 0-rw-rw----+ 1 rich rich 0 Apr 19 17:33 test// 可以再次使用 getfacl 命令查看 ACL。$ getfacl test# file: test# owner: rich# group: richuser::rw-group::r--group:sales:rw-mask::rw-other::---// 要想删除权限,可以使用-x 选项:$ setfacl -x g:sales test$ getfacl test# file: test# owner: rich# group: richuser::rw-group::r--mask::r--other::---

注意, setfacl 命令不产生输出。在列出文件时, 只显示标准的属主、属组和其他用户权限, 但在权限列的末尾多了一个加号(+),指明该文件还应用了 ACL。可以再次使用 getfacl 命令查看 ACL。getfacl 的输出显示为两个组分配了权限。默认组(rich)对文件有读权限, sales 组对文件 有读写权限。要想删除权限,可以使用-x 选项。 Linux 也允许对目录设置默认 ACL,在该目录中创建的文件会自动继承。这个特性称为 ACL 继承。要想设置目录的默认 ACL ,可以在正常的规则定义前加上 d:,如下所示:

$ sudo setfacl -m d:g:sales:rw /sales

为/sales 目录添加了 sales 组的读写权限。在该目录中创建的所有文件都会自动为 sales 组分配读写权限。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。