寶塔運(yùn)維工具[1]乳怎,配合 wordpress 可以快速創(chuàng)建網(wǎng)站芹橡。當(dāng)我們快速完成網(wǎng)站搭建并且上線后,驚訝的發(fā)現(xiàn)有勾,網(wǎng)絡(luò)上總隱藏著壞人疹启,時時刻刻想害我的網(wǎng)站。此時就需要用到網(wǎng)絡(luò)應(yīng)用防火墻 waf蔼卡,因為寶塔自帶 waf 是收費(fèi)的喊崖,作為小網(wǎng)站,用起來并不劃算。所以得尋找可用的免費(fèi) waf [2]荤懂,對比之后茁裙,最后選擇了雷池 waf 社區(qū)版 [3],原因很簡單势誊,社區(qū)版對應(yīng)的就是商業(yè)版呜达,背靠大樹好乘涼谣蠢。
下面是寶塔 bt + 免費(fèi) waf 的搭建過程
環(huán)境準(zhǔn)備
使用騰訊云輕應(yīng)用服務(wù)器[4]創(chuàng)建服務(wù)實例粟耻,操作系統(tǒng)選擇 "WordPress"
設(shè)置騰訊云防火墻開放端口,添加 3 個端口
端口 | 服務(wù) | 用途 |
---|---|---|
8888 | 寶塔面板 | 進(jìn)入寶塔的管理界面眉踱,管理所有服務(wù)挤忙,必開 |
9443 | 雷池社區(qū)面板 | 管理雷池社區(qū)防火墻的后臺,必開 |
8001 | 業(yè)務(wù)服務(wù) | 因為寶塔占用了 80 端口谈喳,waf 需要占用其他端口代理業(yè)務(wù)服務(wù)册烈,非必開 |
注意:8001 端口是為了測試用,正式服務(wù)上線后可以使用 https 協(xié)議的 443 端口婿禽,然后就可以關(guān)掉這個測試端口了赏僧,并且 8001 也可以更換為其他端口,這里僅測試用扭倾。
安裝成功后淀零,在 “應(yīng)用管理” 面板可以看到應(yīng)用信息
根據(jù) 寶塔 Linux 應(yīng)用的提示,ssh 鏈接到服務(wù)器膛壹,獲取登錄寶塔的登錄賬號密碼
然后登錄寶塔管理后端驾中,環(huán)境配置成功。
在寶塔中添加社區(qū)版 waf
因為需要用到寶塔的云服務(wù)功能模聋,這里推薦登錄寶塔賬號肩民。
雷池 waf 使用 docker 運(yùn)行,并且官網(wǎng)提供了一鍵安裝腳本链方,但是想要在寶塔中管理持痰,還需要進(jìn)行一些配置。
寶塔安裝 docker
安裝完成
社區(qū)版 waf 是通過 docker compose 運(yùn)行的祟蚀,在寶塔中添加 compose 模板
然后關(guān)鍵的 compose.yaml 文件工窍,下面是手動修改過的 1.10 版本 compose 配置文件
networks:
safeline-ce:
name: safeline-ce
driver: bridge
ipam:
driver: default
config:
- gateway: 169.254.0.1
subnet: 169.254.0.0/24
driver_opts:
com.docker.network.bridge.name: safeline-ce
services:
postgres:
container_name: safeline-postgres
restart: always
image: postgres:15.2
volumes:
- /srv/safeline-ce/resources/postgres/data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
environment:
- POSTGRES_USER=safeline-ce
- POSTGRES_PASSWORD=SafeLine2023!
networks:
safeline-ce:
ipv4_address: 169.254.0.2
cap_drop:
- net_raw
command: [postgres, -c, max_connections=200]
redis:
container_name: safeline-redis
restart: always
image: redis:7.0.11
volumes:
- /srv/safeline-ce/resources/redis/data:/data
- /etc/localtime:/etc/localtime:ro
command: redis-server --appendonly yes --requirepass SafeLine2023!
networks:
safeline-ce:
ipv4_address: 169.254.0.3
cap_drop:
- net_raw
sysctls:
net.core.somaxconn: "511"
management:
container_name: safeline-mgt-api
restart: always
image: chaitin/safeline-mgt-api:1.10.0
volumes:
- /srv/safeline-ce/resources/management:/resources/management
- /srv/safeline-ce/resources/nginx:/resources/nginx
- /srv/safeline-ce/logs:/logs
- /etc/localtime:/etc/localtime:ro
ports:
- ${MGT_PORT:-9443}:1443
environment:
- MANAGEMENT_RESOURCES_DIR=/resources/management
- NGINX_RESOURCES_DIR=/resources/nginx
- DATABASE_URL=postgres://safeline-ce:SafeLine2023!@127.0.0.1/safeline-ce
- MANAGEMENT_LOGS_DIR=/logs/management
networks:
safeline-ce:
ipv4_address: 169.254.0.4
cap_drop:
- net_raw
detector:
container_name: safeline-detector
restart: always
image: chaitin/safeline-detector:1.10.0
volumes:
- /srv/safeline-ce/resources/detector:/resources/detector
- /srv/safeline-ce/logs/detector:/logs/detector
- /etc/localtime:/etc/localtime:ro
environment:
- LOG_DIR=/logs/detector
networks:
safeline-ce:
ipv4_address: 169.254.0.5
cap_drop:
- net_raw
mario:
container_name: safeline-mario
restart: always
image: chaitin/safeline-mario:1.10.0
volumes:
- /srv/safeline-ce/resources/mario:/resources/mario
- /srv/safeline-ce/logs/mario:/logs/mario
- /etc/localtime:/etc/localtime:ro
environment:
- LOG_DIR=/logs/mario
- GOGC=100
- DATABASE_URL=postgres://safeline-ce:SafeLine2023!@safeline-postgres/safeline-ce
- REDIS_URL=redis://:SafeLine2023!@safeline-redis:6379/0
networks:
safeline-ce:
ipv4_address: 169.254.0.6
cap_drop:
- net_raw
tengine:
container_name: safeline-tengine
restart: always
image: chaitin/safeline-tengine:1.10.0
volumes:
- /srv/safeline-ce/resources/nginx:/etc/nginx
- /srv/safeline-ce/resources/management:/resources/management
- /srv/safeline-ce/resources/detector:/resources/detector
- /srv/safeline-ce/logs/nginx:/var/log/nginx
- /etc/localtime:/etc/localtime:ro
- /srv/safeline-ce/resources/cache:/usr/local/nginx/cache
- /etc/resolv.conf:/etc/resolv.conf
environment:
- MGT_ADDR=169.254.0.4:9002
ulimits:
nofile: 131072
network_mode: host
拷貝文件到 “添加 yaml 模板” 中,并添加模板暂题。
在寶塔面板中移剪,切換到 compose ,創(chuàng)建新的 compose 項目
點擊“添加”后薪者,需要幾分鐘時間準(zhǔn)備運(yùn)行纵苛。成功后,切換到 “容器” 面板,可以看到 waf 相關(guān)的 6 個容器都在運(yùn)行狀態(tài)
此時可以訪問 9443 端口攻人,就可以查看 waf 管理后臺了取试。
注意:雷池 waf 使用了自簽名證書來支持 https,所以第一次訪問時需要手動 “允許” 一次才可以怀吻。
然后可以登錄 waf 的登錄瞬浓,雷池社區(qū)采取了比較特殊的登錄方式: OTP 驗證碼登錄,參考官網(wǎng)文檔[5]蓬坡。綁定完 OTP 后再登錄猿棉,成功后可以看到這個界面
配置 waf
那么,服務(wù)都準(zhǔn)備好了屑咳,下面如何給業(yè)務(wù)服務(wù)套上 waf萨赁。作為中小網(wǎng)站的維護(hù)人員,我并不想學(xué)習(xí) waf兆龙,只想簡單使用杖爽,因此我僅僅了解 waf 的幾個關(guān)鍵點:
- waf 是攔截在 wordpress 網(wǎng)站之前的,waf 如果掛了紫皇,網(wǎng)站就掛了
- 用戶訪問的其實是 waf慰安,如果訪問沒有風(fēng)險,waf 才會轉(zhuǎn)發(fā)給業(yè)務(wù)服務(wù)
- waf 也要監(jiān)聽端口聪铺,并且不能和網(wǎng)站監(jiān)聽同一個端口化焕,這是操作系統(tǒng)的限制
所以應(yīng)該是,waf 應(yīng)該監(jiān)聽 80/443 這樣的端口计寇,然后轉(zhuǎn)發(fā)給網(wǎng)站監(jiān)聽的 8000/8080 這樣的端口锣杂。
配置 waf 前,先測試我們的網(wǎng)站原來什么樣
監(jiān)聽 80 端口番宁,可以正常訪問元莫。下面配置 waf,打開 waf 后端
創(chuàng)建成功后蝶押,可以看到防護(hù)站點列表中出現(xiàn)一條記錄踱蠢,waf 可以配置多個站點,但我們只有一個網(wǎng)站棋电,所以沒有設(shè)置 “域名”茎截,就表示所以訪問都接受,會轉(zhuǎn)發(fā)給網(wǎng)站赶盔。此時創(chuàng)建的 waf 防護(hù)站點運(yùn)行模式是:防護(hù)模式企锌。
注意:waf 監(jiān)聽了 8001 端口,雖然我們已經(jīng)在騰訊云的后臺防火墻中開放了 8001 端口于未,但那是云平臺的防火墻撕攒,在寶塔中添加系統(tǒng)防火墻的允許規(guī)則陡鹃,否則 8001 端口是訪問不了的。
現(xiàn)在可以通過 8001 來訪問網(wǎng)站了
此時我們的網(wǎng)站已經(jīng)在 waf 的保護(hù)之下了抖坪,來檢測一下效果萍鲸,訪問 /shell.php 路徑觸發(fā)一次 waf 的防護(hù)功能
嘖嘖嘖,這個訪問看起來太危險了擦俐,被 waf 攔截了〖挂酰現(xiàn)在回到 waf 管理后臺,在 “檢測日志” 面板下蚯瞧,可以看到攔截日志列表嘿期,其中包含一條剛剛被攔截的日志,點擊 “詳情” 查看状知,會看到攔截原因和訪問細(xì)節(jié)秽五,現(xiàn)在是不是有了一種練成金鐘罩的感覺孽查。
優(yōu)化訪問端口
此時的我們已經(jīng)成功配置了 waf饥悴,但訪問路徑中包含了 8001 這個端口,這可不行盲再。是否可以不顯示這個端口號呢西设?根據(jù) web 訪問的規(guī)則,有兩種情況是不用顯示端口號的
- http 訪問 80 端口
- https 訪問 443 端口
因為 80 端口已經(jīng)被寶塔占用答朋,并且出于安全的考慮贷揽,網(wǎng)站也不建議使用 http 直接訪問。好在寶塔沒有占用 443 端口梦碗,那么我們可以用 waf 來監(jiān)聽 443 端口并轉(zhuǎn)發(fā)給業(yè)務(wù)服務(wù)禽绪。443 端口對應(yīng)的 https 協(xié)議需要證書,關(guān)于如何獲取證書這里不展開解釋洪规。我們來繼續(xù)修改 waf 的配置印屁,將端改為 443 并添加證書。
這里一定要夸獎一下 waf 非常非常貼心的一個功能:自動生成證書斩例。知道你自己搞證書不方便雄人,反正流程是固定的,waf 直接幫你做了念赶。
現(xiàn)在重新訪問一下我們的網(wǎng)站础钠,看到結(jié)果了嗎,不再顯示端口號了叉谜,并且是 https旗吁。雖然是紅色警告,但換成真證書以后就沒問題了停局, 或者也可以就用自簽名證書也問題不大很钓。
收尾
當(dāng)前網(wǎng)站已經(jīng)出于 waf 的保護(hù)之下驻民,現(xiàn)在可以把不安全的端口關(guān)掉了。
關(guān)于 waf 升級
目前 waf 項目還在不斷地更新迭代當(dāng)中履怯,官方推薦 cli 模式下的手動升級回还,在寶塔下這是不行的。waf 是通過在寶塔下創(chuàng)建 compose 模板來實現(xiàn)管理的叹洲,所以升級時需要編寫新的 compose 文件柠硕。關(guān)于如何而升級 waf ,以后升級時再單獨(dú)記錄一篇文章运提。