zoukankan      html  css  js  c++  java
  • 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私房菜

  • 相关阅读:
    171 01 Android 零基础入门 03 Java常用工具类02 Java包装类 01 包装类简介 01 Java包装类内容简介
    170 01 Android 零基础入门 03 Java常用工具类01 Java异常 08 Java异常总结 01 异常总结
    169 01 Android 零基础入门 03 Java常用工具类01 Java异常 07 异常链 01 异常链简介
    168 01 Android 零基础入门 03 Java常用工具类01 Java异常 06 自定义异常 01 自定义异常类
    167 01 Android 零基础入门 03 Java常用工具类01 Java异常 05 使用throw和throws实现异常处理 02 使用throw抛出异常对象
    166 01 Android 零基础入门 03 Java常用工具类01 Java异常 05 使用throw和throws实现异常处理 01 使用throws声明异常类型
    165 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 05 return关键字在异常处理中的使用
    DevExpress WPF v20.2版本亮点放送:全新升级的PDF Viewer
    界面控件DevExpress使用教程:Dashboard – 自定义导出
    DevExpress WinForms帮助文档:表单控件
  • 原文地址:https://www.cnblogs.com/smallpi/p/7381775.html
Copyright © 2011-2022 走看看