linux备忘录-程序管理与SELinux

知识点

程序与程序(Process and Program)

通过执行一条指令或程序,则可以触发一个事件,并获得一个PID。当我们需要启动一个程序时,我们是启动一个二进制文件(binary file),因此可以说,二进制文件就是程序。

当执行者执行一个程序时,该程序就有了执行者的权限,并被加载到内存当中来运行。程序被加载进内存当中的不仅只有程序代码,程序在内存当中的内容有

  1. 程序的PID
  2. 执行者的权限属性参数
  3. 程序所需的代码与相关资料

这里对两种程序作一下区分(Process and Program)

  1. Program

Program 通常是二进制程序,放置在存储媒体中(如硬盘、光盘等),以实体档案的形式存在。

  1. Process

Process 是执行者触发Program后,Program会持有系统分配的PID、执行者的权限属性参数、Program所需的代码和相关资料等一起被加载进内存当中。可以说,Process就是一个运行着的Program。

子程序和父程序

在我们原本的bash环境下,通过路径调用(如/bin/ls)bash script.sh(或sh script.sh)等方式进行调用,这些程序的执行会在一个新的bash环境中执行,这些在原本bash下执行的程序就是子程序,而原本的bash程序就是父程序。子程序可以通过其PPID(Parent ID)找到父程序。

fork-and-exec 与 服务(daemon)

父程序是通过fork-and-exec的方式产生子程序的。父程序首先以fork的方式产生一个与自身一模一样的子程序(但PID和PPID不同)。然后被复制出来的子程序再以exec的方式执行实际需要执行的程序,最终就成为一个子程序的存在。

有些程序执行完就会结束,结束后其产生的PID就会终止,如我们常用的ls rm touch命令等

有些程序会常驻在内存当中执行,通常这样的程序负责一些系统提供的功能以服务用户各项任务。这种常驻程序被称为服务(daemon)。服务可以分成两种

  1. 系统本身所需要的服务,如crond、atd、syslog等
  2. 负责网络联机的服务,如Apache、named、postfix、vsftpd等

负责网络联机的服务会启动一个负责网络监听的端口,用来提供给客服端联机使用。

linux多人多任务环境

  1. 多人环境

每个用户登录后取得的shell的PID都不相同,这就是多人环境。每个人都可以利用~/.bashrc进行自己的环境设定。

  1. 多任务环境

CPU在不同程序之中进行快速切换。

  1. 多重登入环境

每个人都有6个终端机登入环境,可以通过/etc/inittab进行修改
当我们在某个终端环境中卡住不能动,可以通过Atrl+F1~F7切换到其他终端环境,然后通过ps -aux找出出错的程序,最后通过kill将出错程序杀掉就可以了。

  1. 背景执行程序

可以用过像cp file1 file2 &这样在程序后面加上 & 符号,程序会放到背景中执行,执行结束后在终端接口显示完成的消息。

工作管理(job control)

工作管理需要注意

1.无法以工作管理的方式由tty1去管理tty2的程序
2.通过/etc/security/limits.conf可以设定使用者同时可以登入的联机数。因此使用者有可能只能通过一个联机来工作。
3.终端接口中,出现提示符进行操作的环境称为前景(foreground)
4.不进行互动的程序可以放入背景(background)进行运作。当在背景里的程序不能通过[ctrl]+c来终止。可以通过bg/fg呼叫该工作。

可以通过命令jobs观察目前的背景工作状态。

这是所说的背景(background)是shell环境下的背景,与终端机环境有关,不是真正意义上系统的背景。而通过命令at则是将工作放置到系统背景来执行,与终端机环境无关。

可以通过在执行的后面加上符号 & ,将指令放到后台去执行

同时,会显示下面信息
[1] 8400
其中中括号中的1为job id
8400 位后台执行程序的PID

将目前的工作丢到背景中暂停(Ctrl+z)

背景(background)中的工作可以分为暂停(stop)运行中(running)。通过Ctrl+z,将前景的程序转到背景中,并且变成暂停状态。

在背景(background)中执行的指令,其stdoutstderr依然后输出到屏幕上。最好的方式是将背景任务的stdoutstderr重导向到/dev/null或者/tmp/log.txt进行保存,类似于

tar -zpcvf /tmp/etc.tar.gz /etc &> /tmp/log
# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2> &1  也可以

将背景工作拿到前景处理(fg)

通过命令fg可以将背景的工作拿到前景进行处理。fg的用法详细见命令部分。

让背景工作状态变成运行状态(bg)

通过命令bg可以将背景的工作由暂停(stopped)状态 转换成 运行(running)状态。bg的用法详细见命令部分。

管理背景中的工作(kill)

如果要让背景中的工作移除或重新启动,需要给该工作一个信号(signal),通过kill命令可以发送这样的信号。kill的用法详细见命令部分。

脱机任务管理(nohup)

通过命令nohup,可以让任务在脱机或注销系统后,让工作仍然能够继续工作。nohup的用法详细见命令部分。

注意:nohup并不支持bash的內建命令,因此指令必须是外部命令才行。
nohup与终端机环境无关,所以stdout和stderr会被重导向到~/nohup.out

