Linux学习笔记(二)

Linux学习笔记(二),第1张

Linux学习笔记(二) 啰啰嗦嗦的话

这一部分主要写一写关于Linux的权限。这一部分的演示内容基于的系统是CentOS7,使用的用户是notroot。

Linux权限

说到Linux的权限,就要提及用户、组和文件。Linux下一切皆文件,准确的说用户的权限主要看文件权限,文件的权限决定了那些用户可以 *** 作。Linux默认最高权限是root用户,任何文件都可以读取、写入和执行。

用户

Linux是个多用户的 *** 作系统,也就是可以多个用户同时在线 *** 作。Windows就是单用户的,只能一个用户登录。Linux中用户权限是通过UID来进行追踪的,UID是用户的唯一标识。这其中还会涉及到一个用户组,用户组也有一个唯一标识叫GID,用户组的权限也是通过GID跟踪。Linux的默认最高权限用户是root。

  1. /etc/passwd:提到用户,就会说一下这个文件。这个文件里包含了很多信息,任何用户都可以读,在以前的老版本系统里,这个文件还存储用户的密码hash,现在没有了,现在那个位置被改为x,为了更安全。文件内容如下:
#内容太多了,挑了几条(^=^)
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
centos:x:1000:1000:centos:/home/centos:/bin/bash
notroot:x:1001:1001:centos7:/home/notroot:/bin/bash

每一列的意思

示例列含义root用户名x曾经放密码的地方0用户ID(UID),root用户的UID是00组ID(GID),root用户组ID是00组ID(GID),root用户组ID是0root用户描述字段,俗称备注,这里备注的root/root属于用户的目录,自己创建的用户的目录默认在/home目录下,默认以该用户名命名/bin/bash用户默认shell,就是指该用户执行的是bash命令。有的用户是/sbin/nologin,这是指该用户不能登录系统

Linux系统预留了500一下的UID值给系统用户,甚至有的服务要用特定的UID才能正常工作。系统自己创建了一些用户,比如ftp、mail等,在上面的示例中,我自己创建的只有notroot和centos罢了。
2. /etc/shadow:这个文件用于存储用户密码。这个文件并不是所有人都读取,只有root用户可以 *** 作。内容如下:

1      2                                34  5    678 9
root:1fefVjKQxrnzcMrqi6dF3Liaia.::0:99999:7:::
mail:*:17632:0:99999:7:::
operator:*:17632:0:99999:7:::
games:*:17632:0:99999:7:::
ftp:*:17632:0:99999:7:::
centos:$cFBq2XgWTlqQ0Ru4$G6D20.lL.4nrKIEGfAZAW3OswZusNTG.DmSrbhm3C9UcUxh6t04WE8pl.ZaXolHwbCAoHpdvnmc0/8QjtD3K51::0:99999:7:::
notroot:1fefVjKQxrnzcMrqi6dF3Liaia.:18937:0:99999:7:::

每一列的意思:

示例列含义第一列用户名第二列加密后的密码第三列自上次修改密码后过去的天数(从1970.1.1开始计算)第四列多少天后才能修改密码第五列多少天后必须更改密码第六列密码过期前多少天提醒用户更改密码第七列密码过期后多少天禁用用户第八列用户被禁用的日期(从1970.1.1开始到当时的天数)第九列预留字段
  1. useradd:添加用户。参数如下表:
参数含义-b base_dir如果没有使用-d参数的话,使用该参数去指定基本目录,默认下/home目录就是基本目录,使用该参数所指定的基本目录必须存在-c添加备注-d home_dir指定用户的home目录-e expire_date指定账户过期日期,格式例如2021-09-01-f inactive_day指定账户密码过期多久后禁用账户,0表示过期就锁定,-1表示不启用该功能-g groupID/groupName指定账户的属组,用GID或者组名-G group1 group1指定用户所属的多个组-k必须和-m连用,将/etc/skel目录的内容复制到用户的home目录-m创建默认的用户Home目录,默认是/home/[用户名]-M不创建用户的home目录-n创建一个与用户登录名同名的新组-r创建系统账户-p passwd指定用户密码-s shell指定用户默认的shell-u uid指定账户UID-D显示默认选项,配合它可以修改默认选项

