jinhucheung / blog

学习笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Linux 学习之程序管理与SELinux

jinhucheung opened this issue · comments

commented

1. 工作管理(Job Control)

1.1 什么是工作管理

工作管理是指在单一终端下同时进行多个工作的行为管理,不能管理其他终端上的工作,只关注自身终端

以下是进行工作管理时的一些限制与概念:

  • 只管理自己的bash上的工作(即bash只能管理其子进程的工作)
  • 前台: 用户可以控制与执行命令的环境为前台
  • 后台: 可以自行工作的环境,无法用[ctrl]+c终止工作,可用fg/bg调度工作

1.2 工作管理

1) 工作调入后台

  • 将命令丢到后台运行: 命令尾+&vim hello.txt &
  • 将运行中的工作放置后台暂停: [ctrl]+z

2) 后台工作的编号与状态

工作调入后台时会返回一个工作编号(jobNum)给我们处理.
同时会标明工作调入后台后的状态. 其状态可分为Done,Stopped,Killed,Running(其中Killed是不正常终止)

3) 查看目前后台的工作:jobs

我们可以用jobs -l列出当前后台中的工作,同时可以查看到它们的PID

4) 工作调回前台:fg

通过fg %jobNum可以指定调出后台中的工作回前台运行

5) 后台中运行暂停的工作:bg

当我们用[ctrl]+z暂停工作到后台后,我们可以调用bg %jobNum在后台运行指定工作

6) 管理后台工作: kill

通过kill+一个处理信号的方式来管理后台中的工作,形式如kill -signal %jobNum
处理信号可以用kill -l查阅,一些常见的信号: -1 重载入 -9 强制杀死 -15 正常结束

1.3 脱机工作管理

当我们脱机或注销后,需要保持某些工作运行,好让我们下次登录时处理.该怎么做?

首先我们要明白脱机/注销后,系统分配给我们的用户进程(理解为登录后取得的终端,图形界面的是gnome-terminal)及子进程会被回收.

而我们需要做的是指定某进程不被系统回收,用nohup,在需要执行的命令前加上nohup即可.
此时输出信息会到~/nohup.out中.

commented

2. 进程

2.1 什么是进程

其实我们前面提到的工作就是一个进程,其有一个程序触发,在内存中活动,以PID来标示一个内存单元(维护着程序数据以及执行者权限)

即 进程就是程序执行过程,执行者的权限与属性和程序代码与数据会加载至内存单元,并以PID来标示这个内存单元.

2.2 子进程与父进程

当我们父进程派生一个子进程后,父进程会休眠(关于进程状态,我们后面提),之后进入子进程的环境,通过PPID可以知道.

然后是父进程通过什么方式派生子进程?
父进程是通过fork-and-exec方式来派生子进程,系统先以fork复制一个与父进程相同的进程(数据相同,但PID不同,其PPID指向父进程),再以exec来加载子进程实际需要的数据.
如下图:

commented

2.3 进程查看

查看当前系统正在运行当中的进程,可以使用ps查看静态数据,或者top动态查看进程,还能以pstree查看进程树

1) 查看自己bash所有进程和某进程:ps -lps -l PID

当我们使用ps -l查看自己bash,会出现如下信息

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  4616  2586  0  80   0 -  1786 wait   pts/13   00:00:00 bash
4 R  1000  4620  4616  0  80   0 -  1605 -      pts/13   00:00:00 ps

第一行的各字段解释:

  • F : 进程标志,说明进程权限 常见的4表root权限,1表进程只能fork不能exec,其中0表示没标志适用
  • S : 进程状态,S:Sleep,可唤醒 R:运行中 D:不可唤醒的睡眠状态 T:停止 Z:僵尸状态,进程终止却无法从内存中删除
  • UID/PID/PPID: 进程所有者/PID/父进程PID
  • C:CPU使用率
  • PRI/NI: 进程优先级,我们通过修改NI还改变PRI值,PRI决定进程优先,越小越优先
  • ADDR/SZ/WCHAN:内存相关,ADDR指示内存单元位置,SZ表示进程用掉多少内存,WCHAN表示进程是否运行中
  • TTY:指示终端机
  • CMD:触发进程的命令

