0x00 任务

任务目标: 准备学习环境, 学习 web 服务器的搭建过程, 并做相应的加固学习

操作系统: 虚拟机 ubuntu 18.04

推荐环境: linux+nginx+php-fpm+mysql(为后续搭建 nginx+lua 的 waf 做准备, 不可以使用集成好的环境)

报告要求: 将整个环境的搭建过程进行详细记录, 收集网络上的加固文档, 学习加固技术, 从而思考不加固可能存在的安全问题, 对于加固的过程以及对于安全的思考都需要做详细的记录。

最终目标: 能够运行 php 代码并且可以使用 php 连接 mysql, 成功执行 mysql 的语句

拓展任务: 除了这个 web 环境还有其他的环境可以搭建, 能力强者可以做更多的练习, 比如:基于 apache 的环境、基于 Windows server 的 iis 环境等

0x01 nginx+php环境

nginx

安装 nginx

sudo apt update
sudo apt install nginx

查看 nginx 服务版本

nginx -v

启动 nginx 服务和查看 nginx 状态

sudo service nginx start    # 启动nginx
sudo service nginx status   # 查看运行状态

还有重启 nginx 和停止 nginx 服务命令如下:

sudo service nginx restart  # 重新启动nginx
sudo service nginx stop     # 停止nginx

这时在ubuntu中的浏览器中输入127.0.0.1如下:

备份 nginx 配置文件

  • 安装位置: /etc/nginx
  • 全局站点的配置文件: /etc/nginx/nginx.conf
  • 网站默认站点配置文件: /etc/nginx/sites-available/default

这里插入一个题外话, 因为我的是 ubuntu 系统, 所以站点默认配置文件在/etc/nginx/sites-available/default, 如果是 centos 的话, 应该在/etc/nginx/conf.d/default.conf

也就是说, 对于 nginx 来说, 你的站点配置文件可以放在/etc/nginx/sites-available/目录下, 也可以放在/etc/nginx/conf.d/下. 这点我们可以通过查看全局配置文件/etc/nginx/nginx.conf可以看到, 两个配置文件路径都 include 进来了

只不过, 如果你放在sites-available目录下, 需要进入sites-enabled目录下创建软连接. 当然因为是默认配置, 已经自动创建好了

cd /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/default

至于放在哪里好, 大佬们已经讨论过了: https://serverfault.com/questions/527630/what-is-the-different-usages-for-sites-available-vs-the-conf-d-directory-for-ngi

这里的话, 我还是选择默认的位置/etc/nginx/sites-available/

这里我们可以先备份一份默认配置文件, 这样子, 我们待会修改的时候改坏了还可以恢复.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default-bak

然后再备份一份全局备份文件

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

html 测试

接下来是编写一个简单的html来测试, 首先要找到网站目录, 由配置文件/etc/nginx/sites-available/default中的root节点决定

由上图可以看出是/var/www/html, 因此我们进入该目录, 写一个简单的html

因为/var/www/html默认是 755 权限, 所以, 只有它的所属 root 用户有权限写, 因此我们需要sudo

在本机浏览器中输入127.0.0.1/1.html, 可以看到如下输出:

至此, nginx配置完成!

修改端口

sudo vim /etc/nginx/sites-available/default

在文件中更改listen: 80为您要收听的端口

不要忘记重新加载服务: service nginx reload

加固

原文链接: https://www.cnblogs.com/alummox/p/11370607.html

隐藏服务器版本号

默认我们访问不存在的页面时, 报错页面上会有nginx的版本信息, 这会向黑客提供信息, 以方便查找当前版本的漏洞, 加以利用

修改 nginx.conf, http层 里面添加取消server_tokens off;前面的#

然后重新加载 nginx 配置文件

sudo service nginx reload

我们访问不存在的页面试一下

发现此时没有版本信息了

禁止目录浏览

默认是不允许列出整个目录的, 如果不是做下载服务器的, 就不要打开这个, 避免敏感信息暴露给黑客并下载

如果开启了就会是下面这样的效果

配置关闭即可, 再访问就显示 403 了

autoindex off;

限制访问敏感资源

有些资源我们可能不想对外开放, 比如一些版本控制的备份文件, 如.git, .svn等, 这些暴露了可能会将整个项目的结构或是源代码都泄露了

配置前, 访问如下:

然后进行如下配置, 修改/etc/nginx/sites-available/default, 设置了test这个目录下的所有资源都拒绝, 重载nginx 配置后, 效果如下

location ^~ /test{
       deny all;
}

目录后带/只禁止访问目录, 不带/禁止访问目录中的文件

所以要识别不想公开的资源, 限制敏感资源的访问

限制HTTP请求方法

关闭没必要的请求方法, 一般都是get|post

下面配置在server里面, 预期之外的会返回500状态

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 500;
}

这个要放到最前面

限制IP/域名访问

ngx_http_access_module 模块使有可能对特定IP客户端进行控制. 规则检查按照第一次匹配的顺序

location ~ .*a.php$ {
          root /usr/share/nginx/html;
          deny 192.168.0.105;    # 禁止ip
          allow 192.168.189.134; # 允许ip
          deny all;              # 拒绝其他所有
    }

限制访问的ip, 即限制了服务的客户, 防止不允许的人访问, 减少风险

控制超时时间

可以缓解dos攻击, 避免黑客伪造用户访问服务, 造成服务器压力过大, 带宽占满,

编辑 nginx.conf 配置文件(记得先备份!!), 具体设置如下:

client_body_timeout 10;    # 设置客户端请求主体读取超时时间
client_header_timeout 10;  # 设置客户端请求头读取超时时间
keepalive_timeout 5 5;     # 第一个参数指定客户端连接保持活动的超时时间, 第二个参数是可选的, 它指定了消息头保持活动的有效时间
send_timeout10;            # 指定响应客户端的超时时间

错误页面重定向

避免错误页面提供敏感信息, 一般我们会定制一些通用的错误页面返回给客户端

我们在http段配置

error_page   500 502 503 504  /50x.html;

类似上面这种配置, 将状态码500、502、503、504全部重定向到50x.html

nginx降权

如果发生入侵, 获取了当前运行 nginx 的用户, 则拥有该用户的权限了, 我们应当使用最低权限运行 nginx, 绝对禁止root用户运行!!!

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

user nobody;

保存, 然后后重启nginx服务.

说明:nobody在linux中是一个不能登陆的帐号, 一些服务进程如apache, aquid等都采用一些特殊的帐号来运行, 比如 nobody, news, games等等, 这是就可以防止程序本身有安全问题的时候, 不会被黑客获得root权限

php

安装 php

sudo apt-add-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.4 php7.4-fpm
php -v

启动和查看 php 服务状态

sudo service php7.4-fpm start    #启动
sudo service php7.4-fpm status   #运行状态

php 服务的重启和停止命令如下:

sudo service php7.4-fpm restart  #重新启动
sudo service php7.4-fpm stop     #停止

修改 nginx 配置

接下來編輯nginx配置文件: /etc/nginx/sites-available/default文件, 让它支持 php

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # With php7.0-cgi alone:
        # fastcgi_pass 127.0.0.1:9000;
        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

php 测试

然后重启 nginx 和 php 服务

sudo service nginx restart
sudo service php7.4-fpm restart

在浏览器中输入: 127.0.0.1/1.php访问

加固

原文链接: http://www.thinkphp.cn/code/3990.html

启用php的安全模式

safe_mode 自 php5.3 开始被废除, 官方文档: https://www.php.net/manual/zh/features.safe-mode.php, 感谢xzlxr的提醒!!

php的安全模式是个非常重要的内嵌的安全机制, 能够控制一些php中的函数, 比如system(), 同时把很多文件操作函数进行了权限控制, 也不允许对某些关键字文件的文件, 比如/etc/passwd, 但是默认的php.ini是没有打开安全模式的, 我们可以把它打开:

safe_mode = on

用户组安全

safe_mode打开时, safe_mode_gid被关闭, 那么php脚本能够对文件进行访问, 而且相同组的用户也能够对文件进行访问。建议设置为:

safe_mode_gid = off

如果不进行设置, 可能我们无法对我们服务器网站目录下的文件进行操作了, 比如我们需要对文件进行操作的时候。

安全模式下执行程序主目录

如果安全模式打开了, 但是却是要执行某些程序的时候, 可以指定要执行程序的主目录:

safe_mode_exec_dir = /usr/bin

一般情况下是不需要执行什么程序的, 所以推荐不要执行系统程序目录, 可以指向一个目录:然后把需要执行的程序拷贝过去, 比如:

safe_mode_exec_dir = /temp/cmd

但是, 我更推荐不要执行任何程序, 那么就可以指向我们网页目录:

safe_mode_exec_dir = /usr/www

安全模式下包含文件

如果要在安全模式下包含某些公共文件, 那么就修改一下选项:

safe_mode_include_dir = /usr/www/include/

其实一般php脚本中包含文件都是在程序自己已经写好了, 这个可以根据具体需要设置。

控制php脚本能访问的目录

使用open_basedir选项能够控制PHP脚本只能访问指定的目录, 这样能够避免PHP脚本访问不应该访问的文件, 一定程序上显示了phpshell的危害, 我们一般可以设置为只能访问网站目录:

open_basedir = /usr/www

关闭危险函数

如果打开了安全模式, 那么函数禁止是可以不需要的, 但是我们为了安全还是考虑进去。比如, 我们觉得不希望执行包括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了。

关闭php版本信息在http头中的泄露

我们为了防止黑客获取服务器中php版本的信息, 可以关闭该信息泄露在http头中:

expose_php = off

比如黑客在 telnet domain 80 的时候, 那么将无法看到PHP的信息

关闭注册全局变量

在PHP中提交的变量, 包括使用POST或者GET提交的变量, 都将自动注册为全局变量, 能够直接访问, 这是对服务器非常不安全的, 所以我们不能让它注册为全局变量, 就把注册全局变量选项关闭:

register_globals = off

当然, 如果这样设置了, 那么获取对应变量的时候就要采取合理方式, 比如获取GET提交的变量var, 那么就要用$_GET['var']来进行获取, 这个php程序员要注意。

SQL注入防护

SQL注入是非常危险的问题, 小则网站后台被入侵, 重则整个服务器沦陷, 所以一定要小心。php.ini中有一个设置:

magic_quotes_gpc = off

这个默认是关闭的, 如果它打开后将自动把用户提交对sql的查询进行转换, 比如把'转为\'等, 这对防止sql注入有很大作用, 所以我们推荐设置为:

magic_quotes_gpc = off

错误信息控制

一般php在没有连接到数据库或者其他情况下会有错误提示, 一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息, 这类信息提供给黑客后, 是不安全的, 所以一般服务器建议禁止错误提示:

display_errors = Off

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

error_reporting = E_WARNING & E_ERROR

当然, 我还是建议关闭错误提示。

错误日志

建议在关闭 display_errors 后能够把是错误信息记录下来, 便于排查服务器运行的原因:

log_errors = On

同时也要设置错误日志存放的目录, 建议根apache的日志存在一起:

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

注意:给文件必须允许apache用户或组具有写的权限。

mysql

mysql 安装

sudo apt install mysql-server mysql-client php7.4-mysql

然后初始化 mysql, 根据提示来就行

sudo mysql_secure_installation

创建普通用户

# 创建只允许本地登录的用户, 如果想要支持远程登录, 将 localhost 改成 %
create user 'wenhua'@'localhost' identified by 'wenhua123';

给予该用户将要操作的数据库的所有权限

# 先创建一个测试数据库sectest, 并设定编码集为utf8
create database sectest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

# 然后授予该用户 wenhua 该数据库 sectest 的所有权限
grant all privileges on sectest.* to 'wenhua'@'localhost';

刷新数据库权限

flush privileges;

查看用户权限

show grants for 'wenhua'@'localhost';

测试连接

sudo gedit /var/www/html/conn.php
<?php
    echo 'start to connect mysql....<BR>';
    $link=mysqli_connect("127.0.0.1","wenhua","wenhua123");
    if(!$link) //failed
    {
        echo "connect failed!";
        echo "error message:".mysql_error()."<BR>";
    }
    else
        echo "connect success! <BR>";
?>

忘记root密码

要是忘记root密码了, 就执行这一步

sudo cat /etc/mysql/debian.cnf

使用账号 debian-sys-maint 账号登录mysql密码为 debian.cnfpassword

mysql -u debian-sys-maint -p

切换到mysql

然后修改root密码(自己方便修改为123456了)

set global validate_password_policy=LOW;

update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost';

update user set plugin='mysql_native_password';

flush privileges;

exit;

然后用修改的密码登录即可

mysql -uroot -p

加固

