centos7環(huán)境下ModSecurity-envoy編譯和測(cè)試(一) - 野路子技術(shù)宅的博客

@@ ~~ ^_ ^ &_&

相信光,相信相信的力量.

技術(shù)是安身立命之本,實(shí)踐出真知,熟能生巧,佐以業(yè)務(wù)能力,遇上風(fēng)口之時(shí),可逆天改命!

本文同步發(fā)布在作者的個(gè)人博客,歡迎轉(zhuǎn)載。野路子技術(shù)宅博客

http://www.yousee.top

=====================================================================

這篇文章是最近2個(gè)月的工作成果,做個(gè)記錄和備注。

最近一年都在參與某央企通信企業(yè)的安全產(chǎn)品研發(fā)工作,其中我的任務(wù)是進(jìn)行云原生、零信任技術(shù)和開源安全產(chǎn)品研究。

先表個(gè)態(tài)度:感謝領(lǐng)導(dǎo),感謝隊(duì)友,感謝大佬指點(diǎn)和包容。

一、關(guān)于ModSecurity

[圖片上傳失敗...(image-626a65-1673406097867)]](https://github.com/SpiderLabs/ModSecurity/raw/v3/master/others/modsec.png))

ModSecurity是一個(gè)開源的、跨平臺(tái)的Web應(yīng)用防火墻(WAF),被稱為WAF界的“瑞士軍刀”。它可以通過檢查Web服務(wù)接收到的數(shù)據(jù),以及發(fā)送出去的數(shù)據(jù)來對(duì)網(wǎng)站進(jìn)行安全防護(hù)。

1、站點(diǎn)鏈接

官方站點(diǎn)

https://github.com/SpiderLabs/ModSecurity

非官方中文站點(diǎn)

http://www.modsecurity.cn/

2、功能用途介紹

WAF主要用于網(wǎng)站的防護(hù),攔截惡意攻擊和請(qǐng)求,主要用途如下:

SQL Injection (SQLi):阻止SQL注入

Cross Site Scripting (XSS):阻止跨站腳本攻擊

Local File Inclusion (LFI):阻止利用本地文件包含漏洞進(jìn)行攻擊

Remote File Inclusione(RFI):阻止利用遠(yuǎn)程文件包含漏洞進(jìn)行攻擊

Remote Code Execution (RCE):阻止利用遠(yuǎn)程命令執(zhí)行漏洞進(jìn)行攻擊

PHP Code Injectiod:阻止PHP代碼注入

HTTP Protocol Violations:阻止違反HTTP協(xié)議的惡意訪問

HTTPoxy:阻止利用遠(yuǎn)程代理感染漏洞進(jìn)行攻擊

Sshllshock:阻止利用Shellshock漏洞進(jìn)行攻擊

Session Fixation:阻止利用Session會(huì)話ID不變的漏洞進(jìn)行攻擊

Scanner Detection:阻止黑客掃描網(wǎng)站

Metadata/Error Leakages:阻止源代碼/錯(cuò)誤信息泄露

Project Honey Pot Blacklist:蜜罐項(xiàng)目黑名單

GeoIP Country Blocking:根據(jù)判斷IP地址歸屬地來進(jìn)行IP阻斷

二、編譯環(huán)境

vmware安裝centos虛擬機(jī),構(gòu)建代碼編譯環(huán)境。

centos7.9 minal

gcc 9.23.3

cmake 3.16

bazel 0.28.0

三、環(huán)境準(zhǔn)備

1、vmware / visualbo 安裝centos7

設(shè)置靜態(tài)IP為192.168.43.224

安裝詳情略,有需要的筒子們請(qǐng)自行度娘或者狗狗。如有必要,私聊我哈。

2、準(zhǔn)備上網(wǎng)工具

都已經(jīng)21世紀(jì)了,不要浪費(fèi)時(shí)間在無意義的網(wǎng)絡(luò)上面,特別是IT人士,保持網(wǎng)絡(luò)通暢的重要性不言而喻。

編譯過程時(shí)間比較長(zhǎng),涉及到公共類庫(kù)的下載、編譯和校驗(yàn),整過過程需要保持網(wǎng)絡(luò)的通暢,需能訪問github站點(diǎn),個(gè)中的意味,自己體驗(yàn)哈。

2.1export配置網(wǎng)絡(luò)代理

http代理端口為10811,socks5端口為10810,直接粘貼到centos終端命令行。


export http_proxy=http://192.168.43.224:10811

export https_proxy=https://192.168.43.224:10811

export ALL_PROXY=socks5://192.168.43.224:10810


2.2 設(shè)置git客戶端代理

在代碼更新過程中,git submodule會(huì)請(qǐng)求github拉取代碼,網(wǎng)絡(luò)不順暢會(huì)導(dǎo)致異常,失敗,這些都是大叔在實(shí)踐中遇到的技術(shù)細(xì)節(jié)問題。

git config --global https.proxy http://192.168.43.224:10811

git config --global https.proxy https://192.168.43.224:10811

git config --global http.proxy socks5://192.168.43.224:10810

git config --global https.proxy socks5://192.168.43.224:10810

設(shè)置完畢2.1和2.2步驟,檢查下是否成功。

curl www.狗狗.com

終端返回html標(biāo)簽記錄,說明已經(jīng)網(wǎng)絡(luò)dialing設(shè)置成功。


四、代碼下載

Modesecurity作為lib庫(kù),從apache插件發(fā)展成標(biāo)準(zhǔn)的開源waf類庫(kù),能靈活集成到nginx、apache、IIS以envoy。envoy作為云原生利器,用來做waf應(yīng)用的資料比較少。

項(xiàng)目地址:

https://github.com/vmware-archive/ModSecurity-envoy

做好準(zhǔn)備,下載代碼。action ~ go!

1、建立工作目錄

cd ~

mkdir ModeSecurity

cd ModSecurity

2、下載代碼

git clone git@github.com:octarinesec/ModSecurity-envoy.git

git clone git@github.com:SpiderLabs/ModSecurity.git

如果下載代碼有問題,需要設(shè)置git 的ssh權(quán)限,有問題的可以留言!

git submodule update --init

bazel build //:envoy

3、安裝依賴包和工具

安裝unzip

yum install -y unzip

centos7安裝bazel0.28.0

wget https://github.com/bazelbuild/bazel/releases/download/0.28.0/bazel-0.28.0-installer-linux-x86_64.sh

chmod +x ./bazel-0.28.0-installer-linux-x86_64.sh

./bazel-0.28.0-installer-linux-x86_64.sh --user

bazel version

安裝ninja

yum install -y ninja-build

安裝失敗,提示沒有yum源,狗狗搜索ninja,找到歪果仁大神的資料。

ninja參考資料](https://software.opensuse.org//download.html?project=home%3Adanci1973&package=ninja))

步驟如下:

cd /etc/yum.repos.d/

wget https://download.opensuse.org/repositories/home:danci1973/CentOS_7/home:danci1973.repo --no-check-certificate

yum install ninja

安裝pcre包

yum install -y pcre

yum install -y pcre-devel

通過centos-release-scl工具包安裝gcc9

老狗大叔通過gcc源碼編譯安裝,耗費(fèi)4個(gè)多小時(shí)才完成make && make install,一路走來,苦不堪言的。這是個(gè)笨到家的方法!

通過狗狗搜索引擎,找到scl神奇的工具包,事半功倍,效率高到飛起!

參照 https://blog.csdn.net/qq_42819333/article/details/127442286

安裝步驟:

yum -y install centos-release-scl

yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils #安裝最新版本的GCC

scl enable devtoolset-9 bash

echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile #修改環(huán)境變量

gcc -v

升級(jí)CMAKE

centos系統(tǒng)自帶的cmake版本過低,引起編譯錯(cuò)誤,提示cmake2.8版本異常,需升級(jí)cmake3.16版本。

升級(jí)cmake

https://linuxfere.com/how-to-install-latest-cmake-on-centos

curl -LO https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-linux-x86_64.tar.gz

tar -xvf cmake-3.22.2-linux-x86_64.tar.gz

mv cmake-3.22.2-linux-x86_64 /usr/local/cmake

echo 'export PATH="/usr/local/cmake/bin:$PATH"' >> ~/.bashrc

source ~/.bashrc

cmake --version

安裝patch

yum -y install patch

其他依賴包

yum install -y libtool realpath clang-format-5.0 automake

yum install -y g++ flex bison curl doxygen libyajl-dev libgeoip-dev libtool dh-autoreconf libcurl4-gnutls-dev libxml2 libpcre++-dev libxml2-dev

如果出現(xiàn)下列異常提示,是對(duì)應(yīng)的包已經(jīng)廢棄或者yum源找不到對(duì)應(yīng)的包,需到pkgs.org查找對(duì)應(yīng)的安裝包。

異常提示:

沒有可用軟件包 libyajl-dev

沒有可用軟件包 libgeoip-dev

沒有可用軟件包 dh-autoreconf

沒有可用軟件包 libcurl4-gnutls-dev

沒有可用軟件包 libpcre++-dev

沒有可用軟件包 libxml2-dev

不用著急,我們通過關(guān)鍵包名,找到對(duì)應(yīng)的軟件包。

參照資料

https://centos.pkgs.org/7/centos-x86_64/yajl-2.0.4-4.el7.x86_64.rpm.html

yum install -y yajl

yum install -y libxml2-devel

GeoIP包參照

https://centos.pkgs.org/7/centos-x86_64/GeoIP-1.5.0-14.el7.x86_64.rpm.html

https://centos.pkgs.org/7/centos-x86_64/GeoIP-devel-1.5.0-14.el7.i686.rpm.html

安裝GeoIP數(shù)據(jù)庫(kù)

yum install GeoIP-data

開發(fā)工具包

yum install GeoIP-devel

lcurl工具包

ecntos自帶的culr是舊版本,無法滿足編譯要求,需更新libcurl。

參照文章

https://centos.pkgs.org/7/centos-x86_64/libcurl-7.29.0-59.el7.x86_64.rpm.html

yum install libcurl

五、代碼編譯

1、切換編譯環(huán)境到gcc 9

scl enable devtoolset-9 bash

gcc -v

查看gcc版本9.23.3

加載envoy代碼分支

cd ModSecurity-envoy

git submodule update --init

rm -rf envoy

切換envoy1.11.0版本

git clone -b v1.11.0 https://github.com/envoyproxy/envoy.git

通過bazel命令構(gòu)建工程代碼

bazel build //:envoy

編譯錯(cuò)誤修正記錄

因本人能力和水平有限,僅設(shè)定本次工作目標(biāo)是修正代碼錯(cuò)誤,保證代碼能正常通過和運(yùn)行,是不嚴(yán)謹(jǐn)和取巧的方式。也懇請(qǐng)C++的大神朋友請(qǐng)不吝指教和指點(diǎn)。

在編譯過程重,會(huì)出現(xiàn)4次代碼提示錯(cuò)誤,下面一一記錄。

第一次錯(cuò)誤

ERROR: An error occurred during the fetch of repository 'com_github_eile_tclap':

java.io.IOException: Error downloading [https://github.com/eile/tclap/archive/tclap-1-2-1-release-final.tar.gz] to /root/.cache/bazel/_bazel_root/0d8d6857ae4850c8e935cdce2c56c02a/external/com_github_eile_tclap/tclap-1-2-1-release-final.tar.gz: GET returned 404 Not Foun

https://github.com/eile/tclap/archive/tclap-1-2-1-release-final.tar.gz

通過錯(cuò)誤包關(guān)鍵字查找文件

cd /root/.cache/bazel

find . | xargs grep -ril "eile/tclap/archive"

find /root/.cache/bazel/ | xargs grep -ril "eile/tclap/archive"

找到文件repository_locations.bzl,修正地址路徑

vi /root/.cache/bazel/_bazel_root/0d8d6857ae4850c8e935cdce2c56c02a/external/envoy/bazel/repository_locations.bzl

修改為

https://github.com/mirror/tclap/archive/tclap-1-2-1-release-final.tar.gz

保存,繼續(xù)編譯

bazel build //:envoy

第二次錯(cuò)誤,三方類庫(kù)代碼異常

/root/.cache/bazel/_bazel_root/0d8d6857ae4850c8e935cdce2c56c02a/external/com_github_datadog_dd_opentracing_cpp/BUILD.bazel

external/com_github_datadog_dd_opentracing_cpp/src/tracer.cpp

101 | return std::move(span);

修正方式

vi /root/.cache/bazel/_bazel_root/0d8d6857ae4850c8e935cdce2c56c02a/external/com_github_datadog_dd_opentracing_cpp/src/tracer.cpp

注釋

//return std::move(span);

return nullptr;

保存,繼續(xù)編譯

bazel build //:envoy

第三次錯(cuò)誤

n file included from external/envoy/source/exe/main_common.cc:7:

bazel-out/k8-fastbuild/bin/external/envoy/source/common/common/_virtual_includes/compiler_requirements_lib/common/common/compiler_requirements.h:14:2: error: #error "Your toolchain has set _GLIBCXX_USE_CXX11_ABI to a value that uses a std::string " "implementation that is not thread-safe. This may cause rare and difficult-to-debug errors " "if std::string is passed between threads in any way. If you accept this risk, you may define " "ENVOY_IGNORE_GLIBCXX_USE_CXX11_ABI_ERROR=1 in your build."

14 | #error "Your toolchain has set _GLIBCXX_USE_CXX11_ABI to a value that uses a std::string " \

| ^~~~~

Target //:envoy-static failed to build

Use --verbose_failures to see the command lines of failed build steps.

注釋調(diào)宏定義

error

[root@localhost ModSecurity-envoy]# ll bazel-out/k8-fastbuild/bin/external/envoy/source/common/common/_virtual_includes/compiler_requirements_lib/common/common/compiler_requirements.h

vi /root/.cache/bazel/_bazel_root/0d8d6857ae4850c8e935cdce2c56c02a/external/envoy/source/common/common/compiler_requirements.h

注釋#error宏定義

保存,繼續(xù)編譯

bazel build //:envoy

無法找到lib包異常

編譯test階段,提示無法找到包的異常,提示:

/usr/bin/ld: cannot find -lxxx

參照文章:

https://www.cnblogs.com/zhming26/p/6164131.html

https://blog.csdn.net/AXW2013/article/details/51207498

http://www.itdecent.cn/p/ccaf688f54c0

前面準(zhǔn)備階段已經(jīng)完成工具包安裝,在系統(tǒng)路徑下建立連接即可。

建立軟連接到加載目錄:

cd /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9

ln -sfT /usr/lib64/libyajl.so.2 ./libyajl.so

ln -sfT /usr/bin/curl ./curl

ln -sfT /usr/bin/curl ./libcurl.so

cd /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9

ln -sfT /usr/lib64/libcurl.so.4 ./libcurl.so

繼續(xù)編譯

bazel build //:envoy

后續(xù)出現(xiàn)異常,根據(jù)提示解決問題,完成最終編譯。

時(shí)間已經(jīng)到 3:06 2023/1/10,明天還要上班,今天先到這里。

歡迎轉(zhuǎn)載,請(qǐng)保留出處。

野路子技術(shù)宅](http://www.yousee.top/articles/57))

http://www.yousee.top/articles/57

關(guān)于waf的測(cè)試和問題,留到下一篇博文做介紹和總結(jié)。

感謝耐心看完我的分享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容