文章目录
nmap tcpdump audit nginx tomcat mysql安全设置
nmap
格式: nmap [扫描类型] [选项] <扫描目标>
- -sS, TCP SYN扫描(半开) 快但是默认被认为是攻击行为
- -sT,TCP 连接扫描(全开)
- -sU, UDP扫描
- -sP, ICMP扫描
- -A,目标系统全面分析
- -n , 不执行DNS解析 默认是将扫描目标当做域名的
tcpdump
选项 | 说明 |
---|---|
-i | 指定监控的网络接口 默认监听第一个网卡 |
-A | 转换为ASCII码 |
-w | 将数据包信息保存到指定文件 |
-r | 从指定文件读取数据包信息 |
-i具体组合
过滤条件 | 参数 |
---|---|
类型 | host(主机)、net(网段)、port(端口)、portrange(端口范围) |
方向 | src(源地址)、dst(目标地址) |
协议 | tcp、udp、ip、wlan、arp… |
可以使用and or not 来进行组合
举例:tcpdump -w log -i any src or dst port 3306
audit监控
审计的目的是基于事先配置的规则生成日志,记录可能发生在系统上的事件,不能够提供额外安全保护,但会发现并记录违反安全策略的人及其对应的行为 记录行为工具
审计能够记录的日志内容:
- 日期与事件以及事件的结果
- 触发事件的用户
- 所有认证机制的使用都可以被记录,如ssh等
- 对关键数据文件的修改行为等都可以被记录
案例
audit基本命令
命令参数 | 说明 |
---|---|
auditctl -s | 查询状态 |
auditctl -l | 查看规则 |
auditctl -D | 删除所有规则 |
auditctl -w path -p permission -k key_name | 定义临时文件系统规则 w指定文件目录 p权限wrx a(文件或目录的属性发生变化)k可选项 指定key_name方便识别哪些规则产生的日志项 |
环境配置
yum -y install audit
cat /etc/audit/auditd.conf
======================
local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log #日志位置
log_group = root
log_format = RAW
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 8
num_logs = 5
priority_boost = 4
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
verify_email = yes
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
use_libwrap = yes
##tcp_listen_port = 60
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
enable_krb5 = no
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
distribute_network = no
=====================================
systemctl enable --now auditd
定义临时文件系统规则
auditctl -w /etc/passwd -p wa -k passwd_change
auditctl -w /etc/selinux/ -p wa -k selinux_change
auditctl -w /usr/sbin/fdisk -p x -k disk_partition
auditctl -w /etc/ssh/sshd_config -p warx -k sshd_config
# 指定文件或目录 指定权限 key_name标识用的
定义永久审计规则,修改规则配置文件
vim /etc/audit/rules.d/audit.rules
==================================
-w /etc/passwd -p wa -k passwd_changes
-w /usr/sbin/fdisk -p x -k partition_disks #就是将auditctl 命令写到配置文件里面 永久生效
=================================================
检索审计日志
ausearch -k sshd_config -i #-k 根据key_name检索 -i 交互式
Nginx安全配置优化
删除不需要的模块
源码编译时使用–without参数指定不需要的模块
修改版本信息
curl -I http://192.168.2.5 #查看服务器头部信息
HTTP/1.1 200 OK
Server: nginx/1.17.6 #含有nginx版本信息
Date: Tue, 12 Jan 2021 10:45:48 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 06 Jan 2021 10:33:00 GMT
Connection: keep-alive
ETag: "5ff591dc-264"
Accept-Ranges: bytes
vim /usr/local/nginx/conf/nginx.conf
===================================
http{
...
server_tokens off; #不在数据包头部信息包含版本信息
....
}
======================================
nginx -s reload #重启
curl -I http://192.168.2.5 #查看服务器响应的头部信息
HTTP/1.1 200 OK
Server: nginx #版本信息消失了
Date: Tue, 12 Jan 2021 10:47:59 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 06 Jan 2021 10:33:00 GMT
Connection: keep-alive
ETag: "5ff591dc-264"
Accept-Ranges: bytes
nginx限制并发量 ngx_http_limit_req_module模块 降低DDOS攻击
vim /usr/local/nginx/conf/nginx.conf
==========================
http{
... #key值 客户端IP存储在名称为one的共享内存 内存大小为10M 速度
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
limit_req zone=one burst=5; #burst 存取5个同一个ip请求 处理一个
}
....
}
=======================================
#客户端测试
ab -c 100 -n http://192.168.2.5/ #最后要加/ 测试同时100个请求
.... #省略测试不必要信息
Complete requests: 100 #发送了100个请求
Failed requests: 94 #94个被拒绝了 100 - 1个处理-5个等待=94个被拒绝
.....
拒绝非法请求头
vim /usr/local/nginx/conf/nginx.conf
=========================
http{
server{
listen 80;
if($request_method !~ ^(GET|POST)$) { #检索请求头 如果是除了GET POST以外的请求 就返回444
return 444;
}
}
}
===============================
/usr/local/nginx/sbin/nginx -s reload
#客户端测试
curl -i -X GET http://192.168.2.5 #显示请求内容和返回信息 X指定请求方式为GET
#GET方式成功
curl -i -X HEAD http://192.168.2.5
curl: (52) Empty reply from server #被拒绝了
防止buffer溢出
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_bffers 2 1k;
.....
}
====================================
/usr/local/nginx/sbin/nginx -s reload
数据库安全配置
初始化安全脚本
mariadb和mysql安装后root默认没有密码且有一个任何人都可以操作的test测试数据库
systemctl start mariadb
mysql_secure_installation #执行初始化安全脚本 禁止root从远程其他主机登录数据库,并删除test数据库
手动修改数据库密码
mysqladmin -uroot -p123456 password 'mysql' #重新设置数据库root密码为mysql
mysql -uroot -pmysql #测试新密码登录
MariDB[(none)]> set password for root@'localhost'=password('123456'); #在数据库里面改回123456
通过bash终端修改mysql密码 和数据库内命令修改密码 都可以被看到明文密码
history
cat .bash_history #看见历史命令记录 看见mysqladmin修改的密码
cat .mysql_history #查看数据库命令 看见修改的密码
所以要管理好历史记录 不使用明文 数据库binlog日志在5.6版本前也有明文密码
数据库备份与还原
mysqldump -uroot -p123456 mydb table > table.sql #导出mydb数据库中的table表
mysqldump -uroot -p123456 mydb > mydb.sql #导出mydb数据库中的所有表
mysqldump -uroot -p123456 --all-databases > all.sql #导出所有数据库
mysql -uroot -p123456 mydb < table.sql #将table.sql 表导入mydb数据库
mysql -uroot -p123456 mydb < mydb.sql
mysql -uroot -p123456 < all.sql #导入数据库
数据库测试抓包
环境配置
- 2.5数据库 有tom数据库用户 密码123 允许在任何机子上发起访问 能够访问所有表
- 2.100测试端
- 2.5 tcpdump监听3306端口抓包
测试
#2.5
mysql -uroot -p123456
MariaDB [(none)]> grant all on *.* to tom@'%' identified by '123';
# 允许 所有操作 在所有数据库所有表中 tom用户使用123密码在任何主机上登录
tcpdump -w log -i any src or dst port 3306
#抓取源或目标端口是3306端口的数据包保存在log文件中
#2.100
mysql -utom -p123 -h192.168.4.5
MariaDB [(none)]> select * from mysql.user; #执行查询用户命令
MariaDB [(none)]> exit #退出
#2.5查看log
tcpdump -A -r log
09:43:13.837031 IP 192.168.2.100.57480 > proxy.mysql: Flags [S], seq 2877284794, win 29200, options [mss 1460,sackOK,TS val 12322866 ecr 0,nop,wscale 7], length 0
E..<..@.@..y...d..................r............
...2........................
09:43:13.837105 IP proxy.mysql > 192.168.2.100.57480: Flags [S.], seq 4201524256, ack 2877284795, win 28960, options [mss 1460,sackOK,TS val 20129128 ecr 12322866,nop,wscale 7], length 0
E..<..@.@..........d.....n, ......q ...........
.3%h...2....................
09:43:13.837373 IP 192.168.2.100.57480 > proxy.mysql: Flags [.], ack 1, win 229, options [nop,nop,TS val 12322871 ecr 20129128], length 0
E..4..@.@......d.............n,!.....R.....
...7.3%h................
......
#查询命令数据包省略 有加密的hash值 可以逆向破解
#看前三次通信 2.100发送SYN给2.5 2.5返回SYN和ACK给2.100 2.100发送ACK给2.5 通信建立了
可以发现有被抓包破解的危险
可以SSH远程连接服务器后本地登陆数据库 或者 使用SSL对mysql服务器进行加密,类似HTTP+SSL
Tomcat安全配置
隐藏版本信息
vim /usr/local/tomcat/conf/server.xml
==============================
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" server="jacob">
================================================================
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
#测试
curl -I http://192.168.2.100:8080/xx