直接将指令丢到背景中『执行』的 &
将 /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 的功能不会被启动的