Linux监控(系统审计、分析日志)与服务安全(nginx安全优化,数据库服务安全优化,Tomcat安全优化)

系统审计

概述:
1.基于事先配置的规则生成日志,记录可能发生在系统上的事件
2.审计不会为系统提供额外的完全保护,但他会发现并记录违反安全策略的人及其对应的行为
3.审计能够记录的日志内容
(1).日期与事件、事件结果
(2).触发事件的用户
(3).所有认证机制的使用都可以被记录,如ssh等
(4)记录对关键数据文件的修改行为等
4.审计的案例
(1).监控文件访问
(2).监控系统调用
(3).记录用户运行的命令
(4).审计可以监控网络访问行为
(5).ausearch工具,可以根据条件过滤审计日志
(6).aureport工具,可以生成审计报告

部署audit:
使用审计系统需要安装audit软件
主配置文件为:/etc/audit/auditd.conf
[root@proxy ~]# yum -y install audit //安装软件包
[root@proxy ~]# cat /etc/audit/auditd.conf //查看配置文件,确定日志位置
log_file = /var/log/audit/audit.log //日志文件路径
[root@proxy ~]# systemctl start auditd //启动服务
[root@proxy ~]# systemctl enable auditd //设置开机自启

配置审计系统
可以使用auditctl命令控制审计系统并设置规则决定哪些行为会被记录日志。
语法格式如下:
[root@proxy ~]# auditctl -s //查询状态
[root@proxy ~]# auditctl -l //查看规则
[root@proxy ~]# auditctl -D //删除所有规则

注意:审计系统开启时,默认无法关闭程序.

命令行输入命令时,是定义临时文件系统规则:
#语法格式:auditctl -w path -p 权限 -k 存放日志的文件名
#path为需要审计的文件或目录
#权限可以是r,w,x,a(文件或目录的属性发生变化)
#-k 后面跟存放日志的文件名

例子:
[root@proxy ~]# auditctl -w /etc/passwd -p wa -k passwd_change
//设置规则所有对passwd文件的写、属性修改操作都会被记录审计日志
[root@proxy ~]# auditctl -w /etc/selinux/ -p wa -k selinux_change
//设置规则,监控/etc/selinux目录
[root@proxy ~]# auditctl -w /usr/sbin/fdisk -p x -k disk_partition
//设置规则,监控fdisk程序
[root@proxy ~]# auditctl -w /etc/ssh/sshd_conf -p warx -k sshd_config
//设置规则,监控sshd_conf文件

如果需要创建永久审计规则,则需要修改规则配置文件:
[root@proxy ~]# vim /etc/audit/rules.d/audit.rules
-w /etc/passwd -p wa -k passwd_changes
-w /usr/sbin/fdisk -p x -k partition_disks

查看并分析日志
1.手动查看日志

auditctl -l //查看当下所有的审计日志
ausearch -k 日志文件名 //查看对应的审计日志

查看日志时,主要查看一下几个项:
time->…
uid=…
comm=…
success=yes
argc=…
a0=…
a1=…

二、服务安全

1.nginx安全-----优化

删除不需要的模块 -----------> --without

(1)修改隐藏版本信息

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
http{
server_tokens off; //在http下面手动添加这么一行
… …
}
[root@proxy ~]# nginx -s reload
[root@proxy ~]# curl -I http://192.168.4.5 //查看服务器响应的头部信息
[root@proxy nginx-1.12]# vim +48 src/http/ngx_http_header_filter_module.c

//注意:vim这条命令必须在nginx-1.12源码包目录下执行!!!!!!
//该文件修改前效果如下:
static u_char ngx_http_server_string[] = “Server: nginx” CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
//下面是我们修改后的效果:
static u_char ngx_http_server_string[] = “Server: Jacob” CRLF;
static u_char ngx_http_server_full_string[] = “Server: Jacob” CRLF;
static u_char ngx_http_server_build_string[] = “Server: Jacob” CRLF;

[root@proxy nginx-1.12]# ./configure
[root@proxy nginx-1.12]# make && make install
[root@proxy nginx-1.12]# killall nginx
[root@proxy nginx-1.12]# /usr/local/nginx/sbin/nginx //启动服务
[root@proxy nginx-1.12]# curl -i http://192.168.4.5 //查看版本信息验证

(2)限制并发量 (控制同一台机子对其访问的最大访问量)

DDOS攻击者会发送大量的并发连接,占用服务器资源(包括连接数、带宽等),这样会导致正常用户处于等待或无法访问服务器的状态。
Nginx提供了一个ngx_http_limit_req_module模块,可以有效降低DDOS攻击的风险,操作方法如下:

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; //1秒处理一个请求
server {
listen 80;
server_name localhost;
limit_req zone=one burst=5; 将剩余请求量中的5个请求放入内存中.
}
}

