本章内容
Linux的安全模型
用户和组
用户和组管理命令
文件权限
默认权限
特殊权限
ACL访问控制
一:3A认证
Authentication :认证
Authorization :授权
Audition 审计
Authentication(认证):验证用户的身份(账号和密码)与可使用的网络等一系列服务
Authorization (授权):依据认证结果开放网络等各种服务给用户,对用户的资源访问权限进行集中控制。
Audition (审计):将用户所有的操作日志集中记录管理和分析,不仅可以对用户行为进行监控,并且可以通过集中的审计数据进行数据挖掘,以便于事后的安全事故责任的认定。
形象的说就是用户通过用户名和密码认证,认证后获得令牌token(identity),令牌是已经被授权过的“身份卡”,拥有令牌之后就可以访问或者操作系统了,但是活动内容是被授权时赋予的权限限制的,规定了你能做什么;而审计是一种监督管控的措施,它保留日志等一切有关系统、用户活动的事物,可以管控用户是否有非正常操作等不合理的地方。
而linux系统在此过程中,用到的有:
用户名(USERID即UID)
密码(passwd)
主组(GID)
附加组(辅助组)(other)
文件和目录权限
ACL访问控制列表
通过上述各项,对用户的系统活动进行初步的管理
二、用户和组
1、用户user和用户ID(UID)
在linux系统中每一个用户都有自己用户名,但是linux在识别时,并不是识别我们登陆时键入的用户名,而是用户名所对应的UID,而UID才是真正的身份证号码,就好比我们的身份证一样,最后用于核实身份的是身份证号码就是这个道理。因此用户名与用户ID(UID)的关系如下
用户名:类此姓名 方便用户记忆操作登录
用户ID:类此身份证号码 系统识别身份的真正依据
比如我们在系统正常新建一个用户User1,指定UID号码是1111,然后
在linux中用户(UESRNAME和UID)分为
管理用户(管理员root UID=0)
普通用户(UID=1-65535)
系统用户(如nologin)CentOS6.8默认UID=1-499;CentOS7.2默认UID=1-999
作用:对为了能够让后台进程或服务类进程以非管理员的身份运行,通常系统或应用程序需要为此创建多个普通用户,这类用户从不用登录系统,仅仅用来让其他进程以它的身份运行,从而仅能获取普通权限的;用户自己也可以常见系统用户。
登录交互用户(我们日常登陆工作的账户))CentOS6.8默认UID=500-60000;CentOS7.2默认
UID=1000-60000
作用:我们日常工作所用的交互账户,也是我们正常推荐所用的账户(root权限太大,操作有风险),有普通的权限,能够正常操作维护系统。
OK,我们来看一下示例,来看看UID如何影响用户名(账号)的
示例(1)
我们正常新建一个普通登录用户user1,并且指定UID=1111
1
|
useradd -u 1111 user1 |
然后在/etc/passwd中查看user1用户信息
1
|
getent passwd user1 |
查看普通用户家目录/home下的用户家目录列表存在的user1家目录的信息
1
|
ll /home |
然后删除user1账户,但是保留家目录
1
|
userdel user1 |
查看普通用户家目录/home下的用户家目录列表存在的user1家目录的信息的变化
1
|
ll /home |
添加用户user2,但是指定其uid=1111,与原来的user1相同
1
|
useradd -u 1111 user2 |
查看/etc/passwd中查看用户信息变化以及家目录中的变化
1
2
|
getent passwd ll /home |
示例2
作此示例请做好备份快照
我们用nano或vim文本编辑工具编辑修改/etc/passwd中的root uid=2222,并将user2的 uid=0
首先我们先要激活user2的密码,否则无法登陆
1
|
passwd user2 |
然后编辑配置/etc/passwd的信息,将root uid改为2222 将user2 uid改为0
1
|
vim /etc/passwd |
我们以前提到过管理员的命令提示符默认是 # ,而普通用户为 $
然后我们重新登录一下系统,系统会重新读取/etc/passwd文件
1
|
exit |
重新登录
登录user2会发现命令提示符变为 # 而默认管理员的命令提示符就是 # 而且切换用户root并不需要密码
而反观root用户原先只有管理员能够查看的/etc/shadow文件竟然不能访问查看,而且命令提示符号变为默认的普通用户 $ ;切换回user2账号竟然需要密码!而且能够查看/etc/shadow文件了
由此我们可以看出系统中的识别机制:是以用户ID即UID为依据的,并不是我们所用的用户名。
所以linux中的uid可以决定用户的身份,并影响其所属关系及权限。
注意:以上恢复原状,把root和user2的uid改回原值即可
用户uid是可以重复的(用命令创建和修改),但是一般不建议如此做
/etc/passwd 是全局配置文件之一 是数据库文件 记录的是用户账户的相关信息,可以用
1
|
man 5 passwd |
了解相关参数的含义
2、密码
账户密码是用户登录认证的关键,我们在这里初步了解一下linux中用户密码,在系统中存储位置,和密码组成以及加密算法
在linux密码在早期版本中存储在数据库文件/etc/passwd中的第二个参数位置上,但是后期存储在/etc/shadow中,从现在的机制来说了,由于系统运作所需,passwd是所有用户都可以查看的,而shadow文件只能是root管理员查看来看,是为了安全因素所以给转移存储位置了,如果想要回到原来的存储模式,方法如下:
1
2
|
pwunconv #关闭影子密码,是密码重新存储到/etc/passwd,而非/etc/shadow中 pwconv #打开影子密码 |
上图我们可以看到,当关闭影子密码后,密码已经存储得到/etc/passwd中了,而且我们会发现/etc/shadowwen文件没有了!!!重现开启回到系统默认的影子密码模式,/etc/shadow文件又有了,密码又不存储在/etc/passwd中了,而是又存储到/etc/shadow中了
密码的组成:在系统中正常的密码组成由三部分构成
第一个$后是加密算法,数字与加密算法对应关系如下:
1:MD5 128位
2:sha1 160位
3:sha224 224位
4:sha256 256位
5:sha384 384位
6:sha512 512位
也因此我们可以看出上图user2的加密算法是sha512的
而早期密码算法多用MD5和sha1,位数没有上图显示的那么长,在当时虽然已经有更复杂的密码,但是考虑到加密和解密验证,都是要消耗系统资源的,同时还没有人能破解这种加密算法,所以为了让系统系统资源利用率更高,而没有使用更复杂算法;但是,在2005年由我国数学家王小云女博士!女博士!女博士!成功破解,也因此导致其后所有重要领域的密码加密算法改变。
天朝威武霸气,女博士天下无敌!!!!
女博士后是怪物!是寂寞啊!不吹不黑!呵呵
加密机制:
加密:明文–> 密文
解密:密文–> 明文
单向加密:相同算法定长输出,获得密文不可逆推出原始数据
哈希算法,原文不同,密文必不同
雪崩效应:初始条件的微小改变,引起结果的巨大改变
更改加密算法 authconfig –passalgo=sha256 — update
注意:
此命令是修改/etc/login.defs文件中的参数来实现的,所以对所有人有效,已经创建的用户加密模式不变,但是修改会变化,新建用户则使用修改后的加密算法,且重新登录也依然有效
第二$后是salt(盐):可以抽象理解为调料的作用,就是相同的密码,加入salt产生的随机数之后依据雪崩效应,产生的密文就不一样,这样就避免如果别人的密码密文与自己的一样,继而推算我们的密码。
第三$之后才是真正的密码密文,很根据加密算法位数的不同,而呈现不同长度,但是在相同算法下,不同长度的密码,密码密文长度相同,是等长的,所以,密码密文的长度由密码的加密算法决定
密码的复杂性策略
使用数字、大写字母、小写字母及特殊字符中至少3种
足够长原则上至少8位
使用随机密码
定期更换;不要使用最近曾经使用过的密码
3、组group(主组gid、附加组)
Linux 组:Groupname/GID
管理员组:root(与管理员账户名root同名) gid=0
普通组:gid=1-65535
系统组:默认对应系统用户的组
CentOS6.8:1-499
CentsOS7.2:1-999
普通组:默认对应普通登录用户的组
CentOS6.8:500-60000
CentsOS7.2:1000-60000
Linux 组的类别:
用户的主要组( 主组gid):用户必须属于一个且只有一个主组
组名同用户名,且仅包含一个用户:私有组
用户的附加组( 辅助组):一个用户可以属于零个或多个辅助组
在linux系统中用户的组我们可以抽象理解为所属部门,主组就是主职部门(也就是我们的关系所在地),而附加组则是兼职部门(比如技术部的主职技术员,本身又兼职公关部的形象大使)
组也是有密码的,默认情况下,是没有密码的,
用户和组的配置文件
Linux 用户和组的主要配置文件:
/etc/passwd :用户及其属性信息
( 登录名:密码位(已经转存至shadow):用户UID :主组GID :注释信息:家目录路径:shell类型)
/etc/shadow :用户密码及其相关属性
(登录名:加密的密码:最后一次修改密码时间:密码最小有效期:密码最大有效期:密码警告时间:密码禁用期:账户有效期:保留字段)
/etc/group :组及其属性信息
(组名:组密码:组gid:组成员列表)
/etc/gshadow:组密码及其相关属性
(组名:加密的组密码:组管理员:组成员列表)
补充:
/etc/shadow-
/etc/shadow 的备份文件。
注意,此文件由 shadow 工具集使用,而不是所有的用户和密码管理工具都会使用。
/etc/passwd
登录名:用户的登录名,而且不应该包括大写字母
加密密码:是加密的用户密码、 星号 (*) 或 let‐ter 'x'。但是已经使用影子密码存储于shadow内
用户UID:此用户ID(UID)
组GID:此用户主要组ID(GID)
注释:"注释字段" 此字段是可选的使用仅用于提供信息。通常情况下,它包含完整的用户名。
家目录:用户的主目录即家目录,用户的登录的初始目录位置,此处设置影响主目录的环境变量
shell:用户登录时的shell程序类型,如果没有就无法登陆,此处设置影响shell环境变量
/etc/shadow
登录名:必须是有效的账户名,且已经存在于系统中。
加密密码:不解释,一般默认加密模式sha512
但是要注意如果密码字段包含一些不是 crypt(3) 合法结果的字符,比如 ! 或 *,用户将无法使用unix 密码登录(但是可以通过其它方法登录系统)。此字段可以为空,此时认证为特定的登录名时,不要求密码。然而,一些读取 /etc/shadow文件的应用程序,在密码字段为空时,可能决定禁止任何访问。以叹号开始的密码字段意味着密码被锁定。该行的剩余字符表示锁定之前的密码。
最后一次更改密码的日期:最近一次更改密码的时间,表示从1970年1月1日开始的天数。
0 有特殊意思,表示用户应该在下次登录系统时更改密码。
空字段表示密码年龄功能被禁用。
密码的最小年龄:
最小密码年龄是指,用户一次更改密码之后,要等多长时间才再次被允许更改密码。
空字段或 0 表示没有最小密码年龄。随时可以改密码。
最大密码年龄:
最大密码年龄是指,这些天之后,用户必须更改密码。这些天之后,密码仍然可用。用户将会在下次登录的时候被要求更改密码。
99999 表示永不过期
空字段表示没有最大密码年龄,没有密码警告时间段,没有密码禁用时间段
如果最大密码年龄小于最小密码年龄,用户将会不能更改密码。
密码警告时间段:
密码过期之前,提前警告用户的的天数。默认为一周
空字段或者 0 表示没有密码警告期。
密码禁用期:
密码过期后,仍然接受此密码的天数(在此期间,用户应该在下次登录时修改密码)。
密码到期并且过了这个宽限期之后,使用用户的当前的密码将会不能登录。用户需要联系系统管理员。
空字段表示没有强制密码过期。
账户过期日期:
账户过期的日期,表示从1970年1月1日开始的天数。
注意,账户过期不同于密码过期。账户过期时,用户将不被允许登录;密码过期时,用户将不被允许使用其密码登录。
空字段表示账户永不过期。
应该避免使用 0,因为它既能理解成永不过期也能理解成在1970年1月1日过期。
保留字段:
此字段保留作将来使用。
/etc/group
主组名:group_name主要组名称
密码:加密密码,如果此处为空则不需要密码。
GID:主组ID
user_list:以此组为附加组的组成员列表,彼此之间用逗号隔开
/etc/gshadow
组名:必须是系统中已经存在的有效组。
加密密码:注意如果密码字段包含一些不是 crypt(3) 合法结果的字符,比如 ! 或 *,用户将无法使用unix 密码登录此组。但是组内成员不需要密码
此密码用于不是此组成员的用户获取此组的权限。
此字段可以为空,此时,只有组成员可以获取组权限。
以叹号开始的密码字段意味着密码被锁定。该行的剩余字符表示锁定之前的密码。
此密码取代 /etc/group 中指定的任何密码。
管理员
必须是一个逗号分隔的用户名列表。
管理员可以更改组密码和成员。
管理员也有成员一样的权限
成员
必须是一个逗号分隔的附加组用户名列表。
成员可以免密码访问组。
有关以上配置文件的命令
vipw和vigr:编辑密码(passwd)、组(group)、影子密码(shadow)或影子组文件(gshadow)。
vipw和vigr命令分别编辑 /etc/passwd 和 /etc/group 文件。使用 -s标识时,将编辑这些文件的影子版,即分别为 /etc/shadow 和/etc/gshadow。这些程序将设置相应的锁,以防止文件损坏。寻找编辑器时,首先尝试环境变量$VISUAL,然后是环境变量 $EDITOR,最后是默认编辑器 vi。
格式:
vipw [选项]
vigr [选项]
vipw 和 vigr 命令可以接受的选项有:
-g, –group
编辑 group 数据库。vigr -g
-p, –passwd
编辑 passwd 数据库。vipw -p
-q, –quiet
安静模式。
-R, –rootCHROOT_DIR
应用 CHROOT_DIR 目录中的更改,并使用 CHROOT_DIR 目录中的配置文件。
-s, –shadow
编辑 shadow 或 gshadow 数据库。
环境变量
VISUAL
要使用的编辑器。
EDITOR
VISUAL 没有设置的情况下,使用的编辑器。
pwck
查用户及其认证信息的完整性。它检查 /etc/passwd 和 /etc/shadow格式正确、数据有效。将会提示用户删除格式不正确或者有其它错误的项。
格式:pwck [选项] [passwd [ shadow ]]
检查的项目有:
· 正确的字段数
· 一个唯一且有效的用户名
· 一个有效的用户和组标识符
· 有效的主组
· 有效的主目录
· 有效的登录 shell
当指定第二个文件参数或 /etc/shadow 在系统中存在时,启用 shadow 检查。
这些检查是:
· 每个密码项都有对应的影子相,反之亦然。
· 密码在影子化了的文件中指定
· 影子项有正确的字段数。
· 影子项在影子文件中是唯一的
· 最后一次的密码更改时间不是被设成了一个将来的时间。
操作 /etc/passwd 文件的这些命令不能警告损坏或重复的条目,这些情况下,应该使用 pwck
来移除这写有问题的条目。
选项
-r 和 -s 选项不能联合使用。
pwck 选项可以接受的选项有:
-q, –quiet
只报告错误。不显示那些不需要用户操作的警告。
-r, –read-only
在只读模式下执行 pwck。
-R, –rootCHROOT_DIR
用 CHROOT_DIR 目录中的更改,并使用 CHROOT_DIR 目录中的配置文件。
-s, –sort
根据 UID 在 /etc/passwd 和 /etc/shadow 对项目进行排序。
默认上,pwck 操作文件 /etc/passwd 和 /etc/shadow。用户也可以使用 passwd 和 shadow参数来选择替代文件。
配置文件
在 /etc/login.defs 中有如下配置变量,可以用来更改此工具的行为:
PASS_MAX_DAYS (number)
一个密码可以使用的最大天数。如果密码比这旧,将会强迫更改密码。如果不指定,就假定为-1,这会禁用这个限制。
PASS_MIN_DAYS (number)
两次更改密码时间的最小间隔。将会拒绝任何早于此的更改密码的尝试。如果不指定,假定为-1,将会禁用这个限制。
PASS_WARN_AGE (number)
密码过期之前给出警告的天数。0
表示只有只在过期的当天警告,负值表示不警告。如果没有指定,不会给警告。
grpck:
验证组信息的完整性。它检查 /etc/group 和 /etc/gshadow 中的所有条目都具有正确的格式和包含有效数据。提示用户要删除的条目的格式不正确或有其他无法纠正的错误。
格式:grpck [选项] [group [ shadow ]]
检查的项目有:
· 正确的字段数
· 一个唯一且有效的组名
· 有效的组标识符 (仅 /etc/group)
· 有效的成员和 管理员 列表。
选项
-r 和 -s 选项不能联合使用。
grpck 可以接受的选项有:
-r, –read-only
在只读模式下执行 grpck 命令。这会导致更改,无需用户干预不回答有关的所有问题。
-R, –rootCHROOT_DIR
应用 CHROOT_DIR 目录中的更改,并使用 CHROOT_DIR 目录中的配置文件。
-s, –sort
根据 GID 在 /etc/group和 /etc/gshadow 中进行排序。
默认情况下,grpck 在 /etc/group 和 /etc/gshadow 上操作。用户可以选择使用组和阴影参数的备用文件。
配置文件
在 /etc/login.defs 中有如下配置变量,可以用来更改此工具的行为:
MAX_MEMBERS_PER_GROUP (number)
每个组条目的最大成员数。达到最大值时,在 /etc/group
开始一个新条目(行)(使用同样的名称,同样的密码,同样的 GID)。
默认值是 0,意味着组中的成员数没有限制。
此功能(分割组)允许限制组文件中的行长度。这对于确保 NIS 组的行比长于 1024 字符。
如果要强制这个限制,可以使用 25。
注意:分割组可能不受所有工具的支持(甚至在 Shadow工具集中)。您不应该使用这个变量,除非真的需要。
pwconv;pwunconv,grpconv;grpunconv
pwconv [选项]
pwunconv [选项]
grpconv [选项]
grpunconv [选项]
描述
pwconv 命令使用 passwd 以及可选并已经存在的 shadow 来创建 shadow。
pwunconv 命令使用 passwd 和 shadow 来创建 passwd,然后移除 shadow。
grpconv 从 group 和可能存在的 gshadow 创建 gshadow。
grpunconv 命令从 group 和 gshadow 创建 group,然后移除 gshadow。
这四个程序都可以操作普通或影子密码和组文件:/etc/passwd,/etc/group,/etc/shadow/etc/gshadow。
转换前,每个程序都会获取需要的锁。pwconv 和 grpconv
也类似。首先删除,存在于在影子文件中,但在主文件中却没有的条目;然后,更新在主文件中不使用“x”作为密码的影子条目,会添加所有缺失的条目;最后,将主文件中的密码替换为“x”。这两个工具可以用于初始转换以及根据手动编辑的主文件更新影子文件。
pwconv 向 /etc/shadow 添加条目时,将使用/etc/login.defs 中的PASS_MIN_DAYS,PASS_MAX_DAYS 和 PASS_WARN_AGE 值。
pwunconv 和 grpunconv
与此类似。主文件中的密码会根据影子文件更新。在主文件中存在,但不在影子文件中的条目单独留下。最后,移除影子文件。一些密码年龄信息会因为
pwunconv 而丢失。它只转换它可以转换的。
配置文件
/etc/login.defs 中的如下配置变量改变 grpconv 和 grpunconv 的行为:
MAX_MEMBERS_PER_GROUP (number)
每个组条目的最大成员数。达到最大值时,在 /etc/group
开始一个新条目(行)(使用同样的名称,同样的密码,同样的 GID)。
默认值是 0,意味着组中的成员数没有限制。
此功能(分割组)允许限制组文件中的行长度。这对于确保 NIS 组的行比长于 1024 字符。
如果要强制这个限制,可以使用 25。
注意:分割组可能不受所有工具的支持(甚至在 Shadow工具集中)。您不应该使用这个变量,除非真的需要。
/etc/login.defs 中的如下配置变量改变 pwconv 的行为:
PASS_MAX_DAYS (number)
一个密码可以使用的最大天数。如果密码比这旧,将会强迫更改密码。如果不指定,就假定为 -1,这会禁用这个限制。
PASS_MIN_DAYS (number)
两次更改密码时间的最小间隔。将会拒绝任何早于此的更改密码的尝试。如果不指定,假定为 -1,将会禁用这个限制。
PASS_WARN_AGE (number)
密码过期之前给出警告的天数。0
表示只有只在过期的当天警告,负值表示不警告。如果没有指定,不会给警告。
文件
/etc/login.defs
Shadow 密码套件配置。
三、用户及组的管理命令:
useradd:创建一个新用户或更新默认新用户信息
格式 useradd [选项] 登录
useradd -D
useradd -D [选项]
描述
如果使用时不带 -D 选项,useradd
命令使用命令行上指定的值和系统的默认值创建一个新用户。根据命令行选项,useradd
命令也会更新系统文件和创建新用户的主目录并复制初始文件。
默认上,也会为用户创建组 (察看 -g, -N, -U,和 USERGROUPS_ENAB)。
选项
useradd 可以使用的选项有:
-b, –base-dirBASE_DIR
如果没有使用 -dHOME_DIR,则使用默认的基目录。BASE_DIR
加上账户名就是主目录。如果没有使用 -m 选项,BASE_DIR 必须已经存在。
如果选项没有指定,useradd 将使用 /etc/default/useradd 中的 HOME 变量,或者默认的/home。
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
-d<登入目录>:指定用户登入时的启始目录;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m:自动建立用户的登入目录;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-s:指定用户登入后所使用的shell;
-u:指定用户id。
用户登陆的 SELinux 用户。默认为留空,这会造成系统选择默认的 SELinux 用户。
-D, –defaults
看下边,“更改默认值”子节。
更改默认值
只带 -D 选项使用时,useradd 将显示当前的默认值。-D 和其它选项配合使用时,useradd
将为指定的选项更新默认值。有效的“更改默认值”选项有:
-b, –base-dirBASE_DIR
新用户主目录的路径前缀。如果创建新账户时,没有使用 -d 选项,用户的名称将会缀在BASE_DIR 的后边形成新用户的主目录名。
这个选择在 /etc/default/useradd 中设置 HOME 选项。
-e, –expiredateEXPIRE_DATE
禁用此用户账户的日期。
此选项在 /etc/default/useradd 中设置 EXPIRE 变量。
-f, –inactiveINACTIVE
密码过期到账户被禁用之前的天数。
这个选项在 /etc/default/useradd 中设置 INACTIVE 变量。
-g, –gidGROUP
新用户初始组的组名或 ID (使用了 -N/–no-user-group 或者 /etc/login.defs 中的变量USERGROUPS_ENAB 设置为 no 时)。给出的组必须存在,并且数字组 ID
必须有一个已经存在的项。
这个选项在 /etc/default/useradd 中设置 GROUP 变量。
-s, –shellSHELL
新用户的登录 shell 名。
这个选项在 /etc/default/useradd 设置 SHELL 变量。
注意:
系统管理员负责将默认的用户文件放在 /etc/skel/
目录中(或者命令行上、/etc/default/useradd 中指定的任何其它目录)。
CAVEATS
您可能不能想 NIS 组或 LDAP 组添加用户。这只能在相应服务器上进行。
相似地,如果用户名已经存在于外部用户数据库中,比如 NIS 或 LDAP,useradd
将拒绝创建用户账户的请求。
用户名必须以一个小写字母或下划线开始,跟随小写字符、数字、下划线或连字符的组合。可以以美元符号结束。用正则表达式表示就是:[a-z_][a-z0-9_-]*[$]?
用户名不能超过 32 个字符长。
配置文件
在 /etc/login.defs 中有如下配置变量,可以用来更改此工具的行为:
CREATE_HOME (boolean)
指示是否应该为新用户默认创建主目录。
此设置并不应用到系统用户,并且可以使用命令行覆盖。
GID_MAX (number), GID_MIN (number)
useradd,groupadd 或 newusers 创建的常规组的组 ID 的范围。
GID_MIN 和 GID_MAX 的默认值分别是 1000 和 60000。
MAIL_DIR (string)
邮箱目录。修改或删除用户账户时需要处理邮箱,如果没有指定,将使用编译时指定的默认值。
MAIL_FILE (string)
定义用户邮箱文件的位置(相对于主目录)。
MAIL_DIR and MAIL_FILE 变量由 useradd,usermod 和 userdel
用于创建、移动或删除用户邮箱。
如果 MAIL_CHECK_ENAB 设置为 yes,它们也被用于定义 MAIL 环境变量。
MAX_MEMBERS_PER_GROUP (number)
每个组条目的最大成员数。达到最大值时,在 /etc/group
开始一个新条目(行)(使用同样的名称,同样的密码,同样的 GID)。
默认值是 0,意味着组中的成员数没有限制。
此功能(分割组)允许限制组文件中的行长度。这对于确保 NIS 组的行比长于 1024 字符。
如果要强制这个限制,可以使用 25。
注意:分割组可能不受所有工具的支持(甚至在 Shadow
工具集中)。您不应该使用这个变量,除非真的需要。
PASS_MAX_DAYS (number)
一个密码可以使用的最大天数。如果密码比这旧,将会强迫更改密码。如果不指定,就假定为-1,这会禁用这个限制。
PASS_MIN_DAYS (number)
两次更改密码时间的最小间隔。将会拒绝任何早于此的更改密码的尝试。如果不指定,假定为-1,将会禁用这个限制。
PASS_WARN_AGE (number)
密码过期之前给出警告的天数。0
表示只有只在过期的当天警告,负值表示不警告。如果没有指定,不会给警告。
SYS_GID_MAX (number), SYS_GID_MIN (number)
useradd、groupadd 或 newusers 创建的系统组的组 ID 的范围。
SYS_GID_MIN 和 SYS_GID_MAX 的默认值分别是 101 和 GID_MIN-1。
SYS_UID_MAX (number), SYS_UID_MIN (number)
useradd 或 newusers 创建的系统用户的用户 ID 的范围。
SYS_UID_MIN 和 SYS_UID_MAX 的默认值分别是 101 和 UID_MIN-1。
UID_MAX (number), UID_MIN (number)
useradd 或 newusers 创建的普通用户的用户 ID 的范围。
UID_MIN 和 UID_MAX 的默认值分别是 1000 和 60000。
UMASK (number)
文件模式创建掩码初始化为此值。如果没有指定,掩码初始化为 022。
useradd 和 newusers 使用此掩码设置它们创建的用户主目录的模式。
也被 login 用于指定用户的初始 umask。注意,此掩码可以被用户的 GECOS
行覆盖(当设置了 QUOTAS_ENAB 时),也可以被带 K 指示符的 limits(5)
定义的限制值覆盖。
USERGROUPS_ENAB (boolean)
如果 uid 和 gid 相同,用户名和主用户名也相同,使非 root 组的组掩码位和属主位相同(如:022 -> 002, 077 -> 007)。
如果设置为 yes,如果组中没有成员了,userdel 将移除此用户组,useradd
创建用户时,也会创建一个同名的默认组。
文件
/etc/default/useradd
账户创建的默认值。
/etc/skel/
包含默认文件的目录。
/etc/login.defs
Shadow 密码套件配置。
usermod:修改一个用户账户;修改系统账户文件和在命令行上指定的相关更改。
格式:usermod [选项] 登录名
选项
-a, –append
将用户添加到附加组。只能和 -G 选项一起使用。
-c, –commentCOMMENT
用户密码文件中注释字段的新值。通常使用 chfn工具对其进行修改。
-d, –homeHOME_DIR
用户的新登录目录。
如果给了 -m 选项,当前主目录的内容将会移动到新主目录中,如果不存在,则创建。
-e, –expiredateEXPIRE_DATE
用户账户将被禁用的日期。日期以 YYYY-MM-DD 格式指定。
空 EXPIRE_DATE 参数将禁用账户过期。
此选项需要一个 /etc/passwd 文件。如果没有,将会创建一条 /etc/shadow 项目。
-f, –inactiveINACTIVE
密码过期之后,账户被彻底禁用之前的天数。
0 表示密码过期时,立即禁用账户;-1 表示不使用这个功能。
此选项需要一个 /etc/passwd 文件。如果没有,将会创建一条 /etc/shadow 项目。
-g, –gidGROUP
用户的新初始登录组的组名或数字代号。此组必须存在。
用户主目录中,属于原来的主组的文件将转交新组所有。
主目录之外的文件所属的组必须手动修改。
-G, –groupsGROUP1[,GROUP2,…[,GROUPN]]]
用户还属于的附加组列表。组之间使用逗号分隔,没有空格。这些组需要遵守和 -g
选项中给的组同样的限制。
如果用户当前是一个组的成员,而这个组没有列在这里,用户将被从那个组里便删除。这个行为可以通过-a 选项修改,这使用户追加到给出的附加组列表中。
-l, –loginNEW_LOGIN
用户的名称将会从 LOGIN 修改为
NEW_LOGIN。不会更改别的任何东西。特别是,用户的主目录名和邮件池也需要手动修改以和新登录名对应。
-L, –lock
锁定用户的密码。这会在用户加密的密码之前放置一个“!”,可以快速禁用密码。您可以和-p 或 -U 配合使用此选项。
注意:如果希望锁定账户(不仅仅是通过密码访问),您也需要设置EXPIRE_DATE为1。
-m, –move-home
将用户的主目录移动到新位置。
这个选项只有和 -d (或 –home) 选项组合使用时才有效。
usermod 会改写文件的属主并复制模式、ACL 和扩展属性,但是稍后也可能需要手动修改。
-o, –non-unique
使用 -u 选项时,可以将用户 ID 改为非唯一的值。
-p, –passwordPASSWORD
已经加密过的密码,就像 crypt(3) 返回的那样。
注意:不推荐使用这个选项,因为密码(或加密过的密码)会被用户通过列出这个过程而看到。您应该确保密码符合系统的密码政策。
-R, –rootCHROOT_DIR
Apply changes in the CHROOT_DIR directory and use the configuration files fromthe CHROOT_DIR directory.
-s, –shellSHELL
用户的新登录 shell 的名称。将此字段设置为空会让系统选择默认的登录 shell。
-u, –uidUID
用户 ID 的新数值。
这个值必须是唯一的,除非使用了 -o 选项,必须是非负值。
用户的邮箱,用户主目录中属于此用户的文件的属主 ID 也将自动更改。
用户主目录之外文件所有权必须手动修复。
不会对 /etc/login.defs 中的 UID_MIN, UID_MAX, SYS_UID_MIN 和 SYS_UID_MAX进行检查。
-U, –unlock
解锁用户的密码。这将移除加密的密码之前的“!”。您可以将此选项和 -p 或 -L 配合使用。
注意:如果您希望解锁账户(不只是使用密码访问),您也应该设置 EXPIRE_DATE(例如设置为 99999,或者 /etc/default/useradd 中的 EXPIRE 值)。
-Z, –selinux-userSEUSER
用户登陆的 SELinux 用户。
空的 SEUSER 将移除用户 LOGIN 的 SELinux 用户映射(如果有)。
CAVEATS
如果要更改用户的数字
ID、用户名或主目录,需要确保允许命令时,用户没有执行任何进程。usermod 会在 Linux
上进行检查;但是在其它平台上,仅仅根据 utmp 检查用户是否已经登录。
您必须手动更改 crontab 文件或 at 作业的属主。
您必须更改 NIS 服务器上的 NIS 相关内容。
配置文件
在 /etc/login.defs 中有如下配置变量,可以用来更改此工具的行为:
MAIL_DIR (string)
邮箱目录。修改或删除用户账户时需要处理邮箱,如果没有指定,将使用编译时指定的默认值。
MAIL_FILE (string)
定义用户邮箱文件的位置(相对于主目录)。
MAIL_DIR and MAIL_FILE 变量由 useradd,usermod 和 userdel
用于创建、移动或删除用户邮箱。
如果 MAIL_CHECK_ENAB 设置为 yes,它们也被用于定义 MAIL 环境变量。
MAX_MEMBERS_PER_GROUP (number)
每个组条目的最大成员数。达到最大值时,在 /etc/group
开始一个新条目(行)(使用同样的名称,同样的密码,同样的 GID)。
默认值是 0,意味着组中的成员数没有限制。
此功能(分割组)允许限制组文件中的行长度。这对于确保NIS组的行比长于1024字符。
如果要强制这个限制,可以使用 25。
注意:分割组可能不受所有工具的支持(甚至在 Shadow工具集中)。您不应该使用这个变量,除非真的需要。
userdel:删除用户账户和相关文件
userdel [OPTIONS] login_name
-f, –force 此选项强制删除用户账户,甚至用户仍然在登录状态。它也强制userdel删除用户的主目录和邮箱,即使其它用户也使用同一个主目录或邮箱不属于指定的用户。如果/etc/login.defs 中的 USERGROUPS_ENAB 定义为yes,并且如果有一个和用户同名的组,也会删除此组,即使它仍然是别的用户的主组。
注意:此选项危险,可能会破坏系统的稳定性。
-r, –remove 用户主目录中的文件将随用户主目录和用户邮箱一起删除。在其它文件系统中的文件必须手动搜索并删除。邮箱在 login.defs 文件中的 MAIL_DIR 变量中定义。 -Z, –selinux-user 移除用户登录的所有 SELinux 用户映射。
newusers:批量更新和创建新用户
newusers [选项] [文件]
添加格式:
pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell
-r, –system 创建一个系统账户。
chpasswd:批量更新密码
chpasswd [选项]
添加格式 user_name:password
newusers chpasswd可用文本文件按照格式编辑好添加的内容,然后用管道输出重定向至以上两者命令
groupadd:创建添加一个新组
groupadd [OPTIONS] group_name
-g, –gidGID:指定GID,如果不指定默认是上一个组的GID+1
-r, –system 创建一个系统组。
groupmod:修改系统上的组属性
groupmod [OPTIONS] GROUP_NAME
-g, –gidGID:修改GID
-n, –new-nameNEW_GROUP:修改组名:组的名称将转为 NEW_GROUP 名称的组
-o, –non-unique 当使用-g 选项,允许 GID 组更改为非唯一值。
-p, –passwordPASSWORD
已经加密过的密码,就像 crypt(3) 返回的那样。
注意:不推荐使用这个选项,因为密码(或加密过的密码)会被用户通过列出这个过程而看到。
您应该确保密码符合系统的密码政策。
groupdel:删除一个组
groupdel [OPTIONS] GROUP_NAME
groupmems:用户主组的管理员成员
groupmems -a user_name | -d user_name | [-g group_name] | -l | -p
-a, –adduser_name 将一个用户添加到组成员列表。
-d, –deleteuser_name
从组成员列表中删除用户。如果 /etc/gshadow 文件存在,用户将会被从组成员和管理员中移除。
-g, –groupgroup_name
超级用户可以指定修改哪个组的组成员列表。
-l, –list
列出组成员。
-p, –purge
从组成员列表中删除所有用户。
groups:显示用户的组
groups [OPTION]… [USERNAME]…
passwd:修改用户密码
passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [–stdin] [username]
(1)passwd:修改用户自己的密码
(2)passwd USERNAME:修改指定用户的密码,但仅root有此权限
-l,-u:锁定和解锁用户
-d:清除用户密码串
-e DATE:过期期限,日期
-i DAYS:非活动期限
-n DAYS:密码的最短使用期限
-x DAYS:密码的最长使用期限
-w DAYS:警告期限
–stdin:
echo "PASSWORD" | passwd –stdin USERNAME
对用户的锁定其实就是在密码位的首部加 ! 默认刚刚添加的用户有两个 ! ;linux系统中原则上是不允许空密码登录的,而如果在/etc/shadow中将叹号 ! 删掉,并把密码也都删掉的话,就可以空密码登录了,Centos5以前的版本用解锁命令两次就是相当于将!!全部删掉而可以空密码登录,后期6、7版本就禁止了这种操作,但是修改passwd数据库文件/etc/shadow还是能够达到效果,但是建议不要怎么用
gpasswd:新建修改组密码
组密码文件:/etc/gshadow
gpasswd [OPTIONS] group
-a:添加用户到组;
-d:从组删除用户;
-A:指定管理员;
-M:指定组成员和-A的用途差不多;
-r:删除密码;
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
newgrp:临时切换指定的组为基本组
newgrp [-] [group]
-:会模拟用户重新登录以实现重新初始化其工作环境
chage:更改用户密码过期信息
chage [OPTIONS] login_name
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
chsh:改变用户登录的shell类型
chsh [-s shell] [-l] [-u] [-v] [username]
-s或–shell:更改系统预设的shell环境。
-l或–list-shells:列出目前系统可用的shell清单;
finger:用户信息查找程序
包括本地与远端主机的用户皆可,帐号名称没有大小写的差别。单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话。
finger [-lmsp] [user …] [user@host …]
-l:列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的Shell,登入时间,转信地址,电子邮件状态,还有计划文件和方案文件内容;
-m:排除查找用户的真实姓名;
-s:列出该用户的帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话;
-p:列出该用户的帐号名称,真实姓名,用户专属目录,登入所用的Shell,登入时间,转信地址,电子邮件状态,但不显示该用户的计划文件和方案文件内容。
不指定finger的选项如果提供操作者的话,缺省设为-l输出风格,否则为-s风格,注意在两种格式中,如果信息不足,都有一些域可能丢失,如果没有指定参数finger会为当前登录的每个用户打印一个条目。
如果要查询远程机上的用户信息,需要在用户名后面接@主机名,采用用户名@主机名的格式,不过要查询的网络主机需要运行finger守护进程的支持。
chfn:改变finger信息,这些信息都存放在/etc目录里的passwd文件里。若不指定任何选项,则chfn命令会进入问答式界面。
chfn [-f full-name] [-o office] ,RB [ -p office-phone] [-h home-phone] -u] [-v] [username]
-f<真实姓名>或–full-name<真实姓名>:设置真实姓名;
-h<家中电话>或–home-phone<家中电话>:设置家中的电话号码;
-o<办公地址>或–office<办公地址>:设置办公室的地址;
-p<办公电话>或–office-phone<办公电话>:设置办公室的电话号码;
id:显示用户UID、GID、组列表
id [OPTION]…[USER]
-u:仅显示有效的UID
-g:仅显示用户的基本组ID
-G:仅显示用户所属的所有组的ID
-n:显示名字而非ID
su:switch user
登录式切换:会通过读取目标用户的配置文件来重新初始化
su – USERNAME
su -l USERNAME
非登录式切换:不会读取目标用户的配置文件进行初始化
su USERNAME
注意:管理员可无密码切换至其它任何用户
-c 'COMMAND':仅以指定用户的身份运行此处指定的命令,并不切换用户
uname:显示系统信息(内核版本号、硬件架构、主机名称和操作系统类型等)
uname [OPTION]…
-a或–all:显示全部的信息;
-m或–machine:显示电脑类型;
-n或-nodename:显示在网络上的主机名称;
-r或–release:显示操作系统的发行编号;
-s或–sysname:显示操作系统名称;
-v:显示操作系统的版本;
-p或–processor:输出处理器类型或"unknown";
-i或–hardware-platform:输出硬件平台或"unknown";
-o或–operating-system:输出操作系统名称;
四、文件权限
进程由发起者身份运行,进程访问文件的权限,由发起此进程的用户身份权限决定
用ls -l 查看文件我们会发现信息的首部会出现以下类似信息
-rw-r–r– 1 root root 26195 Dec 17 10:42 install.log
权限位 引用计数 所用者 主组 大小 最后修改数据时间 文件名
(硬连接)(owner) (group) (默认单位字节)
rwxrwxrwx:
左三位:定义user(owner)的权限
中三位:定义group的权限
右三位:定义ohter的权限
进程安全上下文:
进程对文件的访问权限应用模型:
进程的属主与文件的属主是否相同,如果相同,则应用属主权限
否则,则检查进程的属主是否属于文件的属组,如果是,则应用属组权限;
否则,就只能应用other的权限
owner: 属主, u
group: 属组, g
other: 其他, o
权限类型:
r:readable,读
w:writable,写
x:excutable,执行
文件:
r:可获取文件的数据
w:可修改文件的数据
x:可将此文件运行为进程,一般情况下文件是不应该有此权限的
目录:
r:可使用ls命令获取其下的所有文件列表,但是不能使用ls -l获取详细属性信息
w:可修改此目录下的文件列表,即创建或删除文件
x:可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息
mode:rwxrwxrwx
ownership:user,group
权限组合机制:
— 000 0
–x 001 1
-w- 010 2
-wx 011 3
r– 100 4
r-x 101 5
rw- 110 6
rwx 111 7
权限管理命令:
chmod命令:
chmod [OPTION]… MODE[,MODE]… FILE…
chmod [OPTION]… OCTAL-MODE FILE…
chmod [OPTION]… –reference=RFILE FILE…
三类用户:
u:属主
g:属组
o:其它
a:所有
(1)chmod [OPTION]… MODE[,MODE]… FILE…
MODE表示法:
赋权表示法:一次性直接操作一类用户的所有权限位rwx
u=
g=
o=
a=
授权表示法:一次性直接操作一类用户的一个或多个权限位r,w,x
u+,u-
g+,g-
o+,o-
a+,a-(可以省略a)
都+w只对root管理员有效!!
(2)chmod [OPTION]… OCTAL-MODE FILE…
chmod 660 FILE
rw-rw—-
chmod 66 FILE
—rw-rw-
chmod 6 FILE
——rw-
因此最好是3位
(3)chmod [OPTION]… –reference=RFILE FILE…
例如
chmod –reference=/var/log/messages fstab
选项:
-R,–recursive:递归修改
对目录修改时非常有用
从属关系管理命令:chown,chgrp
chown 命令:
chown [OPTION]… [OWNER][:[GROUP]] FILE…
chown [OPTION]… [OWNER][.[GROUP]] FILE…
chown [OPTION]… –reference=RFILE FILE…
选项:
-R,–recursive:递归修改
注意:用户仅能修改属主为自己的那些文件的权限
chgrp命令:
chgrp [OPTION]… GROUP FILE…
chgrp [OPTION]… –reference=RFILE FILE…
注意:仅管理员可修改文件的属主和属组
uamsk:文件的权限反向掩码,遮罩码;umask值可以用来保留在创建文件权限
新建FILE 权限: 666-umask
如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数位保留
新建DIR 权限: 777-umask
非特权用户umask是 002
root 的umask 是 022
umask的值越大,代表着创建文件时默认的权限越小,由于root管理员的特殊性,为了避免其创建的敏感文件权限过大,所以linux系统默认情况下root用户的umask值比普通用户的大
注意:之所以文件用666去减,表示文件默认不能拥有执行权限,如果减得的结果中有执行权限,则需要将其加1
umask:023
666-023=644(643+1)
777-023=754
umask命令:
umask:查看当前umask
umask MASK:设置umask
注意:此类设定仅对当前shell进程有效
如果要永久有效则配置到以下文件中
全局设置: /etc/bashrc 用户设置:~/.bashrc
Linux 文件系统上的特殊权限
SUID, SGID, Sticky
三种常用权限:r, w, x user, group, other
安全上下文
前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
可执行文件上SUID 权限
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID 只对二进制可执行程序有效
SUID 设置在目录上无意义
权限设定:
chmod u+s FILE…
chmod u-s FILE…
可执行文件上SGID 权限
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属组
权限设定:
chmod g+s FILE…
chmod g-s FILE…
目录上的SGID 权限
默认情况下,用户创建文件时,其属组为此用户所属的主组
一旦某目录被设定了SGID ,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
通常用于创建一个协作目录
权限设定:
chmod g+s DIR…
chmod g-s DIR.
Sticky 位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
权限设定:
chmod o+t DIR…
chmod o-t DIR…
权限位映射
SUID: user, 占据属主的执行权限位
s: 属主拥有x 权限
S :属主没有x 权限
SGID: group, 占据属组的执行权限位
s: group 拥有x 权限
S :group 没有x 权限
Sticky: other, 占据other 的执行权限位
t: other 拥有x 权限
T :other 没有x
chattr
lsattr
访问控制列表
ACL :Access Control List ,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7.0 默认创建的xfs 和ext4 文件系统有ACL 功能。
CentOS7.X 之前版本,默认手工创建的ext4 文件系统无ACL
功能。需手动增加:
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt
ACL 生效 顺序:所有者,自定义用户,自定义组,其他人
ACL 文件上的group 权限是mask 值(自定义用户,自定义组,拥有组的最大权限), 而非 传统的组权限
getfacl 可看到特殊权限:flags
默认ACL 权限给了x ,文件也不会继承x 权限。
base ACL 不能删除
setfacl -k dir 删除默认ACL 权限
setfacl -b file1 清除所有ACL 权限
getfacl file1 | setfacl –set-file=- file2 复制file1的acl 权限给file2
mask 只影响除所有者和other 的之外的人和组的最大权限
Mask 需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
用户或组的设置必须存在于mask 权限设定 范围内才会 生效。
setfacl -m mask::rx file
–set 选项会把原有的ACL 项都删除,用新的替代,需要注意的是一定要包含UGO 的设置,不能象-m 一样只是添加ACL 就可以.
如:
setfacl –set u::rw,u:wang:rw,g::r,o::- file1
备份和恢复ACL
主要的文件操作命令cp 和mv 都支持ACL ,只是cp 命令需要加上-p 参数。但是tar 等常见的备份工具是不会保留目录和文件的ACL 信息
#getfacl -R /tmp/dir1 > acl.txt
#setfacl -R -b /tmp/dir1
#setfacl -R –set-file=acl.txt /tmp/dir1
#getfacl -R /tmp/dir1
getfacl:获取显示文件的访问控制列表
getfacl [-aceEsRLPtpndvh] file …
getfacl [-aceEsRLPtpndvh] –
setfacl:设置文件访问控制列表
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file …
setfacl –restore=file
-b,–remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。
-k,–remove-default:删除缺省的acl规则。如果没有缺省规则,将不提示。
-n,–no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。 –mask:重新计算有效权限,即使ACL mask被明确指定。
-d,–default:设定默认的acl规则。 –restore=file:从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除–test以外的任何参数一同执行。
–test:测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。
-R,–recursive:递归的对所有文件及目录进行操作。
-L,–logical:跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P,–physical:跳过所有符号链接,包括符号链接文件。
原创文章,作者:NameLess,如若转载,请注明出处:http://www.178linux.com/30524
评论列表(1条)
文章整体架构清晰,对用户,组及权限管理有了很好的归纳总结。