[机派X] Day 5 - Linux 隐藏坏坏的媒体档案

引言

今天是机派X系列文章的第五天。
昨天介绍了 Linux 的档案系统与一些指令,今天要继续介绍使用者及权限管理相关概念,当然也会介绍许多实用的相关指令。

本篇大纲:

  • 引言
  • Linux 的权限管理机制
  • 我是谁
  • 变更使用者的密码
  • 群组的概念
  • 使用者之王
  • 创建新使用者
  • 档案权限管理
  • 关於本文章系列

Linux 的权限管理机制

首先,让我们来讨论为何需要做权限管理?
Linux 是一个多人(Multi User)多工(Multi Task)的作业系统,同一台电脑可能会有多个不同的使用者,为了保护每个使用者的资料隐私与安全性,所以需要权限管理,举个简单的例子来说:你总不会希望储存在共用电脑中的私人聊天纪录被其他人看到吧!权限管理除了保护每个使用者的隐私之外,也能有限度的将部份资料与其他使用者共享,例如你可以将自己的研究论文授权给指导教授观看及修改,但又能防止其他同学偷看你的论文内容。而权限管理机制更能保护整个系统的安全性,防止怀抱恶意的陌生人乱搞系统,仅允许系统维护者查看、变更系统设定,并为系统适时的安装软件或更新套件。

由此可知,权限管理相当重要,就连大多数人爱用的 Windows 都有权限管理的机制。例如你在使用学校电脑时,若是想要安装软件,却被 Windows 要求输入管理员密码,这就是权限管理的一种,透过权限管理可以避免学生自行安装各式各样的软件。

Linux 系统本身也有权限管理机制,在 Linux 的世界中,权限管理是由使用者(User)的角度出发,针对不同使用者做相对应的权限设定,以达成权限管理的目标。

以上提到的使用者(User),指的是实体的人(或说操作系统的人)。然而,当你面对电脑时,电脑又该如何辨识身份呢?Linux 采用帐号(Account)的方式来处理,帐号是权限管理中的最小单位,使用不同帐号登入系统,系统就会视为不同人在操作电脑,不过若是使用相同帐号登入系统,则系统就会认为同一个身份的人在操作电脑。

同一个系统中,通常一个人会拥有一个帐号,这样才能为每个人独立做权限设定。帐号(Account)又常常会被称为使用者(User),然而这边的使用者与前段所讲的使用者内涵不同,以下所指称的使用者(User)是指系统中的帐号,因为在 Linux 的世界里认的是帐号,而非实体的使用者。

我是谁

是否还记得,树莓派开机後会需要输入 ubuntu 作为使用者名称(Username)与密码,这其实就是验证使用者的身份,当验证成功後(密码与使用者名称都正确),才能进入 bash 环境中。当进入 bash 环境中,我们就能以 ubuntu 这个身份操作系统。

变更使用者的密码

前面有提到过,Linux 是只认使用者不认操作者(也就是实体的人),因此如果别人使用你的帐号与密码登入系统,在系统上就会留下「你」的足迹。我们登入时使用的帐号与密码都是预设 ubuntu,这种资讯在网路上非常容易取得,因此我们应该变更使用者或修改密码以防有心人士冒用我们的名义登入系统。

修改密码其实很简单,只需要透过 passwd 就可以完成了:

passwd [OPTION] [LOGIN]

passwd 的全名是 password,passwd 指令其中一个功能就是变更使用者的密码。输入 passwd 预设操作是变更当前使用者的密码,如果想要变更其他使用者的密码,只需要把 LOGIN 换成其他使用者名称就可以了。

以下直接输入 passwd 来变更当前登入的使用者(ubuntu)的密码。

Changing password for ubuntu.
Current password: 
New password: 
Retype new password: 
passwd: password updated successfully

Note :
若需要详细的指令说明,别忘了善用 man 或者是网路资源喔!

群组的概念

前面提到 Linux 以使用者为基底来执行权限管理,接下来要介绍的是群组(Group)的概念。有时候执行授权时,会针对一群使用者赋予权限,而非只是单一一位使用者,例如:你与三位同学一同制作某份专案报告,为了让你们四位在系统中的身份有别,所以你们必须使用四个不同帐号,但是四个帐号却又需要拥有报告档案的存取权,此时就可以用到群组。将四位使用者加入到一个相同群组後,只要再把档案的存取权限指定给该群组就可以让群组中的四位使用者共享存取权。

