专栏首页黑白天Linux用户、组、权限和文件

Linux用户、组、权限和文件

Linux 的安全性

  • Linux安全系统的核心时用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户,用户对系统中各种对象的访问权限取决于他们登陆系统时用的账户。
  • 用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。登录名是用户用来登录系统的最长八字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。

/etc/passwd文件

Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是 /etc/passwd文件,它包含了一些与用户有关的信息。如下:

  • root用户账户是Linux系统的管理员,固定分配给它的UID是0。就像上例中显示的,Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到Linux系统上。
  • 在安全成为一个大问题之前,这些服务经常会用root账户登录。遗憾的是,如果有非授权的用户攻陷了这些服务中的一个,他立刻就能作为root用户进入系统。为了防止发生这种情况,现在运行在Linux服务器后台的几乎所有的服务都是用自己的账户登录。这样的话,即使有人攻入了某个服务,也无法访问整个系统。
  • Linux为系统账户预留了500以下的UID值。有些服务甚至要用特定的UID才能正常工作。为普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户(并非所有的Linux发行版都是这样)。 你可能已经注意到/etc/passwd文件中还有很多用户登录名和UID之外的信息。/etc/passwd文件的字段包含了如下信息:
  • 登录用户名
  • 用户密码
  • 用户账户的UID(数字形式)
  • 用户账户的组ID(GID)(数字形式)
  • 用户账户的文本描述(称为备注字段)
  • 用户HOME目录的位置
  • 用户的默认shell(用户登陆shell,/bin/bash表示可以登陆,/sbin.nologin表示不被授权)

注意:/etc/passwd是一个标准的文件,我们可以使用编辑器来编辑它。一般来说root的用户uid为0,如果我们把一个普通用户的uid修改为0的话,那么它只要用普通用户的用户名和密码登陆就可以切换到root用户了,所以说这样做是不好的,及其危险的!

值得注意的是/etc/passwd文件中的密码字段都被设置成了X,这并不代表说所有用户的密码都是相同的!在早些年的Linux上,/etc/passwd文件里有加密后的用户密码。但是很多程序都要访问/etc/passwd文件来获取用户的权限,这样肯定会造成安全隐患。而且随着密码破解工具的不断强大,/etc/passwd文件中的密码更加的危险。 现在的Linux系统都将用户密码爆出在另外一个单独的文件夹中,这个文件就叫shadow文件,路径是/etc/shadow。只有特定的程序,比如我们要登陆Linux系统的时候才能访问这个文件。

/etc/shadow 文件

/etc/shadow文件是存储系统账户密码的文件,只有root用户才能够访问它,比如我现在用一个普通用户,它能访问/etc/passwd但是它不能访问/etc/shadow

/etc/shadow文件为系统上的每一个用户账户都保存了一条记录,如下:

parrot:$6$ee8g5J/xT4b8FDeS$plJpruIUbsNjQA9WdkxtJZ/4IOaB6XtVIyMScr4KtYocTwp3YMYrz6e/KxQuWIZ6yNHL.klGQtwXHovmuJ34I.:18345:0:99999:7:::

在/etc/shadow文件中的每条记录都有9个字段:

  • 用户名
  • 经过加密后的密码
  • 最后一次修改密码后过去的天数(从1970年1月1日开始计算)
  • 多少天后才能更改密码
  • 多少天后必须更改密码
  • 密码过期几天进行警告
  • 密码过期之后禁用多少天用户账户
  • 账号失效时间距离1970年1月1日的天数间隔
  • 预留字段给将来使用

在字段二密码位置,如果是*表示用户被禁用了,!表示用户密码为初始化,也就是空密码

/etc/group 文件

与用户账户类似,组的信息也保存在系统的一个文件中,在/etc/group文件中包含了系统上用到的每个组的信息。如下:

