Ubuntu 下的用户管理

从普通用户的角度看 Ubunut 下的用户管理

Posted by Ethan on June 19, 2019

这里记录 了 Ubuntu 下的几种软件管理方式及相互对比。

本篇博客是 Ubunut 探索 系列的第二篇,这一次我们来简单看看 Ubuntu 用户管理

这些都是相对比较 easy 的博客,请大佬自行绕过 😃

前言

相较于 Windows, Linux 家族最为突出的优点之一就是其安全性。而这一点还需要归功于 Linux 下严密的用户管理机制。

不论是作为关注 用户权限协调 的服务器管理员,还是作为一个关心 电脑安全性的普通用户,了解一定的用户管理知识都十分的重要。

这篇博客并不是从一个系统管理员的角度来写,而是更多的 从一个普通用户的角度 出发,叙述普通用户所需要知道的,有关 Ubuntu 用户管理的知识。所以,本篇 Blog 并不会 cover 一些只有系统管理员才需要关心的内容(比如用户添加,磁盘配额,PAM等)

以下所有内容都面向 Ubuntu , 但是大部分知识都可以迁移到其他 Linux 版本。

Hope you can Enjoy it ~

从抽象的角度开始 —— 关于 Ubuntu 用户

要想理解 用户管理 这一 Ubuntu 下的重要话题,那么首先我们需要了解什么是 Ubuntu 用户

Ubuntu 用户 其实是一个十分抽象的概念,它不仅仅指现实中使用 Ubuntu 的现实用户,还可以用来指代某个系统程序。

为了说明这一点,让我们使用 htop 打开后台进程来简单看一下。

Sample

htop

从后台进程的 USER 一栏中,我们可以看到图中主要有这么几名用户:

  • root
  • ethan
  • system-t

这几名用户中,除了 ethan(博主本人) 和 root 我们比较熟悉以外,还有另一个用户: system-t

实际上,这是由于 Ubuntu 将系统程序 system-t 也看做是一个调用系统资源的用户,也给它分配了用户名和用户ID等一系列普通用户所拥有的属性。

简单的介绍完用户在 Ubuntu 系统中的基本概念,接下来我们来看看 Ubuntu 用户所具有的用户属性。

用户属性

如果从相对抽象的 OOP 的角度出发,一个 Ubuntu 用户 有且仅有如下属性:

  1. 用户名 (username)与 用户基本信息
  2. 用户类型
  3. 口令 ( password )
  4. 用户ID 和 用户组ID ( GID )
  5. 用户的主目录地址
  6. 用户登录系统时,所使用的 shell

可以看出,Ubuntu 用户 这一概念与 Windows 下只需要操心用户名和密码的 用户 概念大有不同。

而 Ubuntu 下的用户管理,简而言之就是在管理用户的上述内容

所以说,下面让我们来具体了解一下上述的每一项 Ubuntu 用户属性

用户名 和 用户基本信息

用户名和用户基本信息是这些属性中最为好理解的两个。

前者和常用的 Windows 一样,都是属于你账户的一个代号,由账号的创建者自行决定。

而后者则一般记录着该账号的公司,邮箱等个人信息。但是一般来说,现代 Ubuntu 并不提倡这种将个人信息存于电脑中的做法,但是有时候一些老版的 Ubuntu 程序(如 mail 等)仍然需要用到这些信息。

用户类型

在 Ubuntu 下面,一共有三种用户类型:

  • 超级用户 ( super user )
  • 普通用户
  • 系统用户

其中:

超级用户拥有掌控系统的最高权利,其典型代表就是 root 。root 可以使用所有的程序,操作所有的文件,访问文件系统的每一个角落。也就是说,root 可以在 Ubuntu 系统中做任何事情,拥有独一无二的权利。

普通用户只能拥有由 root 决定的权限。一般来说,每次登录 Ubuntu 系统时,刚开始我们使用的身份都仅仅是普通用户。

