文章目录
Linux 权限
0. 前言
权限无处不在,本文就不废话,我们直接开始!
学习目标
- 了解 Linux/Unix 安全模型
- 会使用 Linux 权限相关命令
1. 相关概念
本小节介绍 Linux 中,用户的分类以及常见的文件权限
1.1 用户分类
Linux用户可以分为以下几种类型:
- Root用户:这是Linux系统中的超级用户,拥有完全的系统管理权限。
- 系统用户:这些用户是由系统或应用程序创建的,用于运行服务或进程。
- 普通用户:这些用户是由管理员或root用户创建的,拥有有限的系统权限,只能访问其拥有的文件和目录。
- 游客用户:这是一个特殊的用户类型,通常用于公共计算机或类似的场景,用户在使用期间可以访问系统的一些功能,但不会留下任何痕迹。
作为开发者,我们平时作为普通用户以及Root用户的场景最多,因此接下来的知识将会围绕这两个用户展开介绍。
id 查看当前用户身份标识信息
[sharry@localhost ~]$ id
uid=1000(sharry) gid=1000(sharry) groups=1000(sharry) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
在Unix安全模型中,一个用户可以拥有文件和目录。当一个用户拥有一个文件或者目录时,该用户将对该文件或目录拥有控制权限。同时,一个用户又归属于一个群组,该群组由一个或多个用户组成,组中的用户对文件和目录的访问权限由其所有者授予。
从上面列举的 id
命令执行例子,我们发现,标准输出中的结果有一个uid
、gid
以及groups
,通过上面的介绍,不难理解其中的意思:在创建用户账户的时候,用户将被分配一个uid
号码,同时被分配一个gid
,即被分配到该组id对应的群组。
我们可以切换到Root用户也执行一下id
命令:
[sharry@localhost ~]$ su root
Password:
[root@localhost sharry]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
不难发现,普通用户的uid
及gid
是根据不同的Linux系统,从较大于0的一些编号中开始分配的;Root用户则是0号用户,属于0号群组。
详细用户信息
详细的用户信息记录在了 一些不同的文件中,以下列举一些常见的:
- 用户账户信息:
/etc/passwd
- 用户组定义:
/etc/group
- 用户密码信息:
/ect/shadow
实操一下,我们可选取passwd文件看看:
[root@localhost sharry]# echo $(less /etc/passwd)
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin chrony:x:992:987::/var/lib/chrony:/sbin/nologin unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin qemu:x:107:107:qemu user:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin sssd:x:990:984:User for sssd:/:/sbin/nologin usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin sharry:x:1000:1000:CentOS7-64-SharryVM1:/home/sharry:/bin/bash
1.2 文件权限
与我们学过的操作系统理论知识一致,Linux通常提供文件的读、写以及执行权限。我们通过ls
命令并使用其-l
选项,就可以列举出文件的读写权限属性:
[sharry@localhost ~]$ > newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rw-rw-r--. 1 sharry sharry 0 Jun 1 02:04 newFile.txt
在这个例子中,最前面的-rw-rw-r--
表示这个创建的新文件的文件属性,以下对这个属性进行拆分,对照解释这些属性的表格,文件的权限信息就一目了然了:
- 拆分:
-rw-rw-rw-r--
拆为:-
以及rw-rw-r--
,拆出来的分别顺序对应下面的表格所描述的属性意义,其中rw-rw-r--
每3位分别对应其所有者权限、组权限、其他用户权限 - 表格:
- 文件类型表
文件类型属性 | 代表的文件类型 |
---|---|
- | 普通文件 |
d | 目录 |
l | 符号链接 |
c | 字符设备文件 |
b | 块设备文件 |
- 权限属性表
权限属性 | 文件权限 | 目录权限 |
---|---|---|
r | 允许打开和读取文件 | 允许列出目录下的内容 |
w | 允许写文件;当设置了执行权限时,也允许被创建、删除、重命名。 | |
x | 允许当作程序一样来执行 | 允许进入目录下 |
举例
-
组合表格举例
文件属性 含义 -rwx------ 普通文件,文件所有者具有读取、写入和执行权限,组成员和其他所有用户都没有访问权限 -rw-r–r– 普通文件,文件所有者有读写权限,文件所有者所在群组成员以及其他用户都可读 lrwxrwxrwx 符号链接(软链接) dwxrwx---- 目录文件,文件所有者和所有者所在群组的成员都可以进入该目录,而且可以创建、重命名和删除该目录下的文件 -
再执行一下
ls -l
[sharry@localhost ~]$ ln -s newFile.txt secln [sharry@localhost ~]$ ls -l total 0 drwxr-xr-x. 2 sharry sharry 6 Apr 17 18:33 Desktop -rw-rw-r--. 1 sharry sharry 0 Jun 1 02:04 newFile.txt lrwxrwxrwx. 1 sharry sharry 11 Jun 1 02:27 secln -> newFile.txt
2. 权限操作
本节主要介绍常见的命令行更改文件权限、切换用户方式
2.1 更改文件权限
作为开发者,在工作中我们很少会直接用到更改文件权限的命令,但话都说到这了,我们还是了解一下:
2.1.1 chmod 更改文件模式
在学习这个命令之前,我们首先要注意只有文件所有这者和Root超级用户才可以更改文件或目录的模式。
chmod
命令通常结合八进制或符号表示文件模式。我们以表格的形式举些例子,读者大佬们应该看看就很快懂了:
八进制表示法
八进制 | 二进制 | 文件模式 |
---|---|---|
0 | 000 | — |
2 | 010 | -w- |
7 | 111 | rwx |
以此类推,chmod
八进制表示文件模式通常为 0~7,其中常用的值为0、4、5、6、7, 如下执行示例:
[sharry@localhost ~]$ ls
Desktop Documents Downloads Music newFile.txt Pictures Public secln Templates Videos
[sharry@localhost ~]$ ls -l newFile.txt
-rw-rw-r--. 1 sharry sharry 0 Jun 1 02:04 newFile.txt
[sharry@localhost ~]$ chmod 777 newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rwxrwxrwx. 1 sharry sharry 0 Jun 1 02:04 newFile.txt
符号表示法
符号表示法分为三部分:更改会影响谁、要执行哪个操作以及要设置哪种权限
符号表:
符号 | 含义 |
---|---|
u | user的简写,表示文件或目录的所有者 |
g | 文件所属群组 |
o | 其他用户 |
a | all,表示上述行的权限都有 |
操作表:
操作 | 含义 |
---|---|
+ | 添加一种权限 |
- | 删除一种权限 |
= | 只有指定权限可用 |
举个例子:
[sharry@localhost ~]$ chmod 600 newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rw-------. 1 sharry sharry 0 Jun 1 02:04 newFile.txt
[sharry@localhost ~]$ chmod u+x,g+rwx,o=r newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rwxrwxr--. 1 sharry sharry 0 Jun 1 02:04 newFile.txt
[sharry@localhost ~]$
2.1.2 umask 设置默认权限
umask
命令控制创建文件时指定给文件的默认权限,使用八进制位掩码表示删除哪个位的权限模式。
查看默认umask
位掩码
[sharry@localhost ~]$ umask
0002
根据位掩码,设置位掩码并对文件权限进行默认操作
[sharry@localhost ~]$ umask
0002
[sharry@localhost ~]$ > newTest.txt
[sharry@localhost ~]$ ls -l newTest.txt
-rw-rw-r--. 1 sharry sharry 0 Jun 1 20:42 newTest.txt
[sharry@localhost ~]$ umask 0000
[sharry@localhost ~]$ > newTest1.txt
[sharry@localhost ~]$ ls -l newTest1.txt
-rw-rw-rw-. 1 sharry sharry 0 Jun 1 20:43 newTest1.txt
2.2 切换用户
2.2.1 su 切换用户
su命令常用来以另一个用户的身份来使用shell。常用选项为-l
和 -c
举例:
[sharry@localhost ~]$ su -l
Password:
Last login: Thu Jun 1 22:49:55 PDT 2023 on pts/1
[root@localhost ~]#
# 通过 exit 命令退出到 原先用户的shell
[root@localhost ~]# exit
logout
# 其中,-l 可以省略为 -
[sharry@localhost ~]$ su -
Password:
Last login: Thu Jun 1 23:17:39 PDT 2023 on pts/1
[root@localhost ~]#
-c
选项表示不切换登录,但在目标用户的shell
执行单个命令:
# 当没有权限时
[sharry@localhost ~]$ ls -l /root/ *
lrwxrwxrwx. 1 sharry sharry 11 Jun 1 02:27 secln -> newFile.txt
......
ls: cannot open directory /root/: Permission denied
# 使用 su -c
[sharry@localhost ~]$ su -c 'ls -l /root/ *'
Password:
lrwxrwxrwx. 1 sharry sharry 11 Jun 1 02:27 secln -> newFile.txt
Desktop:
total 0
Documents:
total 0
Downloads:
total 0
Music:
total 0
Pictures:
total 0
Public:
total 0
/root/:
total 8
-rw-------. 1 root root 2783 Apr 17 18:26 anaconda-ks.cfg
-rw-------. 1 root root 2063 Apr 17 18:26 original-ks.cfg
......
2.2.2 sudo 使用另一个用户的权限
sudo
命令在很多方面都类似于 su
命令。管理员可以通过配置sudo
命令,使系统以一种可控的方式,允许一个普通用户以一个不同的用户身份很执行命令。主要区别在于,通过sudo
的配置,用户有些场合会被限制为只能执行特定的几条命令,同时,使用sudo
命令并不需要Root用户的密码,只需要输入用户自己的密码进行认证。举个例子:
[sharry@localhost ~]$ sudo backup_script
[sudo] password for sharry:
sharry is not in the sudoers file. This incident will be reported.
[sharry@localhost ~]$ sudo ls -l /root/*
[sudo] password for sharry:
sharry is not in the sudoers file. This incident will be reported.
上述命令的执行说明了当前用户并没有分配到 sudoers,我们可以用我们上述提到过的知识为当前用户分配 soders :
[sharry@localhost ~]$ su -
Password:
Last login: Thu Jun 1 23:24:17 PDT 2023 on pts/1
[root@localhost ~]# cd /etc/
[root@localhost etc]# ls | grep sudoers
sudoers
sudoers.d
[root@localhost etc]# chmod u+w sudoers
[root@localhost etc]# vi sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
sharry ALL=(ALL) ALL
[root@localhost etc]# chmod u-w sudoers
[root@localhost etc]# exit
按照上面的示例配置完成后,我们再执行一下sudo
[sharry@localhost ~]$ sudo ls -l /root/ *
lrwxrwxrwx. 1 sharry sharry 11 Jun 1 02:27 secln -> newFile.txt
Desktop:
total 0
Documents:
total 0
Downloads:
total 0
Music:
total 0
Pictures:
total 0
Public:
total 0
/root/:
total 8
-rw-------. 1 root root 2783 Apr 17 18:26 anaconda-ks.cfg
-rw-------. 1 root root 2063 Apr 17 18:26 original-ks.cfg
Templates:
total 0
Videos:
total 0
2.2.3 chown、chgrp更改群组
为了演示效果,我们首先要通过上面小节学习过的sudo
命令创建一个新用户,并将当前用户的测试文件更改到新用户群组:
创建新用户
[sharry@localhost ~]$ sudo useradd -r -m -s /bin/bash kevin
[sudo] password for sharry:
[sharry@localhost ~]$ sudo passwd kevin
Changing password for user kevin.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
更改群组
[sharry@localhost ~]$ > testFile.txt
[sharry@localhost ~]$ sudo cp testFile.txt ~kevin
[sharry@localhost ~]$ sudo ls -l ~kevin/testFile.txt
-rw-r--r--. 1 root root 0 Jun 2 00:10 /home/kevin/testFile.txt
[sharry@localhost ~]$ sudo chown kevin: ~kevin/testFile.txt
[sharry@localhost ~]$ sudo ls -l ~kevin/testFile.txt
-rw-r--r--. 1 kevin kevin 0 Jun 2 00:10 /home/kevin/testFile.txt
以上例子仅举例了chown
命令的使用,chgrp
命令的使用与chown
基本一致,读者可自行尝试。
2.2.4 passwd 更改密码
这个命令在上面小节创建新用户的例子中已经用过了,这个命令非常简单粗暴,选择合适的权限后,执行
passwd [username]
然后按照提示,输入校验密码即可。
3. 总结与补充
通过本文,读者应该对 Linux 中的一些权限相关的知识有一些了解了:
我们首先了解了文件模式的表示对应的权限,然后了解了一些不常用的修改文件权限的方式,最后我们学习了用户身份相关的知识,这方面的知识虽然在文中记录的不多,但实际上可能用得多。