如果只执行useradd test -p 123456的话useradd有默认设置。我的虚拟机默认设置如下所示:

[root@localhost ~]# useradd -D
GROUP=100							#默认加入的用户组是公共组
HOME=/home							#home目录的位置,基本目录
INACTIVE=-1						#密码过期后不会被禁用
EXPIRE=								#密码过期时间,不过期
SHELL=/bin/bash					#用户默认shell
SKEL=/etc/skel					#默认将/etc/skel复制到用户home目录下
CREATE_MAIL_SPOOL=yes		#在mail目录下创建一个用于接收邮件的目录

如果我们想要修改默认设置,那么就加入-D和需要修改的条目参数,比如修改一下HOME=/home

[root@localhost ~]# useradd -Db /home/test
[root@localhost ~]# useradd -D
GROUP=100
HOME=/home/test
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
  1. userdel:删除用户。直接执行userdel test,只会删除/etc/passwd和/etc/shadow文件中的记录,不会删除用户的home目录,使用userdel -r test就会删除用户的home目录。这个命令的参数比较少,如果用户在登陆删不掉怎么办,执行userdel -f test,强制删除,很多场景都可以试一试。这里就有点像rm -rf test/。
  2. usermod:修改用户信息。参数和useradd命令差不多,但也有几个不一样的。
参数含义-l(小写L)修改用户名。在centos中比较明显,我登录的时候看到的是centos7,但是用户名是notroot,在ubuntu中不明显,它的登录看到的和用户名是一样的。usermod -l old new-L锁定账户-U解锁账户-p修改账户密码
  1. chsh:修改用户的默认shell,chsh -s /bin/bash test。如果不知道有那些shell的话,可以使用chsh -l可以列出有哪些可用的shell。
  2. chfn:修改备注,在我使用的这个系统中,备注就是开机登录的时候看到的那个名字。可以直接执行chfn test,然后他会给出需要修改的内容。它也有参数,自行查看。
  3. chage:管理期限。
参数含义-d修改上次修改密码到现在的期限-E修改密码过期日期-I(大写i)账户密码到期后 ,几天时间后锁定账户-m修改密码使用的最短时间-M修改密码使用的最长时间,时间到后强制其修改密码-W修改密码过期前多久开始提示-l(小写L)列出用户的密码时间期限

日期格式例如2021-09-11格式的日期。或者1970年1月1日起到该日期的天数。

组是由一群用户共享相同的权限所组成的,它们共享的权限就是指组权限。组有唯一标识符组ID(GID),每创建一个用户,会默认创建一个同名的组,具体可以man useradd,看一下-g参数的解释,当然创建用户的时候可以直接指定组。

  1. /etc/group:组和用户一样,也有一个文件,文件的记录内容如下:
#内容比较多,挑几条,^=^
root:x:0:
wheel:x:10:
mail:x:12:postfix
games:x:20:
ftp:x:50:
centos:x:1000:beiyong
notroot:x:1001:
#解释:组名:组密码(类似passwd):GID:组员
  1. /etc/gshadow:和/etc/shadow相似。组密码这个东西有,但是很少用,它允许非组内成员临时成为该组成员,类似于sudo命令的左右。内容如下:
root:::
wheel:::
mail:::postfix
games:::
ftp:::
centos:!!::beiyong
notroot:!::
#解释:组名:组密码(!代表空):组管理员:组员
  1. groupadd:创建组。groupadd abc,创建一个abc组。部分参数如下表:
参数释义-f强制执行,如果abc组存在的话,可以使用该参数,强制覆盖,和其他参数连用或者单独使用-g指定GID-p创建一个组密码,groupadd abc -p 123456-o允许添加一个GID重复的组。
  1. groupmod:修改组。可以修改组的GID和组名等。参数如下:
参数释义-g修改GID,groupmod abc -g 1003-n修改组名,groupmod abc -n bcd-p修改密码-o和-g连用的时候,GID可以重复,groupmod abc -og 1001
  1. groupdel:删除组。groupdel abc删除abc组。在一系列 *** 作之后发现怎么删不掉创建的组,而且创建的组莫名奇妙的多了个用户,只要把这个用户移动到其他组去,就可以删除这个组。原因就是使用了-o参数,当指定的GID和其中一个组相同时,就会获得这个组的成员,导致无法删除。当改变组关系的时候,需要重启一下才生效。
文件权限 文件权限字符

文件权限有所属主,所属组和其他人之分,每一个都对应一个读、写、执行权限。

drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory
-rw-rw-r--. 1 notroot notroot 7 Nov 22 04:26 file
lrwxrwxrwx. 1 notroot notroot 4 Nov 22 04:38 link_file -> file

以上面的内容为例。“rwx”中,r表示读权限,w表示写权限,x表示执行权限,如果位置是-,则代表没有该权限。前面的d表示什么呢,d所在位置表示的类型,d表示这里是个文件夹,如果是-,就表示是一个文件,这个位置上还会有其他的标识,但是自用的情况下,估计遇到最多的就是d、l和-。每个标识的释义如下表:

标志释义-文件d目录l(小写L)代表链接文件c字符型设备b块设备n网络设备

上一次记录到ls命令的时候没有详细写,这里扯一句。权限后面的数字是文件的应用次数,比如给file文件创建一个硬链接的时候,1就会变成2。如下示例,其中创建了两个软连接和一个硬链接:

18517808 drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory
36911567 -rw-rw-r--. 2 notroot notroot 7 Nov 22 04:26 file
36911550 lrwxrwxrwx. 1 notroot notroot 4 Nov 22 04:38 link_file -> file
36911565 lrwxrwxrwx. 1 notroot notroot 4 Nov 22 04:42 link_file1 -> file
36911567 -rw-rw-r--. 2 notroot notroot 7 Nov 22 04:26 link_file2

现在回归正题,rwx有三组,分别代表了文件或目录的所属主、所属组和其他的 *** 作权限。看下面的表,对应关系就比较清晰了。

rw-rw-r–2notrootnotroot属主属组其他人引用次数文件属主名文件属组名

举个例子:如果用户是notroot,此时对应了文件属主,就可以对该文件有读写权限,如果用户是else,但是else用户属于notroot组,此时对应的是属组,则对该文件有读写权限,如果是if用户,而且不属于notroot组,此时对应其他人,则对该文件只有读的权限。

注:目录和文件都有默认的权限,我的虚拟机看到的目录的默认权限是drwxrwxr-x,文件的默认权限是-rw-rw-r--。

默认权限

在不同的系统中创建的文件和目录默认权限可能不同,我在kali中创建的文件和目录默认权限和centos7中创建的区别:

#kali
-rw-r--r-- 1 notroot notroot    0 11月 22 22:58 test
drwxr-xr-x 2 notroot notroot 4096 11月 22 22:59 test1
#centos.
drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory
-rw-rw-r--. 2 notroot notroot 7 Nov 22 04:26 file

说实话,这种区别也是我在复习书本的时候才注意到这点的。

默认权限由一种叫“权限掩码”的东西确定。当文件和目录拥有所有权限时,权限展示为rwxrwxrwx,而掩码是记录文件和目录所没有的权限,所以拿centos7的目录来说,目录默认没有的权限就是-------w-,所以权限掩码记录的是目录没有写权限。

权限掩码用umask命令查看。centos7中看到的目录权限掩码如下:

[notroot@localhost ~]$ umask
0002

和看到的rwx不同,一个数字,一个字母。

文件权限数字表示

文件权限可以用数字来表示,其转换方法就是二进制转八进制。每一个权限位对应一个二进制数值,文件或目录拥有某一项权限,则对应的二进制数为1,比如一个文件权限是rwxrw-r--,则对应如下表:

rwxrw-r--111110100

那么它的八进制表示就是754,所以可以说这个文件的权限是754。

