@@ ~~ ^_ ^ &_&
相信光,相信相信的力量.
技術(shù)是安身立命之本,實(shí)踐出真知,熟能生巧,佐以業(yè)務(wù)能力,遇上風(fēng)口之時(shí),可逆天改命!
本文同步發(fā)布在作者的個(gè)人博客,歡迎轉(zhuǎn)載。野路子技術(shù)宅博客
=====================================================================
這篇文章是最近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)
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é)。
感謝耐心看完我的分享!