poetry

白发渔樵江渚上,惯看秋月春风。
一壶浊酒喜相逢,古今多少事,都付笑谈中。
常用命令类型 举例
用户 who, whoami, su, useradd, userdel, passwd, usermod, /etc/passwd
groupadd, groupdel, groupmod, /etc/group
文件 chmod, chown, chgrp
其他 sudo、exit

用户和组

用户和组的概念

在Linux中,用户分为管理员用户和普通用户,普通用户又分为系统用户和登录用户,每一个用户都有用户名和独一无二的用户id。管理员的用户id为0,普通用户中,系统用户的用户id为1~499,登录用户的用户id为500+。组也分为管理员组和普通用户组,不过又可以分为基本组(主组)和附加组(额外组)。基本组的组名与用户名相同,附加组是为了方便管理用户,一个用户可以有多个附加组。

Linux安全上下文:

运行中的程序我们称之为进程(process),进程能够访问其所有资源的权限,取决于进程发起者身份。

相关配置文件

Linux中与用户和组相关的配置文件

目录 含义
/etc/passwd 用户及其属性信息(名称、UID、基本组ID等)
/etc/group 组及其属性信息
/etc/shadow 用户密码及其相关属性
/etc/gshadow 组密码及其相关属性

为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。

1、/etc/passwd

1
2
3
4
5
6
7
8
9
10
11
12
/etc/passwd存放用户信息,由6个冒号组成7个信息
1.用户名
2.密码(x表示加密密码)
3.UID(用户标识)
4.GID(组标识)
5.用户全名或本地账号
6.家目录
7.登录之后使用的终端命令

For example:
nginx:x:997:993:Nginx web server:/var/lib/nginx:/sbin/nologin
1 2 3 4 5 6 7

2、/etc/group

1
2
3
4
5
6
7
8
9
用户组的所有信息都存放在/etc/group文件中。此文件的格式是由冒号(:)隔开若干个字段,具体如下:

【组名】:【口令】:【组标识号】:【组内用户列表】
组名:是用户组的名称,由字母或数字构成,不应重复。
口令:存放的是用户组加密后的口令字。一般Linux系统的用户组都没有口令,即这个字段一般为空或者*。
组标识号:与用户标识号类似,也是一个整数,被系统内部用来标识组。别称GID.
组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。

如:root:x:0:

3、/etc/shadow

1
2
3
4
5
6
7
8
9
10
11
root:$6$iDHbyICea.JiS60r.c0::0:99999:7:::

参数一: 用户名称
参数二: 用户加密后的密码
参数三: 用户密码最近一次修改时间,算法是今天的时间减去jan,1,1970得到的时间间隔
参数四: 用户最少多少天后才能改密码的天数(默认为0,表示可以在任何时间修改)
参数五: 用户最多多少天后一定要修改密码的天数,系统会强制用户修改密码(默认为99999,改为1 也能让密码改不了)
参数六: 过期前多少天时间会被警告(改为-1 则永远不会提示)
参数七: 过期后多少天内账号变为inactive状态,可登陆,但不能操作
参数八: 多少天后账号会过期,无法登陆
参数九: 保留参数

4、/etc/gshadow

1
2
3
4
5
6
7
8
9
/etc/gshadow 格式如下,每个用户组独占一行;
groupname:password:admin,admin,…:member,member,…
第一字段:用户组
第二字段:用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码;
第三字段:用户组管理者,这个字段也可为空,如果有多个用户组管理者,用,号分割;
第四字段:组成员,如果有多个成员,用,号分割;

For example:
house1:!::

查看当前用户

一般使用who命令可以查看当前用户:

1
2
3
4
5
6
# 显示当前所有已登录的用户信息(包括 闲置时间, 用户状态, 各列标题)
[root@experience ~]# who -uTH
NAME LINE TIME IDLE PID COMMENT
root + pts/0 2020-01-17 08:49 . 6883 (192.168.19.1)
root + pts/1 2020-01-17 10:36 . 7377 (192.168.19.1)

用户操作命令

用户

1、useradd 增

可以使用 useradd 命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组

