进程管理与 SELinux
进程管理与 SELinux
在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定。』
进程与程序 (process & program)
- 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
- 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。
子进程与父进程:
fork and exec:进程呼叫的流程
在 Linux 的进程呼叫通常称为 fork-and-exec 的流程 !进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
系统或网络服务:常驻在内存的进程
- 常驻程序就会被我们称为:服务 (daemon),我们将他启动在背景当中一直持续不断的运作。
工作管理 (job control)
『进行工作管理的行为中, 其实每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的bash !』
- 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
- 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
- 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
- 背景中『执行』的进程不能等待 terminal/shell 的输入(input)
job control 的管理
直接将指令丢到背景中『执行』的 &
[root@study ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 14432 <== [job number] PID
[root@study ~]# tar: Removing leading `/' from member names
# 在中括号内的号码为工作号码 (job number),该号码与 bash 的控制有关。
# 后续的 14432 则是这个工作在系统中的 PID。至于后续出现的数据是 tar 执行的数据流,
# 由于我们没有加上数据流重导向,所以会影响画面!不过不会影响前景的操作喔!
将『目前』的工作丢到背景中『暂停』:[ctrl]-z
[root@study ~]# vim ~/.bashrc
# 在 vim 的一般模式下,按下 [ctrl]-z 这两个按键
[1]+ Stopped vim ~/.bashrc
[root@study ~]# <==顺利取得了前景的操控权!
[root@study ~]# find / -print
....(输出省略)....
# 此时屏幕会非常的忙碌!因为屏幕上会显示所有的文件名。请按下 [ctrl]-z 暂停
[2]+ Stopped find / -print
那个 + 代表最近一个被丢进背景的工作,且目前在背景下预设会被取用的那个工作 (与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是『暂停』的状态喔!
观察目前的背景工作状态: jobs
- jobs [-lrs]
- 选项与参数:
- -l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
- -r :仅列出正在背景 run 的工作;
- -s :仅列出正在背景当中暂停 (stop) 的工作。
将背景工作拿到前景来处理:fg
- fg %jobnumber
- 选项与参数:
- %jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!
让工作在背景下的状态变成运作中: bg
范例:让该工作在背景下进行,并且观察他!!
[root@study ~]# jobs ; bg %3 ; jobs
[1] Stopped vim ~/.bashrc
[2]- Stopped find / -print
[3]+ Stopped find / -perm /7000 > /tmp/text.txt
[3]+ find / -perm /7000 > /tmp/text.txt &
[1]- Stopped vim ~/.bashrc
[2]+ Stopped find / -print
[3] Running find / -perm /7000 > /tmp/text.txt &
管理背景当中的工作: kill
- kill -signal %jobnumber
- kill -l
- 选项与参数:
- -l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
- -1 :重新读取一次参数的配置文件 (类似 reload);
- -2 :代表与由键盘输入 [ctrl]-c 同样的动作;
- -9 :立刻强制删除一个工作;
- -15:以正常的进程方式终止一项工作(默认)。与 -9 是不一样的。
nohup 可以让你在脱机或注销系统后,还能够让工作继续进行
- nohup [指令与参数] <==在终端机前景中工作
- nohup [指令与参数] & <==在终端机背景中工作
进程的观察
ps :将某个时间点的进程运作情况撷取下来
- ps aux <==观察系统所有的进程数据
- ps -lA <==也是能够观察所有系统的数据
- ps axjf <==连同部分进程树状态
- 选项与参数:
- -A :所有的 process 均显示出来,与 -e 具有同样的效用;
- -a :不与 terminal 有关的所有 process ;
- -u :有效使用者 (effective user) 相关的 process ;
- x :通常与 a 这个参数一起使用,可列出较完整信息。
- 输出格式规划:
- l :较长、较详细的将该 PID 的的信息列出;
- j :工作的格式 (jobs format)
- -f :做一个更为完整的输出。
仅观察自己的 bash 相关进程: ps -l
- F:代表这个进程旗标 (process flags),说明这个进程的总结权限,常见号码有:
- 若为 4 表示此进程的权限为 root ;
- 若为 1 则表示此子进程仅进行复制(fork)而没有实际执行(exec)。
- S:代表这个进程的状态 (STAT),主要的状态有:
- R (Running):该程序正在运作中;
- S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
- D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
- T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
- Z (Zombie):僵尸状态,进程已经终止但却无法被移除至内存外。通常,造成僵尸进程的成因是因为该进程应该已经执行完毕,或者是因故应该要终止了, 但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中。 如果你发现在某个进程的 CMD 后面还接上
时,就代表该进程是僵尸进程。
- UID/PID/PPID:代表『此进程被该 UID 所拥有/进程的 PID 号码/此进程的父进程 PID 号码』
- C:代表 CPU 使用率,单位为百分比;
- PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先级,数值越小代表该进程越快被 CPU 执行。
- 详细的 PRI 与 NI 将在下一小节说明。
- ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个running 的进程,一般就会显示『 - 』 / SZ 代表此进程用掉多少内存 / WCHAN 表示目前进程是否运作中,同样的, 若为 - 表示正在运作中。
- TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n);
- TIME:使用掉的 CPU 时间,注意,是此进程实际花费 CPU 运作的时间,而不是系统时间;
- CMD:就是 command 的缩写,造成此进程的触发程序之指令为何。
观察系统所有进程: ps aux
- USER:该 process 属于那个使用者账号的?
- PID :该 process 的进程标识符。
- %CPU:该 process 使用掉的 CPU 资源百分比;
- %MEM:该 process 所占用的物理内存百分比;
- VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
- RSS :该 process 占用的固定的内存量 (Kbytes)
- TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登入者进程,若为 pts/0 等等的,则表示为由网络连接进主机的进程。
- STAT:该进程目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
- START:该 process 被触发启动的时间;
- TIME :该 process 实际使用 CPU 运作的时间。
- COMMAND:该进程的实际指令为何?
top:动态观察进程的变化
- top [-d 数字] | top [-bnp]
- 选项与参数:
- -d :后面可以接秒数,就是整个进程画面更新的秒数。预设是 5 秒;
- -b :以批次的方式执行 top ,还有更多的参数可以使用喔!通常会搭配数据流重导向来将批次的结果输出成为文件。
- -n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
- -p :指定某些个 PID 来进行观察监测而已。
- 在 top 执行过程当中可以使用的按键指令:
- ? :显示在 top 当中可以输入的按键指令;
- P :以 CPU 的使用资源排序显示;
- M :以 Memory 的使用资源排序显示;
- N :以 PID 来排序喔!
- T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
- k :给予某个 PID 一个讯号 (signal)
- r :给予某个 PID 重新制订一个 nice 值。
- q :离开 top 软件的按键。
top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:
- 第一行(top...):这一行显示的信息分别为:
- 目前的时间,亦即是 00:53:59 那个项目;
- 开机到目前为止所经过的时间,亦即是 up 6:07, 那个项目;
- 已经登入系统的用户人数,亦即是 3 users, 项目;
- 系统在 1, 5, 15 分钟的平均工作负载。我们在第十五章谈到的 batch 工作方式为负载小于 0.8 就是这个负载啰!代表的是 1, 5, 15 分钟,系统平均要负责运作几个进程(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统进程是否太过繁复了!
- 第二行(Tasks...):显示的是目前进程的总量与个别进程在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 !好好看看到底是那个 process 变成僵尸了吧?
- 第三行(%Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 wa 项目,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设备,可以按下数字键『1』来切换成不同 CPU 的负载率。
- 第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在不足!
- 第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。
- 至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:
- PID :每个 process 的 ID 啦!
- USER:该 process 所属的使用者;
- PR :Priority 的简写,进程的优先执行顺序,越小越早被执行;
- NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
- %CPU:CPU 的使用率;
- %MEM:内存的使用率;
- TIME+:CPU 使用时间的累加;
pstree 进程树
- pstree [-A|U] [-up]
- 选项与参数:
- -A :各进程树之间的连接以 ASCII 字符来连接;
- -U :各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
- -p :并同时列出每个 process 的 PID;
- -u :并同时列出每个 process 的所属账号名称。
所有的进程都是依附在 systemd 这支进程底下的,因为他是由 Linux 核心所主动呼叫的第一支程序,所以 PID就是一号。
进程的管理
kill -signal PID
例题:
以 ps 找出 rsyslogd 这个进程的 PID 后,再使用 kill 传送讯息,使得 rsyslogd 可以重新读取配置文件。
答:
由于需要重新读取配置文件,因此 signal 是 1 号。至于找出 rsyslogd 的 PID 可以是这样做:
ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}'
接下来则是实际使用 kill -1 PID,因此,整串指令会是这样:
kill -SIGHUP $(ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}')
如果要确认有没有重新启动 syslog ,可以参考登录档的内容,使用如下指令查阅:
tail -5 /var/log/messages
killall -signal 指令名称
- killall [-iIe] [command name]
- 选项与参数:
- -i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给用户;
- -e :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令不能超过 15 个字符。
- -I :指令名称(可能含参数)忽略大小写。
关于进程的执行顺序
Priority 与 Nice 值
我们 Linux 给予进程一个所谓的『优先执行序 (priority, PRI)』,这个PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的,用户无法直接调整 PRI值的。
PRI 是核心动态调整的,我们用户也无权去干涉 PRI !那如果你想要调整进程的优先执行序时,就得要透过 Nice 值了
- PRI(new) = PRI(old) + nice
当 nice 值为负值时,那么该进程就会降低 PRI 值,亦即会变的较优先被处理。
- nice 值可调整的范围为 -20 ~ 19 ;
- root 可随意调整自己或他人进程的 Nice 值,且范围为 -20 ~ 19 ;
- 一般使用者仅可调整自己进程的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
- 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;
nice :新执行的指令即给予新的 nice 值
- nice [-n 数字] command
- 选项与参数:
- -n :后面接一个数值,数值的范围 -20 ~ 19。
renice :已存在进程的 nice 重新调整
- renice [number] PID
- 选项与参数:
- PID :某个进程的 ID 啊!
系统资源的观察
free :观察内存使用情况
- free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
- 选项与参数:
- -b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)k(Kbytes), 及 g(Gbytes) 来显示单位喔!也可以直接让系统自己指定单位 (-h)
- -t :在输出的最终结果,显示物理内存与 swap 的总量。
- -s :可以让系统每几秒钟输出一次,不间断的一直输出的意思!对于系统观察挺有效!
- -c :与 -s 同时处理~让 free 列出几次的意思~
uname:查阅系统与核心相关信息
- uname [-asrmpi]
- 选项与参数:
- -a :所有系统相关的信息,包括底下的数据都会被列出来;
- -s :系统核心名称
- -r :核心的版本
- -m :本系统的硬件名称,例如 i686 或 x86_64 等;
- -p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
- -i :硬件的平台 (ix86)
uptime:观察系统启动时间与工作负载
uptime 可以显示出 top 画面的最上面一行!
[root@study ~]# uptime
02:35:27 up 7:48, 3 users, load average: 0.00, 0.01, 0.05
netstat :追踪网络或插槽文件
- netstat -[atunlp]
- 选项与参数:
- -a :将目前系统上所有的联机、监听、Socket 数据都列出来
- -t :列出 tcp 网络封包的数据
- -u :列出 udp 网络封包的数据
- -n :不以进程的服务名称,以埠号 (port number) 来显示;
- -l :列出目前正在网络监听 (listen) 的服务;
- -p :列出该网络服务的进程 PID。
输出信息:
- Proto :网络的封包协议,主要分为 TCP 与 UDP 封包;
- Recv-Q:非由用户程序链接到此 socket 的复制的总 bytes 数;
- Send-Q:非由远程主机传送过来的 acknowledged 总 bytes 数;
- Local Address :本地端的 IP:port 情况
- Foreign Address:远程主机的 IP:port 情况
- State :联机状态,主要有建立(ESTABLISED)及监听(LISTEN);
dmesg :分析核心产生的讯息
范例一:输出所有的核心开机时的信息
[root@study ~]# dmesg | more
范例二:搜寻开机的时候,硬盘的相关信息为何?
[root@study ~]# dmesg | grep -i vda
[ 0.758551] vda: vda1 vda2 vda3 vda4 vda5 vda6 vda7 vda8 vda9
[ 3.964134] XFS (vda2): Mounting V4 Filesystem
....(底下省略)....
vmstat :侦测系统资源变化
- vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息
- vmstat [-fs] <==内存相关
- vmstat [-S 单位] <==设定显示数据的单位
- vmstat [-d] <==与磁盘有关
- vmstat [-p 分区槽] <==与磁盘有关
- 选项与参数:
- -a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
- -f :开机到目前为止,系统复制 (fork) 的进程数;
- -s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
- -S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量;
- -d :列出磁盘的读写总量统计表
- -p :后面列出分区槽,可显示该分区槽的读写总量统计表。
表格各项字段的意义:
- 进程字段 (procs) 的项目分别为:
- r :等待运作中的进程数量;
- b:不可被唤醒的进程数量。这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多进程就无法被执行或一直在等待而无法被唤醒之故)。
- 内存字段 (memory) 项目分别为:
- swpd:虚拟内存被使用的容量;
- free:未被使用的内存容量;
- buff:用于缓冲存储器;
- cache:用于高速缓存。 这部份则与 free 是相同的。
- 内存置换空间 (swap) 的项目分别为:
- si:由磁盘中将进程取出的量;
- so:由于内存不足而将没用到的进程写入到磁盘的 swap 的容量。如果 si/so的数值太大,表示内存内的数据常常得在磁盘与主存储器之间传来传去,系统效能会很差!
- 磁盘读写 (io) 的项目分别为:
- bi:由磁盘读入的区块数量;
- bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌!
- 系统 (system) 的项目分别为:
- in:每秒被中断的进程次数;
- cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与接口设备的沟通非常频繁! 这些接口设备当然包括磁盘、网络卡、时间钟等。
- CPU 的项目分别为:
- us:非核心层的 CPU 使用状态;
- sy:核心层所使用的 CPU 状态;
- id:闲置的状态;
- wa:等待 I/O 所耗费的 CPU 状态;
- st:被虚拟机 (virtual machine) 所盗用的 CPU 使用状态。
具有 SUID/SGID 权限的指令执行状态
- SUID 权限仅对二进制程序(binary program)有效;
- 执行者对于该程序需要具有 x 的可执行权限;
- 本权限仅在执行该程序的过程中有效 (run-time);
- 执行者将具有该程序拥有者 (owner) 的权限。
整个 SUID 的权限会生效是由于『具有该权限的程序被触发』,而我们知道一个程序被触发会变成进程, 所以,执行者可以具有程序拥有者的权限就是在该程序变成进程的那个时候!
/proc/* 代表的意义
进程都是在内存当中!而内存当中的数据又都是写入到 /proc/* 这个目录下的。
fuser:藉由文件(或文件系统)找出正在使用该文件的进程
- fuser [-umv] [-k [i] [-signal]] file/dir
- 选项与参数:
- -u :除了进程的 PID 之外,同时列出该进程的拥有者;
- -m :后面接的那个档名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
- -v :可以列出每个文件与进程还有指令的完整相关性!
- -k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
- -i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
- -signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) !
范例一:找出目前所在目录的使用 PID/所属账号/权限 为何?
[root@study ~]# fuser -uv .
USER PID ACCESS COMMAND
/root: root 13888 ..c.. (root)bash
root 31743 ..c.. (root)bash
ACCESS 的项目,那个项目代表的意义为:
- c :此进程在当前的目录下(非次目录);
- e :可被触发为执行状态;
- f :是一个被开启的文件;
- r :代表顶层目录 (root directory);
- F :该文件被开启了,不过在等待回应中;
- m :可能为分享的动态函式库;
lsof :列出被进程所开启的文件档名
- lsof [-aUu] [+d]
- 选项与参数:
- -a :多项数据需要『同时成立』才显示出结果时!
- -U :仅列出 Unix like 系统的 socket 文件类型;
- -u :后面接 username,列出该使用者相关进程所开启的文件;
- +d :后面接目录,亦即找出某个目录底下已经被开启的文件!
pidof :找出某支正在执行的程序的 PID
- pidof [-sx] program_name
- 选项与参数:
- -s :仅列出一个 PID 而不列出所有的 PID
- -x :同时列出该 program name 可能的 PPID 那个进程的 PID
SELinux
SELinux他是『 Security Enhanced Linux 』的缩写,字面上的意义就是安全强化的Linux 之意。其实 SELinux 是在进行进程、文件等细部权限设定依据的一个核心模块! 由于启动网络服务的也是进程,因此刚好也能够控制网络服务能否存取系统资源的一道关卡!
- 传统的文件权限与账号关系:自主式访问控制, DAC。
这种存取文件系统的方式被称为『自主式访问控制 (Discretionary Access Control, DAC)』,基本上,
就是依据进程的拥有者与文件资源的 rwx 权限来决定有无存取的能力 - 以政策规则订定特定进程读取特定文件:委任式访问控制, MAC。
SELinux 的运作模式
图的重点在『主体』如何取得『目标』的资源访问权限! 由上图我们可以发现,(1)主体进程必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对, (2)若比对失败则无法存取目标,若比对成功则可以开始存取目标。
安全性本文 (Security Context)
安全性本文你就将他想成 SELinux 内必备的 rwx 就是了,安全性本文是放置到文件的 inode 内的。
# 先来观察一下 root 家目录底下的『文件的 SELinux 相关信息』
[root@study ~]# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 initial-setup-ks.cfg
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 regular_express.txt
这三个字段的意义为:
- 身份识别 (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 字段的相关性
上图的意义我们可以这样看的:
- 首先,我们触发一个可执行的目标文件,那就是具有 crond_exec_t 这个类型的 /usr/sbin/crond 文件;
- 该文件的类型会让这个文件所造成的主体进程 (Subject) 具有 crond 这个领域 (domain), 我们的政策针对
这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型; - 由于 crond domain 被设定为可以读取 system_cron_spool_t 这个类型的目标文件 (Object), 因此你的配置
文件放到 /etc/cron.d/ 目录下,就能够被 crond 那支进程所读取了; - 但最终能不能读到正确的资料,还得要看 rwx 是否符合 Linux 权限的规范!
SELinux 三种模式的启动、关闭与观察
SELinux 依据启动与否,共有三种模式,分别如下:
- enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了;
- permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
- disabled:关闭,SELinux 并没有实际运作。
getenforce 查看SELinux模式
root@study ~]# getenforce
Enforcing <==诺!就显示出目前的模式为 Enforcing !
sestatus 查看SELinux 的政策 (Policy)
- sestatus [-vb]
- 选项与参数:
- -v :检查列于 /etc/sestatus.conf 内的文件与进程的安全性本文内容;
- -b :将目前政策的规则布尔值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意。
setenforce:SELinux 模式在 enforcing 与permissive 之间切换
- setenforce [0|1]
- 选项与参数:
- 0 :转成 permissive 宽容模式;
- 1 :转成 Enforcing 强制模式
SELinux 各个规则的布尔值查询 getsebool
SELinux 政策内的规则管理
SELinux 各个规则的布尔值查询 getsebool
- getsebool [-a] [规则的名称]
- 选项与参数:
- -a :列出目前系统上面的所有 SELinux 规则的布尔值为开启或关闭值。
SELinux 各个规则规范的主体进程能够读取的文件 SELinux type 查询 seinfo, sesearch
-
seinfo [-Atrub]
-
选项与参数:
- -A :列出 SELinux 的状态、规则布尔值、身份识别、角色、类别等所有信息
- -u :列出 SELinux 的所有身份识别 (user) 种类
- -r :列出 SELinux 的所有角色 (role) 种类
- -t :列出 SELinux 的所有类别 (type) 种类
- -b :列出所有规则的种类 (布尔值)
-
sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布尔值]
-
选项与参数:
- -A :列出后面数据中,允许『读取或放行』的相关数据
- -t :后面还要接类别,例如 -t httpd_t
- -b :后面还要接 SELinux 的规则,例如 -b httpd_enable_ftp_server
修改 SELinux 规则的布尔值 setsebool
- setsebool [-P] 『规则名称』 [0|1]
- 选项与参数:
- -P :直接将设定值写入配置文件,该设定数据未来会生效的!
SELinux 安全本文的修改
使用 chcon 手动修改文件的 SELinux type
- chcon [-R] [-t type] [-u user] [-r role] 文件
- chcon [-R] --reference=范例文件 文件
- 选项与参数:
- -R :连同该目录下的次目录也同时修改;
- -t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
- -u :后面接身份识别,例如 system_u; (不重要)
- -r :后面街角色,例如 system_r; (不重要)
- -v :若有变化成功,请将变动的结果列出来
- --reference=范例文件:拿某个文件当范例来修改后续接的文件的类型!
使用 restorecon 让文件恢复正确的 SELinux type
- restorecon [-Rv] 文件或目录
- 选项与参数:
- -R :连同次目录一起修改;
- -v :将过程显示到屏幕上。
semanage 默认目录的安全性本文查询与修改
- semanage {login|user|port|interface|fcontext|translation} -l
- semanage fcontext -{a|d|m} [-frst] file_spec
- 选项与参数:
- fcontext :主要用在安全性本文方面的用途, -l 为查询的意思;
- -a :增加的意思,你可以增加一些目录的默认安全性本文类型设定;
- -m :修改的意思;
- -d :删除的意思。
重点回顾
- 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等),为实体文件的型态存在;
- 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。
- 程序彼此之间是有相关性的,故有父进程与子进程之分。而 Linux 系统所有进程的父进程就是 init 这个PID 为 1 号的进程。
- 在 Linux 的进程呼叫通常称为 fork-and-exec 的流程!进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
- 常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)。
- 在工作管理 (job control) 中,可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运作。
- 与 job control 有关的按键与关键词有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;
- 进程管理的观察指令有: ps, top, pstree 等等;
- 进程之间是可以互相控制的,传递的讯息 (signal) 主要透过 kill 这个指令在处理;
- 进程是有优先级的,该项目为 Priority,但 PRI 是核心动态调整的,用户只能使用 nice 值去微调 PRI
- nice 的给予可以有: nice, renice, top 等指令;
- vmstat 为相当好用的系统资源使用情况观察指令;
- SELinux 当初的设计是为了避免使用者资源的误用,而 SELinux 使用的是 MAC 委任式存取设定;
- SELinux 的运作中,重点在于主体进程 (Subject) 能否存取目标文件资源 (Object) ,这中间牵涉到政策(Policy) 内的规则, 以及实际的安全性本文类别 (type);
- 安全性本文的一般设定为:『Identify:role:type』其中又以 type 最重要;
- SELinux 的模式有: enforcing, permissive, disabled 三种,而启动的政策 (Policy) 主要是 targeted
- SELinux 启动与关闭的配置文件在: /etc/selinux/config
- SELinux 的启动与观察: getenforce, sestatus 等指令
- 重设 SELinux 的安全性本文可使用 restorecon 与 chcon
- 在 SELinux 有启动时,必备的服务至少要启动 auditd 这个!
- 若要管理预设的 SELinux 布尔值,可使用 getsebool, setsebool 来管理!