也许你会问,为什麽不要四个人共用同一个帐号就好呢?这样只需要一个帐号就好,组成群组很麻烦。
Answer:如果四个实体使用者共用同一个帐号,请问该如何分辨是谁搞砸呢哪件事呢?例如:系统日志中记载 Project_A 使用者於今日早上 8:05 升级了某软件,而这次的升级导致你们写好的程序无法运行,此时若要追查是谁做的好事便会有困难,因为嫌疑人一共有四个,而且搞不好是多人「共谋」犯案,要追查事情原委、甚至复原系统便会相对不容易。

使用者之王

在实际带领大家操作权限相关指令前,需要介绍一个很重要的使用者。

在 Linux 中有一个很特别的使用者,叫做 root ,root 是一个系统内建的使用者,拥有至高无上的权力,讲的更具体一点就是「root 可以做任何事」。不管做什麽权限设定,只要是 root 出场,就能够无视相关权限设定,直接霸王硬上弓。

由於 root 使用者权限很大,因此一般状况下,不会直接以 root 身份登入系统,因为一个不小心就可能搞砸整个系统,通常只有管理系统时,我们才会暂时以 root 身份登入,结束管理作业後便会立刻登出 root 身份。
能力愈大,责任愈重
图源传送门

如果要以 root 身份登入,理论上只要先从当前使用者登出(之前提到的 exit 指令),接着在登入时使用 root 当作 username ,并输入 root 帐号的密码即可成功登入。

Note :
上面有提到一个很重要的关键词「理论上」,之所以说是理论上是因为 root 的权限很大,为了维护系统安全,很多 Linux 发行版预设会禁止使用者以 root 身份登入,而必须间接取得 root 帐号的相关权限。至於如何间接取得权限,请参阅下面的说明。

如果每次管理系统时都要登出再登入再登出再登入,我想一般人会不开心、想要把树莓派对折吧!
我把我对褶,轻轻把你也对褶
图源传送门

Note :
前面提到的「登出再登入再登出再登入」是指:

  1. 登出 - 登出目前使用者(Ex : ubuntu)
  2. 登入 - 登入 root
  3. 登出 - 登出 root
  4. 登入 - 登入目前使用者(Ex : ubuntu)

因此这时要介绍一个很重要的指令 sudo ,用法简述如下:

sudo COMMAND

sudo 可以让你暂时以 root 的身份执行 COMMAND ,而无须直接登入 root 帐号,通常 COMMAND 可以是任何指令。

不过究竟哪位使用者能够使用 sudo 呢?如果每位使用者都能使用 sudo 切换成 root 来操作系统,那就失去 Linux 原有的权限机制了!原先透过基本的帐号、密码机制来控制 root 帐号可以由哪位实体使用者使用,然而 sudo 的授权机制则比较不同,当某位使用者被加入到 sudo 群组後,便取得了使用 sudo 切换成 root 的权力。

Note :
sudo 群组是系统内建的群组,理论上只要是在 sudo 群组中的使用者都可以使用 sudo 指令切换身份至 root 来执行其他指令。

预建的使用者 ubuntu 其实早已在 sudo 群组中,因此之後会用到 sudo 的指令大家可以直接操作。通常作业系统安装过程中所建立的使用者都会被自动加入到 sudo 群组中。然而,之後手动建立的使用者如果需要用到 root 权限,则需要手动被加入至 sudo 群组中。

创建新使用者

由於 ubuntu 是系统预先建立的使用者,因此容易成为坏坏份子攻击的目标。接下来让我们建立一个名叫 crazylab 的新使用者,并藉由这个过程学习权限相关的指令。

Step1. 创建使用者

透过 useradd 指令来创建新使用者,-m 引数可以帮新创的使用者建立家目录,如果不希望使用者有家目录的话可以不加 -m 引数。

sudo useradd -m crazylab

Note :
使用者的设定档通常会储存於家目录中,因此建议给每位使用者家目录,以免之後还要另外设定徒增困扰。通常家目录预设会建立在 /home 目录当中,如果希望建立在其他地方(例如:外接硬碟)可以使用 -b 引数来指定其他位置。