参数 作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为 YYYY-MM-DD
-u 指定该用户的默认 UID
-g 指定一个初始的用户基本组(必须已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户的默认 Shell 解释器

一旦用户的解释器被设置为-s nologin,则代表该用户不能登录到系统中,有哪些解释器可以再/etc/passwd中查看,详情请参见Linux的目录结构。

查看当前用户的属组和属主

1
2
[root@DZQ etc]# id root
uid=0(root) gid=0(root) groups=0(root)
1
2
3
4
5
For example:
useradd -d /home/userx -g nginx user02
#创建一个名为user02的用户,但是家文件的文件名为userx,且属主是user02,属组是nginx
[root@nginxs ~]# ll -d /home/userx
drwx------ 2 user02 nginx 62 Dec 20 00:11 /home/userx

2、userdel 删

删除用户时, 如果用户所属组是创建用户时自动创建的和用户名称同名的组, 并且该组内没有其他用户, 则该组也会被删掉。

1
2
3
参数:
-f 强制删除用户, 即使用户当前已登录
-r 删除用户, 同时删除用户主目录。如果不加r,则在/home目录下,还会有用户目录

3、usermod 改

用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用 usermod 命令修改已经创建的用户信息

参数 作用
-c 填写用户账户的备注信息
-d -m 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为 YYYY-MM-DD
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的 UID

4、passwd

当创建完用户,需要给用户添加密码,比如:

1
2
3
4
5
6
7
8
9
10
useradd dzq 
passwd dzq
---输入你想要的密码---
---之后以用户dzq的身份登录---
su - dzq
passwd
---输入你刚刚用root身份创建的密码,就可以修改密码了---
---之后再次登录到系统中,就可以使用:---
---ssh dzq@192.168.255.10---
---密码:passwd---

1、groupadd

语法:

1
groupadd [-g gid [-o]] [-r] [-f] group

参数说明:

  • -g:指定新建工作组的 id;
  • -r:创建系统工作组,系统工作组的组ID小于 500;
  • -K:覆盖配置文件 “/ect/login.defs”;
  • -o:允许添加组 ID 号不唯一的工作组。
  • -f,–force: 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。

实例:

创建一个新的组,并添加组 ID。

1
#groupadd -g 344 runoob

2、groupmod

语法

1
groupmod [-g <群组识别码> <-o>][-n <新群组名称>][群组名称]

参数

  • -g <群组识别码>  设置欲使用的群组识别码。
  • -o  重复使用群组识别码。
  • -n <新群组名称>  设置欲使用的群组名称。

实例

修改组名

1
2
3
4
5
6
7
8
[root@runoob.com ~]# groupadd linuxso 
[root@runoob.com ~]# tail -1 /etc/group
linuxso:x:500:
[root@runoob.com ~]# tail -1 /etc/group
linuxso:x:500:
[root@runoob.com ~]# groupmod -n linux linuxso
[root@runoob.com ~]# tail -1 /etc/group
linux:x:500:

3、groupdel

语法:

1
groupdel [群组名称]

实例:

删除一个群组

1
# groupdel hnuser

4、gpasswd

参数 作用
-a –add USER 添加用户到组
-d –delete USER 移除组中用户
-Q –root CHROOT_DIR 更改组的chroot目录
-r –delete-password 删除组密码
-M –members USER,… 批量添加用户到组
-A –administrators ADMIN,…设置组管理员

执行管理员权限

这里把执行管理员权限分为三种方式,分别是:直接切换管理员账户、临时使用管理员权限、将管理员权限写入到配置文件。

1、su - 切换用户

使用su命令可以切换用户,在没有参数的情况下调用时,su默认以root的身份运行一个交互式的shell。对于向后兼容性,su默认不改变当前目录,只设置环境变量HOME和SHELL(如果目标不是root,则加上USER和LOGNAME)。

这个版本的su使用PAM作为认证、账户和会话管理。在其他su实验中发现一些配置选项(例如:对轮组的支持)必须通过PAM进行配置

su 后面加上 “-” 表示完全切换到新用户,即把环境变量信息也变更为新用户相应信息。如果没有指明用户名,则切换到root,如:su

2、sudo - 临时权限

sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式为“sudo [参数] 命令名称”

参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或 UID 值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提

3、修改配置文件

配置文件 /etc/sudoers ,只有root管理员才可以使用visudo命令编辑sudo服务配置文件。visudo禁止多个用户同时修改配置sudoers文件。进入普通用户时,还是需要sudo才可以执行相关权限。

第一步:vim /etc/sudoers,将第99行左右的位置,添加想要赋予权限的用户

1
2
3
4
5
[root@localhost ~]# sed '99,102p' -n /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
NIKI ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,

第二步:登录普通用户

1
2
[root@localhost ~]# su - NIKI
Last login: Mon Aug 12 01:26:04 EDT 2019 on pts/0

第三部:sudo -l,这里填的密码是NIKI用户自己的密码

1
2
3
4
5
6
7
[NIKI@localhost ~]$ sudo -l
[sudo] password for NIKI:
Sorry, try again.
[sudo] password for NIKI:
----------------------
User NIKI may run the following commands on localhost:
(ALL) ALL

第四步:显示

  • 不用sudo

    1
    2
    [NIKI@localhost ~]$ ls /root/
    ls: cannot open directory /root/: Permission denied
  • 用sudo

    1
    2
    [NIKI@localhost ~]$ sudo ls /root
    1.txt de dem demo mou nin.sh rubbish script.sh test.py w.sh w.sh~

但是考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此 ALL 参数(第99行)就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可

1
2
3
4
5
6
7
8
9
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /usr/bin/cat

此时,用户只能用sudo执行cat命令。

这样虽然赋予了普通用户执行管理员命令的权限,但每次执行之前都要输入密码,可以通过以下配置,使得用户执行sudo时,不用密码验证。

1
2
3
4
5
6
[root@linuxprobe ~]# visudo
………………省略部分文件内容………………
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff

文件

linux一切皆文件,但文件类型和权限有所不同,用字符来区分。

概述

文件类型

1
2
3
4
5
6
-:普通文件
d:目录文件
l:链接文件
b:块设备文件
c:字符设备文件
p:管道文件

文件权限

r w x
执行
4 2 1

对于文件而言

r w x
可以读文件的内容 可以编辑文件的内容 可以执行这个文件

对于目录而言

r w x
读目录中的文件属性信息 可以在目录中添加或删除文件数据信息 是否可以进入到目录

权限详解

1
2
3
4
5
6
7
8
9
10
[root@nginxs qiandao]# ll 
total 8
-rw-r--r-- 1 root root 1424 Aug 15 06:05 Dockerfile
-rw-r--r-- 1 root root 1413 Aug 15 06:05 README.md
drwxr-xr-x 4 root root 28 Aug 15 06:05 root

#权限数字对应权限组说明: 总共分为4部分
【文件或文件夹】【owner权限】【group权限】【others权限】
【文件是-,文件夹是d】【r/w/x相加】【r/w/x相加】【r/w/x相加】
Linux档案的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限

特殊权限

可读可写可执行不能够满足我们对安全和灵活性的需求,因此便有了 SUID、SGID 与 SBIT 的特殊权限位

SUID

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。

例如,所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。这很像我们在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。

查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。另外有读者会好奇,那么如果原本的权限是 rw-呢?如果原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。

1
2
[root@nginx ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27856 Aug 8 21:39 /usr/bin/passwd
1
2
3
4
5
6
7
8
9
10
chmod 4700 test.txt #添加suid权限
-rws------ 1 root root 0 Dec 20 01:48 test.txt

chmod 700 test.txt #取消suid权限
-rwx------ 1 root root 0 Dec 20 01:48 test.txt


对于当前位没有x执行权限,那么则显示大写的S
chmod 4600 test.txt
-rwS------ 1 root root 0 Dec 20 01:48 test.txt

SGID

SGID 主要实现如下两种功能:

1、让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);

2、在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

1
2
[root@DZQ dev]# ll mem 
crw-r----- 1 root kmem 1, 1 Aug 6 08:50 mem

1、在某个目录中创建的文件自动继承该目录的用户组
2、由于 ps 命令被增加了 SGID 特殊权限位,所以当用户执行该命令时,也就临时获取到了 system 用户组的权限,从而可以顺利地读取设备文件了

SBIT

Sticky Bit ,SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成 T。

1
2
[linuxprobe@linuxprobe tmp]$ ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 /tmp

要是也想对其他目录来设置 SBIT 特殊权限位,用 chmod 命令就可以了。对应的参数 o+t 代表设置 SBIT 粘滞位权限

1
2
3
[root@linuxprobe ~]# chmod -R o+t linux/
[root@linuxprobe ~]# ls -ld linux/
drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/

隐藏权限

chattr

chattr 命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。

参数 作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的而不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用 dump 命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
X 可以直接访问压缩文件中的内容

lsattr

用chattr执行改变文件或目录的属性,可执行lsattr指令查询其属性。

参数 作用
-a 显示所有文件和目录,包括以”.”为名称开头字符的额外内建,现行目录”.”与上层目录”..”
-d 显示,目录名称,而非其内容。
-R 递归处理,将指定目录下的所有文件及子目录一并处理
1
2
3
4
5
6
7
for example
使用隐藏权限,防止某个文件被串改。

[root@nginx myhouse]# chattr +i hello.md
[root@nginx myhouse]# lsattr
----i----------- ./hello.md

文件操作命令

chmod

chmod 可以藉以控制文件如何被他人所调用。

1
2
3
for example:
chmod 700 test.md
chmod wxr-rx-rx test.md
参数 作用
-c 显示更改的部分的信息
-f 忽略错误信息
-h 修复符号链接
-v 显示详细的处理信息
-R 处理指定目录以及其子目录下的所有文件

chown

chown 将指定文件的拥有者改为指定的用户或组

参数 作用
user 新的文件拥有者的使用者 ID
group 新的文件拥有者的使用者组(group)
-c 显示更改的部分的信息
-f 忽略错误信息
-h 修复符号链接
-v 显示详细的处理信息
-R 处理指定目录以及其子目录下的所有文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
For example:
更改一个目录文件以及其下子文件或者子目录的属主和属组。

mkdir myhouse
cd myhouse/
touch hello.md
# ll
#-rw-r--r-- 1 root root 0 Dec 20 08:36 hello.md
cd ..
# ll
# drwxr-xr-x 2 root root 22 Dec 20 08:36 myhouse
chown -Rc dzq:nginx myhouse/
#changed ownership of ‘myhouse/hello.md’ from root:root to dzq:nginx
#changed ownership of ‘myhouse/’ from root:root to dzq:nginx
ll
#total 0
#drwxr-xr-x 2 dzq nginx 22 Dec 20 08:36 myhouse
cd myhouse/
ll
#total 0
#-rw-r--r-- 1 dzq nginx 0 Dec 20 08:38 hello.md

----由此可见,myhouse所属的用户和组都已经被更改,且其子目录里的hello.md也被更改了。

chgrp

变更文件或目录的所属群组。

1
2
3
4
5
6
7
chgrp -v bin myhouse/
#将myhouse属组更改为bin

与chown的区别,chown是将文件或者目录的属主更改,而chgrp是更改属组
chown root myhouse/

当chown以chown root:nginx world2.md的形式更改时,即更改了属主又更改了属组
1
2
3
4
5
6
7
8
9
10
11
[root@node ~]# ll
-rwxrwxrwx 1 root root 9 Jan 17 12:26 demo
#改变属主
[root@node ~]# chown NIKI demo
[root@node ~]# ll
-rwxrwxrwx 1 NIKI root 9 Jan 17 12:26 demo

#改变属组
[root@node ~]# chgrp NIKI demo
[root@node ~]# ll
-rwxrwxrwx 1 NIKI NIKI 9 Jan 17 12:26 demo

文件访问控制列表

对指定的用户进行单独的权限控制,就需要用到文件访问控制列表(ACL,Access Control List)

setfacl

Set File Acess Control List

chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。换句话说,setfacl可以更精确的控制权限的分配。比如:让某一个用户对某一个文件具有某种权限。

参数 作用
-m 更改当前文件的ACL
-M, –modify-file=file 从文件中读取访问列表条目ACL进行修改
-x 根据访问控制列表移除条目
-b 删除所有扩展访问控制列表条目
-k 移除默认访问控制列表
-n –no-mask 不重新计算有效权限掩码
-d –default 应用到默认访问控制列表的操作
-R 递归操作子目录
-L 依照系统逻辑,跟随符号链接
-P 依照自然逻辑,不跟随符号链接
1
[root@localhost ~]# setfacl -Rm u:root:rwx /root/dem

getfacl

显示文件上的ACL信息

常见用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@nginx ~]# getfacl hello2.md 
# file: hello2.md
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@nginx ~]# setfacl -m u:dzq:rwx hello2.md

[root@nginx ~]# getfacl hello2.md
# file: hello2.md
# owner: root
# group: root
user::rw-
user:dzq:rwx
group::r--
mask::rwx
other::r--