在了解之前/etc/passwd文件分配的格式之后,我们也不难理解/etc/group的格式,系统账户用的组通常都会分配低于500的GID,用户组的GID则会采用500以上开始分配。

  • 组名
  • 组密码
  • GID
  • 组成员

wheel组

在Linux中wheel就是类似于一个管理员的组。通常在Linux下即使我们有了管理员,也不推荐用root用户登录。一般情况下用普通用户登录就可以了,在需要root权限执行一些操作时,再su登录成为root用户。但是,任何人只要知道了root的密码,就都可以通过su命令来登录为root用户,这无疑为系统带来了安全隐患。所以,将普通用户加入到wheel组,被加入的这个普通用户就成了管理员组内的用户了,然后可以修改配置文件使得只有wheel组内的用户可以切换到root用户。

"auth required pam_wheel.so use_uid" 表示禁止非wheel组用户切换到root。

添加新用户

在Linux中使用useradd来新添加用户,可以一次性创建新用户账户及设置用户的HOME目录结构。useradd系统默认值在/etc/default/useradd文件中。

新建用户之后,会为用户设置一些默认值:系统会将/etc/skel目录下的内容复制到用户的HOME目录下、为该用户在mail目录下创建一个介绍邮件的文件、将bash shell作为默认shell、在/etc/passwd,/etc/shawod,/etc/group文件夹中新增用户信息

useradd命令参数:

-c comment           给新用户添加备注
-d home_dir          为主目录指定一个名字(如果不想用登录名作为主目录名的话)
-e expire_date       用YYYY-MM-DD格式指定一个账户过期的日期
-f inactive_days     指定这个账户密码过期后多少天这个账户被禁用;0表示密码一过期就立即禁用,1表示禁用这个功能
-g initial_group     指定用户登录组的GID或组名
-G group ...         指定用户除登录组之外所属的一个或多个附加组
-k                   必须和-m一起使用,将/etc/skel目录的内容复制到用户的HOME目录
-m                   创建用户的HOME目录
-M                   不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项)
-n                   创建一个与用户登录名同名的新组
-r                   创建系统账户
-p passwd            为用户账户指定默认密码
-s shell             指定默认的登录shell
-u uid               为账户指定唯一的UID

例子:

#创建用户
useradd zhangsan                          //创建一个张三的用户
useradd -u 666 -g liuliuliu lisi           //创建一个lisi的用户设置它的UID为666并且添加到liuliuliu组中
useradd  -s /sbin/nologin laowang  //创建一个老王的用户并且不给他登陆系统的权限,默认是/bin/bash  (对老王没有恶意)

删除用户

如果你想从系统中删除用户,可以使用userdel来删除用户

userdel -r  laowang
//这里带上-r参数能够删除passwd、shadow、group文件中的用户信息和home目录和邮箱
//如果不带-r参数的话只是删除passwd、shadow、group文件中的用户信息

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

修改用户

一些修改用户的命令

usermod       修改用户账户的字段,还可以指定主要组以及附加组的所属关系
passwd        修改已有用户的密码
chpasswd      从文件中读取登录名密码对,并更新密码
chage         修改密码的过期日期
chfn          修改用户账户的备注信息
chsh          修改用户账户的默认登录shell

usermod可以用来修改/etc/passwd文件中的大部分字段,它还有一些参数

  • -l 修改用户账户的登录名
  • -L 锁定账户,使得用户无法登陆
  • -p 修改账户的密码
  • -U 解除用户锁定
  • -s 修改用户登陆的shell
  • -g 修改账户所在组
  • -G 给账户添加附加组 usermod -d /hong/xiaohong zhangsan ##更改zhangsan的家 usermod -u 666 zhangsan ##修改zhangsan的UID usermod -l laowang zhangsan ##修改zhangsan的用户名为laowang(原来张三是老王假扮的!) usermod -L laowang ##锁定账户(发现老王的嫌疑) usermod -U laowang ##解锁账户(老王技高一筹,用话语蒙骗过关!她和xiaohong没有一腿)

