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私房菜

  • 相关阅读:
    leetcode每日一题:836. 矩形重叠
    单链表之删除头结点,查找等于定值x的结点数,单链表的逆置
    拼数,零幺串
    最大公约数/最小公倍数
    寻找二叉树双亲结点
    Object类的派生-c++
    牛客小白月赛22
    二叉树的基本操作
    字符串的反转,替换,删除
    [2011山东ACM省赛] Identifiers(模拟)
  • 原文地址:https://www.cnblogs.com/smallpi/p/7381775.html
Copyright © 2011-2022 走看看