安全防护方面的总结

472 阅读2分钟

基础环境

  • 宝塔centos7(阿里云ecs)
  • mysql 5.6(阿里云rds)
  • PHP7.0(ThinkPHP5.0)
  • redis6.0
  • jdk1.8

图片文件目录禁止PHP脚本执行

  • 统计站点下的图片文件目录
  • 编写NGINX配置项
    location ~ public/Upload/(.*).(php)$ {
    	return 403;
    }
    
  • 复制粘贴到宝塔上,网站->选择站点->设置->配置文件,将上面的代码粘贴到上面“#PHP-INFO-START PHP引用配置,可以注释或修改”之上

PHP基础设置

  • 高危函数

    apache_setenv
    chgrp
    chown
    chroot
    dl
    eval
    exec
    imap_open
    ini_alter
    ini_restore
    openlog
    passthru
    pcntl_alarm
    pcntl_exec
    pcntl_exec
    pcntl_fork
    pcntl_get_last_error
    pcntl_getpriority
    pcntl_setpriority
    pcntl_signal
    pcntl_signal_dispatch
    pcntl_sigprocmask
    pcntl_sigtimedwait
    pcntl_sigwaitinfo
    pcntl_strerror
    pcntl_wait
    pcntl_waitpid
    pcntl_wexitstatus
    pcntl_wifcontinued
    pcntl_wifexited
    pcntl_wifsignaled
    pcntl_wifstopped
    pcntl_wstopsig
    pcntl_wtermsig
    phpinfo
    popen
    popepassthru
    proc_open
    putenv
    readlink
    shell_exec
    symlink
    syslog
    system
    
  • 是否输出详细错误信息 display_errors=false

站点访问日志配置

  • 网站->选择站点->设置->配置文件中access_log/error_log后面的log文件存储目录修改为数据盘目录
  • 日志分割
    • 计划任务->新增任务
    • 任务类型:日志分割
    • 执行周期:每天 0点 00分
    • 切割网站:所有
    • 保留最新:>=180份

PHP系统后台上传图片限制

  • 接收的文件,断言文件类型必须是可接收的图片类型 png、jpg、jpeg、webp
  • 优先上传到OSS上,上传完成后删除本地文件

增加站点目录文件监控-inotifywait

  • 安装 yum install inotify-tools -y
  • shell脚本
    #!/bin/bash
    filePath=/mnt/wwwroot/xxx.com
    # exclude后面的括号内为忽略的文件:日志图片和tp框架的runtime文件夹
    
    inotifywait -mrq --exclude '(.*/*\.log|.*/*\.txt|.*/*\.jpg|.*/*\.png|^$filePath/(runtime.*))' --timefmt '%y/%m/%d %H:%M' --format '%T %w%f %e' -e move,attrib $filePath/ | while read date time file event
    do
    case  $event  in
        ATTRIB|CREATE)
            echo  'attrib'
            echo  $file
    		# 如果是PHP文件则移动到shell脚本所在的目录
            if [ "${file##*.}"x = "php"x ];then
    	        # rm -rf $file
    	        # mv $file aaa.del
            	mv $file aaa.del
            fi
            ;;
        MOVED_TO)
            echo  'move'
            echo  $file
    		# 如果是PHP文件则移动到shell脚本所在的目录
            if [ "${file##*.}"x = "php"x ];then
    	        # rm -rf $file
    	        # mv $file aaa.del
            	mv $file aaa.del
            fi
            ;;
        *)
            echo 'other'
            echo  $file
            ;;
    esac
    done
    
  • 将该shell脚本权限设置为744
  • 启动该shell脚本
    nohup /mnt/wwwroot/script.xxx.com/xxx_change.sh &
    
  • 在项目启动目录下会生成一个nohup.out文件,记录的有监控到的文件日志

服务器端口

  • 22-远程连接
  • 80-http
  • 443-https
  • 8888-宝塔面板,建议更换
  • 3306-mysql,建议使用云数据库,关闭服务器的3306端口
  • 21-ftp,建议使用git的webhook方式或者docker等方式更新代码
  • 其他端口在安全->防火墙菜单中挨个关闭,尤其是不清楚在哪里使用的端口必须关闭

阿里云

  • AccessKey
    • 禁止使用主账号的AK
    • 使用子账号单独设置权限,一般主要是具备管理短信服务和管理对象存储服务
    • 禁止存储到程序中,尤其是程序公开到了GitHub等网站中
  • 云安全中心
    • 绑定手机号,关注阿里云的产品短信通知
    • 安全警告处理菜单的中高危提示要优先处理(ECS异地登录、发现后门文件等)
    • 漏洞修复和基线检查菜单中的按安全等级抽空修复
    • AK泄漏检测菜单中的要第一时间关注

云数据库RDS

  • 账号权限设置
    • 按业务模块创建账号
    • 按表给账号相应的应该有的权限(最小化)
    • 例如,A账号拥有user表的访问权限,而user表在系统中是不能删除的,那就要把user表的delete、drop权限去掉
    • 例如,交易记录表在系统中是不能被删除、更新的,那就要在所有账号的权限中把交易记录表的delete、drop、update权限去掉
  • 安全组设置
    • 模式切换为高安全白名单模式
    • 新增服务器安全组,网络隔离模式为专有网络
    • 新增本地开发组,网络隔离模式为经典网络及外网地址
  • sql洞察,开通后可查看所有的sql执行记录