系统用户是系统的一部分,并不面向群众。这些用户并不是具体的某个人,而是系统用来运行各种日常的服务所使用的账户。Ubuntu 系统之所以这样设计,原因是为了避免系统的不同服务之间相互影响。

Hint: 普通用户是无法使用这些系统账户登录系统的

口令/密码

在 Windows 下,除了用户名以外,我们最为关心的另一项用户信息就是密码了,在 Ubuntu 下也是一样。

但是关于口令的具体内容,由于内容比较复杂,并且对于一般用户并没有太大作用,所以并不会在本篇博客中详细叙述。感兴趣的读者可以看看 shadow口令PAM 等相关内容。

用户ID 与 用户组ID

用户ID ( UID ) 指的是在 Ubuntu 系统内部,为了区分不同用户,给每个用户所分配的一个固定的数字( 范围为0~65534 ),其中:

0: root 用户

1~499 & 65534: 系统用户

1000 - : 普通用户, 按顺序分配

用户组 则是 Ubuntu 下为了方便权限管理所设计的一个概念。在 Ubuntu 下,每一个用户都必须属于一个用户组(即使在大多数时候,都是一人一个组)。而每一个用户组除了名称以外,都一个对应的 用户组ID ( GID )

这两个概念的具体作用将会在 文件权限系统 具体展开。

主目录

主目录指的是每个用户在 /home/user_name 处专属的文件夹。在这个文件夹下面,包括该用户可以自由操作的所有文件。

Hint: 在终端里快速切换至主目录的一个小技巧 --- $:cd ~ 

用户 shell

实际上,每次当我们使用Ctrl + Alt + T 打开终端时,系统都只是在执行一个指定位置的 bash 文件。在不同用户需要不同类型的终端时,我们可以通过修改对应的配置文件,使得不同用户打开的 shell 的位置不同。

一方面是由于这部分信息一般来说我们并不会修改,另一方面由于这里的内容相对比较复杂,需要涉及到shell 的一些基本概念,所以在此并不展开叙述。

让我们以 /etc/passwd 结束对 Ubuntu 用户的介绍

Ubuntu 下所有用户属性的配置都存储在了一个十分重要的文件中: /etc/passwd

让我们使用 cat /etc/passwd 来查看一下这个文件中的内容:

~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin/false
whoopsie:x:109:117::/nonexistent:/bin/false
avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/bin/false
colord:x:113:123:colord colour management daemon,,,:/var/lib/colord:/bin/false
speech-dispatcher:x:114:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
hplip:x:115:7:HPLIP system user,,,:/var/run/hplip:/bin/false
kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
pulse:x:117:124:PulseAudio daemon,,,:/var/run/pulse:/bin/false
rtkit:x:118:126:RealtimeKit,,,:/proc:/bin/false
saned:x:119:127::/var/lib/saned:/bin/false
usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
ethan:x:1000:1000:ethan,,,:/home/ethan:/bin/bash
privoxy:x:121:65534::/etc/privoxy:/bin/false
dhcpd:x:122:129::/var/run:/bin/false

让我们选几个比较有代表性的信息为例,回顾一下 Ubuntu 用户 有哪些属性。

root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
ethan:x:1000:1000:ethan,,,:/home/ethan:/bin/bash

由于/etc/passwd中将所有的用户属性都组织为下列格式:

username : password : uid : gid : gecos : homedir : shell

即:用户名: 密码 :UID : GID : 信息 : 主目录 : shell 位置

所以按照这个格式,我们可以读取得上面三个用户的用户属性如下:

用户名 密码 用户ID 用户组ID 详细信息 主目录 shell 位置
root x 0 0 root /root /bin/bash
bin x 2 2 bin /bin /usr/sbin/nologin
ethan x 1000 1000 ethan,,, /home/ethan /bin/bash

可能有些人会问,为什么这里的密码都是 x 呢?这当然不是博主自己改的啦~

实际上 Ubuntu 为了保护密码,将所有的密码都从 passwd 中移开并放在了别处。这是由 Ubuntu 下的 shadow 口令 所决定的。

回到用户管理的核心问题——文件权限管理

