删除不需要的数据库账号。
DROP USER user
应按照用户分配帐号,避免不同用户间共享帐号。
不使用默认密码和弱密码
禁止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’;
#开启错误日志审计,打开my.ini(Windows)或my.cnf(Linux),在[mysqld]下添加 log-error="/var/log/mysqld.log"
修改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密码,并设置高复杂度密码。
#编辑redis.conf requirepass test123!@#;
禁止使用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 "" #禁用此命令
修改默认端口6379。
#修改redis.conf配置文件:
port 5656
配置redis仅监听在指定IP地址。
#修改redis.conf配置文件:
bind 127.0.0.1 192.168.1.12
按照用户分配帐号。
删除或锁定与设备运行、维护等工作无关的帐号。
使用密码复杂度高的口令。
#修改账号管理配置文件tomcat/conf/tomcat-users.xml#不需要要的用户可以直接删除或注释对应行
服务降权
不使用 root 用户启动 Tomcat,使用用普通用户启动Tomcat
根据用户的业务需要,配置其所需的最小权限
#修改账号管理配置文件tomcat/conf/tomcat-users.xml,此处使用的是Tomcat8.5.47#roles的值代表用户权限 role1:具有读权限 tomcat:具有读和运行权限 manager-gui:具有远程管理权限,需要自己定义该权限
目录列表访问限制
#禁止tomcat列表显示文件,修改tomcat/conf/web.xml配置文件listings false
配置日志功能,对用户登录进行记录。
#修改配置文件 tomcat\conf\server.xml,此处使用的是Tomcat8.5.47#directory:日志存放目录 #prefix:日志名称格式 #一些pattern参数: %b 发送信息的字节数,不包括http头,如果字节数为0的话,显示为- %h 服务器的名称 %s http的响应状态码 %t 请求时间 %l 记录浏览者进行身份验证时提供的名字 %u 得到了验证的访问者,否则就是"-"
删除默认文档和实例程序
打开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.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;”该行注释。
开启日志,并设置日志格式
#编辑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 记录客户毒啊浏览器的相关信息;
隐藏版本信息
#编辑nginx.conf配置文件,在HTTP模块添加
server_tokens off;
补丁更新,根据nginx版本安装补丁或更新版本。
查看软件版本 nginx -v
测试配置文件 nginx –t
错误日志配置
#打开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的页面
不要使用管理员账户运行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
拒绝服务防范,进行超时设置
#查看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.ini文件。由于可能各个系统使用的PHP版本不一样,PHP的默认选项也可能不一样,为方便操作,要求所有检查的配置项必须在配置文件中明确写出。
启用PHP安全模式
safe_mode = On
或者修改httpd.conf,定义目录:
php_admin_value safe_mode 1
启用safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数。所有操作文件的函数将只能操作与脚本UID相同的文件。能在很大程度上提高PHP应用的安全性。
当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。
建议设置为:safe_mode_gid = off
register_globals = Off
PHP默认register_globals = On,对于GET, POST, Cookie, Environment, Session的变量可以直接注册成全局变量。它们的注册顺序是variables_order = "EGPCS"(可以通过php.ini修改),同名变量variables_order右边的覆盖左边,所以变量的滥用极易造成程序的混乱。
攻击者能通过提交数据来给PHP应用中的未初始化变量赋值,改变代码逻辑,产生安全问题。
allow_url_fopen = Off
allow_url_include=Off
PHP的远程文件包含和远程文件操作功能在通常的应用中都不会用到,如果PHP代码在文件操作或是文件包含的时候对其变量不作严格的检查,攻击者就可以通过改变这些变量的值来包含远程机器上的恶意文件,并在WEB服务器上运行任意代码。
magic_quotes_gpc = On
如果PHP代码中没有对用户输入数据中的特殊字符作过滤就直接用于构造SQL查询串,将产生SQL注入漏洞。
该选项使得从GET, POST, COOKIE来的变量自动加了addslashes()操作,对输入字符串中的单引号,双引号,括号会进行转义操作,虽不能通过打开这个选项来完全解决 SQL注入问题,但能在一定程度上加大注入的难度。
禁止显示警告和错误信息
修改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 命令。 危险等级:高
函数名 限制 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 起受影响)