Web 环境配置
0x00 任务任务目标: 准备学习环境, 学习 web 服务器的搭建过程, 并做相应的加固学习操作系统: 虚拟机 ubuntu 18.04推荐环境: linux+nginx+php-fpm+mysql(为后续搭建 nginx+lua 的 waf 做准备, 不可以使用集成好的环境)报告要求: 将整个环境的搭建过程进行详细记录, 收集网络上的加固文档, 学习加固技术, 从而思考不加固可能存在的...
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的安全模式
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.cnf
中 password
值
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×tamp=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
- 修改监听端口
sudo vim /etc/apache2/ports.conf
- 修改它的主机端口
sudo vim /etc/apache2/sites-available/000-default.conf
- 重启 Apache
sudo service apache2 restart
- 用浏览器访问之前我们写的
1.html
加固
https://www.cnblogs.com/peteremperor/p/10595035.html
账号设置
以专门的用户帐号和用户组运行 Apache 服务。
-
根据需要,为 Apache 服务创建用户及用户组。如果没有设置用户和组,则新建用户,并在 Apache 配置文件中进行指定。
-
创建 Apache 用户组。
groupadd apache
-
创建 Apache 用户并加入 Apache 用户组。
useradd apache –g apache
-
将下面两行设置参数加入 Apache 配置文件
httpd.conf
中:User apache Group apache
-
-
检查 httpd.conf 配置文件中是否允许使用非专用账户(如
root
用户)运行 Apache 服务。默认设置一般即符合要求。Linux 系统中默认使用 apache 或者 nobody 用户,Unix 系统默认使用 daemon 用户。
授权设置
严格控制 Apache 主目录的访问权限,非超级用户不能修改该目录中的内容。
-
Apache 的 主目录对应于 Apache Server配置文件
httpd.conf
中的 Server Root 控制项,应设置为:Server Root /usr/local/apache
-
判定条件: 非超级用户不能修改该目录中的内容。
-
检测操作: 尝试进行修改,看是否能修改该目录中的内容。
该目录一般设置为
/etc/httpd
目录,默认情况下属主为 root 用户,其它用户不能修改该目录中的文件。默认设置一般即符合要求。
-
-
严格设置配置文件和日志文件的权限,防止未授权访问。
-
执行
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 目录之外的任何文件。
-
修改 httpd.conf 配置文件。
Order Deny,Allow Deny from all
-
设置可访问的目录。
Order Allow,Deny Allow from /web
说明: 其中
/web
为网站根目录。 -
默认配置如下,可根据您的业务需要进行设置。
Options FollowSymLinks AllowOverride None
禁止目录列出
目录列出会导致明显信息泄露或下载,建议禁止 Apache 列表显示文件。在 /etc/httpd/httpd.conf 配置文件中删除 Options 的 Indexes 设置即可。
-
修改
httpd.conf
配置文件:#Options Indexes FollowSymLinks #删掉Indexes Options FollowSymLinks AllowOverride None Order allow,deny Allow from all
将
Options Indexes FollowSymLinks
中的Indexes
去掉,就可以禁止 Apache 显示该目录结构。Indexes
的作用就是当该目录下没有 index.html 文件时,自动显示目录结构。 -
重新启动 Apache 服务。
错误页面重定向
Apache 错误页面重定向功能可以防止敏感信息泄露。
-
修改 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 为要设置的错误页面。
-
重新启动 Apache 服务。
注意: 此项配置需要应用系统设有错误页面,或者不在 httpd 中设置,而完全由业务逻辑实现。
拒绝服务防范
根据业务需要,合理设置 session 时间,防止拒绝服务攻击。
-
修改 httpd.conf 配置文件:
Timeout 10 #客户端与服务器端建立连接前的时间间隔 KeepAlive On KeepAliveTimeout 15 #限制每个 session 的保持时间是 15 秒 注:此处为一建议值,具体的设定需要根据现实情况。
-
重新启动 Apache 服务。
注意: 默认值为Timeout 120
,KeepAlive Off
,KeepAliveTimeout 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 地址。
-
执行以下命令查看是否绑定 IP 地址。
cat /etc/httpd/conf/httpd.conf|grep Listen
-
修改 /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安装
-
保证2003连接了安装光盘
-
开始菜单 -> 管理您的服务器
-
添加或删除角色 -> 下一步
-
自定义配置 -> 下一步
-
IIS -> 下一步
-
全选 -> 下一步 -> 下一步
-
然后等一会就安装完成了
-
开始菜单 -> 管理工具 -> Internet 信息服务(IIS)管理器 -> 拖动到桌面
-
打开
Internet 信息服务(IIS)管理器
, 发现有一个默认的网站, 可以浏览一下, 会显示建设中
IIS 的
默认网站
只能用html的, 如果想要搭建asp的, 还需要配置一下
asp网站配置
-
右键
默认网站
-> 打开, 然后就会打开网站根目录了, 然后将打开的文件夹的里面的文件全部删掉 -
找到随便找个 asp 的源码, 如
sql注入-xycms搬家
, 将里面的源码全部复制到刚刚的目录 -
这时候如果直接访问的话, 是没有显示的, 因为我们的网站是asp的, 还需要一些配置
-
右键
网站
->属性
, 在打开的窗口处选择文档
, 然后添加一个index.asp
, 然后点击应用
, 再弹出的"继承覆盖"对话框中全选
->确定
, 这样子, 该iis下的所有网站的默认打开页面就会多了一个index.asp
-
右键
网站
->属性
->主目录
->配置
->选项
->启用父路径
->调试
->打开两个调试标记 -
Web 服务器扩展
->Active Server Pages
->允许
-
接下来用ie访问一下: http://127.0.0.1, 发现需要输入账号密码, 原因是还未配置好网站目录下的文件夹和文件的权限
-
接下来配置权限: 选中所有目录 ->
属性
->安全
->添加
-> 输入e
(代表everyone所有人的意思) ->确定
-> 勾选完全控制
->应用
->确定
-
同样操作选中所有文件, 这时候再刷新一下ie就可以看到网站了
新建一个网站
这里用的是同一个ip不同端口
-
因为默认网站已经用了
80
端口, 所以再新建其他网站, 只能用不同的端口了 -
右键
网站
->新建
->网站
->下一步
-> 描述随便填 ->下一步
-
这里的端口不能和之前的重复, 所以我们可以填一个
8081
, 然后下一步
-
这里选中网站主目录, 随便给一个就行, 然后
下一步
-
这里设置网站的访问权限, 勾上
运行脚本
和执行程序
就行 -
最后点击
完成
, 然后按照之前的步骤, 将源码拖进网站主目录就行了
php网站配置
这里直接使用 phpstudy
-
新建一个网站
-
将一个php源码的站点文件拷贝进来
-
修复一下权限
-
特别地, php的网站, 还需要给该网站的根目录权限
-
接下来就可以访问了: http://127.0.0.1:8080
加固
https://www.cnblogs.com/xiaozi/p/10117741.html
限制目录执行权限
- 在IIS中设置需要上传文件的目录,双击处理程序映射
- 在处理程序映射中,把编辑功能权限中的脚本去掉,这样即使上传了木马文件在此目录,也是无法执行的。
开启日志审计
- 打开IIS管理工具,选择需要设置日志的站点,切换到功能视图,双击日志,进入日志配置界面。
- 默认情况下Web日志存放于系统目录
%SystemDrive%\inetpub\logs\LogFiles
, 将Wb日志文件放在非网站目录和非操作系统分区,并定期对Web日志进行异地备份。
双击日志,可进行日志属性的设置如下图:
自定义404错误页面
- 选择站点,在功能视图页面,双击错误页,进入错误页配置页面:
- 选择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服务。常用于限制网站管理后台对外开放。
- 开始->管理工具->Internet 信息服务(IIS)管理器 选择相应的站点目录,然后在功能视图中找到IP地址和域名限制,双击IP地址和域名限制进入设置。
- 在IP地址和域限制中,添加允许条目
关闭WebDAV
开始->管理工具->Internet 信息服务(IIS)管理器, 选择一个站点,在功能视图中找到WebDAV创作规则,双击 WebDAV创作规则,进入设置:
2、在WebDAV创作规则中,选择禁用WebDAV
关闭目录浏览
- 开始->管理工具->Internet 信息服务(IIS)管理器 选择相应的站点目录,然后在功能视图页面找到“目录浏览”,双击进入目录浏览设置页面:
- 在最右边,操作栏进行“禁用”,即可禁用目录浏览
关闭FTP匿名访问
开始->管理工具->Internet 信息服务(IIS)管理器 点击WIN-主机名后在中间位置FTP栏找到FTP身份验证,双击进入;
右键匿名身份验证->禁用,即可关闭FTP匿名访问
解决IIS短文件名漏洞
- 打开Internet 信息服务(IIS)管理器,选择站点,在功能视图界面,双击请求筛选
- 在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 来宾账号的访问权限,只允许其可以读取和执行运行网站所的需要的程序。
- 选中“我的电脑”右键,选择“管理”,打开“计算机管理”,选择“本地用户和组”,然后点击“用户”,接着“右键”,新建一个用户,如下图:
最后点击“创建”,完成用户创建。
- 删除新建立的用户属的用户组“USERS”,然后点击“添加”,让用户属于Guests组,如下图:
- 网站设置独立运行用户,加强网站安全
独立应用程序池
给网站设置独立运行的程序池,这样每个网站与错误就不会互相影响:
卸载不需要的IIS角色服务
开始->管理工具->服务器管理器” 双击“角色”,在右边最下方可以看见角色服务,点击““删除角色服务”,可对不需要的IIS角色服务进行删除。
更多推荐
所有评论(0)