https://mp.weixin.qq.com/s?src=11&timestamp=1580574479&ver=2132&signature=lYX-2zFY6Zj55w0565BrtF22yA2xJUdhrnU9Hg29HC69Gnnzf7JA2vh7cTrSDUZfoc79q-O9WkD6a*nwsADT0w42VDuIx2GnUJsyORjQ60Dr4a6Z9zMs3FTiu9OZFQfy&new=1

账号安全

禁止 Mysql 以管理员帐号权限运行

以普通帐户安全运行 mysqld, 禁止以管理员帐号权限运行 MySQL 服务。在 /etc/mysql/my.cnf 配置文件中进行以下设置。

[mysql.server]
user=mysql
避免不同用户间共享帐号
mysql> insert into mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("localhost","phplamp",password("passwd"),'','','');

执行以上命令可以创建一个 phplamp 用户。使用该用户登录 MySQL 服务。

mysql>exit; 
@>mysql -u phplamp -p 
@>输入密码 
mysql>登录成功
删除无关帐号

DROP USER 语句可用于删除一个或多个 MySQL 账户。使用 DROP USER 命令时, 必须确保当前账号拥有 MySQL 数据库的全局 CREATE USER 权限或 DELETE 权限。账户名称的用户和主机部分分别与用户表记录的 User 和 Host 列值相对应。

执行DROP USER user;语句, 您可以取消一个账户和其权限, 并删除来自所有授权表的帐户权限记录。

口令

检查账户默认密码和弱密码。口令长度需要至少八位, 并包括数字、小写字母、大写字母和特殊符号四类中的至少两种类型, 且五次以内不得设置相同的口令。密码应至少每 90 天进行一次更换。

您可以通过执行以下命令修改密码。

mysql> update user set password=password('test!p3') where user='root';
mysql> flush privileges;

授权

在数据库权限配置能力范围内, 根据用户的业务需要, 配置其所需的最小权限。

查看数据库授权情况

mysql> use mysql;
mysql> select * from user;
mysql> select * from db;
mysql> select * from host;
mysql> select * from tables_priv;
mysql> select * from columns_priv;

通过 revoke 命令回收不必要的或危险的授权。

mysql> help revoke
Name: 'REVOKE'
Description:
Syntax:
REVOKE
priv_type [(column_list)]
   [, priv_type [(column_list)]] ...
 ON [object_type]
     {
         *
       | *.*
       | db_name.*
       | db_name.tbl_name
       | tbl_name
       | db_name.routine_name
     }
 FROM user [, user] ...

开启日志审计功能

数据库应配置日志功能, 便于记录运行状况和操作行为。

MySQL服务有以下几种日志类型:

错误日志: -log-err 查询日志: -log (可选) 慢查询日志: -log-slow-queries (可选) 更新日志: -log-update 二进制日志: -log-bin

找到 MySQL 的安装目录, 在 /etc/mysql/my.cnf 配置文件中增加上述所需的日志类型参数, 保存配置文件后, 重启 MySQL 服务即可启用日志功能。例如,

#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin= 
#Enter a name for the query log file. Otherwise a default name will be used. 
#log= 
#Enter a name for the error log file. Otherwise a default name will be used. 
log-error= 
#Enter a name for the update log file. Otherwise a default name will be used. 
#log-update=

该参数中启用错误日志。如果您需要启用其他的日志, 只需把对应参数前面的 # 删除即可。

执行show variables like 'log_%';命令可查看所有的 log。 执行show variables like 'log_bin';命令可查看具体的 log

禁止网络连接

防止猜解密码攻击、溢出攻击、和嗅探攻击。

注意: 仅限于应用和数据库在同一台主机的情况

如果数据库不需要远程访问, 可以禁止远程 TCP/IP 连接, 通过在 MySQL 服务器的启动参数中添加--skip-networking参数使 MySQL 服务不监听任何 TCP/IP 连接, 增加安全性。

您可以使用 安全组 进行内外网访问控制, 建议不要将数据库高危服务对互联网开放。

设置可信 IP 访问控制

通过数据库所在操作系统的防火墙限制, 实现只有信任的 IP 才能通过监听器访问数据库。

mysql> GRANT ALL PRIVILEGES ON db.* TO 用户名@'IP子网/掩码';

0x02 apache+php 环境

Apache

安装 Apache

sudo apt update
sudo apt install apache2

