Linux系统审计与服务安全,打补丁

什么是审计

  • 基于事先配置号的规则生成日志,记录可能发生在系统上的事件
  • 审计不会为系统提供额外的完全防护,但它会发现并记录违反安全策略的人及其对应的行为
  • 审计能够记录的日志内容:
  1. 日期与事件、事件结果
  2. 触发事件的用户
  3. 所有认证机制的使用都可以记录,如SSH等
  4. 对关键数据文件的修改行为等

审计的案例

  • 监控文件访问
  • 监控系统调用
  • 记录用户运行的命令
  • 审计可以监控网络访问行为
  • ausearch工具,可以根据条件过滤审计日志
  • aureport工具,可以生成审计报告

部署audit

一、装包

  • 使用审计系统需要安装audit软件包
  • 主配置文件为/etc/audit/auditd.conf
[root@ip53 ~]# yum -y install audit
[root@ip53 ~]# systemctl start auditd   //启动服务
[root@ip53 ~]# systemctl enable auditd  
[root@ip53 ~]# cat /var/log/audit/audit.log     //查看审计日志

二、配置审计

(1)auditctl命令

  • auditctl命令控制审计系统并设置规则决定哪些行为会被记录日志
[root@ip53 ~]# auditctl -s			 //查看服务状态
[root@ip53 ~]# auditctl -l            //查看当前自定义规则类表
[root@ip53 ~]# auditctl -D			//清除所有规则

(2)定义临时规则

  • 定义文件系统规则,语法如下:
  1. auditctl -w path -p permission -k key_name
  2. path为需要审计的文件或者目录
  3. 权限可以是r,w,x,a(文件或者目录的属性发生哪些变化)
  4. Key_name为可选项,方便识别哪些规则生成特定的日志项

(3)设置规则所有对passwd文件写、属性修改操作都会被记录到审计日志

[root@ip53 ~]# auditctl -w /etc/passwd -p wa -k passwd_change

(4)设置规则,监控/etc/selinux目录

[root@ip53 ~]# auditctl -w /etc/selinux/ -p wa -k selinux_change

(5)设置规则,监控fdisk程序

[root@ip53 ~]# auditctl -w /usr/sbin/fdisk -p x -k disk_partition

三、定义永久规则

  • 写入配置文件/etc/audit/rules.d/audit.rules
[root@ip53 ~]# vim /etc/audit/rules.d/audit.rules 
... ...
-w /etc/passwd -p wa -k passwd_change
-w /etc/selinux -p wa -k selinux_change
-w /usr/sbin/fdisk -p x -k disk_partition

从文件里加载规则

[root@ip53 ~]# auditctl -R /etc/audit/rules.d/audit.rules 

附加扩展

  • 扩展知识
    系统提供的参考模板
[root@ip53 ~]# ls /usr/share/doc/audit-2.7.6/rules/

四、审计日志

查看日志

  • 定义规则
[root@ip53 ~]# auditctl -w /etc/ssh/sshd_config -p warx -k sshd_config
  • 查看日志
[root@ip53 ~]# tailf /var/log/audit/audit.log 

type为类型

  • msg为(time_stamp:ID),时间是date+%s
  • arch=c000003e,代表x86_64(16进制)
  • success=yes/no,事件是否成功
  • a0-a3是程序调用前4个参数,16进制编码了
  • ppid父进程ID,如bash,pid进程ID,如cat命令
  • auid是审核用户的id,su - test,依然可以追踪su前的账户
  • uid,gid用户与组
  • tty:从哪个终端执行的命令
  • comm=“cat” 用户在命令行执行的指令
  • exe="/bin/cat" 实际程序的路径
  • key=“sshd_config” 管理员自定义的策略关键字key
  • type=CWD 用来记录当前工作目录
    -cwd="/home/username"
  • type=PATH
    -ouid(owner’s user id) 对象所有者id
    -guid(owner’s groupid) 对象所属组id
  • exit=0 //表示命令执行成功

搜索日志

  • 系统提供的ausearch命令可以方便的搜索特定的日志
    默认该程序会搜索/var/log/audit/audit.log
    ausearch options -if file_name可以指定文件名

根据k搜索日志

[root@ip53 ~]# ausearch -k passwd_change
[root@ip53 ~]# ausearch -k passwd_change -i //加-i是交互式操作

