Linux:进程管理与 SELinux
直接将指令丢到背景中『执行』的 &
将 /etc/ 整个备份成为/tmp/etc.tar.gz 且不想要等待,那么可以这样做:
tar -zpcf /tmp/etc.tar.gz /etc &
进一步,不让后台运行的结果输出显示在屏幕上
tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
观察目前的背景工作状态: jobs
jobs [-lrs]
选项与参数:
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。
jobs -l
观察结果,+ 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了!
将背景工作拿到前景来处理:fg
fg %jobnumber
选项与参数:
jobnumber :jobnumber 为工作号码(数字)。注意,那个%是可有可无的!
举例:
jobs -l
fg
fg 1
[ctrl]-z 可以将目前的工作丢到背景底下去『暂停』, 那么如何让一个工作在背景底下『 Run 』呢?
nohup 可以让你在脱机或注销系统后,还能够让工作继续进行。nohup 并不支持 bash 内建的指令
- Priority 与 Nice 值
Linux 给予进程一个所谓的『优先执行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 用户无法直接调整 PRI 值的。
查看Priority
ps -l
由于 PRI 是核心动态调整的,我们用户也无权去干涉 PRI !那如果你想要调整进程的优先执行序时,就得要透过 Nice 值了!一般来说, PRI 与 NI 的相关性如下:
PRI(new) = PRI(old) + nice
nice 值是有正负的喔,而既然 PRI 越小越早被执行, 所以,当 nice 值为负值时,那么该进程就会降低 PRI 值,亦即会变的较优先被处理。此外,你必须要留意到:
- nice 值可调整的范围为 -20 ~ 19 ;
- root 可随意调整自己或他人进程的 Nice 值,且范围为 -20 ~ 19 ;
- 一般使用者仅可调整自己进程的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
- 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;
如何给予某个进程 nice 值呢?有两种方式,分别是:
- 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
- 调整某个已经存在的 PID 的 nice 值:用 renice 指令。
- renice :已存在进程的 nice 重新调整
netstat -[atunlp]
选项与参数:
-a :将目前系统上所有的联机、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不以进程的服务名称,以埠号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的进程 PID
/proc/* 代表的意义
内存当中的数据又都是写入到 /proc/* 这个目录下的
举例来说,我们开机所执行的第一支程序 systemd 他的 PID 是 1 , 这个 PID 的所有相关信息都写入在 /proc/1/* 当中!
ls -al /proc/1
比较有趣的其实是两个文件,分别是:
cmdline:这个进程被启动的指令串;
environ:这个进程的环境变量内容。
如果是针对整个 Linux 系统相关的参数呢?那就是在 /proc 目录底下的文件啦!相关的文件与对应的内容是这样的:
檔名 |
文件内容 |
/proc/cmdline |
加载 kernel 时所下达的相关指令与参数!查阅此文件,可了解指令是如何启动的! |
/proc/cpuinfo |
本机的 CPU 的相关信息,包含频率、类型与运算功能等 |
/proc/devices |
这个文件记录了系统各个主要装置的主要装置代号,与 mknod 有关呢! |
/proc/filesystems |
目前系统已经加载的文件系统啰! |
/proc/interrupts |
目前系统上面的 IRQ 分配状态。 |
/proc/ioports |
目前系统上面各个装置所配置的 I/O 地址。 |
/proc/kcore |
这个就是内存的大小啦!好大对吧!但是不要读他啦! |
/proc/loadavg |
还记得top 以及 uptime 吧?没错!上头的三个平均数值就是记录在此! |
/proc/meminfo |
使用free 列出的内存信息,嘿嘿!在这里也能够查阅到! |
/proc/modules |
目前我们的 Linux 已经加载的模块列表,也可以想成是驱动程序啦! |
/proc/mounts |
系统已经挂载的数据,就是用 mount 这个指令呼叫出来的数据啦! |
/proc/swaps |
到底系统挂加载的内存在哪里?呵呵!使用掉的 partition 就记录在此啦! |
/proc/partitions |
使用 fdisk -l 会出现目前所有的 partition 吧?在这个文件当中也有纪录喔! |
/proc/uptime |
就是用 uptime 的时候,会出现的信息啦! |
/proc/version |
核心的版本,就是用 uname -a 显示的内容啦! |
/proc/bus/* |
一些总线的装置,还有 USB 的装置也记录在此喔! |
SELinux 的运作模式
SELinux 是透过 MAC 的方式来控管进程,他控制的主体是进程, 而目标则是该进程能否读取的『文件资源』!
主体 (Subject):
SELinux 主要想要管理的就是进程,因此你可以将『主体』跟本章谈到的 process 划上等号;
目标 (Object):
主体进程能否存取的『目标资源』一般就是文件系统。因此这个目标项目可以等文件系统划上等号;
政策 (Policy):
由于进程与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 7.x 里面仅有提供三个主要的政策,分别是:
-
-
-
-
- targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;
- minimum:由 target 修订而来,仅针对选择的进程来保护!
- mls:完整的 SELinux 限制,限制方面较为严格。建议使用预设的 targeted 政策即可。
-
-
-
安全性本文 (security context):
我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了政策指定之外,主体与目标的安全性 本文必须一致才能够顺利存取。这个安全性本文 (security context) 有点类似文件系统的 rwx 啦!安全性本文的内容与设定是非常重要的! 如果设定错误,你的某些服务(主体进程)就无法存取文件系统(目标资源), 当然就会一直出现『权限不符』的错误讯息了!
观察安全性本文可使用『 ls -Z 』去观察
举例如下:
如上所示,安全性本文主要用冒号分为三个字段,这三个字段的意义为:
Identify:role:type
身份识别:角色:类型
-
- 身份识别 (Identify):
相当于账号方面的身份识别!主要的身份识别常见有底下几种常见的类型:
- unconfined_u:不受限的用户,也就是说,该文件来自于不受限的进程所产生的!一般来说,我们使用可登入账号来取得 bash 之后, 预设的 bash 环境是不受 SELinux 管制的~因为 bash 并不是什么特别的网络服务!因此,在这个不受 SELinux 所限制的 bash 进程所产生的文件,其身份识别大多就是 unconfined_u 这个『不受限』用户啰!
- system_u:系统用户,大部分就是系统自己产生的文件啰!
基本上,如果是系统或软件本身所提供的文件,大多就是 system_u 这个身份名称,而如果是我们用户透过 bash 自己建立的文件,大多则是不受限的 unconfined_u 身份~如果是网络服务所产生的文件,或者是系统服务运作过程产生的文件,则大部分的识别就会是 system_u 啰!
因为鸟哥这边教大家使用文字界面来产生许多的数据,因此你看上面的三个文件中,系统安装主动产生的 anaconda-ks.cfs 及 initial-setup-ks.cfg 就会是 system_u,而我们自己从网络上面抓下来的 regular_express.txt 就会是 unconfined_u 这个识别啊!
-
- 角色 (Role):
透过角色字段,我们可以知道这个资料是属于进程、文件资源还是代表使用者。一般的角色有:
- object_r:代表的是文件或目录等文件资源,这应该是最常见的啰;
- system_r:代表的就是进程啦!不过,一般使用者也会被指定成为 system_r 喔!
你也会发现角色的字段最后面使用『 _r 』来结尾!因为是 role 的意思嘛!
-
- 类型 (Type) (最重要!):
在预设的 targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在于这个类型
(type) 字段! 基本上,一个主体进程能不能读取到这个文件资源,与类型字段有关!而类型字段在文件与进程的定义不太相同,分别是:
- type:在文件资源 (Object) 上面称为类型 (Type);
- domain:在主体进程 (Subject) 则称为领域 (domain) 了!
domain 需要与 type 搭配,则该进程才能够顺利的读取文件资源啦!
- 进程与文件 SELinux type 字段的相关性
ps -eZ
身份识别 |
角色 |
该对应在 targeted 的意义 |
unconfined_u |
unconfined_r |
一般可登入使用者的进程啰!比较没有受限的进程之意!大多数都是用户已经顺利登入系统 (不论是网络还是本机登入来取得可用的 shell) 后, 所用来操作系统的进程!如 bash, X window 相关软件等。 |
system_u |
system_r |
由于为系统账号,因此是非交谈式的系统运作进程,大多数的系统进程均是这种类型! |
在预设的 target 政策下,其实最重要的字段是类型字段 (type), 主体与目标之间是否具有可以读写的权限,与进程的 domain 及文件的 type 有关!这两者的关系我们可以使用 crond 以及他的配置文件来说明! 亦即是 /usr/sbin/crond, /etc/crontab, /etc/cron.d 等文件来说明。