修改密码

修改密码的话可以使用passwd和chpasswd

##普通修改密码
passwd laowang        ##修改laowang的密码
##批量修改密码,先创建一个带有用户密码的文本文件
vim user_pass.txt
xiaohong:123456
laowang:66666
zhangsan:250250
然后使用chpasswd批量修改
chpasswd  <  user_pass.txt

组管理命令

groupadd  laowangliuliuliu   ##创建一个laowangliuliuliu的组
groupdel  laowangliuliuliu   ##删除laowangliuliuliu组
groups    zhangsan          ##查看zhangsan所属组的信息
groupmod  -n   jen  zhangsan  ##修改zhangsan组名为jen
groupmod  -g   666  jen    ##修改jen的GID为666
groupmems -a   jen   -g   laowang   ##将jen用户添加到laowang组中(变坏了啊!)

区分基本组和附加组

  • 基本组:创建用户的时候系统会同时创建一个和这个用户名同名的组,这个组就是基本组,不可以把用户从基本组中删除。
  • 附加组:除了基本组之外,用户所在的其他组,都是附加组。用户是可以从附加组中被删除的。一个用户可以隶属于多个附加组。但是一个用户只能有一个基本组。

理解文件权限

除了用户有权限之外,文件也是有权限的!ls 命令可以用来查看Linux系统上文件、目录和设备的权限 如: ls -l

前面信息由10个字符组成:例如:

-rwxr-xr-x
  • 第一位表示文件类型;
  • 2~4位表示文件所有者的权限:u权限(user);
  • 5~7位表示文件所有者所属组成员的权限:g权限(group);
  • 8~10位表示所有者所属组之外的用户的权限:o权限(other);

2~10位的权限综合有时成为:a权限(all) 输出结果的第一个字段就是描述文件和目录的权限的信息,含义为:

  • — 代表文件
  • d 代表目录
  • l 代表连接
  • c 代表设备
  • b 代表块设备
  • n 代表网络

在后面有三组字符,代表了3种访问权限(咋这么多对象啊我的天!)

  • r 代表对象是可读
  • w 代表对象是可写
  • x 代表对象是可执行

Linux权限码:

权 限    二进制值    八进制值    描 述
---      000        0          没有任何权限
--x      001        1          只有执行权限
-w-      010        2          只有写入权限
-wx      011        3          有写入和执行权限
r--      100        4          只有读取权限
r-x      101        5          有读取和执行权限
rw-      110        6          有读取和写入权限
rwx      111        7          有全部权限

用数字表示法表示:r 、 w 和x分别用4、2、1来表示,没有授权则为0。例如:

原始权限        转为数字            数字表示法
rwxrwxr-x      (421)(421)(401)     775
rwxr-xr-x      (421)(401)(401)     755
rwx------      (421)(000)(000)     700   #这就是老王的,自己一个人玩!

针对文件:

  • r 表示可以读取文件
  • w 表示可以对文件内容做修改
  • x 表示文件可执行

针对目录:

  • r 表示可以列出目录内容(可以使用ls),前提是得有 x 权限,因为如果你都不能进入这个目录,你怎么列出该目录的内容
  • w 表示可以在目录中增删改查,前提是得有 x 权限,因为如果你都不能进入这个目录,你怎么增删改查
  • x 表示可以进入目录,但不一定能读取目录内的内容。要想读取目录的内容,需要有 r 权限,要想修改,需要有 w 权限!

※目录的权限比较特殊,可以看到,x 权限是目录最基本的权限,因为如果你都不能进入该目录,那读取内容和增删改查就更无从所起了。还有一个就是当你对目录拥有 rwx 权限的时候。倘若目录中有一个文件,该文件对你的权限是没有 w 权限的,但是因为你先匹配到该目录的权限,可以对目录中的文件修改,所以你可以强制修改该文件,保存退出!

