(待更新)【鸟哥 Linux 16】进程管理与SELinux初探

【鸟哥 Linux 16】进程管理与SELinux初探

一、相关概念梳理

  • 程序:一些代码段的静态集合

  • 进程:程序中静态代码段的一次动态执行

  • 子进程:在某一个进程中创建的新作业,从该进程衍生出来的进程称为子进程

  • 父进程:在bash下执行touch,bash就是父进程,touch就会产生子进程

二、进程调用的流程:fork & exec

  • 父进程fork产生一个完全一样的子进程(PID不同,具有PPID),然后通过exec执行程序。

三、工作管理(job control)

  • bash只能管理属于自己的子进程的工作。(比如:无法使用工作管理来让不同tty中的bash相互管理。)

  • 为什么vim不能在后台运行(run status)呢?因为放入后台的工作绝对不能涉及用户交互

  • 进行工作管理的条件和特点是:

1. 必须是当前shell的子进程
2. 必须是可以自动运行的工作
3. 放入后台的工作不能涉及到等待输入
4. 放入后台的工作不能用^c终止,但可以用bg查看,使用fg切回。

工作状态

  • 前台(foreground)状态

  • 后台(background)状态中的暂停(stopped)状态,比如vim后台之后就是这个状态

  • 后台状态中的运行(running)状态

【*】具体的工作管理方式

  • 通过&

  • ^z的方式将前台工作放入后台暂停,默认都会变成暂停(stopped)状态

  • jobs指令展示后台状态


# 列出后台进程的同时列出PID
jobs -l
# 仅列出run状态的后台进程
jobs -r
# 仅列出stopped状态的后台进程
jobs -s
  • 下面的输出中,+号代表上一个被放入后台的程序,-号代表倒数第二个被放入后台的程序。
# 以下是截取的jobs输出
[1]+  Stopped                 vim test1.txt
[2]   Stopped                 vim test2.txt
[3]-  Stopped                 vim test.txt

  • fg将后台工作拉到前台
# 将+号进程拉到前台
fg
# 将+号进程拉到前台
fg +
# 将-号进程拉到前台
fg -
# 将3号进程拉到前台,百分号用于工作控制,注意和纯数字的区别
fg %3
  • bg将程序放入后台运行和^z的区别是,放入后台的状态是run而不是stopped。
# 将+号进程放入后台运行
bg
# 将+号进程放入后台运行
bg +
# 将-号进程放入后台运行
bg -
# 将3号进程放入后台运行
bg %3
  • kill给进程发送多种终止信号
# 列出所有可用信号
kill -l

# 重新加载PID为13482的服务进程的配置文件(涉及到十七章系统服务)
kill -1 13482

# 向PID为13482的进程发送SIGTERM信号(kill -15),正常结束进程
kill 13482

# 对工作管理中的2号进程执行一次^c
kill -2 %2

# 对PID为13482的进程发送SIGKILL信号,忽略信号处理函数(用于强制删除不正常的工作)
kill -9 13482

# 对PID为13482的进程发送SIGKILL信号,忽略信号处理函数(用于强制删除不正常的工作)
kill -SIGKILL 13482

【*】脱机管理的问题(nohup)

  • 上文叙述的后台管理仅用于避免^c杀死进程的问题。试想如下情景:

  • 当你远程SSH到一台服务器使用工作管理将某个程序放入后台运行,然后你断开了SSH,放入后台运行的这个程序依然会结束。原因是某个Bash只能利用工作管理来管理属于自己的子进程。你SSH登录的时候分配了一个bash进程,这是你在这次工作中开启的所有子进程的父进程,一旦你断开SSH,父进程没有了,子进程当然也会结束。

  • 解决方法:使用at或者nohup,将这些进程放入系统后台,与你的SSH终端机进程脱离关联。

四、进程管理

进程观察(ps、pstree、top指令)

ps:撷取某个时间点的进程情况(静态查阅)

  • ps的man page融合了多个发行版,阅读困难,所以最好是记住几个常用的。
# 摘取自ps的man page
This version of ps accepts several kinds of options:

1   UNIX options, which may be grouped and must be preceded by a dash.
2   BSD options, which may be grouped and must not be used with a dash.
3   GNU long options, which are preceded by two dashes.

...

Commands options such as ps -aux are not recommended as it is a confusion of two different standards.  
According to the POSIX and UNIX standards, 
the above command asks to display all processes with a TTY (generally the commands users are running) plus all processes
owned by a user named "x".  If that user doesn't exist, then ps will assume you really meant "ps aux".
  • *查阅当前bash相关的进程
ps -l

