安全加固(对Windows系统虚拟机、Linux系统虚拟机、nginx配置、php 5.4配置等的加固)

Windows系统虚拟机的加固

0. Windows配置的途径

组策略(gpedit.msc

命令(cmdpowershell中执行,或者编写batps文件执行)

注册表(regedit

配置文件(位置和文件名各不相同)

1. 账户管理和认证授权

1.1 账户

1.1.1 默认账户安全

禁用 Guest 账户。

禁用或删除其他无用账户(建议先禁用账户三个月,待确认没有问题后删除。)

操作步骤:

  打开 控制面板 > 管理工具 > 计算机管理,在 系统工具 > 本地用户和组 > 用户 中,双击 Guest 帐户,在属性中选中 帐户已禁用,单击 确定。

 

1.1.2 定期检查并删除与无关帐户

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

操作步骤:

  打开 控制面板 > 管理工具 > 计算机管理,在 系统工具 > 本地用户和组 中,删除或锁定与设备运行、维护等与工作无关的帐户。

 

1.1.3 不显示最后的用户名

配置登录登出后,不显示用户名称。

操作步骤:

  打开 控制面板 > 管理工具 > 本地安全策略,在 本地策略 > 安全选项 中,双击 交互式登录:不显示最后的用户名,选择 已启用 并单击 确定。

 

1.2 口令

1.2.1 密码复杂度

密码复杂度要求必须满足以下策略:

  最短密码长度要求八个字符。

启用本机组策略中密码必须符合复杂性要求的策略,即密码至少包含以下四种类别的字符中的两种:

英语大写字母 A, B, C, Z

英语小写字母 a, b, c, z

西方阿拉伯数字 0, 1, 2, 9

非字母数字字符,如标点符号,@, #, $, %, &, * 等。

操作步骤:

  打开 控制面板 > 管理工具 > 本地安全策略,在 帐户策略 > 密码策略 中,确认 密码必须符合复杂性要求 策略已启用。

 

1.2.2 密码最长留存期

对于采用静态口令认证技术的设备,帐户口令的留存期不应长于 90 天。

操作步骤:

  打开控制面板 > 管理工具 > 本地安全策略,在 帐户策略 > 密码策略 中,配置 密码最长使用期限 不大于 90 天。

 

1.2.3 帐户锁定策略

  对于采用静态口令认证技术的设备,应配置当用户连续认证失败次数超过 10 次后,锁定该用户使用的帐户。

操作步骤:

  打开 控制面板 > 管理工具 > 本地安全策略,在 帐户策略 > 帐户锁定策略 中,配置 帐户锁定阈值 不大于 10 次。

 

1.3 授权

1.3.1 远程关机

  在本地安全设置中,从远端系统强制关机权限只分配给 Administrators 组。

操作步骤:

  打开 控制面板 > 管理工具 > 本地安全策略,在 本地策略 > 用户权限分配 中,配置 从远端系统强制关机 权限只分配给 Administrators 组。

 

 

1.3.2 本地关机

  在本地安全设置中关闭系统权限只分配给 Administrators 组。

操作步骤:

  打开 控制面板 > 管理工具 > 本地安全策略,在 本地策略 > 用户权限分配 中,配置 关闭系统 权限只分配给 Administrators 组。

 

2. 日志配置操作

2.1 日志配置

 

3. 文件权限

3.1 共享文件夹及访问权限

 

4. 服务安全

4.1 禁用 TCP/IP 上的 NetBIOS

4.2 禁用不必要的服务

 

5. 安全选项

5.1 启用安全选项

5.2 禁用未登录前关机

 

6. 其他安全配置

6.1 防病毒管理

6.2 设置屏幕保护密码和开启时间

6.3 限制远程登录空闲断开时间

6.4 操作系统补丁管理

6.5 开启本地防火墙

 

Linux系统虚拟机的加固

1. 账号和口令

1.1 禁用或删除无用账号

1.2 检查特殊账号

  检查是否存在空口令和 root 权限的账号。

操作步骤:

查看空口令和 root 权限账号,确认是否存在异常账号:

使用命令 awk -F: '($2=="")' /etc/shadow 查看空口令账号

使用命令 awk -F: '($3==0)' /etc/passwd 查看 UID 为零的账号。

加固空口令账号:

使用命令 passwd <用户名> 为空口令账号设定密码

确认 UID 为零的账号只有 root 账号。

 

1.3 添加口令策略

  加强口令的复杂度等,降低被猜解的可能性。

操作步骤:

·使用命令 vi /etc/login.defs 修改配置文件。

PASS_MAX_DAYS 90 #新建用户的密码最长使用天数

PASS_MIN_DAYS 0 #新建用户的密码最短使用天数

PASS_WARN_AGE 7 #新建用户的密码到期提前提醒天数

 

·使用 chage 命令修改用户设置。

例如,chage -m 0 -M 30 -E 2000-01-01 -W 7 <用户名>表示将此用户的密码最长使用天数设为 30,最短使用天数设为 0,密码 2000 1 1 日过期,过期前七天警告用户。

  ·设置连续输错三次密码,账号锁定五分钟。使用命令 vi /etc/pam.d/common-auth修改配置文件,在配置文件中添加 auth required pam_tally.so onerr=fail deny=3 unlock_time=300

 

1.4 限制用户 su

  限制能 su root 的用户。

操作步骤:

  使用命令 vi /etc/pam.d/su修改配置文件,在配置文件中添加行。例如,只允许 test 组用户 su root,则添加 auth required pam_wheel.so group=test

 

 

1.5 禁止 root 用户通过ssh直接登录

  限制 root 用户直接登录。

操作步骤:

  ·创建普通权限账号并配置密码, 防止无法远程登录;

  ·使用命令 vi /etc/ssh/sshd_config修改配置文件将 PermitRootLogin 的值改成 no,并保存,然后使用service sshd restart重启服务

  ·配置文件将 PermitRootLogin 的值改成 no

 

·重启服务。

2. 服务

2.1 关闭不必要的服务

  关闭不必要的服务(如普通服务和 xinetd 服务),降低风险。

操作步骤:

  ·使用命令systemctl list-units --type=service查看开启的服务;

 

  ·使用命令systemctl disable <服务名>设置服务在开机时不自动启动

 

2.2 SSH 服务安全

  对 SSH 服务进行安全加固,防止暴力破解成功。

操作步骤:

·使用命令 vim /etc/ssh/sshd_config 编辑配置文件

·不允许 root 账号直接登录系统

·设置 PermitRootLogin 的值为 no

·修改 SSH 使用的协议版本

·设置 Protocol 的版本为 2

·修改允许密码错误次数(默认 6 次)

·设置 MaxAuthTries 的值为 3

 

 

配置文件修改完成后,重启 sshd 服务生效。

 

 

3. 文件系统

3.1 设置 umask

  设置默认的 umask 值,增强安全性。

操作步骤:

  ·使用命令 vi /etc/profile 修改配置文件,添加行 umask 027, 即新创建的文件属主拥有读写执行权限,同组用户拥有读和执行权限,其他用户无权限

 

3.2 设置登录超时

 

4. 日志

4.1 syslogd 日志

  启用日志功能,并配置日志记录。

  对于大多数现代 Linux 发行版,systemd-journald 是默认的日志服务。可通过以下命令检查systemd-journald 服务状态——systemctl status systemd-journald

 

 

  如果服务未运行,可以使用以下命令启用:

 

  可以通过编辑配置文件来配置日志记录策略,在 /etc/rsyslog.conf 文件中,可以指定日志级别和输出位置,配置好后重启服务并检查其服务状态。

 

 

4.2 记录所有用户的登录和操作日志

 

nginx(一种网站中间件)配置进行加固

  修改前都要备份文件:

 

1 日志配置

 1、备份nginx.conf 配置文件修改配置,按如下设置日志记录文件、记录内容、记录格式,添加标签为mainlog_format格式(http标签内,在所有的server标签内可以调用)

 2server标签内,定义日志路径

 3保存,然后重启nginx服务。

 4、浏览网站后会在日志中出现。

 

2 禁止目录浏览

 1备份nginx.conf配置文件编辑配置文件,HTTP模块添加如下一行内容:

 

 2保存,然后重启nginx服务。

更改前:

更改后:

 

3 限制目录执行权限

  1备份nginx.conf配置文件。

  2编辑配置文件,在server标签内添加如下内容:

 3保存,然后重启nginx服务。

需要注意两点:

  1、以上的配置文件代码需要放到 location ~ .php{...}上面,如果放到下面是无效的;

  2attachments需要写相对路径,不能写绝对路径。

更改前:

更改后:

 

4 错误页面重定向(忽略)

 

5 最佳经验实践

5.1 隐藏版本信息

  1备份nginx.conf配置文件。

  2编辑配置文件,添加http模块中如下一行内容:

 

  3、保存,然后重启nginx服务

更改前:

更改后:

5.2 限制HTTP请求方法

  1、备份nginx.conf配置文件。

  2、编辑配置文件,添加如下内容:

 

  3、保存,然后后重启nginx服务。

更改前:

更改后:

 

5.3 限制IP访问

  1、备份nginx.conf配置文件。

  2、编辑配置文件,在server标签内添加如下内容:

 

 

  3、保存,然后后重启nginx服务。
更改前:

 

更改后:

 

 

5.4 限制并发和速度

  1、备份nginx.conf配置文件。

  2、编辑配置文件,在server标签内添加如下内容:

  3、保存,然后后重启nginx服务。
·创建一个简单的 PHP 脚本,用于测试并发连接。保存以下代码为 test.php

 

·限制并发前,打开两个测试服务时可同时执行:

 

·限制并发后,当我们打开两个测试服务时,第一个等待执行,第二个将报错:

 

5.5 控制超时时间

 

6 风险操作项

6.1 Nginx降权

  1、备份nginx.conf配置文件。

  2、编辑配置文件,添加如下一行内容:

 

  3、保存,然后后重启nginx服务。    

6.2 防盗链

6.3 补丁更新

php 5.4配置进行加固

1.PHP 基线检查及加固概述

  PHP 的安检和加固项通常在 php.ini 的配置文件中进行配置。

 

2.启用 PHP 的安全模式

  注意: PHP <=5.2 环境适用的安全模式是一个非常重要的内嵌安全机制,PHP 安全模式能有效控制一些 PHP 环境中的函数(例如 system()函数),对大部分的文件操作函数进行权限控制,同时不允许对某些关键文件进行修改(例如 /etc/passwd)。但是,默认的 php.ini 配置文件并没有启用安全模式。

  可以通过修改 php.ini 配置文件启用 PHP 安全模式:safe_mode = on,如下图

 

 

更改前:

 

更改后:

 

3.控制 PHP 脚本能访问的目录

  使用 open_basedir 选项能够控制 PHP 脚本只能访问指定的目录,这样能够避免 PHP 本访问不应该访问的文件,一定程度下降低了 phpshell 的危害。一般情况下,可以设置为只能访问网站目录:open_basedir = "/var/www/html:/tmp"

 

4.关闭危险函数

  如果启用了安全模式,那么可以不需要设置函数禁止,但为了安全考虑,还是建议进行相关设置。例如,你不希望执行包括 system()等在内的执行命令的 PHP 函数,以及能够查看 PHP 信息的 phpinfo()等函数,那么您可以通过以下设置禁止这些函数:

disable_functions = system, passthru, exec, shell_exec, popen, phpinfo,

escapeshellarg, escapeshellcmd, proc_close, proc_open, dl

 

 

  如果您想要禁止对于任何文件和目录的操作,那么您可以关闭以下文件相关操作。

disable_functions = chdir, chroot, dir, getcwd, opendir, readdir, scandir, fopen,

unlink, delete, copy, mkdir, rmdir, rename, file, file_get_contents, fputs, fwrite,

chgrp,chmod, chown

 

  注意: 以上设置中只列举了部分比较常用的文件处理函数,您也可以将上面的执行命令函数和这些文件处理函数相结合,就能给抵制大部分的 phpshell 威胁。

  更改前,可以使用包括phpinfo();等函数:

 

更改后则无法使用:

 

5.关闭 PHP 版本信息在 HTTP 头中的泄露

  为了防止黑客获取服务器中 PHP 版本的信息,您可以禁止该信息在 HTTP 头部内容中泄露:

expose_php = off

 

  这样设置之后,黑客在执行 telnet <domain> 80 尝试连接您的服务器的时候,将无法看到 PHP 的版本信息。

  更改前可以通过抓包看到PHP的版本信息:

 

  更改后则看不到:

 

6.关闭注册全局变量

  注意: PHP < = 5.2 适用

  在 PHP 环境中提交的变量,包括使用 POST 或者 GET 命令提交的变量,都将自动注册为全局变量,能够被直接访问。这对您的服务器是非常不安全的,因此建议将注册全局变量的选项关闭,禁止将所提交的变量注册为全局变量。

register_globals = off

 

  当然,如果这样设置之后,获取对应变量的时候就需要采取合理方式。例如,获取 GET 令提交的变量 var,就需要使用$_GET['var']命令来进行获取,在进行 PHP 程序设计时需要注意。

 

7.SQL 注入防护

  注意: PHP <= 5.3.0

  SQL 注入是一个非常危险的问题,小则造成网站后台被入侵,重则导致整个服务器沦陷。

  magic_quotes_gpc 选项默认是关闭的。如果打开该选项,PHP 将自动把用户提交对SQL 查询的请求进行转换(例如,把 ’ 转换为 \’ 等),这对于防止 SQL 注入攻击有很大作用,因此建议您将该选项设置为:

magic_quotes_gpc = on

 

  创建一个简单的 PHP 脚本来演示 magic_quotes_gpc 的效果。保存以下代码为 test_magic_quotes.php

 

启用前,数据原封不动地被注入:

 

更改后,数据被转义,一定程度上防止了SQL注入:

 

8.错误信息控制

  一般 PHP 环境在没有连接到数据库或者其他情况下会有错误提示信息,错误信息中可能包含 PHP 脚本当前的路径信息或者查询的 SQL 语句等信息,这类信息如果暴露给黑客是不安全的,因此建议禁止该错误提示:

display_errors = Off

 

  创建一个简单的 PHP 脚本来演示错误显示和错误报告的效果。保存以下代码为 test_errors.php


  打开错误提示信息设置时,会显示错误报告级别:

 

  关闭错误提示信息时,不显示错误报告级别:

 

  如果您确实要显示错误信息,一定要设置显示错误信息的级别。例如,只显示警告以上的错误信息:

error_reporting = E_WARNING & E_ERROR

 

设置后如下:

注意: 强烈建议关闭错误提示信息。

 

9.错误日志

  建议在关闭错误提示信息后,对于错误信息进行记录,便于排查服务器运行异常的原因:

log_errors = On

 

  同时,需要设置错误日志存放的目录,建议您将 PHP 错误日志与 Apache 的日志存放在同一目录下:

error_log = /usr/local/apache2/logs/php_error.log

 

  注意: 该文件必须设置允许 Apache 用户或用户组具有写的权限对mysql服务进行配置,实现用户的权限限制。

要求:

1. 新建一个db_web1数据库,新建一个user_web1用户,让user_web1拥有db_web1的所有权限;

2. 限制user_web1只能从本地登录;


验证:

1.查看 user_web1 的权限,很明显,他拥有db_web1的所有权限;

 

 

2.尝试远程登录:用物理机远程登录,发现无法登录


   而在本机上可以登录,由此证明user_web1只能从本地登录。

 

 

 

  3.检查 MySQL 用户表:登录 MySQL 后,查询 mysql.user 表,检查 user_web1 的主机设置。这将显示 user_web1 的用户名和对应的主机。确保 Host 列显示为 localhost

 

   到此,我们可以确定mysql服务实现了用户的权限限制。

posted @ 2025-05-10 14:26  Antoniiiia  阅读(54)  评论(0)    收藏  举报