程序管理

通过ps -l查看自己bash相关的程序。
通过ps aux查看系统运行的所有程序。
通过pstree可以显示程序树
通过top可以动态观察程序状态。

观察程序状态(ps)

ps的信息说明

# 通过ps -l列出的信息
F  S  UID  PID  PPID  C  PRI  NI  ADDR  SZ  WCHAN  TTY  TIME  CMD

# F => 程序的总结权限Flag
#     4 => 此程序的权限为root
#     1 => 该子程序只进行复制(fork),而没有执行(exec)
# S => 程序的状态
#     R => running
#     S => Sleep.程序处于睡眠状态(idle),可以唤醒(signal)
#     D => 不能被唤醒的睡眠状态,一般在等待IO
#     T => 停止状态(stop),背景暂停(stopped或除错(traced)状态
#     Z => 僵尸状态(Zombie),程序已经终止,但还在内存中
# C => 代表CPU使用率,百分比
# PRI和NI => 代表程序执行的优先级,越小代表越快被CPU执行。
# ADDR => 代表程序在内存哪个部分。running时显示-
# SZ => 代表程序用掉多少内存
# WCHAN => 程序是否在运行,running时显示-
# TTY => 登入者的终端机位置,若为远程登录则使用动态接口 pts/n
# TIME => 使用掉多少CPU时间
# CMD => 此程序触发的指令

# 通过ps aux列出的信息
USER  PID  %CPU  %MEM  VSZ  RSS  TTY  STAT  START  TIME  COMMAND
# USER => 程序属于哪个使用者
# PID
# %CPU => 程序使用掉的CPU资源百分比
# %MEM => 程序占用的物理内存百分比
# VSZ => 程序使用掉的虚拟内存量(kbytes)
# RSS => 程序占用的固定内容量
# TTY => 程序所在终端机
# STAT => 程序的状态
# START => 程序被触发启动的时间
# TIME => 使用CPU运作的时间百分比
# COMMAND  => 程序执行命令 

僵尸程序(Zombie)

若通过ps列出的程序状态为Z,或者字段CMD后边还接上,则表示该程序为僵尸程序。

通常僵尸程序如果系统已经交由init的控管,而且过些时间系统仍然不能将它杀掉,那么只能通过reboot来杀掉了。

动态观察程序状态(top)

通过top命令可以动态观察程序状态。top的用法详细见命令部分。

top的显示项目信息

load average => 系统在1,5,15分钟的平均工作负载,值越小,系统越空闲。大于1时系统过于繁忙。
CPU栏的 %wa => 代表IO wait,通常系统慢都是IO wait造成的。如果是多核心CPU可以通过数字键1切换不同CPU的负载率

信号signal

信号的号码 信号名称 信号说明

1 SIGHUP 可以让该PID重新读取配置文件,类似于重新启动
2 SIGINT 相当于键盘的Ctrl+c,中断信号
9 SIGKILL 强制中断杀死
15 SIGTERM 正常终止
17 SIGTOP 相当于键盘的Ctrl+z暂停一个程序

通过kill -signal PIDkill -signal %jobnumber可以像程序发送信号。

使用kill的例子

# 找出syslog这个程序,让这个程序重新读取配置文件
ps aux | grep 'syslog' | grep -v grep | awk '{print $2}'
kill -SIGHUP $(ps aux | grep 'syslog' | grep -v grep | awk '{print $2}')
# 查看登录档观察syslog是否有重新启动
tail -5 /var/log/messages

通过killall指令可以给命令名直接发送信号。会给所有命令的程序都发送信号。

程序执行优先级

Priority 和 Nice 值

Priority,一般缩写为PRI,是系统对程序动态调整的优先级。用户无法直接调整PRI值。
Nice值,一般简写为NI,

PRI和NI的关系为

PRI(new) = PRI(old) + NI
但并不是严格遵守该等式,还要经过系统分析
等式说明了NI值可以影响PRI值

PRI值越小越早被执行。

需要注意:

  1. NI值调整范围为-20~19
  2. root可以随意调整自己或他人的NI值,范围为 -20~19
  3. 一般用户只可以修改自己程序的NI值,且范围为 0~19
  4. 一般用户只能将NI值调高。

NI值调整方法:

  1. 一开始执行程序就给予一个NI值,利用nice命令。
  2. 根据PID调整NI值,利用renice命令。
  3. 通过top指令的r快键修改NI值

系统资源观察

内存观察(free)

通过命令free可以观察内存使用情况。

free [-b|-k|-m|-g] [-t]
# 选项和参数
# -b 后接 b(bytes) k(Kbytes) m(Mbytes) g(Gbytes)显示别的单位,默认为-k
# -t 显示物理内存和swap的总量

# shared/buffers/cached 是已被使用的量当中,用来当作缓存和快取的量

系统参数(uname)

通过命令uname可以查看系统参数。

uname [-asrmpi]
# 选项和参数
# -a 列出所有参数
# -s 列出系统核心名称
# -r 列出系统核心版本
# -m 列出系统硬件名称,如i686
# -p 列出系统CPU类型
# -i 列出系统硬件平台 