F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000    7227    7220  0  80   0 -  3456 do_wai pts/0    00:00:00 bash
0 T  1000   52680    7227  0  80   0 -  6957 do_sig pts/0    00:00:00 vim
0 T  1000   52681    7227  0  80   0 -  6957 do_sig pts/0    00:00:00 vim
0 T  1000   52682    7227  0  80   0 -  6977 do_sig pts/0    00:00:00 vim
0 R  1000   53461    7227  0  80   0 -  3623 -      pts/0    00:00:00 ps

结果中F代表进程旗标
若为 4 表示此进程的权限为 root ;
若为 1 则表示此子进程仅进行复制(fork)而没有实际执行(exec)。

S代表进程状态
R (Running):该程序正在运作中;
S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
Z (Zombie):僵尸状态,进程已经终止但却无法被移除至内存外。

C 代表CPU使用率

PRI/NI 进程优先级

ADDR/SZ/WCHAN 都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个
running 的进程,一般就会显示『 - 』 / SZ 代表此进程用掉多少内存 / WCHAN 表示目前进程是否运作中,同样的, 若为 - 表示正在运作中。

TTY 终端机位置,主机登录是pts/0,远程登录是pts/n(pts表示虚拟终端)

TIME 花费的CPU时间

CMD 触发该程序的指令是什么
  • 查阅整个系统的进程
ps aux
# 以下是在kernel5.4的linux mint中的部分输出
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.4 105624  9308 ?        Ss   8月16   0:01 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    8月16   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   8月16   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   8月16   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   8月16   0:00 [kworker/0:0H-kblockd]
root           9  0.0  0.0      0     0 ?        I<   8月16   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S    8月16   0:00 [ksoftirqd/0]
root          11  0.0  0.0      0     0 ?        I    8月16   0:02 [rcu_sched]

USER:该 process 属于那个使用者账号的?
PID :该 process 的进程标识符。
%CPU:该 process 使用掉的 CPU 资源百分比;
%MEM:该 process 所占用的物理内存百分比;
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登
入者进程,若为 pts/0 等等的,则表示为由网络连接进主机的进程。
STAT:该进程目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运作的时间。
COMMAND:该进程的实际指令为何?

# 以下是man page中对于该语句的说明
Note that "ps -aux" is distinct from "ps aux".  The POSIX and UNIX standards require that "ps -aux" print all processes owned by a user
named "x", as well as printing all processes that would be selected by the -a option.  If the user named "x" does not exist, this ps
may interpret the command as "ps aux" instead and print a warning.  This behavior is intended to aid in transitioning old scripts and
habits.  It is fragile, subject to change, and thus should not be relied upon.
  • 使用ps -l的方式显示出系统所有进程(而非仅当前bash下的进程)
ps -lA
  • 展示进程树
ps axjf

top:动态进程观察

  • top界面中输入问号?可以查看帮助页面
# 每2s刷新一次top
top -d 2

# 将top的信息输出两次到指定文件,使用-b切换为batch模式,不接受键盘输入
top -b -n 2 ./topinfo.txt

# 观察指定进程
top -d 2 -p 14836

pstree:进程树

# 列出进程树
pstree
# 列出进程树,用ASCII码链接
pstree -A
# 列出进程树,显示进程的用户
pstree -u
# 列出进程树,显示PID
pstree -p

进程管理(信号机制以及kill和killall)

  • 进程管理是通过SIGNAL信号机制实现的。给予进程一个信号,让它知道你想让他做什么。

  • 使用killall替代kill来终止服务是很方便的,因为可以根据名称查找。

# 根据名称发送信号
killall -9 httpd

进程的执行顺序(Priority & Nice)

  • PRI为进程优先级,由系统自动调整。越小优先级越高。

  • NI为Nice值,有:

PRI(new) = PRI(old) + nice
  • NI范围为-20到19

  • root用户可以任意调整所有进程的NI,调大或者调小均可

  • 一般用户只能调整自己进程的NI且仅允许越调越大

  • 通过nice指令直接给予指令nice值

nice [-n 数字] command
  • 通过renice指令调整已经存在的进程的nice值

  • nice只能起到影响PRI的作用,最终的进程执行顺序还是由系统决定。

系统资源观察(netstat等)

  • free查看内存余量
free -m
  • uname查看系统和内核相关信息(核心版本,硬件平台,cpu类型等)
uname [-asrmpi]
  • uptime显示系统启动时间和工作负载,也就是top指令顶部的那一行内容。

  • *netstat追踪网络和端口

netstat -[atunlp]

选项与参数:
-a :将目前系统上所有的联机、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不以进程的服务名称,以埠号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的进程 PID
  • dmesg展示核心信息

  • vmstat监测系统资源变化

五、特殊文件和进程