useradd 并非每位使用者都能执行,必须先取得 root 权限才能使用。因此如果直接执行 useradd 会报出权限错误,因此必须加 sudo 让 useradd 以 root 身份执行。

ubuntu@ubuntu:~$ useradd -m crazylab
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.

Step2. 变更使用者密码

还记得之前用过的 passwd 指令吗?就是用它没错!不过因为是变更别的使用者(别忘了,你现在是 ubuntu 使用者)的密码因此需要 root 权限!

sudo passwd crazylab

Step3. 取得 root 权限

你可以用前几天提过的 Ctrl + Alt + Fx 来切换至其他独立 shell ,然後尝试以 crazylab 使用者登入。
crazylab 使用者已经可以使用了,只是该使用者无法使用 sudo 切换成 root 操作系统,如果你尝试执行 sudo 会出现错误讯息如下。

crazylab is not in the sudoers file.  This incident will be reported.

接下来,让我们将 crazylab 加入 sudo 群组中吧!(别问了要切回 ubuntu 使用者喔!)
使用 usermod 可以变更使用者相关的设定,最後的 crazylab 是要作用到的目标使用者,而 -a -G sudo 则是将使用者加入至群组 sudo 中。因为我们是修改其他使用者,因此加 sudo 是必要的!

sudo usermod -a -G sudo crazylab

将 crazylab 加入 sudo 群组中之後,已登入的 crazylab 必须要重新登入设定才会生效喔!
登入 crazylab 後,试试看 sudo 是否能正常执行呢?

Step4. 变更 shell

以 crazylab 登入时是否觉得怪怪的?

$

理论上应该是这样才对吧!

crazylab@ubuntu:~$

因为新建的使用者预设是用 sh 当作 shell 而非 bash,接下来让我们用 chsh 把预设 shell 改回 bash 吧。
chsh 全文是 change shell,可以变更使用者预设的 shell,-s 引数後方接新的 shell。

如果是以 crazylab 使用者执行 chsh 的话无须 root 权限,因为是变更自己的预设 shell,只是执行指令时会需要 crazylab 的密码。完成设定後,别忘了重新登入设定才会生效喔!

# Login as crazylab.
chsh -s /bin/bash

如果是以 ubuntu 使用者执行 chsh 的话就会需要 root 权限,因为是变更别人的预设 shell。

# Login as ubuntu.
sudo chsh -s /bin/bash crazylab

Step5. 删除使用者

之後我打算都以 crazylab 使用者登入,为了避免之後荒废的 ubuntu 使用者带来麻烦,让我们将这位开疆辟土的大前辈删除吧!
使用 userdel 可以删除使用者,-r 引数可以一并删除使用者的家目录。

如果你在登入 ubuntu 的情况下想要删除 ubuntu 那就会收到 ubuntu 使用中的错误讯息。

userdel: user ubuntu is currently used by process 16629

因此请先登出 ubuntu 并用 crazylab 登入,执行 userdel 时别忘了,你是删除别的使用者,因此要加 sudo。

sudo userdel -r ubuntu

此时,如果你尝试用 ubuntu 登入,会发现登入失败。
也可以用 ls 来检查 /home 中 ubuntu 目录已被删除。

档案权限管理

本篇最後,让我们来讨论 Linux 的档案权限管理。

之前使用 ls -l 时,应该可以看到类似的输出讯息:

crazylab@ubuntu:~$ ls -l 
total 4
-rw-rw-r-- 1 crazylab crazylab 13 Sep 17 03:02 fruit.txt

有没有好奇这串详细资料代表什麽呢?
其实其中的部份资料与档案或目录的权限管理有关。

其中 crazylab crazylab 分别表示该档案(或目录)是属於哪个使用者的(称为 owner)、又是隶属哪个群组(称为 group)的。
而 -rw-rw-r-- 则是决定档案(或目录)隶属的使用者及群组具有什麽权限。

-rw-rw-r-- 可以被切割成以下几段:

编号 分断 用途
1 - 用於指示这是个档案还是目录,- 代表档案,d 代表目录。
2 rw- 决定档案(或目录)隶属的使用者所拥有的权限。r 代表具有读取权限,w 代表具有写入权限,x 代表具有执行权限,若没有该权限会以 - 表示。
3 rw- 决定档案(或目录)隶属的群组所拥有的权限。r 代表具有读取权限,w 代表具有写入权限,x 代表具有执行权限,若没有该权限会以 - 表示。
4 r-- 决定其他人所拥有的权限。

