Linux 学习之程序管理与SELinux
jinhucheung opened this issue · comments
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
中.
2. 进程
2.1 什么是进程
其实我们前面提到的工作就是一个进程,其有一个程序触发,在内存中活动,以PID来标示一个内存单元(维护着程序数据以及执行者权限)
即 进程就是程序执行过程,执行者的权限与属性和程序代码与数据会加载至内存单元,并以PID来标示这个内存单元.
2.2 子进程与父进程
当我们父进程派生一个子进程后,父进程会休眠(关于进程状态,我们后面提),之后进入子进程的环境,通过PPID可以知道.
然后是父进程通过什么方式派生子进程?
父进程是通过fork-and-exec方式来派生子进程,系统先以fork复制一个与父进程相同的进程(数据相同,但PID不同,其PPID指向父进程),再以exec来加载子进程实际需要的数据.
如下图:
2.3 进程查看
查看当前系统正在运行当中的进程,可以使用ps查看静态数据,或者top动态查看进程,还能以pstree查看进程树
1) 查看自己bash所有进程和某进程:ps -l
与ps -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 -Al
或ps -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,则进程树不会显示出来
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
: 连接词,ANDu
: 列出该用户相关进程所打开的文件U
: 列出系统的socket文件+d
: 后接目录,列出该目录已被打开的文件
3) 查看某命令所启动的进程: pidof
pidof格式是pidof command
3. 系统资源查看
3.1 free:查看内存使用情况
free输出的信息默认以KB为单位,如果我需要其他单位显示容量,可以使用-b|-k|-m|-g
3.2 uname:查看系统与内核相关信息
uname相关选项:
a
: 所有信息s
: 内核名称r
: 内核版本m
: 本系统的硬件名称,如i686或x86_64i
: 硬件架构,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是这个进程的环境变量
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权限)
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字段称为domaintype
: 在目标安全上下文其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] 文件
- 格式
4.4 SELinux的启动/关闭/查看
SELinux支持3种运行模式(注意与MAC策略模式的区别)
- enforcing: 强制模式,代表SELinux已正确限制访问
- permissive:宽容模式,代表SELinux已启动,但不会限制访问,但会提出警告
- disable:SELinux关闭
1) SELinux的查看
getenforce
:查看SELinux的运行模式sestatus
:查看SELinux目前的状态,如运行模式,策略模式等
2) SELinux的启动
- 首先了解你的系统是否装了SELinux(apt-get install selinux)
- 打开SELinux的配置文件/etc/selinux/config,将其中的SELINUX项设为enforcing,SELINUXTYPE设为targeted
- 修改/boot配置文件(/boot/grub/menu.1st或/boot/grub/grub.cfg),将其中的selinux=0改为=1(或者去掉)
- 重启主机
- 查看getenforce
(可是我在Ubuntu14.04上进行以上操作,并不能启动SELinux,待解)
3) SELinux的关闭
只要将SELinux配置文件SELINUX改回disable,重启即可
4) SELinux运行模式切换
我们SELinux启动/关闭要进行上面工作,但enforcing与permissive模式的切换只要用setenforce
即可
4.5 SELinux的错误回报处理
当SELinux发生错误时,我们可以通过setroubleshoot
或auditd
服务收集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信息
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] 规则bool
与setsebool [-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(/.*)?)