【*】特殊权限SUID/SGID/SBIT如何影响进程?(参看鸟哥 Linux 6.4)

  • 一个问题:为什么调用passwd之后就可以获得root的权限去访问/etc/passwd呢?

  • 解答:在调用passwd,创建一个新进程的时候,会根据SUID将文件所有者的权限给予这个新进程。这个新进程的归属不变,依然是由bash创建出来。

】/proc/中有什么内容?

  • /proc中存放的是所有进程的相关信息,一个进程对应一个文件夹,文件夹的名称是这个进程的PID

  • 1号进程为systemd进程,执行initd

  • 进程文件夹中的重要内容

- cmdline:这个进程被启动的指令串;

- environ:这个进程的环境变量内容。

【*】查询开启的进程和文件之间的相互关联(fuser等)

  • 使用fuser查看进程和文件的关联
# 查看/proc文件夹的使用者和完整的指令信息
fuser -uv /proc
  • 使用lsof列出进程打开文件列表

  • 使用pidof通过名称查询运行中程序的PID

Selinux 初探

Selinux是啥?

  • Security Enhanced Linux 安全强化linux

  • 是整合到linux核心中的一个模块

  • 初衷是为了防止内部员工对于进程文件的误用。

自主式访问控制DAC

  • 也就是我们日常接触最多的,根据进程所有者文件的rwx权限来进行的访问控制。

  • DAC的问题:1. 具有root权限的进程可以读取任意文件,就算这个文件并不是这个进程工作范围内需要用到的文件 2. root用户可以直接变更任何文件权限为777(非常严重)。

  • 根据以上描述,如果使用者对linux不熟,很有可能出现资源误用的情况。

  • 说到底,DAC的问题就是root进程可以活动的空间太大了。 因为只对用户权限做了限制,但没有对进程权限做限制。(致命问题)

委任式访问控制MAC

  • 为了避免DAC中的资源误用问题,SELinux引入了MAC,通过MAC来管控进程。

  • 使用了MAC之后,可以做到:即使是root用户创建的进程也不能访问所有资源(只具有不完整的权限)。

  • 控制角度从【用户】变成了【进程】,控制该主体进程是否能读取某些文件资源

  • 被控制的主体进程不能随意使用系统资源,因为每个文件资源都对这个主体进程有单独设置的权限。(但这样设置起来就会很复杂,一个多对多的关系)

  • 为了避免设置过于复杂,SELinux提供了许多默认的Policy,在Policy中提供多个rule供使用。


【*】SELinux的运行过程

相关概念梳理
  1. 主体(Subject):在MAC中主体就是【进程】

  2. 目标(Object):在MAC中目标就是【文件系统】

  3. 政策(Policy):依据某些服务来制订的基本存取安全政策。默认为target政策。除此之外还有minimum和mls。一般使用默认政策即可,也一般不需要去自定义政策。

  4. 安全上下文(Security Context):主体进程能否存取目标资源,除了取决于政策规定之外,还取决于主体进程和目标资源的安全上下文是否一致。

进程访问文件资源大体流程

  • SELinux中,进程访问文件资源,在进入DAC前,先要进行MAC。

  • 分析安全政策,进行安全上下文比对,最后进入DAC权限控制。

政策(Policy)
  • 一般直接使用默认政策,不做过多讨论。
安全上下文(Security Context)
  • 较为复杂,但可以理解为SELinux中的rwx权限

  • 主体进程目标资源都包含安全上下文,进程在内存,所以进程的安全上下文也在内存;目标资源在硬盘,所以目标资源的安全上下文存放在文件的inode中。

文件资源的安全上下文

# 查看文件资源的安全上下文
ls -Z

显示的安全上下文由三个字段组成
Identify:role:type
身份识别:角色:类型
# 这里因为自己的虚拟机还没有开启selinux,暂时跳过
身份识别(Identify)字段
  • 表明该文件资源来自于什么类型的进程
# 以下为该字段的多种取值
unconfined_u:该文件来自于不受限的进程(比如bash就不受SELinux管制)所产生,用户自己通过bash建立的文件大多属于这种。
system_u:系统自己产生的文件
角色(Role)字段
  • 表明该文件资源是进程还是文件资源还是使用者。
object_r:代表的是文件或目录等文件资源,最常见
system_r:代表的就是进程,一般使用者也会被指定成为system_r
【*】类型(Type)字段
  • 三个字段中最重要的一个,主体能不能读到这个文件基本就看这个字段。

  • 在进程中需要和Type字段进行对应的字段的名称为domain。对应上了该文件就可以被这个进程读取。


进程的安全上下文及其和文件资源安全上下文的对应
# 查看系统中所有进程,并展示进程的安全上下文
ps -eZ

开始看不懂了,需要补crond之后在更新,逃~

posted @ 2022-08-17 21:32  LeisureLak  阅读(76)  评论(0编辑  收藏  举报