网络安全常见中间件(mysql,redis,tomcat,nginx,apache,php)安全加固

常见中间件:mysql,redis,tomcat,nginx,apache,php
一.mysql数据库加固
1.账号配置
  • 删除不需要的数据库账号。

    • DROP USER user

  • 应按照用户分配帐号,避免不同用户间共享帐号。

2.口令安全
  • 不使用默认密码和弱密码

3.权限配置
  • 禁止MySQL以系统管理员账号权限运行,使用非管理员专用账号来运行mysql服务。

    • Windows系统

      • 直接打开任务管理器,查看运行mysql进程的操作系统账号,不能为administrator账号

    • Linux系统

      • #查看mysql服务的运行账号是否为root或其他高权限账号

      • ps -ef | grep mysql

  • 数据库账户权限配置

      #查看数据库授权情况。
      mysql> use mysql;
      mysql> select * from user;
      mysql> select * from db;
      #授予指定用户权限指定表的权限
      mysql> Grant select,insert,update,delete on tablename to ‘username’@’hostname’;

4.日志配置
  #开启错误日志审计,打开my.ini(Windows)或my.cnf(Linux),在[mysqld]下添加
  log-error="/var/log/mysqld.log"

5.访问控制
  • 修改MySQL默认端口3306。

      #打开my.ini或者my.cnf,在[mysqld]下修改
      port=3306        #修改成合适端口

  • 网络访问限制,在防火墙中做限制,只允许与指定的 IP 地址与3306端口(或MySQL数据库的指定端口)通讯。

  mysql> GRANT ALL privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option;
  mysql> flush privileges;

二.redis安全加固
1.口令配置
  • 开启redis密码,并设置高复杂度密码。

      #编辑redis.conf
      requirepass test123!@#;

2.授权管理
  • 禁止使用root启动redis,使用普通账户启动redis。

  • 限制redis文件目录访问权限。

    • $chmod 700 /var/lib/redis #redis目录

    • $chmod 600 /etc/redis/redis.conf #redis配置文件

  • 禁用或重命名危险命令。

    • #在redis.conf配置文件添加

    • rename-command CONFIG CONFIG_1 #重命名命令CONFIG为CONFIG_1

    • rename-command FLUSHDB "" #禁用此命令

3.访问控制
  • 修改默认端口6379。

    • #修改redis.conf配置文件:

    • port 5656

  • 配置redis仅监听在指定IP地址。

    • #修改redis.conf配置文件:

    • bind 127.0.0.1 192.168.1.12

三.tomcat加固
1.账号管理
  • 按照用户分配帐号。

  • 删除或锁定与设备运行、维护等工作无关的帐号。

  • 使用密码复杂度高的口令。

      #修改账号管理配置文件tomcat/conf/tomcat-users.xml
      
      #不需要要的用户可以直接删除或注释对应行
2.权限配置
  • 服务降权

    • 不使用 root 用户启动 Tomcat,使用用普通用户启动Tomcat

  • 根据用户的业务需要,配置其所需的最小权限

      #修改账号管理配置文件tomcat/conf/tomcat-users.xml,此处使用的是Tomcat8.5.47
      
      #roles的值代表用户权限
      role1:具有读权限
      tomcat:具有读和运行权限
      manager-gui:具有远程管理权限,需要自己定义该权限

  • 目录列表访问限制

      #禁止tomcat列表显示文件,修改tomcat/conf/web.xml配置文件
      
          listings
          false
      

3.日志配置
  • 配置日志功能,对用户登录进行记录。

      #修改配置文件 tomcat\conf\server.xml,此处使用的是Tomcat8.5.47
      
      #directory:日志存放目录
      #prefix:日志名称格式
      #一些pattern参数:
      %b    发送信息的字节数,不包括http头,如果字节数为0的话,显示为-
      %h    服务器的名称
      %s    http的响应状态码
      %t    请求时间
      %l  记录浏览者进行身份验证时提供的名字
      %u    得到了验证的访问者,否则就是"-"