由上可以知道laowang分析一下(全面解剖老王的个人品质)

  • 是一个目录
  • 文件所属主权限,可读可写可执行
  • 所属组没有权限
  • 系统上其他人也没有用权限
  • 权限码解读
    • rwx------
    • 转为数字 (421)(000)(000)
    • 数字表示法 700

这样的话我们肯定不爽了,就只能laowang自己一个人玩,组的人也不带上一起玩吗?独乐乐不如众乐乐。 那么我们就可以使用chmod来改变老王自私的行为。 例如,我们要组成员可以在laowang里面增删改查,搞跟一堆事情。那么我们要能进入目录,就是要添加 x 权限,可以修改就是添加 w 权限,还可以看那就要添加 r 权限。直接改吧!

chmod 770 laowang
或者
chmod g=rwx laowang

那现在我要削弱老王自己看自己的东西怎么办,也是可以使用chmod来修改

chmod u-r laowang

文件所属者所属组一个例子

drwxr-xr-x 2 laowang laowang   4096 03-18 11:56 xiaohong

小红所属者是老王,所属组是老王组,哇!这就太不好了吧!我也不懂,但是还是要救失足少女的是吧,可以使用命令chown修改所属者,chgrp修改所属组

 chown xiaohong xiaohong/
 chgrp xiaohong xiaohong/
 ##在查看一下,让小红做回自己
 ls -l
 drwxr-xr-x 2 xiaohong xiaohong  4096 03-18 11:56 xiaohong

umask值

什么是umask?当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。一般在/etc/profile、 [HOME]/.bash_profile或[HOME]/.profile中设置umask值。

umask值 文件 目录
0       6    7
1       6    6
2       4    5
3       4    4
4       2    3
5       2    2
6       0    1
7       0    0

一般来说新建文件的默认值是0666,新建目录的默认值是0777 如果将全线的掩码设置为0002的话则每个新建的文件的默认权限为0666-0002=0644,而目录的权限为775。

查看umask值
直接umask

我们知道umask的值为0022后就可以计算出新创建文件和目录的权限了

drwxr-xr-x    =   0777 - 0022 = 755  #目录
-rw-r--r--    =   0666 - 0022 = 644  #文件

我们可以修改umask值来改变新创建文件和目录的权限

umask 0002
drwxrwxr-x   =   0777 - 0002  =  775   #目录
-rw-rw-r--   =   0666 - 0002  =  664   #文件

可以看到umask值设置的越小,给的权限就会越大

Linux 文件系统

Linux在路径名中不使用驱动器盘符。在Windows中,PC上安装的物理驱动器决定了文件的路径名。Windows会为每个物理磁盘驱动器分配一个盘符,每个驱动器都会有自己的目录结构,以便访问存储其中的文件。例如在D盘下有一个视频,路径为:

D:\myFile\video\Comic.mp4

这种Windows文件路径表明了文件test.doc究竟位于哪个磁盘分区中。Linux则采用了一种不同的方式。Linux将文件存储在单个目录结构中,这个目录被称为虚拟目录(virtual directory)。虚拟目录将安装在PC上的所有存储设备的文件路径纳入单个目录结构中。Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出,这点跟Windows类似。

注意:Linux是使用正斜线(/)而不是反斜线()在文件路径中划分目录。在Linux中, 反斜线用来标识转义字符,要是用在文件路径中的话会导致各种各样的问题

在Linux中,假如老王在他家放了一些影片录像,那么他的路径可能为:

/home/laowang/Desktop/SomeFilms.avi

这里表明了SomeFilms.avi位于Desktop目录,Desktop又位于laowang目录中,laowang则在home目录中,它这里并没有提供任何信息表明它存放在那个物理磁盘上面。

Linux虚拟目录中比较复杂的部分是它如何协调管理各个存储设备。在Linux PC上安装的第一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上它们却存储在另外一个驱动器中。

何为挂载呢?Linux 系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。

  • 如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。
  • 挂载,指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。
  • 并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。