2) 查看系统所有进程:ps -Alps -aux

以下是用ps -aux以另一种呈现方式输出系统所有进程

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4616  3736 ?        Ss   08:08   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    08:08   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    08:08   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   08:08   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S    08:08   0:03 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    08:08   0:00 [rcu_bh]

字段的含义以之前类似,其中VSZ与``RSS`分别表示进程使用的虚拟内存与固定内存量

3) 动态查看进程的变化:top

top可以持续监听进程的运行状态
其中选项-d:后接秒数,表示多少秒后更新状态 -p:接PID
在top内我们还可以通过操作来修改进程的状态,以下是一些top操作

  • P:以CPU使用率排序进程
  • M:以内存使用率排序进程
  • N:以PID排序进程
  • k:给与某进程一个信号
  • r:修改某进程的NI值(NICE)

top的输出信息以下

### 以下部分描述当前系统状态 load aveage:表示CPU的平均负载(1,5,15分钟)
top - 10:00:41 up  1:51,  3 users,  load average: 0.37, 0.37, 0.33
Tasks: 212 total,   1 running, 211 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.0 us,  3.7 sy,  0.0 ni, 81.9 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   6075096 total,  2214228 used,  3860868 free,   148028 buffers
KiB Swap:  3998716 total,        0 used,  3998716 free.  1198676 cached Mem

### top操作命令
Send pid 4698 signal [15/sigterm] 

### 进程信息
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
 4698 root      20   0       0      0      0 S   0.0  0.0   0:00.06 kworker/u4+ 
 4697 kumho     20   0    6960   2796   2392 R   0.3  0.0   0:00.34 top   

4) 进程的树结果:pstree

通过pstree我们可以了解到进程间的相互关系,如果要同时输出PID及进程所有者,可加上-up选项,如果进程所有者是root,则进程树不会显示出来

commented

2.4 进程管理

与工作管理类似,进程也是通过kill加信号量来管理的,不同的是,进程间可以彼此管理.

1) 需指定PID:kill

kill需要指定进程的PID,才能对进程进行管理,通常配合ps
格式是kill -signal PID,signal如工作管理中提到,可通过kill -l才查看,
这里再补充下

  • 1:重新启动
  • 2:相当与[ctrl]+c
  • 9:强制杀死
  • 15:正常结束
  • 17:相当与[ctrl]+z

2) 管理指定命令启动的所有进程:killall

killall 格式是killall -signal 命令,其中killall也包含其他的选项 i:询问用户 I忽略命令大小写

2.5 进程优先级

CPU会根据进程优先级来决定某进程的执行频率,一些冗长的进程应该较不优先
进程优先级由PRI值决定,值越低越优先,用户无法直接设置PRI值,而是通过NI值来修改PRI值.

PRI(new)=PRI(old)+Ni #这个加式,不是绝对的,PRI(new)可能会有点偏差,由系统分析后绝对

Ni值的修改有以下限制:

  • Ni值可调整范围为-20~19
  • root可以随意调整自己或他人的进程的Ni值,范围是-20~19
  • 一般用户仅可以调整自己进程的Ni值,范围是0~19,且值只能越调越大

要调整Ni值有以下两种方式:

1) nice: 给予新执行命令一个NI值

格式nice -n NI值 commad

2) renice:修改已存在的进程的Ni值

格式renice NI值 PID

2.6 进程与文件

1) 查看正在使用某文件的进程:fuser

fuser的格式: fuser [-umv] [-k -signal] file/dir

  • u :显示进程执行者
  • m :后接的文件,会上提到其所在的文件系统挂载点,等价与查看正在使用此文件系统的进程
  • v : 显示列出文件与进程的相关数据
  • k : 管理进程

2) 列出某进程所打开的文件: lsof

lsof的格式: lsof [-p PID] [-u username] [+d] [-a] [-U]

  • a : 连接词,AND
  • u : 列出该用户相关进程所打开的文件
  • U : 列出系统的socket文件
  • +d : 后接目录,列出该目录已被打开的文件

3) 查看某命令所启动的进程: pidof

pidof格式是pidof command

commented

3. 系统资源查看

3.1 free:查看内存使用情况

free输出的信息默认以KB为单位,如果我需要其他单位显示容量,可以使用-b|-k|-m|-g

3.2 uname:查看系统与内核相关信息

uname相关选项:

  • a : 所有信息
  • s : 内核名称
  • r : 内核版本
  • m : 本系统的硬件名称,如i686或x86_64
  • i : 硬件架构,i686等

3.3 uptime:查看系统启动时间与工作负载

uptime所查看的信息就是top描述系统信息的部分

3.4 netstat:跟踪网络

netstat被用在网络监控方面,以下网络连接,与本地socket的信息
以下是一些选项

  • a : 列出目前系统所有连接/socket/监听
  • t : 列出tcp网络数据包的数据
  • u:列出udp网络数据包的数据
  • n : 不列出进程的服务名称,以端口号显示
  • l: 列出目前正在网络监听的服务
  • p:显示PID

比如列出目前系统上已在监听的网络连接及PID:netstat -tlnp

3.5 dmesg:分析内核产生的信息(主机硬件信息)

dmesg是用来查看内核分析出来的主机硬件信息的,通常配合grep一起使用

3.6 vmstat:动态跟踪系统资源的变化

vmstat可以检测CPU/内存/磁盘的IO状态等.下面是常见的参数说明:

  • vmstat time:vmstat默认是检测CPU/内存等信息,time为秒数,表示动态跟踪
  • vmstat -d 磁盘IO总量统计表
  • vmstat -p 分区 显示该分区的IO总量统计表

3.7 /proc目录

/proc目录存放的是内存中的数据,每一个进度都会在/proc下创建一个以PID为名的子目录,进程目录下存放着相当多的文件,比如cmdline是存放启动此进程的命令,environ是这个进程的环境变量

commented

4. SELinux

4.1 什么是SELinux

SELinux是在进行程序/文件等权限设置依据的一个内核模块,是程序进程能访问系统资源的一道关卡,通常用于控制网络服务.

SELinux是基于以策略规则制定特定程序访问特定文件的模式,即委托访问控制(MAC),我们之前用户访问文件,直接通过判断文件权限与用户对比,这种访问方式称为自主访问控制(DAC).

DAC的一些缺陷:

  • root具有最高权限
  • 用户取得进程来更改文件资源的访问权限

而MAC是针对进程设置对文件的访问权限,通过提供一些策略来管理众多的进程与文件

4.2 SELinux运行模式

SELinux是通过MAC方式控管进程的,其控管的主体是进程,而目标是文件资源,其相关性如下:

  • 主体(Subject)
    • 进程
  • 目标(Object)
    • 文件资源
  • 策略(Policy)
    • 由于进程与文件数量庞大,所有SELinux依据某些服务制定了基本的访问策略,这些策略内还会有详细的规则(rule)来制定不同服务的开放某些资源的程度
    • targetd: 针对网络服务限制较多,本机限制较少
    • strict:限制方面较严格
  • 安全上下文(security context)
    • 安全上下文是描述主体/目标的相关信息,只有当主体与目标的安全上下文匹配时,主体才能去访问目标.(当然,最后还要匹配目标的rwx权限)

SELinux 运行各组件的相关性如下图

4.3 安全上下文

安全上下文存在于文件的inode上,因为进程也是由文件触发的,所以主体进程也有安全上下文
SELinux下,只有当主体通过策略与安全上下文的匹配后,才能得到放行.而最主要的部分就是安全上下文.

1) 安全上下文的查看

文件安全上下文的查看: ls -Z
进程安全上下文的查看: ps -Z

安全上下文主要分为3个字段

Identify:role:type
  • Identify:标明数据所有者的身份,值为:
    • root root所有
    • system_u 系统程序方面的标识,通常指服务进程
    • user_u 一般用户
  • role :表明数据的角色,比如程序,文件资源等
    • object_r:代表文件资源
    • system_r : 代表进程
  • type:安全上下文的比较字段
    • domain:在主体的安全上下文中其type字段称为domain
    • type: 在目标安全上下文其type字段称为type
    • 只有domain与type匹配后,安全上下文才匹配成功
    • SELinux启动后会写入domain与type的映射表,匹配就是在映射表中搜索

2) 安全上下文的修改

如果已知某文件的安全上下文的type字段错了,需要改回正常可以怎么做?

  • chcon:指定修改安全上下文的字段
    • 格式 chcon [-R] [-t type] [-u user] [-r role] 文件chcon [-R] --reference=范例文件 文件
    • 参数: -R是级联修改 -t修改type字段 -u修改Identify字段 -r修改role字段
  • restorecon:还原文件的默认安全上下文
    • 格式 restorecon [-Rv] 文件
commented

4.4 SELinux的启动/关闭/查看

SELinux支持3种运行模式(注意与MAC策略模式的区别)

  • enforcing: 强制模式,代表SELinux已正确限制访问
  • permissive:宽容模式,代表SELinux已启动,但不会限制访问,但会提出警告
  • disable:SELinux关闭

1) SELinux的查看

  • getenforce:查看SELinux的运行模式
  • sestatus:查看SELinux目前的状态,如运行模式,策略模式等

2) SELinux的启动

  1. 首先了解你的系统是否装了SELinux(apt-get install selinux)
  2. 打开SELinux的配置文件/etc/selinux/config,将其中的SELINUX项设为enforcing,SELINUXTYPE设为targeted
  3. 修改/boot配置文件(/boot/grub/menu.1st或/boot/grub/grub.cfg),将其中的selinux=0改为=1(或者去掉)
  4. 重启主机
  5. 查看getenforce
    (可是我在Ubuntu14.04上进行以上操作,并不能启动SELinux,待解)

3) SELinux的关闭

只要将SELinux配置文件SELINUX改回disable,重启即可

4) SELinux运行模式切换

我们SELinux启动/关闭要进行上面工作,但enforcing与permissive模式的切换只要用setenforce即可

4.5 SELinux的错误回报处理

当SELinux发生错误时,我们可以通过setroubleshootauditd服务收集SELinux的错误信息,并加以分析处理

1) setroubleshoot:SELinux错误信息写入/var/log/messages

首先我们需要确认安装setroubleshoot,并将其启动

当SELinux报告错误信息后,我们可以查看/var/log/messages,其会提供解决的方法.

2)auditd:SELinux日志信息写入/var/log/audit/audit.log

auditd会收集SELinux的日志信息,由于auditd信息庞大,可以借由audit2why来处理导入的audit信息

commented

4.6 SELinuxde的策略与规则管理

我们知道,一个主体进程能否读取目标文件的重点在于SELinuxde的策略以及策略下的各项规则,然后在通过该规则的定义去处理各文件的安全上下文.

1) 查看当前策略提供的信息:seinfo

seinfo的参数有以下:

  • b 列出当前策略提供的所有规则种类(bool值,表示该规则启动与否)
  • t 列出所能提供的安全上下文中的type种类
  • u 列出所能提供的安全上下文中的Identify种类
  • r 列出所能提供的安全上下文中的role种类

比如以下看出所有与httpd有关的规则: seinfo -b | grep httpd

2) 查看安全上下文type字段映射表:sesearch

基本格式 sesearch [-a] [-s 主体type] [-t 目标type] [-b 策略bool]

  • a 列出该类型或布尔值的所有相关信息

比如我要查找目标文件类型为httpd_sys_content_t的有关信息

sesearch -a -t httpd_sys_content_t

输出结果
allow 主体安全上下文类型 目标安全上下文类型 目标文件资源格式

3) 查看/设置规则的状态:getsebool [-a] 规则boolsetsebool [-P] 规则bool=[0|1]

我们通过getsebool来查看SELinux目前策略下的规则状态,-a是查看所有规则条款
setsebool来设置规则条款的状态 0-关闭 1-开启 -P直接写入配置文件

4) 默认目录的安全上下文查询与修改:semanage

semanage的查询格式:semanage {user|port|interface|fcontext|login} -l (其中fcontext是用与安全上下文方面)
semanage的修改格式 : semanage fcontext -{a|d|m} [-tru] file_spec

  • a|d|m 增/删/改 一条安全上下文
  • tru 对于安全上下文的类型/角色/身份上的处理
  • file_spec 针对的目标文件或主体文件的路径名(如/srv/samba(/.*)?)