在 Ubuntu 中,有一句十分有名的 Unix 哲学:

一切皆文件 —— everything is file

不论是现实中可知可感的硬件设备,还是仅仅存在于计算机硬盘的程序代码,在 Ubuntu 眼里,都只不过是一个个对应的文件而已。比如像鼠标和硬盘之类的硬件设备,都直接关联于 /dev 文件夹下的对应文件。

用户管理的核心 ,就在于 如何管理每一个用户对系统资源(即文件)的权限 。只有正确的设置每一个用户(包括每一个程序)的权限,我们的系统安全才有保障。这也是 Ubuntu 高安全性的由来所在。

下面我们就从 Ubuntu 下的文件权限系统开始讲起。

文件权限系统

在 Ubuntu 中,所有文件都只有两种权限:文件的 所有权 和文件的 访问权

文件的所有权,顾名思义,是指 Ubuntu 视该文件归哪一个用户 ( u : user ) 所有。

而文件的访问权,在 Ubuntu 下一共只有三种:读( r : read ),写( w : write )和执行( x :execute )。

而文件权限的管理,其实就是 管理对于文件的 所有者 ( u : user)该用户所在的组 ( g : group ) ,以及 其他用户( a : all ) 而言,他们各自可以拥有 读( r : read )写( w :write )执行( x : execute ) 这三项权限中的哪些。

如果说上面所说的理论比较不大好懂的话,那让我们利用一个 ls -l 命令来实战一下:

$ ls -l 
total 89016
drwxrwxr-x 26 ethan ethan     4096 5月  30 18:16 anaconda3
drwxrwxr-x  2 ethan ethan     4096 6月   1 14:38 code
drwxr-xr-x  2 ethan ethan     4096 6月  18  2019 Desktop
drwxr-xr-x  3 ethan ethan     4096 5月  30 17:31 Documents
drwxr-xr-x  3 ethan ethan     4096 6月  16 19:04 Downloads
-rw-rw-r--  1 ethan ethan     1761 5月  31 00:16 environment.yml
-rw-r--r--  1 ethan ethan     8980 5月  29 00:56 examples.desktop
drwxrwxr-x 12 ethan ethan     4096 6月   1 21:18 GitHubBlog
-rw-rw-r--  1 ethan ethan    11481 5月  30 17:52 index.html

这里仅仅展示了我的主文件夹下的一部分文件。

现在,每一个文件都以一行的形式被显示出来。这时,被显示的内容包括有文件的所有者(都是 ethan ),文件所有者所属的组(同样还是 ethan ),以及文件的大小,名称,创建时间等等信息。

但是我们最为感兴趣的还是最前面的十个字母:

drwxr-xr-x  3 ethan ethan     4096 5月  30 17:31 Documents

比如以这个为例。前面这十个字母中第一个是 文件属性 信息。这一个字母的类型和含义如下:

代码 对象类型
- 常规文件
d 目录
l 符号链接
c 字符特殊设备
b 模块特殊设备
p FIFO
s 套接字

而后面九个字母,就是文件的权限设定。所谓的文件权限设置,本质上都是设置这九个字母 所代表的 九种权限

这九个字母每三个一组。第一组的三个代表着这个文件的所有者拥有对这个文件拥有什么样的权限。比如对上面举的这个例子,文件所有者( ethan )就拥有 rwx 三项权限,即拥有读、写、执行的权限。

而第二组的三个代表对文件所有者所在组的其他成员而言,他们对这个文件拥有什么样的权限。这时,我们可以看见,对组内的其他成员,他们仅仅有用 rx 的权限,即有用读和执行的权限。原本属于 w 的位置,此时被一个 - 所替代。

而第三组的三个表示对于和所有者不在同一个用户组的用户拥有些什么权限。可以看出,此时他们和文件所有者的小组成员拥有的权限相同。

如果足够细心就会发现,在所举的这个例子中,Documents 明明是一个文件夹,怎么会有 执行 这一项权利?其实这是因为对于不同的文件类型而言,rwx 所代表的含义会略微有所不同。关于这一点,感兴趣的读者可以参考自行搜索一下 ~