4.其他配置
  • 删除默认文档和实例程序

    • 打开tomcat_home/webapps文件夹,删除默认存在docs和examples文件夹

  • 隐藏Tomcat版本信息

    • 使用解压软件打开 Tomcat目录下的lib\catalina.jar

    • 打开catalina.jar中 org\apache\catalina\util 下的 ServerInfo.properties 文件

    • 打开该文件,将server.info参数值更改为NO VERSION,重启Tomcat即可生效

  • 修改默认端口8080

    • #修改配置文件 tomcat\conf\server.xml
      
      #port:为tomcat服务端口
      #redirectPort:当用户使用http请求设置了必须要https方式访问的资源,此时会自动重定向到该端口
      #connectionTimeout:超时时间,默认为20000毫秒
四.nginx安全加固
1.权限配置
  • 禁止目录浏览

    • #编辑nginx.conf配置文件,在http模块下添加

    • autoindex off;

  • 限制HTTP请求方法

      #编辑nginx.conf配置文件,在http模块下添加
      if ($request_method !~ ^(GET|HEAD|POST)$ ) {
      return 444;
      }
  • 限制目录执行权限

      #编辑nginx.conf配置文件,在server模块下添加
      location ~ /(attachments|upload)/.*\.(php|php5)?$ {
      deny all;
      }
      #此处禁止在attachments与upload目录下执行php
      #此处配置代码需要放到 location ~ .php{...}上面

  • Nginx降权。

    • 编辑nginx.conf配置文件,取消 “user nobody;”该行注释。

2.日志配置
  • 开启日志,并设置日志格式

     #编辑nginx.conf配置文件,在http模块下取消以下代码的注释
      #设置日志格式
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' 
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
      #开启日志,并指定存放路径与日志格式
      access_log  logs/access.log  main; 
      #日志格式参数:
      $remote_addr与$http_x_forwarded_for 用以记录客户端的ip地址;
      $remote_user          用来记录客户端用户名称;
      $time_local         用来记录访问时间与时区; 
      $request              用来记录请求的url与http协议;
      $status              用来记录请求状态;成功是200,
      $body_bytes_s ent      记录发送给客户端文件主体内容大小;
      $http_referer        用来记录从那个页面链接访问过来的;
      $http_user_agent    记录客户毒啊浏览器的相关信息;

3.其他配置
  • 隐藏版本信息

    • #编辑nginx.conf配置文件,在HTTP模块添加

    • server_tokens off;

  • 补丁更新,根据nginx版本安装补丁或更新版本。

    • 查看软件版本 nginx -v

    • 测试配置文件 nginx –t

五.apache安全加固
1.日志配置
  • 错误日志配置

      #打开httpd.conf文件,确认错误日志开启,并设置好存放路径
      ErrorLog "logs/error.log"
      LogLevel warn                #设置日志的级别
  • 访问日志配置

      #打开httpd.conf文件,确认访问日志开启,并设置好日志格式、存放路径
      
           LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
          CustomLog "logs/access.log" combined
      
      #日志参数
      %b  客户端响应的大小(以字节为单位)
      %h    远端主机
      %r    来自客户端的请求行
      %l    远端登录名
      %>s 是从服务器发送到客户端的状态代码(500,404等)
      Referer 是链接到此URL的页面