Apache 默认的配置文件在/etc/apache2/apache2.conf , 这个文件的末尾可以看到, include了其它所有的配置文件.

  • /etc/apache2/ports.conf 始终包含在主配置文件中. 它用于确定传入连接的侦听端口, 默认为80
  • 其它配置文件在 /etc/apache2/sites-enabled, /etc/apache2/conf-enabled, /etc/apache2/mods-enabled 目录下。

Apache2的默认web目录:/var/www/html, 在 /etc/apache2/sites-enabled/000-default.conf 里可以看到这个 DocumentRoot /var/www/html配置

Apache2 的默认用户是 www-data, 定义在 /etc/apache2/envvars 文件中

设置默认主页的配置文件/etc/apache2/mods-enabled/dir.conf

修改 Apache 端口

因为上面 nginx 已经使用了80端口, 所以我们需要给 Apache 修改端口, 这里我改成8099

  1. 修改监听端口
sudo vim /etc/apache2/ports.conf

  1. 修改它的主机端口
sudo vim /etc/apache2/sites-available/000-default.conf

  1. 重启 Apache
sudo service apache2 restart
  1. 用浏览器访问之前我们写的1.html

加固

https://www.cnblogs.com/peteremperor/p/10595035.html

如果你的 apache 找不到 httpd.conf也是正常的, 在 apache2 中配置文件已经变成 /etc/apache2/apache2.conf!

账号设置

以专门的用户帐号和用户组运行 Apache 服务。

  1. 根据需要,为 Apache 服务创建用户及用户组。如果没有设置用户和组,则新建用户,并在 Apache 配置文件中进行指定。

    1. 创建 Apache 用户组。

       groupadd apache
    2. 创建 Apache 用户并加入 Apache 用户组。

       useradd apache –g apache
    3. 将下面两行设置参数加入 Apache 配置文件 httpd.conf 中:

       User apache
       Group apache
  2. 检查 httpd.conf 配置文件中是否允许使用非专用账户(如 root 用户)运行 Apache 服务。

    默认设置一般即符合要求。Linux 系统中默认使用 apache 或者 nobody 用户,Unix 系统默认使用 daemon 用户。

授权设置

