A. SElinux权限
在了解SELinux之前,我们先来了解一下Linux的两种访问控制策略:DAC和MAC
DAC,自主访问控制(Discretionary Access control)。系统只提供基本的验证, 完整的访问控制由开发者自己控制。
DAC将资源访问者分成三类:Owner、Group、Other 。
将访问权限也分成三类:read、write、execute
资源针对资源访问者设置不同的访问权限。访问者通常是各个用户的进程,有自己的uid/gid,通过uid/gid 和文件权限匹配, 来确定是否可以访问。DAC机制下,每一个用户进程默认都拥有该用户的所有权限。
DAC 有两个严重问题:
问题一:
因为Root用户是拥有所有权限的,所以DAC对Root用户的限制是无效的。并且在Linux Kernel 2.1以后,Linux将Root权限根据不同的应用场景划分成许多的Root Capabilities, 普通用户也可以被设置某个Root Capability。普通用户如果被设置了CAP_DAC_OVERRIDE, 也可以绕过 DAC 限制。
问题二:
用户进程拥有该用户的所有权限,可以修改/删除该用户的所有文件资源, 难以防止恶意软件。
可见,DAC 有明显的缺陷,一旦被入侵,取得Root权限的用户进程就可以无法无天,胡作非为,早期android版本就深受其害。
MAC, 强制性访问控制(Mandatory Access control)。 系统针对每一项访问都进行严格的限制, 具体的限制策略由开发者给出。
Linux MAC 针对DAC 的不足, 要求系统对每一项访问, 每访问一个文件资源都需要根据已经定义好了的策略进行针对性的验证。系统可以针对特定的进程与特定的文件资源来进行权限的控制。即使是root用户,它所属的不同的进程,并不一定能取得root权限,而得要看事先为该进程定义的访问限制策略。如果不能通过MAC 验证,一样无法执行相关的操作。
与DAC相比,MAC访问控制的“主体”变成了“进程”而不是用户。这样可以限制了Root 权限的滥用,另外要求对每一项权限进行了更加完整的细化, 可以限制用户对资源的访问行为。
SELinux就是目前最好的MAC机制,也是目前的行业标准。
SELinux,安全增强Linux(Security-Enhanced Linux),是由美国国家安全局(NSA)发起, 多个非营利组织和高校参与开发的强制性安全审查机制(Mandatory Access control,简称MAC)。SELinux最早于2000年12月采用GPL许可发布。目前,Linux Kernel 2.6 及以上的版本都已经集成了SELinux。
SELinux 分成三种模式:
Android 5.x及以上强制开启,因此,disabled(关闭)模式并没有什么用了。 通常在调试时,我们会启用Permissve(宽容模式), 以便尽可能的发现多的问题, 然后一次修正。 在量产时启用Enfocing mode(强制模式)来保护系统。
查看SELinux模式:adb shell getenforce
设置SELinux模式:adb shell setenforce 1 //0是Permissve,1是Enfocing
SELinux 的访问控制示意图:
通常我们开发的过程中,就是配置Subject、Object、Security Policy。
SELinux 给Linux 的所有对象都分配一个安全上下文(Security Context), 描述成一个标准的字符串。
安全上下文的标准格式: user:role:type[:range]
Security Label 用来绑定被访问资源和安全上下文,描述它们的对应关系。标准格式为:resource security_context。即:res user:role:type[:range]。这里也可以使用通配符,例如 net.就可以绑定所有以net.开头的属性,除此之外,还有类似正则表达式的*、?等等通配符。Security Label 都定义在type_contexts当中,例如file的定义在file_contexts中,service定义在service_contexts中,property定义在property_contexts中。
举例:
file_contexts:
service_contexts:
查看进程安全上下文: ps -AZ 。例如,查看Settings进程的安全上下文,ps -AZ | grep settings:
u:r:system_app:s0 system 1381 585 4234504 201072 0 0 S com.android.settings
查看文件安全上下文: ls -Z 。例如,查看文件build.prop的安全上下文:
u:object_r:system_file:s0 build.prop
Type Enforcement (TE) 是根据Security Context中的 type 进行权限审查, 审查 subject type 对 object type 的某个class 类型中某种permission 是否具有访问权限,是目前使用最为广泛的MAC 审查机制, 简单易用。
TE控制语句格式 : rule_name source_type target_type : class perm_set
Type Enforcement规则说明:
举个例子,logd.te、tombstoned.te中定义的TE规则:
allow logd runtime_event_log_tags_file:file rw_file_perms;
dontaudit domain runtime_event_log_tags_file:file { open read };
auditallow tombstoned anr_data_file:file { append write };
neverallow logd { app_data_file system_data_file }:dir_file_class_set write;
SELinux 中每一个进程或者文件都对应一个type, 而每一个type 都对应有一个或几个attribute。所有常见的attribute定义在以下文件中:
system/sepolicy/public/attributes
system/sepolicy/prebuilts/api/[build version]/public/attributes
system/sepolicy/prebuilts/api/[build version]/private/attributes
其中的[build version]即为android版本号,例如android O为28.0。常见的attribute定义:
Type对应一个或者几个attribute,Type的定义格式:
type type_name, attribute1, attribute2;
Type的定义通常分散在各个te文件中。例如,常用普通文件的type定义在file.te中:
SEAndroid对于不同的资源类型,定义了不同的Class。比如普通的file、socket等等,比如SELinux 使用的security, 比如针对每个process 参数的process 等定义相关的class。这些class,每一个class 都有相对应的permissions。 比如file 就有 read, write, create, getattr, setattr, lock, ioctl 等等. 比如process 就有fork, sigchld, sigkill, ptrace, getpgid, setpgid 等等。这些相关的class, 以及他们具有那些Permissions都定义在以下文件中:
system/sepolicy/private/access_vectors
system/sepolicy/reqd_mask/access_vectors
system/sepolicy/prebuilts/api/版本号/private/access_vectors
例如:
定义完之后,在以下对应的security_classes 文件中声明定义的classes。
system/sepolicy/private/security_classes
system/sepolicy/reqd_mask/security_classes
system/sepolicy/prebuilts/api/版本号/private/security_classes
例如:
注意,Classes 和Permissions的定义与Kernel 中相关API是强相关的,普通用户严禁修改。
在SELinux 中, 我们通常称一个进程是一个domain, 一个进程fork 另外一个进程并执行(exec) 一个执行档时, 我们往往会涉及到domain 的切换. 比如init 进程, SELinux 给予了它很大的权限, 而它拉起的服务, 我们要限制这个服务的权限,于是就涉及到从一个domain 切换到另外一个domain, 不然默认就使用init 进程的domain.
在SELinux 里面有专门的一条语法: type_transition statement.
在准备切换前我们先要确保有相关的权限操作:
如下面的demo, init 拉起apache 并且切换到 apache 的domain.
(1). 首先,你得让init_t域中的进程能够执行type为apache_exec_t的文件
allow init_t apache_exec_t : file {read getattr execute};
(2). 然后,你还得告诉SELinux,允许init_t做DT切换以进入apache_t域
allow init_t apache_t : process transition;
(3). 然后,你还得告诉SELinux,切换入口(对应为entrypoint权限)为执行apache_exec_t类型 的文件
allow apache_t apache_exec_t : file entrypoint;
(4).最后,Domain Transition
type_transition init_t apache_exec_t : process apache_t;
可以看到,整个domain切换过程写起来非常麻烦。因此,Google 为了使用方便, 在system/sepolicy/public/te_macros 文件中定义了宏:
我们可以使用这些宏来完成domain切换。
举例:
kernel启动init进程切换domain:
domain_auto_trans(kernel, init_exec, init)
init启动netd、vold、zygote、installd切换domain:
init_daemon_domain(netd)
init_daemon_domain(vold)
init_daemon_domain(zygote)
init_daemon_domain(installd)
一个进程创建在一个目录下创建文件时, 默认是沿用父目录的Security Context, 如果要设置成特定的Label, 就必须进行Object Transitions.
同样是使用:type_transition statement.
对应的必须有两个前提条件:
下面是一个demo, ext_gateway_t 这个domain 在类型为in_queue_t 的目录下,创建类型为 in_file_t 的文件.
(1). 首先,你得让ext_gateway_t 对in_queue_t 目录具备访问权限
allow ext_gateway_t in_queue_t : dir { write search add_name };
(2). 然后,你还得告诉SELinux,允许ext_gateway_t 访问in_file_t的文件
allow ext_gateway_t in_file_t : file { write create getattr };
(3).最后,Object Transition
type_transition ext_gateway_t in_queue_t : file in_file_t;
同样的,为了方便使用,Google 也在system/sepolicy/public/te_macros 文件中定义了宏:
使用举例:
file_type_auto_trans(factory, system_data_file, factory_data_file)
android O 以前sepolicy 集中放在boot image 。前面提到SELinux在Android的主要变更历史时,有提到android O 开始,Google将system image 和 vendor image 分离。因此,sepolicy 也相应的被分离存放到system image 以及 vendor image。与system 相关的sepolicy 就存放system image, 与SoC vendor 相关的sepolicy 就存放在vendor image。
对于原生AOSP,Google 设定了不同的存放目录, 以便进行分离, 以Google 默认的sepolicy 为例,sepolicy主目录为 /system/sepolicy,我们主要关注三个子目录:
对于不同的平台,不同平台厂商也设定了不同的存放目录,以MTK平台为例:
首先,根据不同的platform共用sepolicy、platform独有、project独有,分为:
对应的,不同版本会导入不同目录下的sepolicy配置
以mt6763平台为例,导入时:
[common] 路径为:/device/mediatek/sepolicy
[platfrom] 路径为:/device/mediatek/mt6763/sepolicy/
具体的定义在BoardConfig.mk文件中:
然后,basic、bsp、full又可以主要细分为:
Google 在system/sepolicy 中定义了相关的neverallow 规则, 对SELinux Policy 的更新进行了限制, 以防止开发者过度开放权限,从而引发安全问题。并且还会通过CTS测试检测开发者是否有违法相关的规则。
因此,我们需要注意以下几点:
出现SELinux Policy Exception时常见的两种解决方案:
(1). 修改对应节点的SELinux Security Label, 为特定的Subject,如system_app、platform_app、priv_app,例如Settings,SystemUI等内置APP开启权限, 但严禁为untrsted app 开启权限。
(2). 通过system server service 或者 init 启动的service 读写操作, 然后app 通过binder/socket 等方式连接访问. 此类安全可靠, 并且可以在service 中做相关的安全审查, 推荐这种方法.
情景: 定义由 init 进程启动的service, factory, 其对应的执行档是 /vendor/bin/factory。
(1). 在device/mediatek/mt6763/sepolicy/basic/non_plat 目录下创建一个factory.te , 然后将te文件加入编译,如放到这种指定目录下不需要额外配置,sytem/sepolicy/Android.mk中定义的build_policy函数会遍历指定目录导入te文件。
(2). 在factory.te 中定义factory类型,init 启动service 时类型转换,
type factory, domain;
type factory_exec, exec_type, file_type, vendor_file_type;
init_daemon_domain(factory)
(3). 在file_contexts中绑定执行档
/(system/vendor|vendor)/bin/factory u:object_r:factory_exec:s0
(4). 根据factory需要访问的文件以及设备, 定义其它的权限在factory.te 中.
#Purpose: For key and touch event
allow factory input_device:chr_file r_file_perms;
allow factory input_device:dir rw_dir_perms;
情景: 添加一个自定义的system property: persist.demo,并为platform_app设置读写权限
(1). 在property.te中定义system property类型
type demo_prop, property_type
(2). 在property_contexts中绑定system property的安全上下文。
persist.demo u:object_r:demo_prop:s0
(3). 在platform_app.te 中新增写权限,可以使用set_prop宏。
set_prop(platform_app, demo_prop)
(4). 在platform_app.te 中新增读权限,可以get_prop 宏。
get_prop(platform_app, demo_prop)
情景: 有一个设备节点/dev/demo,有一个platform_app进程需要读写这个设备节点。
(1). 在device.te中定义device 类型
type demo_device dev_type;
(2). 在 file_contexts中绑定demo_device
/dev/demo u:object_r:demo_device:s0
(3). 在platform_app.te中,允许platform_app使用demo device 的权限
allow platform_app demo_device:chr_file rw_file_perms;
情景: 有一个扩展的系统服务demo_service供APP调用。
(1). 在service.te 中定义service 类型
type demo_service, app_api_service, system_server_service, service_manager_type;
(2). 在service_contexts 中绑定service
demo u:object_r:demo_service:s0
(3). 在frameworks/base/core/java/android/content/Context.java中定义服务常量
public static final String DEMO_SERVICE = "demo";
(4). 在frameworks/base/core/java/android/app/SystemServiceRegistry.java中,参照其它系统服务注册demo_service
(5). 在frameworks/base/services/java/com/android/server/SystemServer.java中,启动DemoService,添加到service_manager进行管理。
(6). 最后一步,参考其它系统服务,实现DemoManager、DemoService,并定义如IDemoService等等的AIDL接口。
情景: 一个native service 通过init 创建一个socket 并绑定在 /dev/socket/demo, 并且允许某些process 访问.
(1). 在file.te中定义socket 的类型
type demo_socket, file_type;
(2). 在file_contexts中绑定socket 的类型
/dev/socket/demo_socket u:object_r:demo_socket:s0
(3). 允许所有的process 访问,使用宏unix_socket_connect(clientdomain, socket, serverdomain)
unix_socket_connect(appdomain, demo, demo)
(1). 在device/mediatek/mt6763/sepolicy/basic/non_plat目录下创建一个demo.te。
(2). 在demo.te 中定义demo 类型,init 启动service 时类型转换。并可以根据demo 需要访问的文件以及设备, 定义其它的权限在demo.te 中。
type demo, domain;
type demo_exec, exec_type, file_type;
init_daemon_domain(demo)
(3). 绑定执行档 file_context 类型
/vendor/bin/demo u:object_r:demo_exec:s0
(4). 创建demo的入口执行档demo_exec、并配置相应的权限。
(1). 将SELinux 调整到Permissive 模式复测
使用eng/userdebug 版本,adb shell setenforce 0 将SELinux 模式调整到Permissive 模式,然后复测。如果还能复现问题,则与SELinux 无关; 如果原本很容易复现, 而Permissive mode 不能再复现, 那么就可能与SELinux相关。
(2). 查看LOG 中是否有标准的SELinux Policy Exception.
在Kernel LOG / Main Log 中查询关键字 "avc: denied" 看看是否有与目标进程相关的SELinux Policy Exception, 并进一步确认这个异常是否与当时的逻辑相关。
一般情况我们在符合Google sepolicy策略及neverallow策略的前提下,根据LOG中的内容,需要什么权限就加什么权限。例如LOG:
2020-03-27 14:11:02.596 1228-1228/com.android.systemui W/FaceIdThread: type=1400 audit(0.0:481): avc: denied { read } for name="als_ps" dev="tmpfs" ino=10279 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:als_ps_device:s0 tclass=chr_file permissive=0
LOG说明如下:
一般我们需要重点关注的是四个:permission、source type、target type、target class
根据这四个就可以配置出的所需要的selinux权限:
allow [source type] [target type]: [target class] [permission]
例1:
03-27 03:45:22.632 2958 2958 W Camera: type=1400 audit(0.0:314): avc: denied { read } for name="u:object_r:graphics_debug_prop:s0" dev="tmpfs" ino=2649 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:graphics_debug_prop:s0 tclass=file permissive=0
解决方案:
按正常的套公式,应该是这样修改platform_app.te,增加:
allow platform_app graphics_debug_prop:file r_file_perms;
这里我们利用system/sepolicy/te_macros中定义的宏get_prop:
更多相关的宏定义请参考:system/sepolicy/public/te_macros。
所以最终简化后,修改platform_app.te,增加:
get_prop(platform_app, graphics_debug_prop)
例2:
03-27 14:11:02.596 1228-1228/com.android.systemui W/BackThread: type=1400 audit(0.0:481): avc: denied { read } for name="als_ps" dev="tmpfs" ino=10279 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:als_ps_device:s0 tclass=chr_file permissive=0
解决方案:
修改platform_app.te增加:
allow platform_app als_ps_device:chr_file r_file_perms;
(1). 不符合neverallow规则或者修改了neverallow规则
编译报错:
neverallow check failed at xxx
CTS测试项failed:
android.cts.security.SELinuxNeverallowRulesTest#testNeverallowRulesXXX
这类问题在android O vendor和system分离之后,尤其容易出现。基本上这类问题都是因为修改或者增加的te配置不符合neverallow规则,导致编译报错。而为了解决编译报错,又修改了neverallow规则,最终在跑CTS时,没法通过相关的测试项。
解决思路:
(2). init进程fork新进程没有做domain切换
CTS测试项failed:
android.security.cts.SELinuxDomainTest # testInitDomain
解决思路:
fork进程时,参考3.4节中做domain切换。
本文主要参考了MTK-Online的Quick-start中《SELinux 问题快速分析》的内容,感谢原作者们的辛勤付出。另外,结合源码和自身开发实践,增加了一些自身理解和实践内容。
B. linux中安装了一个插件,这个插件装完后正常的情况在终端输入./phpxujh -p pid可查看当前PID的运行情况,
目录
开始之前
系统环境
监控内容
所需软件包
CentOS7重要变化
配置开发环境
同步时间
关闭Selinux
使用CRT上传软件包
安装邮件服务
监控主机安装
常用到的命令
安装nagios所需要的运行环境
增加用户
安装nagios
配置权限
安装插件
安装nrpe
远程主机安装
常用到的命令
配置运行环境
安装nagios-plugin
安装nrpe
启动nrpe
监控主机安装PNP
配置开发环境
安装pnp4nagios (版本号为0.6)
配置pnp4nagios
图表展示
问题集合
在首次配置了nagios监控端后,在浏览器输入地址后连接不上
启动nrpe后却不能互相通信
安装pnp4nagios后出现The requested URL /pnp4nagios/graph was not found on this server.
出现“CHECK_NRPE: Error - Could not complete SSL handshake.”的错误
执行 ./configure时报错:configure error cannot find ssl headers
解压./configure 后,在nagios-4.0.8进行make all报错
安装nrpe时执行.configure出错
错误:perfdata directory "/usr/local/pnp4nagios/var/perfdata/" is empty
开始之前
声明:本文中的命令都经过了测试,但难免有所纰漏,如果你发现命令粘贴后运行有错,可能是由于符号的格式(尤其是破折号)导致的,此时你应该自己手打一遍命令。对于本文中发现的错误和建议,请发送邮件给我:
[email protected],请在邮件主题里注明“关于nagios的问题(建议)”。
--------------------------------------分割线 --------------------------------------
在Ubuntu下配置Mrtg监控Nginx和服务器系统资源 http://www.linuxidc.com/Linux/2013-08/88417.htm
使用 snmp+Mrtg 监控 Linux 系统 http://www.linuxidc.com/Linux/2012-11/73561.htm
Mrtg服务器搭建(监控网络流量) http://www.linuxidc.com/Linux/2012-07/64315.htm
网络监控器Nagios全攻略 http://www.linuxidc.com/Linux/2013-07/87067.htm
Nagios搭建与配置详解 http://www.linuxidc.com/Linux/2013-05/84848.htm
Nginx环境下构建Nagios监控平台 http://www.linuxidc.com/Linux/2011-07/38112.htm
在RHEL5.3上配置基本的Nagios系统(使用Nagios-3.1.2) http://www.linuxidc.com/Linux/2011-07/38129.htm
CentOS 5.5+Nginx+Nagios监控端和被控端安装配置指南 http://www.linuxidc.com/Linux/2011-09/44018.htm
Ubuntu 13.10 Server 安装 Nagios Core 网络监控运用 http://www.linuxidc.com/Linux/2013-11/93047.htm
--------------------------------------分割线 --------------------------------------
系统环境
一共3台机器,全都按照CentOS7最小化模式安装系统
系统版本号
[root@localhost ~]# cat /etc/RedHat-release
CentOS Linux release 7.0.1406 (Core)
监控主机
(一台)
IP地址:192.168.1.204
主机名称:nagios_server_204
远程主机
(两台)
IP地址:192.168.1.112
主机名称:nagios_slave_112
IP地址:192.168.1.113
主机名称:nagios_slave_113
分区情况
安装时使用默认分区(使用 df 命令来查看)
[root@localhost ~]# df -h
监控内容
要监控的服务
监控命令
cpu负载
(check_linux_state.pl -C)
当前用户登录数量
(check_users)
磁盘使用情况
(check_disk)
总进程数
(check_procs)
内存使用情况
(check_linux_stats.pl -M)
负载均衡
(check_load)
磁盘IO
(check_linux_stats.pl -I)
网络流量
(check_linux_stats.pl -N)
打开的文件数量
(check_linux_stats.pl -F)
socket连接数
(check_linux_stats.pl -S)
进程使用的内存和CPU
(check_linux_stats.pl -T)
指定的网站是否可连接
(check_http)
系统在线时长
(check_uptime)
所需软件包
监控主机
软件包
下载地址
nagios-4.0.8.tar.gz
请到我的github地址里下载:
https://github.com/Kylinlin/install_nagios_automatically/tree/master/nagios_tools_for_server
注明:我的github项目install_nagios_automatically是一个一键自动化安装nagios的项目(能运行,但还在完善中)
nagios-plugins-2.0.3.tar.gz
nrpe-2.15.tar.gz
pnp4nagios-0.6.25.tar.gz
Sys-Statistics-Linux-0.66.tar.gz
libxml2-2.7.1.tar.gz
远程主机
软件包
下载地址
nagios-plugins-2.0.3.tar.gz
请到我的github地址里下载:
https://github.com/Kylinlin/install_nagios_automatically/tree/master/nagios_tools_for_client
nrpe-2.15.tar.gz
Sys-Statistics-Linux-0.66.tar.gz
Centos7重要变化
Centos7相比较以前的Centos有一些涉及到常用命令的变化,如果不事先了解,会在使用命令的时候造成巨大的困扰
Centos7默认没有ifconfig和netstat两个命令了,ip addr命令代替了ifconfig,只要安装上net-tools包就可以继续使用ifconfig和netstat两个命令了
systemctl命令的出现(systemctl可以看作是service和chkconfig的组合),虽然仍然可以使用以前的命令,但是会重定向到新的命令中,下面以http服务为例
job
以前的系统
CentOS7
服务开机启动
chkconfig --level 3 httpd on
systemctl enable httpd.service
服务不开机启动
chkconfig --level 3 httpd off
systemctl disable httpd
服务状态
service httpd status
systemctl status httpd
所有服务的启动状态
chkconfig --list
systemctl
启动服务
service httpd start
systemctl start httpd.service
停止服务
service httpd stop
systemctl stop httpd.service
重启服务
service httpd restart
systemctl restart httpd.service
配置开发环境
同步时间
把监控系统里的所有机器都同步一次网络时间(非常重要)
[root@localhost ~]timedatectl #该命令用来检查当前时间和时区
如果发现所有机器的时区不一致,此时就要使用命令
[root@localhost ~]timedatectl list-timezones #该命令列出了所有的时区
[root@localhost ~]timedatectl set-timezone Asia/Shanghai #该命令把时区设置为上海
ntpdate time.nist.gov #该命令同步网络当前的时间
如果提示没有ntpdate命令,则安装ntp,并且配置系统自动更新时间
[root@localhost ~]# yum install ntp -y
[root@localhost ~]# /usr/sbin/ntpdate time.nist.gov
[root@localhost ~]# echo '#time sync'>>/var/spool/cron/root
[root@localhost ~]# echo '*/10**** /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'>>/var/spool/cron/root
关闭Selinux
不关闭selinux可能会导致一些难以察觉的错误,为了保险起见,首先关闭selinux:
[root@localhost ~]vi /etc/selinux/config
重启机器
检查selinux是否关闭:
[root@localhost ~]getenforce #如果显示enforcing则没有关闭
使用SecureCRT上传软件包
我在这里使用的SSH连接工具是SecureCRT7.2,通过这个工具上传文件到Linux的步骤如下:
1. 首先在Linux中安装传送文件命令:
[root@localhost ~] yum install lrzsz -y
2. 然后在Linux中跳转到/usr/local/src目录下
[root@localhost ~] cd /usr/local/src
3. 运行CRT的传送文件命令
安装邮件服务
因为邮件报警服务需要安装mail功能
[root@localhost ~]yum install –y mailx
[root@localhost ~]yum install –y sendmail
[root@localhost ~]systemctl restart sendmail.service
[root@localhost ~]mail –s Test [email protected](你的邮箱地址)
#此时进入输入模式,输入完邮件内容后按ctrl + d退出并且发送
监控主机安装
常用到的命令
命令内容
命令格式
检查nagios的配置文件是否有错
/etc/init.d/nagios checkconfig
或者
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
启动nagios
systemctl start nagios.service
或者
/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
修改了nagios的配置文件后重新加载配置文件
/etc/init
安装nagios所需要的运行环境
[root@localhost ~]# yum install gcc glibc glibc-common -y
[root@localhost ~]# yum install php php-gd perl -y
[root@localhost ~]# yum install httpd gd gd-devel openssl openssl-devel -y
[root@localhost ~]# systemctl enable httpd.service #设置CentOS开机启动服务
增加用户
[root@localhost ~]useradd -m nagios
并将nagios以及apache用户加入到nagcmd组中
[root@localhost ~]groupadd nagcmd
[root@localhost ~]usermod -G nagcmd nagios
[root@localhost ~]usermod -a -G nagcmd apache #把apace用户添加到与nagios的一个组(apache用户会在安装apache时自动创建)
安装nagios
[root@localhost src]# tar -zxvf nagios-4.0.8.tar.gz
[root@localhost src]# cd nagios-4.0.8
首先初始化和建立编译的环境
[root@localhost nagios-4.0.8]#./configure --with-command-group=nagcmd
如果能看到下面的基本配置信息则说明初始的环境已经成功配置完成:
之后按照提示执行命令来进行编译:
[root@localhost nagios-4.0.8]# make all
[root@localhost nagios-4.0.8]# make install
[root@localhost nagios-4.0.8]# make install-init
[root@localhost nagios-4.0.8]# make install-config
[root@localhost nagios-4.0.8]# make install-commandmode
[root@localhost nagios-4.0.8]# make install-webconf
安装完成之后,在/usr/local/nagios目录下如果能够看到这些目录:
就表示Naigos安装成功了。
Nagios的样例配置文件默认安装在/usr/local/nagios/etc目录下,配置这些文件就可以使得nagios按要求运行(详细的配置过程请参考我的另一篇博文:nagios服务配置详解)
此时应该为email指定您想用来接收nagios警告信息的邮件地址,默认是本机的nagios用户:
[root@localhost]# vi /usr/local/nagios/etc/objects/contacts.cfg
email nagios@localhost #把描红的地方修改为你的email地址
创建一个登录nagios web程序的用户(用户名配置为nagiosadmin则不需要配置权限,设置为其他用户名就要配置权限),我在这里把用户名设置为kylinlin,密码为123456,这个用户帐号在以后通过web登录nagios认证时所用:
[root@localhost ~]# htpasswd -bc /usr/local/nagios/etc/htpasswd.users kylinlin 123456 #把描红的地方修改为你的用户名和密码
配置权限
如果在上面创建登陆nagios web程序的用户名不是nagiosadmin(我在上面已经设置为kylinlin),在登陆nagios的web界面后(此时我们还不能登录,但如果你忽略了这一小节的配置,那么在后面的登陆中就会看到如下的界面),点击Hosts或Services会显示图片红色的错误提示
是因为nagios默认把全部的权限给nagiosadmin,所以可以通过修改cgi.cfg文件赋予kylinlin权限,切换到/usr/local/nagios/etc目录下
[root@localhost etc]# sed -i 's#nagiosadmin#kylinlin#g' cgi.cfg #这条命令将nagiosadmin用户名替换为kylinlin
[root@localhost etc]# grep kylinlin cgi.cfg #这条命令检查是否修改成功
以上过程配置结束以后需要重新启动httpd:
[root@localhost etc]# systemctl restart httpd.service
检查其主配置文件的语法是否正确:
[root@localhost etc]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
或者使用下面这个命令来检查语法
[root@localhost etc]# /etc/init.d/nagios checkconfig
显示错误数为0才正确
配置成功
安装插件
刚才已经提到Nagios主程序只是一个控制中心,而能够起到服务监测和系统监测等功能的是众多Nagios的插件,没有插件的Nagios系统其实只是一个空壳。因此在安装了Nagios平台之后我们还需要安装插件。
Nagios插件同样是在其官方网站下载,目前版本是1.4.15。我将下载的源码包放到/usr/local目录下,按照下面的步骤进行解压,编译和安装:
[root@localhost src]# tar zxf nagios-plugins-2.0.3.tar.gz
[root@localhost src]# cd nagios-plugins-2.0.3
[root@localhost nagios-plugins-2.0.3]# ./configure --with-nagios-user=nagios --with-nagios-group=nagios
[root@localhost nagios-plugins-2.0.3]#make
[root@localhost nagios-plugins-2.0.3]#make install
通过下面的命令查看安装了多少个插件
[root@localhost nagios-plugins-2.0.3]#ls /usr/local/nagios/libexec/|wc -l
然后把Nagios加入到服务列表中以使之在系统启动时自动启动:
[root@localhost nagios-plugins-2.0.3]# chkconfig --add nagios
[root@localhost nagios-plugins-2.0.3]# chkconfig nagios on
执行下面的命令来验证Nagios的样例配置文件:
[root@localhost ~]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
C. (追加100分!)谁能帮我找到linux/unix系统下创建文件夹的C语言源码
去下载busybox的源码,在busybox-XXXX/coreutils/mkdir.c
/* vi: set sw=4 ts=4: */
/*
* Mini mkdir implementation for busybox
*
* Copyright (C) 2001 Matt Kraai <[email protected]>
*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
/* BB_AUDIT SUSv3 compliant */
/* http://www.opengroup.org/onlinepubs/007904975/utilities/mkdir.html */
/* Mar 16, 2003 Manuel Novoa III ([email protected])
*
* Fixed broken permission setting when -p was used; especially in
* conjunction with -m.
*/
/* Nov 28, 2006 Yoshinori Sato <[email protected]>: Add SELinux Support.
*/
#include "libbb.h"
/* This is a NOFORK applet. Be very careful! */
#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS
static const char mkdir_longopts[] ALIGN1 =
"mode\0" Required_argument "m"
"parents\0" No_argument "p"
#if ENABLE_SELINUX
"context\0" Required_argument "Z"
#endif
;
#endif
int mkdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int mkdir_main(int argc, char **argv)
{
mode_t mode = (mode_t)(-1);
int status = EXIT_SUCCESS;
int flags = 0;
unsigned opt;
char *smode;
#if ENABLE_SELINUX
security_context_t scontext;
#endif
#if ENABLE_FEATURE_MKDIR_LONG_OPTIONS
applet_long_options = mkdir_longopts;
#endif
opt = getopt32(argv, "m:p" USE_SELINUX("Z:"), &smode USE_SELINUX(,&scontext));
if (opt & 1) {
mode = 0777;
if (!bb_parse_mode(smode, &mode)) {
bb_error_msg_and_die("invalid mode '%s'", smode);
}
}
if (opt & 2)
flags |= FILEUTILS_RECUR;
#if ENABLE_SELINUX
if (opt & 4) {
selinux_or_die();
setfscreatecon_or_die(scontext);
}
#endif
if (optind == argc) {
bb_show_usage();
}
argv += optind;
do {
if (bb_make_directory(*argv, mode, flags)) {
status = EXIT_FAILURE;
}
} while (*++argv);
return status;
}
D. 求教selinux源代码获取
linux下的内核头文件放在/usr/include/linux/和/usr/include/sys/ linux目录树: scripts目录 该目录中不包含任何核心代码,该目录下存放了用来配置内核的脚本和应用程序源码。 lib目录 该目录主要包含两部分内容:gnuzip解压缩算法,用于在系统.
E. Linux系统下如何一次性创建多个文件夹
1、首先,连接相应linux主机,进入到linux命令行状态下,等待输入shell指令。回
F. 求小红帽Linux下载地址及源码下载地址
在经历了两次跳票以后, Red Hat于2007年3月14日正式发布了RHEL5. RHEL 5将是Red Hat的商业服务器操作系统版本的第四次重要版本发布, Red Hat酝酿发布RHEL 5已经超过了两年, 主要变化包括Linux内核由2.6.9升级为2.6.18, 支持Xen虚拟化技术, 集群存储等.
RHEL5的版本主要分为Sever和Desktop两个版本。
具体来说,Server版本分为:
· Red Hat Enterprise Linux Advanced Platform - 对应以前的· Red Hat Enterprise Linux AS
· Red Hat Enterprise Linux - 对应以前的Red Hat Enterprise Linux AS
Desktop版本分为:
· Red Hat Enterprise Linux Desktop - 对应以前的Red Hat Desktop
· Red Hat Enterprise Linux Desktop with Workstation option - 对应以前的Red Hat Enterprise Linux WS
主要的功能包括:
1. 虚拟化技术
在各种平台上支持虚拟化技术
在Red Hat Enterprise Linux Advanced Platform支持存储与扩展的服务器虚拟化技术
Red Hat Network提供各种虚拟化系统的支持
virt-manager, libvirt/virsh管理工具
2. 内核与性能
基于Linux 2.6.18内核
支持多核处理器
广泛的新硬件支持
更新的基于Kexec/Kmp的Dump支持
支持Intel Network Accelerator Technology (IOAT)
对于大型SMP系统技持的增强
增强的管道缓存
内核缓存接合能力用于改进IO缓存操作
3. 安全
SELinux增强
图形化SELinux管理界面
集成的目录和安全机制
增强的IPESEC提高安全与性能
新的审计机制用于提供新的搜索、报表和实时监控的能力
4. 网络与互操作性
支持Autofs, FS-Cache和iSCSI
增强的IPv6支持
改进的Microsoft®文件/打印和Active Directory集成
5. 桌面
更新的管理工具、应用程序和对笔记本的支持
改进的ACPI支持,包括Suspend to Disk
智能卡登录,包括PKI/Kerberos认证
集成的多媒体支持
增强的即插即用支持
Network Manager提供自动的有线和无线网络配置
基于AIGLX/Compiz的图形化界面(支持淡化、透明等效果)
6. 开发环境
增强的开发工具,包括System Tap和Frysk
GCC4.1和glibc 2.5工具链
7. 存储
支持根设置多路IO(MPIO),提高可用性
服务器产品中包含单系统/客户的Red Hat Global File System支持
块设备数据加密支持
8. 管理
安装过程更新简化系统配
基于Yum/Pup的Red Hat Network更新
Conga集群和存储管理
http://download.chinaunix.net/download/0013000/12382.shtml
G. Android系统集成自己的程序
之前在Android N平台上selinux是disabled的,这样是生效的
但是Android P上好像没有直接关闭selinux这个项,在bootargs_...txt文件中设置androidboot.selinux为disabled,但是开机启动时仍然是Enforcing,查找原因:
发现在Android P上 system/core/init/init.cpp 中selinux状态枚举类型 enum selinux_enforcing_status { SELINUX_PERMISSIVE, SELINUX_ENFORCING, SELINUX_DISABLED };
包含三种状态的,这样adb shell getenforce ,源码如下
然而在Android P上单独分离出一个文件system/core/init/selinux.cpp,是如下定义的,
显而易见,并没有disabled状态,得另想方案,于是在网络就看到了添加selinux 的te规则,使得Android系统允许开机运行我们的程序,设置androidboot.selinux为permissive
在device/hisilicon/bigfish/system/sepolicy/vendor 下添加属于自己的规则,内容如下:
同目录下file_contexts也要定义:
这样结合上面这些,在init.rc中定义,并且添加属于自己的规则TE文件,在selinux为permissive的情况的也能完成程序的自启动
Android P和Android N不同,从Android O开始Google添加了客制化分区vendor分区,这样导致原本在Android N上的运行程序放入system/bin下运行不了了,找不到库,因为海思将他们的移到vendor/lib下面了,然而将自己程序移至vendor/bin下也会有许多问题,这样在打包生成镜像之前时就将vendor/lib所需要的库到system/lib下,修改system/extras/ext4_utils/mkuserimg_mke2fs.sh脚本即可
H. linux系统中opt 、selinux 、srv、 media这些文件夹是做什么用的
Linux文件夹
opt option自由选择,主要给源码安装软件时候选择的安装目录位置
selinux 伪文件专系统kernel子系统通常使用的命属令
srv 系统启动服务时候可以访问的数据库目录
media 一般是挂载cd、DVD的光盘
更深的可以搜索下:Linux目录结构学习下
可以参考下:
http://www.360doc.com/content/14/0607/16/203871_384577619.shtml
I. 如何在centos上安装samba图形界面
组成Samba运行的有两个服务,一个是SMB,另一个是NMB;SMB是Samba 的核心启动服务,主要负责建立 Linux Samba服务器与Samba客户机之间的对话, 验证用户身份并提供对文件和打印系统的访问,只有SMB服务启动,才能实现文件的共享,监听139 TCP端口;而NMB服务是负责解析用的,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与其IP对应起来,如果NMB服务没有启动,就只能通过IP来访问共享文件,监听137和138 UDP端口。首先配置这些东西你需要先拥有root权限。
1、关闭防火墙:service iptables stop。
2、关闭SELINUX的强制模式:setenforce 0,这个也不可忽略,如果setenforce 1,就好多共享都不成功了。
3、构建yum仓库。打开目录/etc/yum.repos.d下的CentOS-Base.repo文件。
4、在线Samba安装包,开始安装Samba。
yum install samba samba-client samba-swat,安装过程不再贴图。
5、查看安装情况:rmp -qa|grep samba
7、保存退出:wq,重启samba服务
创建/share目录mkdir /share,并且设置chmod 777 /share——注:这样做有风险,大家先达到共享这一步的效果,以后慢慢学习安全性的考虑。