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 等文件来说明。

 

 SELinux 三种模式的启动、关闭与观察

enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了;

permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux debug 之用;

disabled:关闭,SELinux 并没有实际运作。

 

 

 

 

并不是所有的进程都会被 SELinux 所管制,因此最左边会出现一个所谓的『有受限的进程主体』!那如何观察有没有受限 (confined )呢? 很简单啊!就透过 ps -eZ

可以看到, crond 确实是有受限的主体进程,而 bash 因为是本机进程,因此就是不受限 (unconfined_t)  的类型!也就是说, bash  是不需要经过图 16.5.4  的流程,而是直接去判断 rwx 而已~。

 

目前的 SELinux 模式:getenforce

知道 SELinux 的政策 (Policy) 为何:

sestatus [-vb]

选项与参数:

-v  :检查列于 /etc/sestatus.conf 内的文件与进程的安全性本文内容;

-b  :将目前政策的规则布尔值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意;

SELinux 的配置文件是/etc/selinux/config

  • SELinux 的启动与关闭

SELinux 模式在 enforcing  与permissive 之间切换的方法为:

setenforce [0|1]

选项与参数:

0:转成 permissive 宽容模式;

1:转成 Enforcing 强制模式

setenforce 无法在 Disabled 的模式底下进行模式的切换喔!

注意:

在某些特殊的情况底下,你从 Disabled 换成 Enforcing 后,竟然有一堆服务无法顺利启动,都会跟你说在 /lib/xxx 里面的数据没有权限读取,所以启动失败。这大多是由于在重新写入 SELinux type(Relabel) 出错之故,使用 Permissive 就没有这个错误。那如何处理呢?最简单的方法就是在 Permissive 的状态下, 使用『 restorecon -Rv /  』重新还原所有 SELinux 的类型,就能够处理这个错误!

 

SELinux 政策内的规则管理

查询目前这个政策里面到底有多少会影响到主体进程的规则

  • 各个规则的布尔值查询 getsebool

如果想要查询系统上面全部规则的启动与否 (on/off,亦即布尔值),很简单的透过 sestatus -b 

getsebool -a 均可!

  • SELinux 各个规则规范的主体进程能够读取的文件 SELinux type 查询 seinfo, sesearch

yum install /mnt/Packages/setools-console-*

seinfo [-Atrub]

选项与参数:

-A  :列出 SELinux 的状态、规则布尔值、身份识别、角色、类别等所有信息

-u  :列出 SELinux 的所有身份识别 (user) 种类

-r  :列出 SELinux 的所有角色 (role) 种类

-t  :列出 SELinux 的所有类别 (type) 种类

-b  :列出所有规则的种类 (布尔值)

crond 这个进程的 type crond_t  , 能不能找一下 crond_t  能够读取的文件 SELinux type 有哪些呢

sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布尔值]

选项与参数:

-A  :列出后面数据中,允许『读取或放行』的相关数据

-t  :后面还要接类别,例如 -t httpd_t

-b  :后面还要接 SELinux 的规则,例如 -b httpd_enable_ftp_server

getsebool -a 里面看到的 httpd_enable_homedirs  到底是什么?又是规范了哪些主体进程能够读取的 SELinux type

呢?

  • 修改 SELinux 规则的布尔值 setsebool

SELinux 安全本文的修改

  • 使用 chcon 手动修改文件的 SELinux type

  • 使用 restorecon 让文件恢复正确的 SELinux type

SELinux 自己解决默认目录下的 SELinux type

  • semanage 默认目录的安全性本文查询与修改

如何 (1)查询预设的 SELinuxtype 以及 (2)如何增加/修改/删除预设的 SELinux type 呢?很简单~透过 semanage 即可

要建立一个 /srv/mycron 的目录,这个目录默认也是需要变成 system_cron_spool_t 时, 我们应该要如何处理呢?基本上可以这样作:

setroubleshoot --> 错误讯息写入 /var/log/messages

这个服务会将关于 SELinux 的错误讯息与克服方法记录到 /var/log/messages 与 /var/log/setroubleshoot/* 里头

需要两个软件,分别是
setroublshoot 与 setroubleshoot-server

安装好了 setroubleshoot-server 之后,请记得要重新启动 auditd,否则 setroubleshootd 的功能不会被启动的

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值