计算方式:每三个二进制一组,2进制转8进制,最终拼凑起来就是最后的8进制数啦。

同理,权限掩码也是这样。这四位八进制掩码每一位表示的意思如下表:

0002粘着位属主权限属组权限其他人权限

二进制权限掩码对应关系如下表:

000000000010特殊权限特殊权限特殊权限rwxrwxrwx

对应上表,0002所表示的用户没有的权限就是-------w-,也就是“其他人”没有写权限。

利用掩码,就可以算出目录和文件的默认权限,目录默认权限是777-002=775,也就是目录对应权限是rwxrwxr-x,文件默认权限是666-002=664,也就是文件对应权限是rw-rw-r--。利用八进制权限掩码计算八进制文件权限只用了后三位,没有用粘着位,因为粘着位有特殊作用。

注:文件默认满权限是666,因为文件一开始是任何人不能执行,所以777去掉可执行(x)权限,就是666。

文件的扩展权限

Linux的文件权限如果只有属主、属组、其他人,那就会遇到一些问题。比如用户A给其他人创建了一个打卡程序write_A_file用于将考勤记录进用户A创建的文件file,最简单的办法就是赋予write_A_file程序其他人可执行的权限,赋予file其他人可读写权限,但是这样就会导致其他人绕过程序任意读写file。A只想自己 *** 作file。如果只给write_A_file一个其他人可执行权限的话,其他人运行的时候,只能 *** 作自己创建的file。所以这个时候就体现了特殊的权限位SUID和SGID的作用。

特殊权限位和普通权限的数字表示方法是一样的,权限掩码的第一位就是表示这个权限的,每一个二进制对应关系如下表:

000SUIDSGID粘着位

每一个位置的作用如下:
SUID置位时,表示当文件被使用时,程序会以文件属主的权限运行。
SGID置位时,表示当文件被使用时,程序会以文件属组的权限运行。对于目录而言,目录中的文件会以目录的默认属组作为默认属组。
粘着位置位时,表示进程结束后文件还驻留再内存中。暂不了解这有啥用,回头知道了回来补上

结合上面的例子,用户A只要给write_A_file赋予一个特殊权限,将SUID置位,那么任何人都不能直接 *** 作file,但是所有人运行write_A_file时,write_A_file就以用户A的权限运行,那么程序就可以 *** 作用户A创建的file文件。特殊权限不能乱给,否则会造成安全问题,假设write_A_file中允许用户执行任意系统命令,那么就可以利用该程序直接获得用户A的权限shell,完成越权 *** 作。

修改权限

一是修改权限,二是修改属组和属主,三是修改默认权限。

chomd:修改权限命令。基本格式:chmod options mode file。mode参数可以是八进制模式,也可以是符号模式。options是可选的参数,详见man chmod,这里就不写啦。

八进制模式下修改权限示例

#起始权限
drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory
-rw-rw-r--. 1 notroot notroot 7 Nov 22 04:26 file
#给directory权限rwxr-xr-x(755)
[notroot@localhost documents]$ chmod 755 directory/
[notroot@localhost documents]$ ls -l
total 4
drwxr-xr-x. 2 notroot notroot 6 Nov 22 04:01 directory
-rw-rw-r--. 1 notroot notroot 7 Nov 22 04:26 file
#给file权限rw-rw-rw-(666)
[notroot@localhost documents]$ chmod 666 file 
[notroot@localhost documents]$ ls -l
total 4
drwxr-xr-x. 2 notroot notroot 6 Nov 22 04:01 directory
-rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file
#给directory一个SUID的特殊权限(4),其余权限是rwxr-xr-x(755),合起来的八进制是4755。其他两个扩展权限位赋权同理。但是如果要把特殊权限去除的话,用八进制做不到好像。
[notroot@localhost documents]$ chmod 4755 directory/
[notroot@localhost documents]$ ls -l
total 4
drwsr-xr-x. 2 notroot notroot 6 Nov 22 04:01 directory
-rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file

符号模式比较复杂,但是省去了换算的烦恼。权限格式为[ugoa…][+-=][rwxXstugo]。每个字母释义如下表:

参数释义第一个括号u属主g属组o其他人a以上三个第二个括号-现有权限下去除某权限+现有权限下增加某权限=设置权限第三个括号rwx略X如果对象是目录或着它已有执行权限,赋予执行权限s赋予特殊权限t保留文件或目录u将权限设置成和属主一样的权限g将权限设置成和属组一样的权限o将权限设置成和其他人一样的权限

使用示例如下:

#起始权限
drwsrwsr-x. 2 notroot notroot 6 Nov 22 04:01 directory
-rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file
#给file属主怎加一个可执行权限
[notroot@localhost documents]$ chmod u+x file 
[notroot@localhost documents]$ ll
-rwxrw-rw-. 1 notroot notroot 7 Nov 22 04:26 file
#给file文件属组权限设置和属主相同
[notroot@localhost documents]$ chmod g=u file 
[notroot@localhost documents]$ ll
-rwxrwxrw-. 1 notroot notroot 7 Nov 22 04:26 file
#给file的属主、属组和其他人权限相同
[notroot@localhost documents]$ chmod ug=o file 
[notroot@localhost documents]$ ll
-rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file
#给file文件增加一个SUID特殊权限
[notroot@localhost documents]$ chmod u+s file 
[notroot@localhost documents]$ ll
-rwSrw-rw-. 1 notroot notroot 7 Nov 22 04:26 file
#去除directory中的特殊权限。
[notroot@localhost documents]$ chmod ug-s directory/
[notroot@localhost documents]$ ll
total 4
drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory

chown:修改属主,也支持改变属组。命令格式chown options owner[.group] file。owner可以是用户名,也可以是UID。先创建一个文件newfile,然后修改它的属主为beiyong此时需要root权限。示例如下:

-rw-rw-r--. 1 notroot notroot 0 Nov 27 01:48 newfile
#切换root用户后,修改用户
[root@localhost documents]# chown beiyong newfile 
[root@localhost documents]# ll
-rw-rw-r--. 1 beiyong notroot 0 Nov 27 01:48 newfile
#还可以改变属组,beiyong用户的属组是centos。只改变属组也可以执行
#chown .centos newfile 
#如果用户名和组名相同,那么可以执行chown centos. newfile,将属主和属组全部改变 
[root@localhost documents]# chown beiyong.centos newfile 
[root@localhost documents]# ll
-rw-rw-r--. 1 beiyong centos  0 Nov 27 01:48 newfile
#newdir下的文件和目录
drwxrwxr-x. 2 notroot notroot 6 Nov 27 02:02 chddir
-rw-rw-r--. 1 notroot notroot 0 Nov 27 02:02 chfile

chgrp:修改属组。命令格式chgrp options group file,和chown差不多。只是说可能会用到两个参数。-R参数可以递归改变目录下的子目录和文件的属组,-h可以改变符号链接(软连接)的属组。使用示例如下:

drwxrwxr-x. 2 notroot notroot 6 Nov 27 02:00 newdir
#修改属组为centos
[root@localhost documents]# chgrp centos newdir/
[root@localhost documents]# ll
drwxrwxr-x. 2 notroot centos  6 Nov 27 02:00 newdir
#将newdir下的所有文件和目录都改为centos
[root@localhost documents]# chgrp -R centos newdir/
[root@localhost documents]# ls newdir/ -l
drwxrwxr-x. 2 notroot centos 6 Nov 27 02:02 chddir
-rw-rw-r--. 1 notroot centos 0 Nov 27 02:02 chfile

注:任何用户都可以改变属组,但是前提是用户必须属于文件和目录的当前属组和目标属组

umask:查看、修改默认权限。使用示例如下:

#查看默认掩码
[notroot@localhost newdir]$ umask 
0002
#修改默认掩码,修改的是当前用户下的,如果不修改特殊权限位的话,也可以只写3个数字。
#umask 022
[notroot@localhost newdir]$ umask 0022
[notroot@localhost newdir]$ umask
0022
总结

无,有错误的话请指正。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5610248.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存