Web 環境配置

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.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 服務。

  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角色服務進行刪除。

發佈了40 篇原創文章 · 獲贊 58 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章