2.权限配置
  • 不要使用管理员账户运行Apache服务,以专门的用户帐号和用户组运行。

      #为 Apache 服务创建用户及用户组,并在配置文件http.conf中进行指定
      User apache的用户
      Group apache的用户组
  • 设置配置文件和日志文件的权限,防止未授权访问。

      chmod 600 /etc/httpd/conf/httpd.conf #设置配置文件为属主可读写,其他用户无读写权限。
      chmod 644 /var/log/httpd/*.log #设置日志文件为属主可读写,其他用户拥有只读权限。
  • 禁止目录列出。

      #修改配置文件http.conf,找到指定目录进行如下设置
       
          #Options Indexes FollowSymLinks #删掉Indexes
          Options FollowSymLinks    
      
  • 忽略.htaccess 文件

      #修改配置文件http.conf,找到指定目录进行如下设置
       
          AllowOverride None
      
  • 禁止访问外部文件

      #修改配置文件http.conf,找到指定目录进行如下设置
       
          Order Deny,Allow 
          Deny from all
      
  • 限制请求消息长度

    • LimitRequestBody 5120000 #单位为byte

3.其他配置
  • 拒绝服务防范,进行超时设置

      #查看httpd.conf配置文件,确保httpd-default.conf启用
      Include "conf/extra/httpd-default.conf"
      #配置apache\conf\extra\httpd-default.conf
      Timeout 30              #客户端与服务器端建立连接前的时间间隔
      KeepAlive On          #开启可以提高性能,保持连接
      KeepAliveTimeout 15  #限制每个 session 的保持时间是 15 秒
  • 隐藏 Apache 的版本号及其它敏感信息

      #在httpd.conf配置文件中添加
      ServerSignature Off 
      ServerTokens Prod

六.php安全加固
  • 说明:本文件中所有的配置选项无特殊说明,均为系统的php.ini文件。由于可能各个系统使用的PHP版本不一样,PHP的默认选项也可能不一样,为方便操作,要求所有检查的配置项必须在配置文件中明确写出。

1.检查的配置项
  • 启用PHP安全模式

    safe_mode = On

  • 或者修改httpd.conf,定义目录:

    php_admin_value safe_mode 1

  • 启用safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数。所有操作文件的函数将只能操作与脚本UID相同的文件。能在很大程度上提高PHP应用的安全性。

2.用户组安全
  • 当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。

  • 建议设置为:safe_mode_gid = off

3.关闭注册全局变量
  • register_globals = Off

  • PHP默认register_globals = On,对于GET, POST, Cookie, Environment, Session的变量可以直接注册成全局变量。它们的注册顺序是variables_order = "EGPCS"(可以通过php.ini修改),同名变量variables_order右边的覆盖左边,所以变量的滥用极易造成程序的混乱。

  • 攻击者能通过提交数据来给PHP应用中的未初始化变量赋值,改变代码逻辑,产生安全问题。

4.关闭远程文件操作(allow_url_fopen = On allow_url_include = Off 业务需求)
  • allow_url_fopen = Off

  • allow_url_include=Off

  • PHP的远程文件包含和远程文件操作功能在通常的应用中都不会用到,如果PHP代码在文件操作或是文件包含的时候对其变量不作严格的检查,攻击者就可以通过改变这些变量的值来包含远程机器上的恶意文件,并在WEB服务器上运行任意代码。

5.打开引号转义
  • magic_quotes_gpc = On

  • 如果PHP代码中没有对用户输入数据中的特殊字符作过滤就直接用于构造SQL查询串,将产生SQL注入漏洞。

  • 该选项使得从GET, POST, COOKIE来的变量自动加了addslashes()操作,对输入字符串中的单引号,双引号,括号会进行转义操作,虽不能通过打开这个选项来完全解决 SQL注入问题,但能在一定程度上加大注入的难度。

6.建议配置项
  • 禁止显示警告和错误信息

    修改php.ini中关于Error handling and logging部分内容:
    ​
    error_reporting = E_ALL
    ​
    display_errors = Off
    ​
    log_errors = On
    ​
    error_log = /usr/local/apache/logs/php_error.log
    ​
    关掉PHP的错误信息显示,并把PHP的所有警告及错误信息记录到一个日志文件是非常明智的,即不给攻击者泄漏物理路径,又能知道程序错误所在。
  • 限制PHP能操作的文件目录(不满足,由于未启用安全模式)

    open_basedir =/var/www/
    ​
    ​
    限制PHP代码中文件操作函数能操作的目录,防止代码中的错误或是受到攻击时能破坏的文件范围。建议根据具体使用要求,进一步细化配置值。
  • 禁止动态加载模块

    enable_dl=off
    ​
    动态加载模块功能可能会被用于加载一些外部模块来突破PHP本身的一些安全限制。
    ​
    如果没有动态动态加载模块的需求,建议关闭这个选项。
  • 禁止部分函数和类

    设置php.ini里的disable_functions(这个选项不能在httpd.conf里设置)
    ​
    禁用方法如下:
    ​
    打开php.ini文件,
    ​
    查找到 disable_functions ,添加需禁用的函数名,如下:
    ​
    phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
    ​
    phpinfo()
    ​
    功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。
    ​
    危险等级:中
    ​
    passthru()
    ​
    功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
    ​
    危险等级:高
    ​
    exec()
    ​
    功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
    ​
    危险等级:高
    ​
    system()
    ​
    功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
    ​
    危险等级:高
    ​
    chroot()
    ​
    功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式
    ​
    PHP 时才能工作,且该函数不适用于 Windows 系统。
    ​
    危险等级:高
    ​
    scandir()
    ​
    功能描述:列出指定路径中的文件和目录。
    ​
    危险等级:中
    ​
    chgrp()
    ​
    功能描述:改变文件或目录所属的用户组。
    ​
    危险等级:高
    ​
    chown()
    ​
    功能描述:改变文件或目录的所有者。
    ​
    危险等级:高
    ​
    shell_exec()
    ​
    功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
    ​
    危险等级:高
    ​
    proc_open()
    ​
    功能描述:执行一个命令并打开文件指针用于读取以及写入。
    ​
    危险等级:高
    ​
    proc_get_status()
    ​
    功能描述:获取使用 proc_open() 所打开进程的信息。
    ​
    危险等级:高
    ​
    error_log()
    ​
    功能描述:将错误信息发送到指定位置(文件)。
    ​
    安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,
    ​
    执行任意命令。
    ​
    危险等级:低
    ​
    ini_alter()
    ​
    功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。
    ​
    具体参见 ini_set()。
    ​
    危险等级:高
    ​
    ini_set()
    ​
    功能描述:可用于修改、设置 PHP 环境配置参数。
    ​
    危险等级:高
    ​
    ini_restore()
    ​
    功能描述:可用于恢复 PHP 环境配置参数到其初始值。
    ​
    危险等级:高
    ​
    dl()
    ​
    功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
    ​
    危险等级:高
    ​
    pfsockopen()
    ​
    功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。
    ​
    危险等级:高
    ​
    syslog()
    ​
    功能描述:可调用 UNIX 系统的系统层 syslog() 函数。
    ​
    危险等级:中
    ​
    readlink()
    ​
    功能描述:返回符号连接指向的目标文件内容。
    ​
    危险等级:中
    ​
    symlink()
    ​
    功能描述:在 UNIX 系统中建立一个符号链接。
    ​
    危险等级:高
    ​
    popen()
    ​
    功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。
    ​
    危险等级:高
    ​
    stream_socket_server()
    ​
    功能描述:建立一个 Internet 或 UNIX 服务器连接。
    ​
    危险等级:中
    ​
    putenv()
    ​
    功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数
    ​
    修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。
    ​
    危险等级:高
7.安全模式限制函数
  • 函数名 限制
    ​
    dbmopen() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    dbase_open() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    filepro() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    filepro_rowcount() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    filepro_retrieve() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    ifx_* sql_safe_mode 限制, (!= safe mode)
    ​
    ingres_* sql_safe_mode 限制, (!= safe mode)
    ​
    mysql_* sql_safe_mode 限制, (!= safe mode)
    ​
    pg_loimport() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    posix_mkfifo() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    putenv() 遵循 ini 设置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的有关文档。
    ​
    move_uploaded_file() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    chdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    dl() 本函数在安全模式下被禁用。
    ​
    backtick operator 本函数在安全模式下被禁用。
    ​
    shell_exec()(在功能上和 backticks 函数相同) 本函数在安全模式下被禁用。
    ​
    exec() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
    ​
    system() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
    ​
    passthru() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
    ​
    popen() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
    ​
    fopen() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    mkdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    rmdir() 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    rename() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    unlink() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    copy() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (on source and target)
    ​
    chgrp() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    chown() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    chmod() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 另外,不能设置 SUID、SGID 和 sticky bits
    ​
    touch() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。
    ​
    symlink() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
    ​
    link() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
    ​
    apache_request_headers() 在安全模式下,以“authorization”(区分大小写)开头的标头将不会被返回。
    ​
    header() 在安全模式下,如果设置了 WWW-Authenticate,当前脚本的 uid 将被添加到该标头的 realm 部分。
    ​
    PHP_AUTH 变量 在安全模式下,变量 PHP_AUTH_USER、PHP_AUTH_PW 和 PHP_AUTH_TYPE 在 $_SERVER 中不可用。但无论如何,您仍然可以使用 REMOTE_USER 来获取用户名称(USER)。(注意:仅 PHP 4.3.0 以后有效)
    ​
    highlight_file(), show_source() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1 版本后有效)
    ​
    parse_ini_file() 检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1 版本后有效)
    ​
    set_time_limit() 在安全模式下不起作用。
    ​
    max_execution_time 在安全模式下不起作用。
    ​
    mail() 在安全模式下,第五个参数被屏蔽。(注意,仅自 PHP 4.2.3 起受影响)

你可能感兴趣的:(中间件,安全)