【读书笔记】Linux命令行与Shell脚本编程大全--理解Linux文件权限

1.Linux的安全性

Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户。
用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。
用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。
Linux系统使用特定的文件和工具来跟踪和管理系统上的用户账户。

1.1 /etc/passwd 文件

Linux系统使用一个专门的/etc/passwd文件来将用户的登录名匹配到对应的UID值。它包含了一些与用户有关的信息。
/etc/passwd文件的字段包含了如下信息(显示按如下顺序):

  1. 登录用户名
  2. 用户密码 (passwd文件中看到的密码都是x,因为Linux单独管理密码的是etc/shadow文件)
  3. 用户账户的UID(数字形式)
  4. 用户账户的组ID(GID)(数字形式)
  5. 用户账户的文本描述(称为备注字段)
  6. 用户HOME目录的位置
  7. 用户的默认shell

此处列举了Ubuntu上的部分,如下:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

notice:
Q:何为用户账户?
A:root用户账户是Linux系统的管理员,固定分配给它的UID是0。Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到Linux系统上。
也可以这样理解,在etc/passwd/目录下存在的用户账户并不是都能拿来登录的。

Linux为系统账户预留了500以下的UID值。大多数Linux系统会从500开始,将第一个可用UID分配给这个账户。

虽然/etc/passwd是一个标准的文本文件,不要随意的去编辑修改它,可能会引起一些不必要的麻烦。

1.2 /etc/shadow 文件

绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
只有root用户才能访问/etc/shadow文件,这让它比起/etc/passwd安全许多。

/etc/shadow文件为系统上的每个用户账户都保存了一条记录。记录就像下面这样:

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

这条记录这样解释:

  1. 与/etc/passwd文件中的登录名字段对应的登录名
  2. 加密后的密码
  3. 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
  4. 多少天后才能更改密码
  5. 多少天后必须更改密码
  6. 密码过期前提前多少天提醒用户更改密码
  7. 密码过期后多少天禁用用户账户
  8. 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
  9. 预留字段给将来使用

使用shadow密码系统后,Linux系统可以更好地控制用户密码。它可以控制用户多久更改一次密码,以及什么时候禁用该用户账户,如果密码未更新的话。

1.3 添加新用户–useradd

useradd可以一次性创建新用户账户设置用户HOME目录结构
useradd命令使用系统的默认值以及命令行参数来设置用户账户。系统默认值被设置在/etc/default/useradd文件中。
可以使用加入了**-D选项**的useradd命令查看所用Linux系统中的这些默认值。

eg:

GROUP=100				新用户会被添加到GID为100的公共组
HOME=/home				新用户的HOME目录将会位于/home/loginname
INACTIVE=-1				新用户账户密码在过期后不会被禁用
EXPIRE=					新用户账户未被设置过期日期	
SHELL=/bin/sh			新用户账户将bash shell作为默认shell
SKEL=/etc/skel		  	系统会将/etc/skel目录下的内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=no  	系统不为该用户账户在mail目录下创建一个用于接收邮件的文件

1.4 删除用户–userdel

默认情况下,userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。
-r参数:userdel会删除用户的HOME目录以及邮件目录。

notice:在有大量用户的环境中使用-r参数时要特别小心。你永远不知道用户是否在其HOME目录下存放了其他用户或其他程序要使用的重要文件。记住,在删除用户的HOME目录之前一定要检查清楚!

1.5 修改用户

Linux提供了一些不同的工具来修改已有用户账户的信息。如下表所示:

命令 描述 参数(包含不限于)
usermod 修改用户账户的字段,还可以指定主要组以及附加组的所属关系 -l -L -p -U
passwd 修改已有用户的密码 -e
chpasswd 从文件中读取登录名密码对,并更新密码 -e
chage 修改密码的过期日期 -d -E
chfn 修改用户账户的备注信息
chsh 修改用户账户的默认shell -s

2.使用Linux组

Linux使用了(group)概念控制共享资源的一组用户。
组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。
ps:有些发行版会为每个用户创建单独的一个组。
每个组都有唯一的GID(类似UID)。

2.1 /etc/group/文件

组信息保存在/etc/group文件中。
系统账户用的组通常会分配低于500的GID值,而用户组的GID则会从500开始分配。
其格式如下:

  1. 组名
  2. 组密码
  3. GID
  4. 属于该组的用户列表

在这里插入图片描述
notice:

当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中。

2.2 创建新组–groupadd

为用户账户分配组时要格外小心。
如果加了**-g选项,指定的组名会替换掉该账户的默认组。-G**选项则将该组添加到用户的属组的列表里,不会影响默认组。

2.3 修改组–usermod

usermod命令的-G选项会把这个新组添加到该用户账户的组列表里。

3.理解文件权限

3.1 使用文件权限符

在这里插入图片描述

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

文件myprog有下面三组权限:

  1. rwx 文件的属主 (设为登录名为rich)
  2. rwx 文件的属组 (设为组名为rich)
  3. r-x 系统上其他人

3.2 默认文件权限-umask(umask值是掩码)

umask命令用来设置所创建文件和目录的默认权限。大部分默认0022。
第一位代表了一项特别的安全特性,叫作粘着位(sticky bit)。
在这里插入图片描述
对象的全权限值

对文件来说,全权限的值是666(所有用户都有读和写的权限);
而对目录来说,则是777(所有用户都有读、写、执行权限)。
假设默认umask是0022,因此创建的文件一般权限是0644,目录则是0755。

4.改变安全性设置

4.1 改变权限–chmod

chmod命令用来改变文件和目录的安全性设置。其格式如下:

chmod options mode file

options mode 可以使用八进制模式或者符号模式进行安全性设置。
eg:
八进制模式:

chmod 760 newfile

符号模式稍显复杂,其格式如下:

[ugoa…][[+-=][rwxXstugo…]

第一个[]里参数表示如下:

  1. u代表用户
  2. g代表组
  3. o代表其他
  4. a代表上述所有
    第二个[]代表着权限的加减
    第三个[]里参数表示如下:
  5. X:如果对象是目录或者它已有执行权限,赋予执行权限。
  6. s:运行时重新设置GID或UID。
  7. t:保留文件或目录。
  8. u:将权限设置为跟属主一样。
  9. g:将权限设置为跟属组一样。
  10. o:将权限设置为跟其他人一样。

eg;chmod o+r newfile

4.2 改变所属关系–chown/chgrp

Linux提供了两个命令来实现这个功能:
chown命令用来改变文件的属主chgrp命令用来改变文件的默认属组

notice:

  1. 只有root用户能够改变文件的属主
  2. 任何属主都能够改变文件的属组,但前提是属主必须是原属组合目标属组的成员。

5.共享文件–创建组(SGID)

Linux系统上共享文件的方法是创建组。但在一个完整的共享文件的环境中,事情会复杂得多。
Linux还为每个文件和目录存储了三个额外的信息位

  1. 设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
  2. 设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
  3. 粘着位:进程结束后文件还驻留(粘着)在内存中。

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

SGID如何设置?-- chmod命令。它会加到标准3位八进制值之前(组成4位八进制值),或者在
符号模式下用符号s。
在这里插入图片描述
eg:

mkdir testdir
ls -l
drwxrwxr-x 2 rich rich 4096 Sep 20 23:12 testdir/
chgrp shared testdir
chmod g+s testdir
ls -l
drwxrwsr-x 2 rich shared 4096 Sep 20 23:12 testdir/   /*这里其他人组多了一个s*/

申明:文中没特殊注明,图皆来自Linux命令行与shell脚本编程大全<第三版>。

发布了91 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_23327993/article/details/104559216