系统启动时间和工作负载(uptime)

通过命令uptime可以观察系统启动时间和工作负载。

网络程序查看(netstat)

通过命令uname可以观察网络程序与端口状态。

netstat [-atunlp]
# 选项和参数
# -a 将目前系统上所有的联机、监听、Socket数据都列出
# -t 列出tcp网络封包的数据
# -u 列出udp网络封包的数据
# -n 以port number来显示,即端口号
# -l 列出目前正在网络监听的服务
# -p 列出该网络服务的程序 PID

# 例子
# 查看哪些程序开了后门
netstat -tlnp
  1. netstat网络相关部分各字段的意义

Proto => 网络的封包协议,主要分为tcp和udp等
Rece-Q => 不是通过用户自己程序链接到此的Socket接受的总字节数
Send-Q => 不是通过远程主机传送过来的acknowledged总哦字节数
Local Address => 本地端的IP:port
Foreign Address => 远程主机的IP:port
State => 联机状态。一般有ESTABLISHED(建立)LISTEN(监听)

  1. netstatsocket file部分各字段的意义

Proto => 一般是unix
RefCnt => 连接到此socket的程序数量
Flags => 联机的标识
Type => socket存取的类型。有需要确认连接的STREAM和不需要确认的DGRAM
State => 若为CONNECTED,表示多个程序之间已经建立连接。
Path => 连接到此socket的相关程序路径,或者相关数据输出路径。

核心产生的信息(dmesg)

通过命令dmesg可以查看核心产生的信息。

dmesg | grep 'hd' # 查看核心捕获的硬盘信息
dmesg | grep 'eth' # 查看核心捕获的网络卡信息

侦测系统资源变化(vmstat)

通过命令vmstat可以侦测系统资源变化。

#统计目前主机CPU状态,每秒一次,一共三次。
vmstat 1 3

# vmstat输出的各字段意义
# ---- procs部分 ----
# r => 等待运行的程序总数
# b => 不可被唤醒的程序综述

# ---- memory部分 ----
# swpd => 虚拟内存使用的容量
# free => 未被使用的内存容量
# buffer => 用于缓冲的容量
# cache =>  用于高速缓存

# ---- swap部分 ----
# si => 由磁盘中将程序取出的量
# so => 由于内存不足将没用到的程序写入的磁盘的swap的容量

# ---- io部分 ----
# bi => 由磁盘写入的block数量
# bo => 写出到磁盘的block数量

# ---- system部分 ----
# in => 每秒被中断的程序次数
# cs => 每秒进行的事件切换次数

# ---- cpu部分 ----
# us => 非核心层的cpu使用状态
# sy => 核心层使用的cpu状态
# id => 闲置的状态
# wa => 等待IO所耗费的CPU状态
# st => 被虚拟机盗用的cpu使用状态

