服务安全与监控

Posted xujint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务安全与监控相关的知识,希望对你有一定的参考价值。

一、审计服务(audit)

1.1 审计服务介绍

auditd(或 auditd 守护进程)是Linux审计系统中用户空间的一个组件,其负责将审计记录写入磁盘。Auditd可以对整个操作系统的以下行为做审计:
账户管理、文件系统管理、权限管理、网络配置管理、日志文件操作管理

auditd安装完毕后将自动安装以下auditd和相关的工具:
auditctl : 即时控制审计守护进程的行为的工具,比如如添加规则等等。
/etc/audit/audit.rules : 记录审计规则的文件。
aureport : 查看和生成审计报告的工具。
ausearch : 查找审计事件的工具
auditspd : 转发事件通知给其他应用程序,而不是写入到审计日志文件中。
autrace : 一个用于跟踪进程的命令。
/etc/audit/auditd.conf : auditd工具的配置文件。

1.2 配置审计服务

	[root@host53 ~]# rpm -q audit  (没有则yum安装)
		audit-2.7.6-3.el7.x86_64
	配置文件: /etc/audit/auditd.conf
		log_file = /var/log/audit/audit.log    //日志文件

	[root@svr7 ~]# systemctl start auditd
	[root@svr7 ~]# systemctl enable auditd

查看审计规则
	[root@svr7 ~]# auditctl   -s     //查看服务状态
	[root@svr7 ~]# auditctl  -l	 //查看规则列表
	[root@svr7 ~]# auditctl  -D 	 //删除规则

auditd配置参考

1.3自定义审计规则

命令行定义(临时生效)
auditctl -w /etc/passwd  -p wa -k passwd_change
  -w + 需要审计的文件或目录
  -p + 权限(r,w,x,a)
  -k + 名称(方便识别生成的规则)

永久定义  
]# vim  /etc/audit/rules.d/audit.rules
-w /etc/passwd -p wa -k plj_passwd

查看审计日志  
~]# ausearch -k passwd_change-i   //根据key搜索日志,-i为交互式操作

二、服务安全

网站安全(nginx

源码安装nginx服务

]# yum  -y  install gcc  pcre-devel zlib-devel openssl-devel  //安装依赖包
]# tar -zxvf nginx-1.12.2.tar.gz 
]# cd nginx-1.12.2/
]# ./configure --without-http_autoindex_module  --without-http_ssi_module
]# make&&make install				
]# /usr/local/nginx/sbin/nginx  
]# netstat -utnlp  | grep  :80

nginx安全配置

**1. 禁用不需要的模块 **
nginx-1.12.2]# ./configure --help |grep -i "without" //查看那些模块可以被禁用

/usr/local/nginx/sbin/nginx  -t   //测试是否有错误
  
 ]# /usr/local/nginx/sbin/nginx  -s stop(修改配置时先停止服务)

 ]# vim /usr/local/nginx/conf/nginx.conf
server {
	#autoindex on ;   //自动索引模块(不安全)
  
 ]#./configure --without-http_autoindex_module  配置时禁用autoindex模块
 ]# make && make install   

**2 .修改版本信息 **

[root@pc117 ~]# curl -I  http://192.168.4.50/          //获取软件名与版本
HTTP/1.1 200 OK
Server: nginx/1.12.2                  
Date: Wed, 29 May 2019 07:47:10 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 29 May 2019 07:13:58 GMT
Connection: keep-alive
ETag: "5cee3136-264"
Accept-Ranges: bytes

   ]# /usr/local/nginx/sbin/nginx -s stop
   ]#vim +48 src/http/ngx_http_header_filter_module.c 
	static u_char ngx_http_server_string[] = "Server: IIS" CRLF;
      static u_char ngx_http_server_full_string[] = "Server: IIS" CRLF;
      static u_char ngx_http_server_build_string[] = "Server: IIS" CRLF;
   ]#  ./configure --without-http_autoindex_module && make && make install 
   ]# /usr/local/nginx/sbin/nginx
[root@pc117 ~]# curl -I  http://192.168.4.50/      //验证

3.限制并发----->降低DDos攻击风险
DDOS攻击者会发送大量的并发连接,占用服务器资源(包括连接数、带宽等),这样会导致正常用户处于等待或无法访问服务器的状态

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
//1M可以存储8千个IP信息,将客户端IP信息存储名称为one的共享内存,内存空间为10M,容量可以根据需要任意调整
    server {
        listen 80;
        server_name localhost;
        limit_req zone=one burst=5;//每秒中仅接受1个请求,多余的放入漏斗
            }
}
		
[root@client ~]# ab -c 100 -n 100  http://192.168.4.5/	//客户端使用ab测试软件测试		
[root@client ~]# curl -i -X HEAD http://192.168.4.5           
//curl命令选项说明:-i选项:访问服务器页面时,显示HTTP的头部信息,-X选项:指定请求服务器的方法