用户权限的 管理 与 转换

对于普通用户来说,在用户的文件权限管理这个话题上,最为重要的是需要掌握如何 修改文件的权限暂时转至管理员权限 。下面就从这两个方面进行展开。

修改文件权限

可以修改文件权限的命令为 chmod ,其格式如下:

chmod  [ugoa]* ( [-+=]([rwxXst]*|[ugo]) )+ | [-+=][0-7]+

其中,ugoa 是指 管理范围 ,分别代表:

参数 含义
u user 所有者
g group 所有者所在的组
o other 和所有者不同组的人
a all 所有人

-+= 是代表对于权限的 行动 ,分别代表:

字符 行动
+ 添加权限
- 删除权限
= 用新的设置覆盖以前的结果

rwx 的含义就不再多说了。

同时,chmod 命令还有另一种八进制表示法,命令格式类似于

chmod abc filename	

其中,abc分别是一个八进制数字,分别代表着 user , group , other 的权限。它与普通的rwx表示法转换方式很简单。根据r = 4, w = 2, x = 1 来授予不同种类的权限不同的权重。然后将所有授予的权限求和得到对应的八进制数表示法。比如说:

rwx 属性则 4+2+1=7; 
rw- 属性则 4+2=6; 
r-x 属性则 4+1=5。

所以常见的 chmod 777 filename 的实际含义就是授予所有人最高的权限。

暂时转换管理员权限

在 Linux 中,执行很多任务都需要管理员的权限,其中最为经典的情形就是前文所提及的软件安装。

如果想要暂时转换管理员权限,直接使用常见的 sudo 命令即可。而如果说想要长期的转换至管理员身份,则可以考虑使用 sudo -i 来进行切换。

唯一需要提醒的就是,千万不要 总使用管理员权限 。sudo 一时爽,一直 sudo 一直爽,然后全家… 咳咳咳。 关于这么做的后果,最为经典的一个例子就是 sudo rm -rf * 这个笑话。这条命令不要在自己的电脑上试,但可以在你朋友的电脑上试一试~

用户组管理

作为文件权限管理这个话题的最后,下面我们就可以来愉快的 填一下坑 解释一下为什么 Ubuntu 下会有用户组这样的概念。

其实用户组的设定,就是为了 方便集体性的权限授予 。比如说,对于每一个使用 Ubuntu 的用户,你都需要授予其桌面的读取权(否则连桌面都没有是什么鬼~),而如果是一个人一个人的授予这种权限,未免太过低效,违背了 Ubuntu 本身的设计哲学,但是如果是直接授予使用该系统的所有用户,那么有一些不应该使用桌面的程序也可以随意的篡改你的桌面(脑补一下打开电脑发现自己的桌面被黑是什么感觉)。这时候,就是用户组这一概念的用武之地了。将文件的使用者直接划分为一个组,然后对这个组进行权限管理显然比上述两种方式更为方便。

由于对于个人用户而言,用户组管理并不是一个会经常会接触的议题。所以这里不再详细叙述,直接以相关命令作为这个话题结束。

sh 命令 命令功能
groupadd 建立并添加新的用户组
groupdel 删除现有的用户组
groupmod 改变用户组名称或 GID ,但不会改动其中用户
gpasswd 创建用户组的口令,或者指派用户组管理员
useradd -G 添加最初创建的用户到某个用户组中
usermod -G 在用户没有登录到系统时添加至用户组
grpck 检查 /etc/group 文件格式
chgrp 改变文件或目录的用户组所有权
chown 改变文件或目录的所有者

后记

这篇博客是 Ubuntu 探索系列的第二篇,主要讲述了 Ubuntu 用户管理 这一话题。

下一篇 Blog 将详细讲述 Ubuntu 下另一个十分重要的话题:文件系统。

希望这些博客能对那些还不大了解 Ubuntu 系统底层的开发者们有所帮助~

(Plus:喜欢的话记得 ⭐️ star 一下 ~ )