特殊档案与程序 /proc/*

因为程序的执行时丢到内存当中,而内存中的数据又是写到/proc/*这个目录下的。程序会根据PID,在/proc目录下有PID对应的目录/proc/PID/

/proc/PID/内,有下面这些档案

cmdline => 程序被启动的指令串
environ => 程序的环境变量内容

针对特定的PID程序,此内存数据内容写入到/proc/PID/目录下的档案。而对于整个Linux系统,其内存数据内容写入到/proc/目录下的档案中。其中有

  1. /proc/cmdline 加载kernel时所下达的相关参数
  2. /proc/cpuinfo 本机cpu的相关信息
  3. /proc/devices 系统各个主要装置的主要装置代号
  4. /proc/filesystems 系统已加载的文件系统
  5. /proc/interrupts 系统的IRQ分配状态
  6. /proc/ioports 目前系统上各个装置所配合的I/O地址
  7. /proc/kcore 内存的大小
  8. /proc/loadavg 记录cpu负载均值
  9. /proc/meminfo 记录内存信息
  10. /proc/modules 系统已经加载的模块列表
  11. /proc/mounts 系统已经挂载的数据
  12. /proc/swaps swap分区记录在此
  13. /proc/partitions 记录所有分区信息
  14. /proc/pci PCI总线上,每个装置的详细情况,可通过lspci查看
  15. /proc/uptime uptime命令的信息
  16. /proc/version 核心的版本,即uname -a
  17. /proc/bus/* 一些总线的装置,USB的装置也记录在此

程序相关查询

档案、目录和文件系统的占用程序查询(fuser)

通过命令fuser,可以找到正在使用某档案、目录或文件系统的程序,并列出来。

fuser [-umv] [-k[i] [-signal]] file/dir
# 选项与参数
# -u 同时列出程序的拥有者
# -m 目标是文件系统
# -v 列出每个档案与程序或指令的相关性
# -k 找出使用该档案或目录的PID,并试图发送SIGKILL信号给该PID
# -i 必须与-k一起使用,在删除PID前会进行询问
# -signal 默认是-9 SIGKILL

# 例子
# 找出目前所在目录的使用 PID/所属账号/权限
fuser -uv
# ACCESS字段的意思
# c => 此程序在当前目录下(非次目录)
# e => 可被触发为执行状态
# f => 是一个被开启的档案
# r => 代表顶层目录
# F => 该档案被开启了,不过在等待回应
# m => 可能为分享的动态函数库

# 例子
# 找到所有使用到/proc文件系统的程序
fuser -uvm /proc
# 试图删除程序
fuse -ki /var/gdm/gdmfifo

列出被程序所开启的档案文件名(lsof)

通过命令lsof可以列出被程序所开启的档案文件名。

lsof [-aUu] [+d]
# 选项与参数
# -a 多项数据需要同时成立才显示结果
# -U 仅列出Unix like文件系统的socket文件类型
# -u 后面接username,列出该用户相关程序所开启的档案
# +d 后面接目录,找出某个目录底下已经被开启的档案

# 例子
# 列出目前系统上所有已经被开启的档案或装置
lsof 
# 仅列出关于root的所有程序开启的socket档案
lsof -u root -a -U
# 列出所有被启动的装置
lsof +d /dev
# 列出root的bash程序所开启的档案
lsof -o root | grep 'bash'

找出正在执行的程序的PID(pidof)

通过命令pidof可以找出正在执行的程序的PID

pidof [-sx] program_name
# 选项和参数
# -s 仅列出一个PID,而不是所有PID
# -x 同时列出program_name的可能的PPID那个程序的PID

# 例子
# 列出目前系统上 init 和 syslogd 这两个程序的PID
pidof init syslogd

SELinux (Security Enhanced Linux)

SELinux的作用是对档案和程序等进行细部的权限限定。传统的存取文件系统的方式称为自主访问控制(DAC),这种方式就是根据程序的拥有者与档案资源的rwx权限来决定是否具有存取的能力,但是这种DAC的访问控制会有些不足:

  1. root具有最高权限,如果某个程序属于root的权限,那么这个程序就可以对文件系统进行任意的存取了。
  2. 如果某个目录权限设定为777,改目录将可以被所有人进行存取。

以上的不足很多情况下都是由人为的不小心造成的,因此这时候就需要SELinux帮忙了。

SELinux采用委任式访问控制(MAC)的方式对权限进行管理。这种权限的控制方式是针对程序而言的。对于某个程序,它能否存取文件系统的档案资源,就可以由SELinux来控制啦。

主体(Subject)

SELinux中的主体就是程序。在这里可以将SELinux的主体和认为是程序Process。

目标(Object)

一般目标资源就是指的文件系统中的档案资源。SELinux控制的就是程序是否具有存取档案资源的权限。

政策(Policy)

SELinux会根据某些服务指定安全性的政策。这些政策会有详细的规则rule。其中有两个主要的政策为

  1. targeted: 有针对性的SELinux限制,针对网络服务限制较多,针对本机限制较少,这是预设的政策
  2. strict: 严格的SELinux限制。

安全上下文(Security Context)

SELinux除了根据政策的规则进行安全性控制外,主体和目标的安全上下文如果不是一致的,也不能进行目标资源的存取。这有点类似于文件系统的rwx。

SELinux的目标资源存取过程
主体(Subject) -> 政策规则限制(Policy) -> 安全上下文比对(Security Context) -> 目标资源(Object)

安全性上下文记录在档案的inode中,通过命令ls -Z可以档案的安全性上下文。

# ls -Z 观察档案的安全性上下文
# SELinux必须开启
ls -Z

通过ls -Z可以发现,安全性上下文用冒号:分成了三个字段Identityroletype,分别为身份识别、角色、和类型。

  1. Identity(身份识别) 主要用于说明该档案是哪种类型的身份所有

Identity字段主要用于账号方面的识别,其一般有三种类型
1.root 表示root的账号身份
2.system_u 表示系统程序方面的识别
3.user_u 表示一般使用者账号相关的身份

  1. Role(角色) 用于说明数据是属于程序、档案还是使用者

Role角色一般有
1.object_r 代表档案或目录等档案资源
2.system_r 代表程序或一般使用者

  1. Type(类型),比较重要的一个字段

类型字段在档案资源(Object)中称为type
类型字段在主体程序(Subject)中称为domain
只有domaintype搭配,才能顺利读取档案资源。

SELinx的三个字段对于主体程序

# 身份      角色        政策为targeted下的意义
# root      system_r   代表root身份登录时所取得的权限
# system_u  system_r   代表非交谈式的系统程序   
# user_u    system_r   代表一般可登入用户的程序

# 例如
# Apache的 /usr/sbin/httpd 档案的domain为httpd_exec_t
# 而目录/var/www/html 的type为 httpd_sys_content_t
# 因为在targeted政策中,httpd_exec_t这种domain可以读取httpd_sys_content_t这种类型
# 所以 /usr/sbin/httpd 可以读写 /var/www/html
# 最终能不能读取,还需要看rwx权限

# 在执行/usr/sbin/httpd后,该程序的domain会与程序档案/usr/sbin/httpd的type相同

从上面的说明中可以看出

  1. 政策(Policy)内需要制定详细的domain/type规则
  2. 程序是否能存取档案与程序的domain、档案的type、以及rwx权限都有关系。

SELinux的启动、关闭和观察

SELinux支持三种模式

  1. enforcing: 强制模式,说明SELinux运行中,并已经正确限制domain/type了
  2. permissive: 宽容模式,说明SELinux运行中,但不会真正限制,只会发出警告信息。
  3. diabled: 说明SELinux处于关闭状态

通过命令getenforce可以查看SELinux处于哪种模式。

getenforce
# 输出 Enforcing

通过命令sestatus可以查看SELinux的政策(Policy)。

sestatus [-vb]
# 选项和参数
# -v 查看位于 /etc/sestatus.conf 内的档案与程序的安全性上下文内容
# -b 将目前政策的规则用布尔值列出。

# 例子
# 查看目前SELinux使用哪个政策
sestatus

SELinux的配置文件为/etc/selinux/config,通过配置文件,可以修改SELinux的模式和政策类型。

通过修改SELinux的模式,可以开启和关闭SELinux,但必须重新启动系统,因为SELinux是整合到Linux核心中的。

通过查看档案/boot/grub/menu.lst,可以查看核心有无关闭SELinux。没有selinux=0就说明SELinux已经启动了。

通过命令setenforce可以让SELinux在Enforcing和permissive之间进行切换。

setenforce [0|1]
# 选项和参数
# 0 :转成permissive宽容模式
# 1 :转成Enforcing强制模式

但是,命令setenforce无法在disabled模式下进行切换,此时必须修改配置文件/etc/selinux/config中的SELinux模式进行模式切换。

SELinux实例与观察

# 启动httpd服务
/etc/init.d/httpd start

# 观察该程序是否启动
pstree | grep 'httpd'

# 观察该程序的安全上下文
# ps -Z可以列出程序的安全上下文
ps aux -Z | grep 'httpd'
# 发现其domain都是 httpd

# 建立首页
echo "This is my home page" > /var/www/html/index.html
# 然后在浏览器中输入http://127.0.0.1进行观察
# 此时浏览器会通过httpd这个程序以httpd这个domain去读取档案/var/www/html.index.html

# 查看档案的安全性上下文
ls -lZ /var/www/html/index.html
# 发现档案的type为 httpd_sys_content_t
# 根据正则规则 httpd这个domain可以读取httpd_sys_content_t
# 而且档案具有r权限

# SELinux设定错误的测试
# 删除 /var/www/html/index.html
# 在家目录/root 建立index.html
# 将刚建立的index.html移动到/var/www/html
rm /var/www/html/index.html
echo "This is my home page" > /root/index.html
mv /root/index.html /var/www/html
ls -lZ /var/www/html/index.html
# 此时/var/www/html/index.html档案的type为user_home_t
# domain为http_t不可读取user_home_t

通过命令chcon修改安全上下文。

chcon [-R] [-t type] [-u user] [-r role] 档案
chcon [-R] --reference=范例文件 档案
# 选项和参数
# -R 连同该目录下的次目录也同时修改
# -t 修改类型字段
# -u 后接身份表示,如system_u
# -r 后接角色,如system_r
# --reference=范例文件:参考某个范例来修改 后接档案

# 例子
# 将刚才的index.html的type修改为httpd_sys_content_t
chcon -t httpd_sys_conetent_t /var/www/html/index.html
ls -lZ /var/www/html/index.html

# 以/etc/passwd为范例,修改index.html的类型
chcon --reference=/etc/passwd /var/www/html/index.html
ls -lZ /var/www/html/index.html

通过命令restorecon可以用预设的方式修改安全性上下文。restorecon是根据目录的预设值进行设定的。

restorecon [-Rv] 档案或目录
# 选项和参数
# -R :连同此目录一次修改
# -v :将过程显示出来

# 例子
# 将index.html以预设的安全性上下文进行修改
restorecon -Rv /var/www/html/index.html

SELinux所需要的服务

SELinux是整合在Linux核心中的,因此SELinux本身是不需要服务支持的。但为了辅助SELinux,需要一些服务进行日志记录等工作。

  1. setroubleshoot 将错误信息写入/var/log/messages

通过chkconfig --list setroubleshoot查看setroubleshoot是否开启自启动
通过chkconfig setroubleshoot on 设定setroubleshoot开启自启动
通过cat /var/log/messages | grep 'setroubleshoot' 查询错误信息
根据通过/var/log/messages档案中的提示,可以通过sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4查看更完整的错误信息
sealert命令内容中的Allowing Access会教导我们如何进行设定。

  1. auditd 详细资料写入 /var/log/audit/audit.log

auditd 会将SELinux发生的错误信息记录在/var/log/audit/audit.log中
可以通过命令chkconfig查询开机启动和设置开机启动。
audit.log会记录很多信息,文档一般很大。
所以可以通过命令audit2why协助分析

# 用audit2why协助分析/var/log/audit/audit.log,并产生分析报告
audit2why < /var/log/audit/audit.log

SELinux政策(Policy)查询

通过命令seinfo 可以查询SELinux政策(Policy)的详细规则。

seinfo [-Atrub]
# 选项和参数
# -A 列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息
# -t 列出SELinux的所有类型(type)信息
# -r 列出SELinux的所有角色(role)信息
# -u 列出SELinux的所有身份识别(user)信息
# -b 列出所有规则的种类 (布尔值)

# 例子
# 列出与httpd有关的规则
seinfo -b | grep 'httpd'

通过命令sesearch可以查询规则的详细信息

sesearch [-a] [-s 主体类型] [-t 目标类型] [-b 布尔值]
# 选项和参数
# -a 列出所有相关信息
# -t 后面接类别,如 -t httpd_t
# -b 后面接布尔值规则,如 -b httpd_enable_ftp_server

# 例子 
# 找出与http_sys_content_t有关的信息
sesearch -a -t httpd_sys_content_t
# 显示的内容为
# allow 主体程序的domain 目标档案的type

# 找出主体程序的domain为http_t 目标档案的type为httpd_开头的规则
sesearch -a -s httpd_t -t httpd_*

# 查询布尔值httpd_enable_homedirs的规则
sesearh -b httpd_enable_homedirs

实际的政策信息放置在目录/etc/selinux/targeted/policy/底下。所有与targeted有关的都放置在/etc/selinux/targeted/目录里。

SELinux的布尔值查询与修改

通过命令seinfo -b可以查询所有的布尔值。要知道布尔值的开关情况,可以通过命令getsebool进行查询。

getsebool [-a] [布尔值项]
# 选项和参数
# -a 列出所有

# 例子
# 查询所有布尔值设定情况
getsebool -a

要设定某个布尔值,可以通过命令setsebool

setsebool [-P] 布尔值项=[0|1]
# 选项和参数
# -P 直接将设定值写入配置文件,即以后也会生效

# 例子
# 查看httpd_enable_homedirs是否关闭,若还开着,就关闭它
getsebool httpd_enable_homedirs
setsebool -P httpd_enable_homedirs=0

默认目录的安全性上下文查询和修改

之前,我们通过命令restorecon可以用默认目录预设的方式修改档案的安全性上下文。如果要查询和修改默认目录预设的安全性上下文,在需要通过命令semanage进行。

semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] [file_spec]
# 选项和参数
# -l 进行查询
# -a 增加
# -m 修改
# -d 删除

# 例子
# 查询/var/www/html的预设的安全性上下文设定
semanage fcontext -l    

# 设定目录/src/samba目录的默认安全性上下文为public_content_t
mkdir /srv/samba
ls -ldZ /srv/samba
semanage fcontext -l | grep '/srv'
semanage fcontext -a -t public_content_t
semanage fcontext -l | grep '/srv/samba'

cat /etc/selinux/targeted/contexts/files/file_contexts.local
# /etc/selinux/targeted/contexts/files/file_contexts.local 记录着默认安全性上下文
restorecon -Rv /srv/samba*

ls -ldZ /srv/samba

散乱知识

$$ 代表自己bash程序的PID。

一般服务启动脚本位于/etc/init.d目录下

ps -Z 可以列出程序的安全上下文

命令

  1. jobs (观察目前的背景工作状态)
jobs [-lrs]
# 选项与参数
# -l:除了列出job number和指令串,同时列出PID
# -r:只列出在背景中运行(running)的程序
# -s:只列出在背景中暂停(stop)的程序

# 其中的+、-号中的+号表示预设取用状态,通过调用fg将预设状态的程序弄到前台
  1. fg (将背景工作拿到前景处理)
fg %jobnumber
# 选项和参数
# %jobnumber 代码背景工作的id,其中%号可有可无
# 默认取出+号的工作
fg - # 将-号的工作取出
  1. bg(将背景中的程序由暂停状态 转换成 运行状态)
bg %jobnumber
# 用法和fg相同
  1. kill
kill -signal [%jobnumber|PID]
kill -l
# 选项和参数
# 如果不加%号,数字默认是PID
# -l:列出目前kill能够发送的信号有哪些。
# signal:代表发送什么信号,可以通过 man 7 signal查询
#     -1:重新读取一次参数的配置文件,也可以是 -SIGHUP
#     -2:代表由键盘输入Ctrl+c相同的动作,也可以是 -SIGINT
#     -9:立刻强制删除一个工作,也可以是 -SIGKILL
#     -15:以正常的方式终止一个工作,也可以是 -SIGTERM

# 例子
# 强制删除2号工作
jobs #查看背景工作
kill -9 %2
jobs
# 强制结束vi,.swp文件会保留在系统中

# 正常终止1号工作
jobs
kill -SIGTERM %1
jobs
# 正常方式结束vi, .swp文件会主动删除
  1. nohup (让指令能够脱机运行)
nohup [指令与参数] # 在终端机前景运行
nohup [指令与参数] # 在终端机背景运行
# 例子
# filename sleep500.sh
#!/bin/bash
/bin/sleep 500
/bin/echo "I have slept 500 seconds."
# 丢到背景中去执行,并且立刻注销系统
chmod u+x
nohup ./sleep500.sh &
exit
  1. ps (查看某个时间点的程序状态)
ps aux # 观察系统所有的程序数据
ps -lA # 也能观察系统所有的程序数据
ps axjf # 连同部分程序树状态
# 选项与参数
# -A:所有的process都显示出来,与-e一样
# -a:列出与终端无关的process
# -u:列出有效使用者有关的process
# x:通常与a合用,列出完整信息
# l:列出PID等详细信息
# j:工作的格式(job format)
# -f:更完整的输出
ps -l # 只能查阅自己的bash相关的程序
ps aux # 列出系统运作的所有程序
  1. top (动态观察程序状态)
top [-d seconds]
top [-bnp]
# 选项和参数
# -d seconds 程序界面更新的秒数,默认为5秒
# -p 指定某些PID来进行观测
# -b -n 数字 可以通过数据重导向输出到档案中
# top执行过程中的按键指令
#     ? => 显示可以输入什么指令
#     P => 以CPU资料排序
#     M => 以Memory资料排序
#     N => 以PID排序
#     T => 以TIME排序
#     k => 给某个PID一个signal
#     r => 给某个PID重新指定一个nice值(优先级)
#     q => 退出

# 例子
top -b -n 2 > /tmp/top.txt # 输出两次
  1. pstree (显示程序树)
pstree [-A|U] [-up]
# 选项和参数
# -A 各程序树之间的连接以Ascii字符连接
# -U 各程序树之间连接以Unicode字符来连接
# -p 同时列出process的PID
# -u 同时列出process的所属账号
  1. killall (给某个命令发送一个信号)
killall [iIe] [command name]
# 选项和参数
# -i 交互式的
# -e exact的意思,cammand name必须完全相同,不能超过15个字符
# -I 指令名称忽略大小写
# 
  1. nice (给新执行的指令新的NI值,并执行)
nice [-n 数字] command
# 选项和参数
# -n 后面接新NI值,范围-20~19

# 例子,只是测试
nice -n -5 vi &
kill -9 %1

# 一般可以将备份工作的NI值调大,从而减小对系统资源的占用。
  1. renice (已存在程序的nice重新调整)
renice [number] PID
  1. free (观察内存使用情况)
free [-b|-k|-m|-g] [-t]
# 选项和参数
# -b 后接 b(bytes) k(Kbytes) m(Mbytes) g(Gbytes)显示别的单位,默认为-k
# -t 显示物理内存和swap的总量

# shared/buffers/cached 是已被使用的量当中,用来当作缓存和快取的量
  1. uname (查看系统参数)
uname [-asrmpi]
# 选项和参数
# -a 列出所有参数
# -s 列出系统核心名称
# -r 列出系统核心版本
# -m 列出系统硬件名称,如i686
# -p 列出系统CPU类型
# -i 列出系统硬件平台 
  1. uptime(查看系统的开机时间和工作负载)
  2. netstat()
netstat [-atunlp]
# 选项和参数
# -a 将目前系统上所有的联机、监听、Socket数据都列出
# -t 列出tcp网络封包的数据
# -u 列出udp网络封包的数据
# -n 以port number来显示,即端口号
# -l 列出目前正在网络监听的服务
# -p 列出该网络服务的程序 PID

# 例子
# 查看哪些程序开了后门
netstat -tlnp
  1. vmstat (侦测系统资源变化)
  2. fuser (查看档案、目录或文件系统被什么程序占用)
fuser [-umv] [-k[i] [-signal]] file/dir
# 选项与参数
# -u 同时列出程序的拥有者
# -m 目标是文件系统
# -v 列出每个档案与程序或指令的相关性
# -k 找出使用该档案或目录的PID,并试图发送SIGKILL信号给该PID
# -i 必须与-k一起使用,在删除PID前会进行询问
# -signal 默认是-9 SIGKILL

# 例子
# 找出目前所在目录的使用 PID/所属账号/权限
fuser -uv
# ACCESS字段的意思
# c => 此程序在当前目录下(非次目录)
# e => 可被触发为执行状态
# f => 是一个被开启的档案
# r => 代表顶层目录
# F => 该档案被开启了,不过在等待回应
# m => 可能为分享的动态函数库

# 例子
# 找到所有使用到/proc文件系统的程序
fuser -uvm /proc
# 试图删除程序
fuse -ki /var/gdm/gdmfifo
  1. lsof (列出被程序所开启的档案文件名)
lsof [-aUu] [+d]
# 选项与参数
# -a 多项数据需要同时成立才显示结果
# -U 仅列出Unix like文件系统的socket文件类型
# -u 后面接username,列出该用户相关程序所开启的档案
# +d 后面接目录,找出某个目录底下已经被开启的档案

# 例子
# 列出目前系统上所有已经被开启的档案或装置
lsof 
# 仅列出关于root的所有程序开启的socket档案
lsof -u root -a -U
# 列出所有被启动的装置
lsof +d /dev
# 列出root的bash程序所开启的档案
lsof -o root | grep 'bash'
  1. pidof (找出某只正在执行的程序的PID)
pidof [-sx] program_name
# 选项和参数
# -s 仅列出一个PID,而不是所有PID
# -x 同时列出program_name的可能的PPID那个程序的PID

# 例子
# 列出目前系统上 init 和 syslogd 这两个程序的PID
pidof init syslogd
  1. getenforce (查看目前SELinux处于哪种模式)
  2. sestatus(查看SElinux的政策)
sestatus [-vb]
# 选项和参数
# -v 查看位于 /etc/sestatus.conf 内的档案与程序的安全性上下文内容
# -b 将目前政策的规则用布尔值列出。

# 例子
# 查看目前SELinux使用哪个政策
sestatus
  1. setenforce (让SELinux在Enforcing和permissive之间进行切换)
setenforce [0|1]
# 选项和参数
# 0 :转成permissive宽容模式
# 1 :转成Enforcing强制模式
  1. chon (修改安全性上下文)
chcon [-R] [-t type] [-u user] [-r role] 档案
chcon [-R] --reference=范例文件 档案
# 选项和参数
# -R 连同该目录下的次目录也同时修改
# -t 修改类型字段
# -u 后接身份表示,如system_u
# -r 后接角色,如system_r
# --reference=范例文件:参考某个范例来修改 后接档案

# 例子
# 将刚才的index.html的type修改为httpd_sys_content_t
chcon -t httpd_sys_conetent_t /var/www/html/index.html
ls -lZ /var/www/html/index.html

# 以/etc/passwd为范例,修改index.html的类型
chcon --reference=/etc/passwd /var/www/html/index.html
ls -lZ /var/www/html/index.html
  1. restorecon (用预设的方式修改安全性上下文)
restorecon [-Rv] 档案或目录
# 选项和参数
# -R :连同此目录一次修改
# -v :将过程显示出来

# 例子
# 将index.html以预设的安全性上下文进行修改
restorecon -Rv /var/www/html/index.html
  1. chkconfig (查看开机启动服务和设定开机启动服务)
# 查看某个服务是否开机自启动
# chkconfig --list 服务名称
chkconfig --list setroubleshoot

# 将某个服务设定为开机自启动
# chkconfig 服务名称 on
chkconfig setroubleshoot on
  1. audit2why (协助分析SELinux的记录档案/var/log/audit/audit.log)
  2. seinfo (查询SELinux政策(Policy)的详细规则)
seinfo [-Atrub]
# 选项和参数
# -A 列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息
# -t 列出SELinux的所有类型(type)信息
# -r 列出SELinux的所有角色(role)信息
# -u 列出SELinux的所有身份识别(user)信息
# -b 列出所有规则的种类 (布尔值)

# 例子
# 列出与httpd有关的规则
seinfo -b | grep 'httpd'
  1. sesearch (查询规则的详细信息)
sesearch [-a] [-s 主体类型] [-t 目标类型] [-b 布尔值]
# 选项和参数
# -a 列出所有相关信息
# -t 后面接类别,如 -t httpd_t
# -b 后面接布尔值规则,如 -b httpd_enable_ftp_server

# 例子 
# 找出与http_sys_content_t有关的信息
sesearch -a -t httpd_sys_content_t
# 显示的内容为
# allow 主体程序的domain 目标档案的type

# 找出主体程序的domain为http_t 目标档案的type为httpd_开头的规则
sesearch -a -s httpd_t -t httpd_*

# 查询布尔值httpd_enable_homedirs的规则
sesearh -b httpd_enable_homedirs
  1. getsebool (查询SELinux布尔值的开关情况)
getsebool [-a] [布尔值项]
# 选项和参数
# -a 列出所有

# 例子
# 查询所有布尔值设定情况
getsebool -a
  1. setsebool (设定SELinux布尔值的开关)
setsebool [-P] 布尔值项=[0|1]
# 选项和参数
# -P 直接将设定值写入配置文件,即以后也会生效

# 例子
# 查看httpd_enable_homedirs是否关闭,若还开着,就关闭它
getsebool httpd_enable_homedirs
setsebool -P httpd_enable_homedirs=0
  1. semanage (查询和修改默认目录预设的安全性上下文)
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] [file_spec]
# 选项和参数
# -l 进行查询
# -a 增加
# -m 修改
# -d 删除

# 例子
# 查询/var/www/html的预设的安全性上下文设定
semanage fcontext -l    

# 设定目录/src/samba目录的默认安全性上下文为public_content_t
mkdir /srv/samba
ls -ldZ /srv/samba
semanage fcontext -l | grep '/srv'
semanage fcontext -a -t public_content_t
semanage fcontext -l | grep '/srv/samba'

cat /etc/selinux/targeted/contexts/files/file_contexts.local
# /etc/selinux/targeted/contexts/files/file_contexts.local 记录着默认安全性上下文
restorecon -Rv /srv/samba*

ls -ldZ /srv/samba

参考

鸟哥的Linux私房菜

原文地址:https://www.cnblogs.com/smallpi/p/7381775.html