服务安全

Nginx安全

一、删除不需要的模块

  • Nginx是模块化设计
  1. 需要的模块使用–with加载模块
  2. 不需要的模块使用–without禁用模块

(1)安装nginx,编写测试页面

[root@ip50 ~]# yum -y install gcc pcre-devel zlib-devel openssl-devel  //安装依赖包
[root@ip50 ~]# cd nginx-1.12.2/
[root@ip50 nginx-1.12.2]# useradd nginx
[root@ip50 nginx-1.12.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx
[root@ip50 ~]# echo "A" > /usr/local/nginx/html/a.html
[root@ip50 ~]# echo "B" > /usr/local/nginx/html/b.html
[root@ip50 ~]# echo "C" > /usr/local/nginx/html/c.html
[root@ip50 ~]# /usr/local/nginx/sbin/nginx
[root@room9pc01 ~]# firefox 192.168.4.50/a.html

(2)修改配置文件,打开自动索引

[root@ip50 ~]# vim /usr/local/nginx/conf/nginx.conf

... ...
 server {
        autoindex on;  //自动索引打开
        listen       80;
        server_name  localhost;

        #charset koi8-r;
... ...

[root@ip50 ~]# /usr/local/nginx/sbin/nginx -s reload

(3)创建新的访问路径

[root@ip50 ~]# mkdir /usr/local/nginx/html/game
[root@ip50 ~]# echo "one" > /usr/local/nginx/html/game/a1.html
[root@ip50 ~]# echo "two" > /usr/local/nginx/html/game/a2.html

这样访问时,浏览器会列出所有该文件夹下的文件,这样太不安全

[root@room9pc01 ~]# firefox 192.168.4.50/game

所以需要去除相应模块,禁用该功能

[root@ip50 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@ip50 ~]# vim /usr/local/nginx/conf/nginx.conf

... ...
 server {
        #autoindex on;  //注释掉该项
        listen       80;
        server_name  localhost;

        #charset koi8-r;
... ...

(4)重新编译安装,禁用自动索引模块

[root@ip50 nginx-1.12.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --without-http_autoindex_module
[root@ip50 nginx-1.12.2]# make && make install
[root@ip50 ~]# /usr/local/nginx/sbin/nginx 

[root@room9pc01 ~]# firefox 192.168.4.50/game   //报错403

二、修改版本信息

  • 如何修改版本信息(修改源码)
  • 如何隐藏版本号信息(server_tokens off)

(1)修改源码,隐藏软件名跟版本号

[root@ip50 ~]# /usr/local/nginx/sbin/nginx -s stop

[root@ip50 nginx-1.12.2]# vim +48 src/http/ngx_http_header_filter_module.c

修改前
...  ...
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: IIS" CRLF;
static u_char ngx_http_server_full_string[] = "Server: IIS" CRLF;
static u_char ngx_http_server_build_string[] = "Server: IIS" CRLF;
... ...

(2)重新编译安装

[root@ip50 nginx-1.12.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --without-http_autoindex_module
[root@ip50 nginx-1.12.2]# make && make install

[root@ip50 ~]# /usr/local/nginx/sbin/nginx

三、限制并发

  • ngx_http_limit_req_module为默认模块
    该模块可以降低DDos攻击风险
[root@ip50 ~]# /usr/local/nginx/sbin/nginx -s stop
  • 下面配置的功能为:
  1. 语法:limit_req_zone key zone=name:size rate=rate;
  2. 将客户端IP信息存储名称为one的共享内容,空间为10M
  3. 1M可以存储8000个IP信息,10M可以存储8万个主机状态
  4. 每秒中仅接受1个请求。多余的放入漏斗
  5. 漏斗超过5个则报错
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=5;
[root@ip50 ~]# vim /usr/local/nginx/conf/nginx.conf

http{
...  ...
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...  ...
    server {
        #autoindex on;
        listen       80;
        server_name  localhost;
        limit_req zone=one burst=5;
... ...

这样的配置的是,服务器1s只处理一个,其中有5个放在内存里边等待处理,即就是客户端通一时间访问数据库的并发量最大只有6个,剩下的服务器都不处理,如一次性客户端发起10个请求,有6个会请求成功,其余4个全部失败

[root@ip50 ~]# /usr/local/nginx/sbin/nginx

[root@room9pc01 ~]# ab -n 10 -c 10  http://192.168.4.50/

四、拒绝非法请求

  • 常见的HTTP请求方法
    HTTP定义了很多方法,实际应用中一般仅需要get和post
请求方法 功能描述
GET 请求指定的页面信息,并返回实体主体
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)
DELETE 请求服务器删除指定的页面
PUT 向服务器特定位置上传资料
其他

(1)修改配置文件,只配置(GET|POST)请求,关闭其他请求

[root@ip50 ~]# vim /usr/local/nginx/conf/nginx.conf

...	...
    server {
        #autoindex on;
        listen       80;
        server_name  localhost;
        limit_req zone=one burst=5;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        if ($request_method !~ ^(GET|POST)$) {
                return 444;
      	      }
...	...

[root@ip50 ~]# /usr/local/nginx/sbin/nginx -s reload

(2)客户端测试

[root@room9pc01 ~]# curl -i -X GET http://192.168.4.50/a.html
[root@room9pc01 ~]# curl -i -X POST http://192.168.4.50/a.html
[root@room9pc01 ~]# curl -i -X HEAD http://192.168.4.50/a.html

五、防止buffer溢出

  • 防止客户端请求数据溢出
  • 有效降低机器Dos攻击风险
[root@ip50 ~]# vim /usr/local/nginx/conf/nginx.conf
... ...
http {
    client_body_buffer_size 1k;
    client_header_buffer_size 1k;
    client_max_body_size 16k;
    large_client_header_buffers 4 4k;
... ...

数据库安全

初始化安全脚本

  • 输入旧密码,配置新root密码
  • Remove anonymous users(删除匿名账户)
  • Disallow root login remotely?(禁止root远程登陆)
  • Remove test database(删除测试数据库)
  • Reload privilege(刷新权限)

(1)安装mariadb

[root@ip50 ~]# yum -y install mariadb mariadb-server
[root@ip50 ~]# systemctl start mariadb
[root@ip50 ~]# mysql_secure_installation        //执行初始化安全脚本

[root@ip50 ~]# mysql -uroot -p123456

通过mysqladmin或者登陆mysql通过set password修改密码

(2)密码安全

  • 问题是历史记录会出卖你
  • binlog日志里有明文密码(5.6版本以后修复了)
[root@ip50 ~]# cat ~/.bash_history 
...  ...
mysqladmin -uroot -pxxx password '123456'
...  ...

[root@ip50 ~]# cat ~/.mysql_history 
...  ...
set password for root@'localhost'=password('123456');
select user,host,password from mysql.user;
flush privileges;
...  ...
  • 解决:
  1. 管理好自己的历史,不适用明文登录,选择合适的版本
  2. 日志,行为审计
  3. 防火墙从TCP层设置ACL(禁止外网接触数据库)

Tomcat安全

(1)安装依赖环境

[root@ip50 ~]# yum -y install java-1.8.0-openjdk
[root@ip50 ~]# yum -y install java-1.8.0-openjdk-headless

(2)安装tomcat

隐藏版本信息

  • 修改tomcat主配置文件,隐藏版本信息
[root@ip50 ~]# yum -y install java-1.8.0-openjdk-devel
[root@ip50 ~]# /usr/local/tomcat/bin/shutdown.sh 
[root@ip50 ~]# cd /usr/local/tomcat/lib/
[root@ip50 lib]# jar -xf catalina.jar
[root@ip50 lib]# vim org/apache/catalina/util/ServerInfo.properties   //修改内容

修改之前
...   ....
server.info=Apache Tomcat/9.0.6
server.number=9.0.6.0
server.built=Mar 5 2018 09:34:35 UTC
...  ...

修改之后
... ...
server.info=Nginx
server.number=6.0
server.built=May 3 2013 04:20:01 UTC
... ...

[root@ip50 ~]# vim /usr/local/tomcat/conf/server.xml



[root@ip50 ~]# /usr/local/tomcat/bin/startup.sh 

测试

[root@ip50 ~]# curl -I http://192.168.4.50:8080/a.html   //头部信息
[root@ip50 ~]# curl -I http://192.168.4.50:8080   //头部信息
[root@ip50 ~]# curl  http://192.168.4.50:8080/xx   //报错页面

降权启动

  • 使用非root启动tomcat服务
[root@ip50 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@ip50 ~]# useradd tomcat
[root@ip50 ~]# chown -R tomcat:tomcat /usr/local/tomcat/
[root@ip50 ~]# su -c /usr/local/tomcat/bin/startup.sh tomcat
[root@ip50 ~]# ps aux | grep -i java
  • 开机启动
[root@ip50 ~]# chmod +x /etc/rc.local 
[root@ip50 ~]# vim /etc/rc.local   //添加如下内容

su -c /usr/local/tomcat/bin/startup.sh tomcat

删除默认的测试页面

[root@ip50 ~]# rm -rf /usr/local/tomcat/webapps/*

Linux安全之打补丁

一、补丁的原理

diff逐行比较

  • diff的原则是:
    告诉我们怎么修改第一个文件后能得到第二个文件

选项:

  • -u 输出统一内容的头部信息(打补丁使用)
  • -r 递归对比目录中的所有资源(可以对比目录)
  • -a 所有文件视为文本(包括二进制程序)
  • -N 无文件视为空文件(空文件怎么变为第二个文件)

过程概述

  1. A目录下没有txt文件,B目录下有txt文件
  2. diff比较两个目录时,默认会提示txt仅在B目录有(无法根据补丁修复A缺失的文件)
  3. diff比较时使用N选项,则diff会拿B下的空文件对比
  4. 补丁信息会明确说明如何从空文件修改后变成txt文件,打补丁即可成功

一、创建补丁文件

(1)创建一个原始脚本并写入内容

[root@ip50 ~]# mdkir /cod
[root@ip50 ~]# cd /code
[root@ip50 code]# vim hello.sh

echo "hello,world"

[root@ip50 code]# scp hello.sh [email protected]:/root/

[root@ip53 ~]# mkdir code
[root@ip53 ~]# mv hello.sh code/

(2)撰写新的修复后的文件

[root@ip50 code]# cp hello.sh hello1.sh 
[root@ip50 code]# vim hello1.sh

echo "hello,world"
echo "hello,world"
echo "hello,world"
echo "hello,world"
echo "hello,world"
echo "hello,world"
echo "hello,world"

(3)生成补丁文件

[root@ip50 code]# diff -u hello.sh hello1.sh > hello.patch
[root@ip50 code]# cat hello.patch 

-r选项

[root@ip50 code]# mkdir -p /demo/{source1,source2} //创建相应目录

(1)每个目录中创建对应的文件

[root@ip50 code]# echo "hello world" > /demo/source1/test.sh
[root@ip50 code]# echo "hello the world" > /demo/source2/test.sh
[root@ip50 code]# echo "test" > /demo/source2/tmp.txt
[root@ip50 code]# cp /bin/find /demo/source1/
[root@ip50 code]# cp /bin/find /demo/source2/
[root@ip50 code]# echo 1 >> /demo/source2/find 

(2)B主机创建对应目录

[root@ip53 ~]# mkdir -p /demo/source1

(3)A主机拷贝源码到B主机

[root@ip50 ~]# scp /demo/source1/* [email protected]:/demo/source1/

(4)生成补丁文件

[root@ip50 demo]# diff -uraN  source1/ source2/ > /root/all.patch

(5)将补丁文件发送给B主机

[root@ip50 demo]# scp /root/all.patch [email protected]:/root/

二、patch打补丁

  • 对旧版本的代码,使用补丁即可更新,而不需要下载完成的新代码(往往完整的程序很大)
  1. path -pnum指定删除补丁文件中多少层路径前缀
  2. 如原始路径是/u/howard/src/blurfl/blurfl.c
  3. -p0则表示整个路径不变
  4. -p1则修改路径为u/howard/src/blurfl/blurfl.c
  5. -p4则修改路径为blurfl/blurfl.c
  6. -R(reverse)反向修复,-E修复后如果文件为空,则删除该文件

(1)安装补丁文件

[root@ip53 ~]# yum -y install patch

(2)打补丁

[root@ip53 ~]# cd /demo/
[root@ip53 demo]# patch -p0 < /root/all.patch 
patching file source1/find
patching file source1/test.sh
patching file source1/tmp.txt

(4)还原旧版本,反向修复

[root@ip53 demo]# cd source1/
[root@ip53 source1]# patch -RE < /root/all.patch 

你可能感兴趣的:(云计算,Linux云计算)