让Nginx拒绝非法的请求方法:

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http{
       server {
                 listen 80;
#这里,!符号表示对正则取反,~符号是正则匹配符号
              if ($request_method !~ ^(GET|POST)$ ) {   #如果用户使用不是GET或POST方法访问网站,则retrun返回444的错误信息
                     return 444;
               }    
        }
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

4.防止buffer溢出
当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)。

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
				http{
					client_body_buffer_size  1K;
					client_header_buffer_size 1k;
					client_max_body_size 1k;
					large_client_header_buffers 2 1k;
					 … …
					}	
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

网站安全(Tomcat)

启动服务

#rpm -qa  | grep  -i openjdk   //查看是否安装java
#java -version                  //查看版本
#tar -zxvf apache-tomcat-8.0.30.tar.gz 
#mv apache-tomcat-8.0.30 /usr/local/tomcat   //移动包并改名
#echo "test" > /usr/local/tomcat/webapps/ROOT/a.html  //测试页面
mv /dev/random   /dev/random1
ln -s  /dev/urandom  /dev/random     //有需要的话更改随机数,提高启动速度
#/usr/local/tomcat/bin/startup.sh      
#netstat -utnlp  | grep  :8080
#curl  http://localhost:8080/a.html

优化配置
1) 隐藏版本信息、修改tomcat主配置文件(隐藏版本信息)
未修改版本信息前,使用命令查看服务器的版本信息

[root@proxy ~]# curl -I http://192.168.2.100:8080/xx        
//访问不存在的页面文件,查看头部信息
[root@proxy ~]# curl -I http://192.168.2.100:8080    
//访问存在的页面文件,查看头部信息
[root@proxy ~]# curl http://192.168.2.100:8080/xx
//访问不存在的页面文件,查看错误信息
[root@web1 tomcat]# yum -y install java-1.8.0-openjdk-devel
[root@web1 tomcat]# cd /usr/local/tomcat/lib/
[root@web1 lib]# jar -xf catalina.jar           //解压
[root@web1 lib]# vim org/apache/catalina/util/ServerInfo.properties //修改版本信息的内容

修改后,客户端再次查看版本信息
再次修改tomcat服务器配置文件,修改版本信息,手动添加server参数(服务端)

[root@web1 lib]# vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"  redirectPort="8443" server="jacob" />

[root@web1 lib]# /usr/local/tomcat/bin/shutdown.sh        //关闭服务
[root@web1 lib]# /usr/local/tomcat/bin/startup.sh        //启动服务

修改后,客户端再次查看版本信息

[root@proxy ~]# curl -I http://192.168.2.100:8080/xx        
//访问不存在的页面文件,查看头部信息
	[root@proxy ~]# curl -I http://192.168.2.100:8080    
//访问存在的页面文件,查看头部信息
	[root@proxy ~]# curl http://192.168.2.100:8080/xx
//访问不存在的页面文件,查看错误信息

2)降权启动
~]# ps aux |grep -i java //查看进程
默认tomcat使用系统高级管理员账户root启动服务,启动服务尽量使用普通用户。

[root@web1 ~]# useradd tomcat
[root@web1 ~]# chown -R tomcat:tomcat /usr/local/tomcat/
//修改tomcat目录的权限,让tomcat账户对该目录有操作权限
[root@web1 ~]# su -c "/usr/local/tomcat/bin/startup.sh" tomcat
//使用su命令切换为tomcat账户,以tomcat账户的身份启动tomcat服务
[root@m50 ~]# ps aux |grep -i java
[root@web1 ~]# chmod +x /etc/rc.local                //设置该文件为开机启动文件
[root@web1 ~]# vim /etc/rc.local                     //修改文件,添加如下内容
	su -c /usr/local/tomcat/bin/startup.sh tomcat

3)删除默认的测试页面
[root@web1 ~]# rm -rf /usr/local/tomcat/webapps/*

数据库服务(mariadb)

[root@proxy ~]# cat .mysql_history //通过命令行修改的密码,bash会自动记录历史,历史记录中记录了明文密码
怎么解决?
管理好自己的历史;不使用明文登录;选择合适的版本5.6以后的版本;
日志,行为审计(找到行为人);使用防火墙从TCP层设置ACL(禁止外网接触数据库)
1.优化配置

]# rpm -q mariadb
]# rpm -q mariadb-server
[root@proxy ~]# systemctl status mariadb	//确保服务已启动 
[root@proxy ~]# mysql_secure_installation   //执行初始化安全脚本
]# netstat -utnlp  | grep  :3306

2.删除/root/.mysql_history 文件
rm -rf /root/.mysql_history
3.使用tcpdump抓包[查看被谁访问过]
[root@proxy ~]# tcpdump -w log -i any src or dst port 3306//抓取源或目标端口是3306的数据包,保存到log文件中
mysql数据默认不加密传输



























以上是关于服务安全与监控的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端Eureka 服务信息Eureka 发现管理Eureka 安全配置Eureka-HA(高可用) 机制Eur(代码片段

ini Web服务器安全性片段

ini Web服务器安全性片段

Twistlock使Istio的安全层更强大,更易于监控

Windows服务与安全

监控Prometheus的概述安装与服务发现