严格控制 Apache 主目录的访问权限,非超级用户不能修改该目录中的内容。

  1. Apache 的 主目录对应于 Apache Server配置文件 httpd.conf 中的 Server Root 控制项,应设置为:

     Server Root /usr/local/apache
    • 判定条件: 非超级用户不能修改该目录中的内容。

    • 检测操作: 尝试进行修改,看是否能修改该目录中的内容。

      该目录一般设置为 /etc/httpd 目录,默认情况下属主为 root 用户,其它用户不能修改该目录中的文件。默认设置一般即符合要求。

  2. 严格设置配置文件和日志文件的权限,防止未授权访问。

    • 执行chmod 600 /etc/httpd/conf/httpd.conf命令设置配置文件为属主可读写,其他用户无读写权限。

    • 执行chmod 644 /var/log/httpd/*.log命令设置日志文件为属主可读写,其他用户拥有只读权限。

      注意:

      • /etc/httpd/conf/httpd.conf 配置文件的默认权限是644,可根据需要修改权限为600。
      • /var/log/httpd/*.log 日志文件的默认权限为644,默认设置即符合要求。

日志设置

Apache 设备应配置日志功能,对运行错误、用户访问等事件进行记录,记录内容包括时间,用户使用的 IP 地址等内容。

修改 httpd.conf 配置文件,设置日志记录文件、记录内容、记录格式。

  • 错误日志:

      LogLevel notice #日志的级别
      ErrorLog /…/logs/error_log #日志的保存位置(错误日志)
  • 访问日志:

      LogFormat %h %l %u %t \”%r\” %>s %b “%{Accept}i\”%{Referer}i\” \”%{User-Agent}i\””
      combined
      CustomLog /…/logs/access_log combined (访问日志)

注意:

  • ErrorLog指令设置错误日志文件名和位置。错误日志是最重要的日志文件。Apache httpd 程序将在这个文件中存放诊断信息和处理请求中出现的错误。若要将错误日志传送到 Syslog,则执行ErrorLog syslog命令。
  • CustomLog指令指定了保存日志文件的具体位置以及日志的格式。访问日志中会记录服务器所处理的所有请求。
  • LogFormat命令用于设置日志格式,建议设置为 combined 格式。
  • LogLevel命令用于调整记录在错误日志中的信息的详细程度,建议设置为 notice。日志的级别,默认是 warn 级别,notice 级别比较详细,但在实际中由于日志会占用大量硬盘空间。

禁止访问外部文件

禁止 Apache 访问 Web 目录之外的任何文件。

  1. 修改 httpd.conf 配置文件。

     Order Deny,Allow
     Deny from all
  2. 设置可访问的目录。

     Order Allow,Deny
     Allow from /web

    说明: 其中 /web 为网站根目录。

  3. 默认配置如下,可根据您的业务需要进行设置。

     Options FollowSymLinks
     AllowOverride None

禁止目录列出

目录列出会导致明显信息泄露或下载,建议禁止 Apache 列表显示文件。在 /etc/httpd/httpd.conf 配置文件中删除 Options 的 Indexes 设置即可。

  1. 修改 httpd.conf 配置文件:

     #Options Indexes FollowSymLinks #删掉Indexes
     Options FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow from all

    Options Indexes FollowSymLinks中的Indexes去掉,就可以禁止 Apache 显示该目录结构。Indexes的作用就是当该目录下没有 index.html 文件时,自动显示目录结构。

  2. 重新启动 Apache 服务。

错误页面重定向

Apache 错误页面重定向功能可以防止敏感信息泄露。

  1. 修改 httpd.conf 配置文件:

     ErrorDocument 400 /custom400.html
     ErrorDocument 401 /custom401.html
     ErrorDocument 403 /custom403.html
     ErrorDocument 404 /custom404.html
     ErrorDocument 405 /custom405.html
     ErrorDocument 500 /custom500.html

    注意: Customxxx.html 为要设置的错误页面。

  2. 重新启动 Apache 服务。

注意: 此项配置需要应用系统设有错误页面,或者不在 httpd 中设置,而完全由业务逻辑实现。

拒绝服务防范

根据业务需要,合理设置 session 时间,防止拒绝服务攻击。

  1. 修改 httpd.conf 配置文件:

     Timeout 10 #客户端与服务器端建立连接前的时间间隔
     KeepAlive On
     KeepAliveTimeout 15 #限制每个 session 的保持时间是 15 秒 注:此处为一建议值,具体的设定需要根据现实情况。
  2. 重新启动 Apache 服务。

注意: 默认值为Timeout 120KeepAlive OffKeepAliveTimeout 15,该项设置涉及性能调整。

隐藏 Apache 的版本号

隐藏 Apache 的版本号及其它敏感信息。

修改 httpd.conf 配置文件:

ServerSignature Off ServerTokens Prod

关闭 TRACE功能

关闭 TRACE 功能,防止 TRACE 方法被访问者恶意利用。

/etc/httpd/conf/httpd.conf 配置文件中添加以下设置参数:

TraceEnable Off

注意: 该参数适用于 Apache 2.0 以上版本。

禁用 CGI

如果服务器上不需要运行 CGI 程序,建议禁用 CGI。

如果没有CGI程序,可以修改 /etc/httpd/conf/httpd.conf 配置文件,把 cgi-bin 目录的配置和模块都进行注释。

#LoadModule cgi_module modules/mod_cgi.so
#ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
#
#AllowOverride None
# Options None
#Order allow,deny
#Allow from all
#

绑定监听地址

服务器有多个 IP 地址时,只监听提供服务的 IP 地址。

  1. 执行以下命令查看是否绑定 IP 地址。

     cat /etc/httpd/conf/httpd.conf|grep Listen
  2. 修改 /etc/httpd/conf/httpd.conf 配置文件。

     Listen x.x.x.x:80

监听功能默认监听所有地址,如果服务器只有一个 IP 地址可不修改该项设置,如果有多个 IP 可根据需要进行设置。

删除缺省安装的无用文件

删除缺省安装的无用文件。

  • 删除缺省 HTML 文件:

      # rm -rf /usr/local/apache2/htdocs/*
  • 删除缺省的 CGI 脚本:

      # rm –rf /usr/local/apache2/cgi-bin/*
  • 删除 Apache 说明文件:

      # rm –rf /usr/local/apache2/manual
  • 删除源代码文件:

      # rm -rf /path/to/httpd-2.2.4*
  • 删除 CGI。

    可根据实际情况删除,一般情况下/var/www/html /var/www/cgi-bin 默认就是空的。

注意: 根据安装步骤不同和版本不同,某些目录或文件可能不存在或位置不同。

禁用非法 HTTP 方法

禁用 PUT、DELETE 等危险的 HTTP 方法。

修改 httpd.conf 配置文件,只允许 get、post 方法。

<Location />
<LimitExcept GET POST CONNECT OPTIONS>
Order Allow,Deny
Deny from all
</LimitExcept>
</Location>

您可根据需要进行设置,如果需要用到 PUT 或 Delete 等 HTTP 方法的话,在 /etc/httpd/conf/httpd.conf 配置文件中相应添加即可。

php

sudo apt install libapache2-mod-php7.4 php7.4-curl php7.4-json php7.4-cgi php7.4-mbstring php7.4-xml php7.4-intl

mysql

sudo apt install php7.4-mysql

0x03 iis+asp/php

IIS安装

  1. 保证2003连接了安装光盘

  2. 开始菜单 -> 管理您的服务器

  3. 添加或删除角色 -> 下一步

  4. 自定义配置 -> 下一步

  5. IIS -> 下一步

  6. 全选 -> 下一步 -> 下一步

  7. 然后等一会就安装完成了

  8. 开始菜单 -> 管理工具 -> Internet 信息服务(IIS)管理器 -> 拖动到桌面

  9. 打开 Internet 信息服务(IIS)管理器, 发现有一个默认的网站, 可以浏览一下, 会显示建设中

IIS 的默认网站 只能用html的, 如果想要搭建asp的, 还需要配置一下

asp网站配置

  1. 右键默认网站 -> 打开, 然后就会打开网站根目录了, 然后将打开的文件夹的里面的文件全部删掉

  2. 找到随便找个 asp 的源码, 如sql注入-xycms搬家, 将里面的源码全部复制到刚刚的目录

  3. 这时候如果直接访问的话, 是没有显示的, 因为我们的网站是asp的, 还需要一些配置

  4. 右键网站-> 属性, 在打开的窗口处选择文档, 然后添加一个index.asp, 然后点击应用, 再弹出的"继承覆盖"对话框中全选->确定, 这样子, 该iis下的所有网站的默认打开页面就会多了一个index.asp

  5. 右键网站->属性->主目录->配置->选项-> 启用父路径->调试->打开两个调试标记

  6. Web 服务器扩展 -> Active Server Pages -> 允许

  7. 接下来用ie访问一下: http://127.0.0.1, 发现需要输入账号密码, 原因是还未配置好网站目录下的文件夹和文件的权限

  8. 接下来配置权限: 选中所有目录 -> 属性 -> 安全 -> 添加 -> 输入e(代表everyone所有人的意思) -> 确定 -> 勾选完全控制 -> 应用 -> 确定

  9. 同样操作选中所有文件, 这时候再刷新一下ie就可以看到网站了

新建一个网站

这里用的是同一个ip不同端口

  1. 因为默认网站已经用了80端口, 所以再新建其他网站, 只能用不同的端口了

  2. 右键网站 -> 新建 -> 网站 -> 下一步 -> 描述随便填 -> 下一步

  3. 这里的端口不能和之前的重复, 所以我们可以填一个8081, 然后下一步

  4. 这里选中网站主目录, 随便给一个就行, 然后下一步

  5. 这里设置网站的访问权限, 勾上运行脚本执行程序就行

  6. 最后点击完成, 然后按照之前的步骤, 将源码拖进网站主目录就行了

php网站配置

这里直接使用 phpstudy

  1. 新建一个网站

  2. 将一个php源码的站点文件拷贝进来

  3. 修复一下权限

  4. 特别地, php的网站, 还需要给该网站的根目录权限

  5. 接下来就可以访问了: http://127.0.0.1:8080

加固

https://www.cnblogs.com/xiaozi/p/10117741.html

限制目录执行权限

  1. 在IIS中设置需要上传文件的目录,双击处理程序映射

  1. 在处理程序映射中,把编辑功能权限中的脚本去掉,这样即使上传了木马文件在此目录,也是无法执行的。

开启日志审计

  1. 打开IIS管理工具,选择需要设置日志的站点,切换到功能视图,双击日志,进入日志配置界面。

  1. 默认情况下Web日志存放于系统目录%SystemDrive%\inetpub\logs\LogFiles, 将Wb日志文件放在非网站目录和非操作系统分区,并定期对Web日志进行异地备份。

双击日志,可进行日志属性的设置如下图:

自定义404错误页面

  1. 选择站点,在功能视图页面,双击错误页,进入错误页配置页面:

  1. 选择404状态代码,进入自定义错误页编辑状态:

最佳经验实践

防止.mdb数据库文件被下载

很多网站都是使用的是asp+access数据库,mdb路径可能被猜解,数据库很容易就被别人下载了,利用IIS设置可有效防止mdb数据库被下载。

步骤一:在 C:\Windows\System32\inetsrv\config目录下找到applicationHost文件;

步骤二:打开 applicationHost 文件,选择requestFiltering 下的节点: <add fileExtension=".mdb" allowed="false" />,修改allowed的值为“false”,mdb文件不能被下载。

步骤三:保存后,即无法下载.mdb数据库文件。

访问源IP限制

在条件允许的条件下,对IIS访问源进行IP范围限制。只有在允许的IP范围内的主机才可以访问WWW服务。常用于限制网站管理后台对外开放。

  1. 开始->管理工具->Internet 信息服务(IIS)管理器 选择相应的站点目录,然后在功能视图中找到IP地址和域名限制,双击IP地址和域名限制进入设置。

  1. 在IP地址和域限制中,添加允许条目

关闭WebDAV

开始->管理工具->Internet 信息服务(IIS)管理器, 选择一个站点,在功能视图中找到WebDAV创作规则,双击 WebDAV创作规则,进入设置:

2、在WebDAV创作规则中,选择禁用WebDAV

关闭目录浏览

  1. 开始->管理工具->Internet 信息服务(IIS)管理器 选择相应的站点目录,然后在功能视图页面找到“目录浏览”,双击进入目录浏览设置页面:

  1. 在最右边,操作栏进行“禁用”,即可禁用目录浏览

关闭FTP匿名访问

开始->管理工具->Internet 信息服务(IIS)管理器 点击WIN-主机名后在中间位置FTP栏找到FTP身份验证,双击进入;

右键匿名身份验证->禁用,即可关闭FTP匿名访问

解决IIS短文件名漏洞

  1. 打开Internet 信息服务(IIS)管理器,选择站点,在功能视图界面,双击请求筛选

  1. 在URL添加拒绝序列URL序列设置为【~】

风险操作项

停用或删除默认站点

IIS安装后的默认主目录是C:\inetpub\wwwroot,为更好地抵抗踩点、刺探等攻击行为,应该更改主目录位置,禁用默认站点,新建立站点并进行安全配置。

开始->管理工具->Internet 信息服务(IIS)管理器 选择相应的站点,然后右键站点,选择停止或者删除。

删除不必要的脚本映射

打开IIS服务管理器,选择需要设置的站点,找到“处理程序映射”双击,从列表中删除以下不必要的脚本。

包括 .asa .cer .cdx .idq .htw .ida .shtml .stm .idc .htr .printer等。

删除的原则:只保留需要的脚本映射。

根据需要可以在已经存在的脚本上点击右键进行编辑和删除,也可以自定义添加映射。

设置最大并发连接数

打开IIS服务管理器,选择需要设置的站点,点击浏览网站下的“高级设置“,打开高级设置对话框,切换到“连接限制”选项卡,设置连接限制,包括最大并发连接数等的设置。

独立站点帐户

在Windows server 2008R2系统下,用IIS架设Web服务器,合理的为每个站点配置独立的Internet来宾账号,这样可以限制Internet 来宾账号的访问权限,只允许其可以读取和执行运行网站所的需要的程序。

  1. 选中“我的电脑”右键,选择“管理”,打开“计算机管理”,选择“本地用户和组”,然后点击“用户”,接着“右键”,新建一个用户,如下图:

最后点击“创建”,完成用户创建。

  1. 删除新建立的用户属的用户组“USERS”,然后点击“添加”,让用户属于Guests组,如下图:

  1. 网站设置独立运行用户,加强网站安全

独立应用程序池

给网站设置独立运行的程序池,这样每个网站与错误就不会互相影响:

卸载不需要的IIS角色服务

开始->管理工具->服务器管理器” 双击“角色”,在右边最下方可以看见角色服务,点击““删除角色服务”,可对不需要的IIS角色服务进行删除。

最后修改:2020 年 05 月 29 日 04 : 57 PM
如果觉得我的文章对你有用,请随意赞赏