[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
[root@client ~]# ab -c 100 -n 100 http://192.168.4.5/ //使用ab测试软件测试效果

//备注说明:
//limit_req_zone语法格式如下:
//limit_req_zone key zone=name:size rate=rate;
//上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M
//1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整
//每秒中仅接受1个请求,多余的放入漏斗
//漏斗超过5个则报错

(3)拒绝非法请求

网站使用的是HTTP协议,该协议中定义了很多方法,可以让用户连接服务器,获得需要的资源。但实际应用中一般仅需要get和post。

具体HTTP请求方法的含义如下所示:

| 请求方法 | 功能描述 |
| GET | 请求指定的页面信息,并返回实体主体 |
| HEAD | 类似于get请求,只不过返回的响应中没有具体内容,用于获取报头 |
POST 向指定资源提交数据进行处理请求(例如提交表单或上传文件)
DELETE 请求服务器删除指定的页面
PUT 向服务器特定位置上传资料
… …

通过如下设置可以让Nginx拒绝非法的请求方法:

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http{
server {
listen 80;
#这里,!符号表示对正则取反,~符号是正则匹配符号
#如果用户使用非GET或POST方法访问网站,则retrun返回444的错误信息
if ( r e q u e s t m e t h o d !   ( G E T ∣ P O S T ) request_method !~ ^(GET|POST) requestmethod! (GETPOST) ) {
return 444;
}
}
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

修改服务器配置后,客户端使用不同请求方法测试:

[root@client ~]# curl -I -X GET http://192.168.4.5 //正常
[root@client ~]# curl -I -X HEAD http://192.168.4.5 //报错

(4)防止buffer溢出
当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)。
修改Nginx配置文件,调整各种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

2.数据库服务安全(mariadb)----优化

(1)初始化安全脚本:

安装完MariaDB或MySQL后,默认root没有密码,并且提供了一个任何人都可以操作的test测试数据库。有一个名称为mysql_secure_installation的脚本,该脚本可以帮助我们为root设置密码,并禁止root从远程其他主机登陆数据库,并删除测试性数据库test。

yum -y install mariadb (提供管理命令)
yum -y install mariadb-server (提供数据库服务)
[root@proxy ~]# mysql_secure_installation //执行初始化安全脚本,(执行脚本时,旧密码为空,一路敲Y,设置新密码)

脚本解读:
Remove anonymous users (删除匿名账户)
Disallow root login remotely? (禁止root远程登录)
Remove test database (删除测试数据库)
Reload privilege (刷新权限)

(2)密码安全

修改mysql 密码的若干方法

方法一: 在命令行中输入命令: mysqladmin -uroot -plocalhost password ‘123456’
方法二: 进入数据库中,在MySQL命令行中敲:set password for root@“lcoalhost”=password(“ceshimima”);
方法三:进入数据库中,在MySQL命令行中输入:select user,host,password from mysq.user;
update mysql.user set password=password(“ceshimima”) where host=“localhost” and user=“root”;
方法四:进入数据库中,在MySQL命令行中输入:alter user user() identified by “123456”;

(3)binlog日志优化

binlog 日志里有明文密码 (5.6版本之后已经修复)
cat .bash_history 查看本机历操作记录
cat .mysql_history 查看数据库的操作历史记录

解决方法:
管理好自己的历史记录,不使用明文登录,选择合适的版本
日志,行为审计
防火墙从TCP层设置ACL(禁止外网接触数据库)

(4)数据备份与还原

首先,备份数据库(注意用户名为root,密码为redhat):

[root@proxy ~]# mysqldump -uroot -predhat mydb table > table.sql
//备份数据库中的某个数据表
[root@proxy ~]# mysqldump -uroot -predhat mydb > mydb.sql
//备份某个数据库
[root@proxy ~]# mysqldump -uroot -predhat --all-databases > all.sql
//备份所有数据库

接下来,还原数据库(注意用户名为root,密码为redhat):

[root@proxy ~]# mysql -uroot -predhat mydb < table.sql //还原数据表
[root@proxy ~]# mysql -uroot -predhat mydb < mydb.sql //还原数据库
[root@proxy ~]# mysql -uroot -predhat < all.sql //还原所有数据库

(5)数据安全
容易被抓包,使用tcpdump查看之前抓取的数据包,很多数据库的数据都明文显示出来
解决方案:使用SSH 或SSL加密数据传输
可以使用SSH远程连接服务器后,再从本地登陆数据库(避免在网络中传输数据,因为网络环境中不知道有没有抓包者)。
或者也可以使用SSL对MySQL服务器进行加密,类似与HTTP+SSL一样,MySQL也支持SSL加密(确保网络中传输的数据是被加密的)。

3.Tomcat安全
安装Tomcat
]# yum -y install java-1.8.0-openjdk-devel
]# tar -xf xf apache-tomcat-8.0.30.tar.gz
]# mv apache-tomcat-8.0.30 /usr/local/tomcat
]# echo “abc” > /usr/local/tomcat/webapps/ROOT/test.html //写一个测试网页

3-1.隐藏版本信息
]# yum -y install java-1.8.0-openjdk-devel
]# cd /usr/local/tomcat/lib/
]# jar -xf catalina.jar
]# vim org/apache/catalina/util/ServerInfo.properties //根据自己的需要,修改版本信息的内容
]# /usr/local/tomcat/bin/shutdown.sh //关闭服务
]# /usr/local/tomcat/bin/startup.sh //启动服务

再次修改tomcat服务器配置文件,修改版本信息,手动添加server参数

]# vim /usr/local/tomcat/conf/server.xml

]# /usr/local/tomcat/bin/shutdown.sh //关闭服务
]# /usr/local/tomcat/bin/startup.sh //启动服务

测试:
]# curl -I http://localhost/xx //访问不存在的页面文件,查看头部信息

3-2.降级启动
默认tomcat使用系统高级管理员账户root启动服务,启动服务尽量使用普通用户
]# useradd tomcat
]# chown -R tomcat:tomcat /usr/local/tomcat/ //修改tomcat目录的权限,让tomcat账户对该目录有操作权限
]# su -c /usr/local/tomcat/bin/startup.sh tomcat //使用su命令切换为tomcat账户,以tomcat账户的身份启动tomcat服务
]# chmod +x /etc/rc.local //该文件为开机启动文件
]# vim /etc/rc.local //修改文件,添加如下内容
su -c /usr/local/tomcat/bin/startup.sh tomcat

3-3删除默认的测试页面
]# rm -rf /usr/local/tomcat/webapps/*

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值