举个例子,我们想通过命令行访问某个 U 盘中的数据,图 1 所示为 U 盘文件目录结构和 Linux 系统中的文件目录结构。

可以看到,目前 U 盘和 Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载。 接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录,挂载效果如图:

常见Linux目录名称

目 录          用 途
/             虚拟目录的根目录。通常不会在这里存储文件
/bin          二进制目录,存放许多用户级的GNU工具
/boot         启动目录,存放启动文件
/dev          设备目录,Linux在这里创建设备节点
/etc          系统配置文件目录
/home         主目录,Linux在这里创建用户目录
/lib          库目录,存放系统和应用程序的库文件
/media        媒体目录,可移动媒体设备的常用挂载点
/mnt         挂载目录,另一个可移动媒体设备的常用挂载点
/opt         可选目录,常用于存放第三方软件包和数据文件
/proc        进程目录,存放现有硬件及当前进程的相关信息
/root        root用户的主目录
/sbin        系统二进制目录,存放许多GNU管理员级工具
/run         运行目录,存放系统运作时的运行时数据
/srv         服务目录,存放本地服务的相关文件
/sys         系统目录,存放系统硬件信息的相关文件
/tmp         临时目录,可以在该目录中创建和删除临时工作文件
/usr         用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里
/var         可变目录,用以存放经常变化的文件,比如日志文件

本文由 jen 撰写

本文分享自微信公众号 - 黑白天(li0981jing),作者:jen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • windows用户和组

    用户账号的认证 用户账号是对计算机用户身份标识,。每个使用计算机的人,必须凭借他的用户账号密码才能够进入计算机,进而访问计算机里面的资源。在计算机中存有一个叫S...

    cn0sec
  • sql注入分类

    是一种结构化的查询语言,用于与数据库进行交互并能够被数据库解析。SQL注入攻击是一种常见的注入攻击类型。攻击方式在用户与程序进行交互时发生的。如在表单输入、搜索...

    cn0sec
  • DC-2

    在这里要配置本地dns解析,将目标ip地址(192.168.44.133 dc-2)添加进hosts中。

    cn0sec
  • 不用Linux跟着微软蓝屏吗?10大“剑”招招毙命!

    有很多原因可以说明为什么Linux应该优先于Windows和Mac等专有软件平台。但在这里,我们列出了十大“诱惑”,让你看得更清楚。

    程序员小助手
  • Linux基础知识第一讲,基本目录结构与基本命令

    废话也不多说, Windows是在同一时间只能一个用户使用.所以有了盘符概念. E:\文件夹\.... Linux是支持多用户使用的.所以没有盘符概念.有跟...

    IBinary
  • Linux新手渗透指南:从枚举到内核利用

    许多人都认为Linux是最安全的操作系统,因此在对Linux的安全问题上也放松了警惕。那么事实真的如此吗?其实安全从来都只是相对的,Linux也不例外。虽然它加...

    周俊辉
  • 初识Linux渗透:从枚举到内核利用

    许多人都认为Linux是最安全的操作系统,因此在对Linux的安全问题上也放松了警惕。那么事实真的如此吗?其实安全从来都只是相对的,Linux也不例外。虽然它加...

    FB客服
  • 弃Windows转Linux,韩国政府能成么?

    还有半年多的时间,Windows 7 就会终止支持(2020年1月14日),微软建议所有的个人、企业或者政府机构升级到Win 10。而韩国政府出于长期成本及安全...

    FB客服
  • 流水的新技术,铁打的Linux

    这一年人工智能火了,凡是带电的专业都往AI上靠,实在靠不上的还可以看AlphaGo下棋,探讨AI能否取代人类。这种全民跟风,比前两年的“云计算”、“大数据”热度...

    嘉为科技
  • 后端程序员必备的Linux基础知识

    我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailc...

    用户2164320

扫码关注云+社区

领取腾讯云代金券