Linux学习(四)
Linux学习(四)
用户身份与文件权限
用户身份与能力
linux系统中的管理员就是root,这是错误的,linux系统的管理员之所以是root,并非是他的名字叫root,而是因为该用户的身份号码即(UID)user identification 的数值为0 ,在linux系统中,UID就像我们的身份号码一样,具有唯一性,因此可以通过用户的UID来判断用户的身份.
- 管理员UID为0:系统的管理员用户
- 系统用户UID为1~999:linux系统为了避免某个因服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏的范围
- 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户
需要注意的是,UID是不能冲突的,而且管理员创建的普通用户的uid默认是从1000开始的(即使前面还有闲置的号码)
为了方便管理属于同一组的用户,linux引入了组的概念,通过使用用户组号码(GID Group IDentIfication)可以把多个用户添加到同一组中,从而方便为组中的用户同一划定权限或者指定任务.假设一个公司中有多个部门,每个部门中又有很多员工,如果只是想让员工访问本部门内的资源,则可以针对部门而非具体的员工来设置权限.
另外,在linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有用户一个人,如果该用户以后被归纳到其他用户组,则这个其他用户组成为扩展用户组,一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要
基本用户组就像是原生家庭,实在创建账号时就自动生成的,而扩展用户组则像工作单位为了完成任务,需要加入到各个不同的群体中,这是需要手动添加的
id命令
id命令用于显示用户的详细信息,语法格式为
id 用户名 |
这个id命令时一个在创建用户前需要学习的命令,它能够简单轻松的查看用户的基本信息,例如用户id 基本组 与扩展组gid以便于我们判别某个用户是否已经存在,以及查看相关信息
useradd命令
useradd命令用于创建新的用户账号,语法
useradd [参数] 用户名 |
可以使用useradd命令用于创建用户账户.使用该命令创建用户时,默认的用户家目录会被存放在/home目录中,默认的shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组.
useradd命令中的参数以及作用
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
下面使用useradd命令创建一个名称为wanan的用户,并使用id命令确认信息
创建一个普通用户并指定家目录的路径,用户的UID以及shell解释器,在下面的命令中,请注意/sbin/nologin,他是终端解释器中的一员,与bash解释器有着天壤之别,一旦用户的解释器被设置为nologin,代表用户不能登录到系统中
groupadd命令
groupadd命令用于创建新的用户组语法
groupadd [参数] 群组名 |
为了能够更加高效的指派系统中各个用户的权限,在工作中常常会把这几个用户加入到同一个用户组中,这样便可以针对一类用户同一安排权限.例如在工作中成立了一个部门组,当有新同事加入是就把他的账号添加到这个部门组中,这样新同事的权限就会自动跟其他同事一模一样了,从而省去了一系列繁琐的操作
创建用户组的步骤非常简单,例如使用如下命令创建一个用户组user
usermod命令
usermod命令用于修改用户的属性,英文为 user modify 语法格式为
usermod [参数] 用户名 |
在系统中创建用户也就是修改配置文件的过程,用户的信息保存在/etc/passwd文件中,可以直接使用文本编辑器来修改其中的用户参数项目,也可以使用usermod命令修改已经创建的用户信息,比如用户的UID 基本/扩展用户组 默认终端
usermod命令中的参数以及作用
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
将wanan用-G参数添加到root组中
使用-u参数改变wanan用户的UID号码值
将默认的/bin/bash修改为/sbin/nologin
这个用户的终端设置为/sbin/nologin后用户就不能登录了,但这个用户依然可以被某个服务所调用,管理某个具体的服务,这样的好处是当黑客通过这个服务侵入之后,破坏的范围也仅仅局限于这个特定的服务,而不能使用这个用户身份登录到整台服务器上.
passwd命令
passwd命令用于修改用户的密码 过期时间等信息 password 语法
passwd [参数] 用户名 |
普通用户只能使用passwd命令修改自己的系统密码,而root管理员则有权限修改其他所有人的密码,root管理员在linux系统中修改自己或他人的密码时不需要验证旧密码,这一点非常方便
passwd命令中的参数以及作用
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
–stdin | 允许通过标准输入修改用户密码,如echo “NewPassWord” | passwd –stdin Username |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
修改自己的密码
要修改其他人的密码,则需要先检查当前是否为root管理员权限,然后再命令后指定要修改的用户名称
可以使用passwd命令禁止用户登录系统,或者允许登录系统
userdel命令
userdel命令用于删除已有的用户账户 user delete 语法
userdel [参数] 用户名 |
如果确认某位用户后续不会在登录到系统中,则可以使用userdel命令删除该用户的所有信息,在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用-r参数将其删除
userdel命令中的参数以及作用
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
在删除一个用户时,一般会建议保留他的家目录数据,以免有重要的数据被误删,所以在使用userdel命令时可以不加参数,写清楚要删除的用户名称就行
虽然此时该用户已经被删除,但家目录数据会继续存放在/home目录中,等确认删除时手动将其删除就好
文件权限与归属
在linux系统中,每一个文件都有归属的所有者和所属组,并规定了文件的所有者 所属组以及其他人对文件所拥有的可读(r) 可写(w) 可执行(x)等权限,对于一般的文件来说,权限比较容易理解:可读表示能够读取文件的实际内容,可写表示能够编辑 新增 修改 删除文件的实际内容; 可执行表示能够运行一个脚本程序,但是对于目录文件来说,理解其权限设置就不那么简单了.对于目录文件来说,可读表示能够读取目录内的文件列表;可写表示能够在目录内新增 删除 删除 重命名文件,而可执行则表示能够进入该目录
读写执行权限对于文件与目录可执行命令的区别
文件的可读 可写 可执行权限的英文名称分别为read write execute 可以简写为rwx也可以使用数字4 2 1 来表示,文件的所有者 文件所属组及其他用户权限之间无关联
文件权限的字符与数字表示
文件权限的数字表示法基于字符(rwx)的权限计算而来的,其目的是简化权限的表示方式,例如,某个文件的权限为7, 则代表可读,可写 可执行 (4 +2 +1);若权限为6,则表示可读 可写(4+2).现在有一个文件,其所有者拥有可读 可写 可执行权限,其文件所属组拥有可读 可写的权限,其他人只有可读的权限,那么这个文件的权限就是rwxrwr-r–,数字表示法即为764.不过不能将这三个数字相加,计算出17的结果,这个不是linux系统的权限数字表示法
这里以rw-r-x-w-为例来介绍如何将字符表示的权限转换为数字表示的权限 首先,要将各个位上的字符替换为数字
减号是占位符,代表这里没有权限,在数字表示法中用0表示,也就是说rw-转换后就是420,r-x转换后就是401,-w-转换后就是020,然后将这三组数字之间的每组数字相加得出652,这便是数字表示权限
这里分别包含了文件的类型 访问的权限 所属者(属主) 所属组(属组) 占用的磁盘大小 最后修改时间和文件名称等信息. 该文件类型为普通文件 所属者权限可写 可读(rw-) 所属组权限可读(r–) 其他人也只有可读权限(r–) 文件的磁盘占用大小是34298字节,最近一次修改时间是4月2日的 0:23分 文件名称为 install.log
排在权限前面的减号(-)是文件类型(减号表示普通文件) linux中不同文件由于作用不同,因此类型也不尽相同.常见的文件类型包括普通文件(-) 目录文件(d) 链接文件(l) 管道文件(p) 块设备文件(b) 以及字符设备文件(c)
普通文件的范围特别广泛,比如纯文本信息 服务配置信息 日志信息以及shell脚本等 都属于是普通文件,几乎在每个目录下都能看到 普通文件(-) 和目录文件(d) 的身影.块设备文件(b)和字符设备文件(c) 一般是指硬件设备,比如鼠标 键盘等 在/dev/目录中最为常见
文件的特殊权限
在复杂的环境中,单纯的rwx权限是无法满足我们的需求的,因此便有了SUID SGID与SBIT的特殊权限位.这是一种对文件权限进行设置的特殊功能,可以与一般的权限同时使用,以弥补一般权限不能使用
SUID
SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效).例如所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中,仔细看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或者编辑该文件的权限.但是在使用passwd命令时如果加上SUID特殊权限,既可以让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件件中.
查看passwd命令属性时发现所有者的权限有rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限,如果原先权限位置上没有可执行权限x,那么被赋予特殊权限之后将变成大写的S
一定要小心这个权限,因为一点某个命令文件被设置了SUID权限,就意味着凡是执行该文件的人都临时获取到文件所有者所对应的最高权限,因此不要将SUID权限设置到vim cat rm 等命令上面
SGID
SGID特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新建的文件自动继承该目录原有用户组的名称
SGID的第一种功能就是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限,在早起的linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据权限为
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem |
除了root管理员或属于system组的成员之外,所有用户都没有读取该文件的权限,由于在欧宁市需要查看系统的进程状态,为了能够获取进程的状态信息,可在用于查看系统进程状态的ps命令上增加SGID特殊权限位
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps |
这样一来由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获得了system用户组的权限,从而顺利的读取到了设备文件
每个文件都有其归属的所有者和所属组,当创建或者传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户时文件的所有者) 如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能读取目录中的内容,那么就可以在穿件不能共享目录之后,在该目录上设置SGID特殊权限位,这样,部门内的任何人员在里面创建的任何文件都会归属该目录的所属组,而不在是自己的基本用户组.此时用到的是SGID的第二个功能,即在某个目录中创建的文件会自动继承该目录的用户组
在使用上述命令设置好目录的777权限之后确保普通用户可以向其中写入文件,并为该目录设置了SGID特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称
除了上面提到的SGID的这两个功能,在介绍 chmod 和chown
chmod命令用于设置文件的一般权限及特殊属性权限, change mode
chmod [参数] 文件名 |
这是一个与文件权限的日常设置强相关的命令 想要把一个文件的权限设置成其所有者可读可写可执行 所属组可读 可写 其他人没有任何权限,则相应的字符表示法表示rwxrw—-,其数字法表示为760
chmod命令用于设置文件的所有者和所属组,英文 change own
chown 所有者:所有组 文件名 |
chmod和chown命令时用于修改文件属性和权限的最常用命令,他们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内的所有文件进行整体操作
SBIT
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件.当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了
与前面的SUID与SGID权限显示方法不同,当目录被设置了SBIT特殊权限位之后,文件的其他用户权限部分的x执行权限就会被替换成t或者T 原本有x执行权限则会写成t,原本没有x执行权限就会被写成T
/tmp目录上的SBIT权限默认已经存在,这体现为其他用户权限字段的权限变为rwt
其实文件能否被删除并不取决于自身的权限,而是看其所在的目录是否有写入权限
随后切换到一个普通用户身份下,尝试删除这个由其他人创建的文件,这时就会发现,即便读 写 执行权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件
若能善加使用特殊权限,就能实现很多巧妙的功能
SUID、SGID、SBIT特殊权限的设置参数
参数 | 作用 |
---|---|
u+s | 设置SUID权限 |
u-s | 取消SUID权限 |
g+s | 设置SGID权限 |
g-s | 取消SGID权限 |
o+t | 设置SBIT权限 |
o-t | 取消SBIT权限 |
上述的代码中o+t参数是在一般权限已经设置了完毕的前提下,又新增了意向特殊权限,如果我们像将一般的权限和特殊权限一起设置,
其实SUID SGID SBIT也有对应的数字表示法,分别表示为4 2 1 也就是说777还不是最大的权限,最大的权限应该是7777,其中第一个数字代表的是特殊位置权限.
在rwxr-xr-t权限中,最后一位是t,这说明了该文件的一般权限是rwxr-xr-x,并带有SBIT特殊权限,-rwxr-xr-x即为755,而SBIT特殊权限位是1,则合并之后的结果为1755
如果权限是rwsrwSr–呢 大写的S表示原本没有执行全心,因此一般权限为rwxrw-r–,将其转换为数字表示法后的结果是764.带有SUID和SGID特殊权限的数字法表示是4和2,所以结果就是6,合并之后就是6764.
将权限的数字表示法转换成字符表示法的难度有点高,这里以5537为例.首先特殊权限5是有4+1组合成的,意味着有SUID和SBIT.SUID和SBIT的写法是,原先有执行权限则是小写s如果没有执行权限则是大写的S;而SBIT的写法则是,原先有执行权限是小写t,没有执行权限是大写的T.一般权限的537进行字符转换后应该为r-x-wxrwx,然后再此基础上增加SUID和SBIT特殊权限,合并后的结果是r-s-wxrwt
文件的隐藏属性
隐藏权限的专用设置命令时chattr,专用查看命令是lsattr
chattr命令
chattr命令用于设置文件的隐藏属性权限, change attributes
chattr [参数] 文件名称 |
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加”+参数”,如果想要将某个隐藏功能移除文件,则需要追加”-参数”.chattr命令中可供选择的隐藏权限参数非常丰富
chattr命令中的参数及其作用
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
先来创建一个普通文件,然后立即尝试删除
接下来在创建一个普通文件,将其设置”不允许删除与覆盖”(+a参数)权限,然后再尝试删除
lsattr命令
lsattr命令用于查看文件的隐藏权限 英文 list attributes 语法
lsattr [参数] 文件名称 |
文件的隐藏权限必须通过lsattr命令来查看
一帮会将-a参数设置到日志文件中(/var/logmessages),这样可以在不影响系统正常写入日志的前提下,防止黑客擦除自己的作案证据.如果希望彻底保护某个文件,不允许其他人修改或者删除它的话,可以加上-i参数
要想彻底删除某个文件,可以使用-s参数来保证其被删除后不可恢复,硬盘上的文件数据会被用零块重新填充
文件访问控制列表
如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表了(ACL),基于普通文件或者目录设置ACL其实就是针对特定的用户或用户组设置文件或者目录的操作权限,更加精确的派发权限.如果针对某个目录设置了ACL则目录中的文件会继承其ACL权限,若针对文件设置了ACL,则文件不在继承其所在目录的ACL权限
先切换到普通用户,然后尝试进入root管理员的家目录中
setfacl命令
setfacl命令用于管理文件的ACL权限规则 set files ACL
setfacl [参数] 文件名称 |
ACL权限提供的是在所有者 所属组 其他人的读 写 执行权限之外的特殊权限控制.使用setfacl命令可以针对单一用户或用户组 单一文件或目录来进行 读 写 执行权限的控制 其中针对目录文件需要使用 -R 递归参数 针对普通文件则使用-m 参数 如果想要删除某个文件的ACL可以使用-b参数
setfacl命令中的参数以及作用
参数 | 作用 |
---|---|
-m | 修改权限 |
-M | 从文件中读取权限 |
-x | 删除某个权限 |
-b | 删除全部权限 |
-R | 递归子目录 |
常用的ls命令时看不到ACL信息的,但是却可以看到文件权限最后的一个(.)变成了加号(+),这就意味着该文件已经设置了ACL
getfacl命令
getfacl命令用于查看文件的ACL权限规则, get files ACL
getfacl [参数] 文件名称 |
允许某个组的用户都可以读写/etc/fstab文件:
要清空所有ACL权限,请用-b参数;要删除某一条指定的权限,就用-x参数
ACL权限的设置都是立即且永久生效的,不需要再编辑什么配置文件
在备份/home目录上的ACL权限时,可使用-R递归参数,这样不仅能够把目录本身的权限进行备份,还能将里面的文件权限也自动备份.getfacl在备份目录权限时不能使用绝对路径的形式,因此我们需要先切换到最上层根目录,然后再进行操作。
ACL权限的恢复也很简单,使用的是–restore参数。由于在备份时已经指定是对/home目录进行操作,所以不需要写对应的目录名称,它能够自动找到要恢复的对象
su命令与sudo服务
su命令
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺利的切换到其他用户
这其中的减号(-),就意味着完全切换到新用户,即把环境变量信息也变更为新用户的响应信息,而不是保留原始信息
从root管理员切换到普通用户时是不需要验证密码的,而从普通用户切换成root用户就需要进行密码验证了
虽然这样使用su命令,普通用户可以完全切换到root管理员用户的身份来进行工作但是这将暴露root管理员的密码
sudo命令
sudo命令用于给普通鱼护提供额外的权限
sudo [参数] 用户名 |
使用sudo命令可以给普通用户提供额外的权限来完成只有root用户才能完成的任务,可限制用户执行指定的命令,记录用户执行过的每一条命令,集中管理用户与全心(/etc/sudoers),以及可以在验证密码后的一段时间内无需让用户再次验证密码
sudo命令中的可用参数以及作用
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
visudo命令
visudo命令用于编辑 配置用户sudo的权限文件
visudo [参数] |
这是一条会自动调用vi编辑器来配置/etc/sudoers权限文件的命令.能够解决多个用户同时自改权限而导致的冲突问题.visudo命令还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错提醒.
使用visudo命令配置权限文件的时候.其操作方法和vim编辑器中用到的方法完全一致因此在编写完成后记得在末行模式下保存并退出。在配置权限文件时,按照下面的格式在第101行(大约)填写上指定的信息
谁可以使用 允许使用的主机 = (以谁的身份) 可执行命令的列表
谁可以使用:稍后要为哪位用户进行命令授权。
允许使用的主机:可以填写ALL表示不限制来源的主机,亦可填写如192.168.10.0/24这样的网段限制来源地址,使得只有从允许网段登录时才能使用sudo命令。
以谁的身份:可以填写ALL表示系统最高权限,也可以是另外一位用户的名字。
可执行命令的列表:可以填写ALL表示不限制命令,亦可填写如/usr/bin/cat这样的文件名称来限制命令列表,多个命令文件之间用逗号(,)间隔。
在Linux系统中配置服务文件时,虽然没有硬性规定,但从经验来讲新增参数的位置不建议太靠上,以免我们新填写的参数在执行时失败,导致一些必要的服务功能没有成功加载。一般建议在配置文件中找一下相似的参数,然后在相邻位置进行新的修改,或者在文件的中下部位置进行添加后修改
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用sudo -l命令查看所有可执行的命令了(在下面的命令中,验证的是普通用户的密码,而不是root管理员的密码)
作为一名普通用户,是肯定不能看到root管理员的家目录(/root)中的文件信息的,但是,只需要在想执行的命令前面加上sudo命令就行了
每次执行sudo命令后都会要求验证一下密码。虽然这个密码就是当前登录用户的密码,但是每次执行sudo命令都要输入一次密码其实也挺麻烦的,这时可以添加NOPASSWD参数,使得用户下次再执行sudo命令时就不用密码验证
这样,当切换到普通用户后再执行命令时,就不用再频繁地验证密码了