档案 fruit.txt(表格中的编号 1 栏位,因为是 - 不是 d,所以知道是个档案)是使用者 crazylab 所拥有的(第一个 crazylab)。从表格中的编号 2 栏位可知,crazylab 可以读取档案内容、也可以写入(或说变更)档案,由於执行权限的部份是 - 所以得知并没有执行权。

虽然 fruit.txt 是由 crazylab 使用者拥有,但是为了因应多人共同编辑的需求(可以参考前面说明群组时举的例子),我们可以将 fruit.txt 指定权限给某个特定群组,该群组中的使用者便会拥有档案的存取权。从表格中的编号 3 栏位可知,fruit.txt 隶属於群组 crazylab,因此该档案目前没有被设定让其他使用者或群组得以存取。在 crazylab 群组中的使用者拥有读取与写入的权限,但没有执行权。

Note :
创建使用者的时候,系统会帮该位使用者创建一个同名的群组,而该群组中不会有任何使用者。以 crazylab 使用者来说,crazylab 群组会在 useradd 执行时被自动建立。建立同名群组的目的是,当档案或目录没有打算共享(设定群组)时,可以直接套用与使用者同名的群组,就类似空头帐户的概念。

而如果要对 fruit.txt 操作的使用者既不是前面提到的档案拥有者,也不是档案被指定的群组,那该怎麽办呢?此时存取权限就会由表格中的编号 4 栏位栏位来决定,我们可以得知不是 crazylab 使用者,也不在 crazylab 群组中的使用者对 fruit.txt 的操作只剩读取权限,而不具有写入与执行权限。

若是要变更档案或目录的权限设定,可以使用 chmod 指令,请参考下方语法。
FILE 代表要变更权限的档案或路径,MODE 代表权限设定。MODE 的撰写方式有很多种,其中一种方式是「使用者代号±权限代号」的形式。

chmod MODE FILE

上面提到的 MODE 撰写方式可以参考下表:

使用者代号 描述
u user,表示拥有档案的使用者(owner)。
g group,表示拥有档案的群组(group)。
o other,表示其他人(other)。
a all,表示代号 u、g 与 o。
权限代号 描述
r read,表示读取权限。
w write,表示写入权限。
x execution,表示执行权限。

举例来说:

# 移除群组的写入权限。
chmod g-w fruit.txt

# 给予其他人读取与写入权限。
chmod o+rw fruit.txt

以上就是 Linux 的档案权限管理,在本篇的最後留给读者一个练习:

  1. 请创建三个使用者:professor、mary、ken 。
  2. 给予 professor 使用者 root 权限,但不要给予 mary 与 ken root 权限。
  3. 请用 groupadd 创建一个群组 shineteam,并将 professor、mary、ken 都加入至群组中。
  4. 用 professor 使用者的身份建立一个目录 Project A,并让 shineteam 群组中的使用者都能读取并写入 Project A 目录中的所有档案与目录。

关於本文章系列

如果对於文章内容有建议、纠错或图源标示不正确的问题,欢迎参考 [机派X] Day 1 尝试与文章作者联络。
想看更多本系列的文章,请连结至 [机派X] Day 1 查看大纲。


<<:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day2

>>:  {DAY5} SQLite操作练习

Array of arrays

Recursion + Loop let array = [[["c",[&qu...

Day 12 强化学习 (Reinforcement Learning)

强化学习什麽是? 简称RL,在没有以往资料的前提下,将模型放到使用环境中,透过一些操作观察环境状态,...

[day22]Vue实作-交易建立页面

交易建立页面 功能规划 简单建置交易建立的页面,填入住户代号、金额以及选择转帐或信用卡缴费。 交易方...

3. 关於那些重要但无法帮助升迁的工作

前言 这篇真的是非常有意思的反思演讲,强烈推荐大家去听原演讲或看文字稿。 讲者主要讲述的是技术发展...

[DAY2]建立容器(一)

一边把容器建立起来,一边看有没有什麽地方要修改的~ 1.network 跟着Multi contai...