انجیناکس؛ شب ۳۶: ساخت موتور و ماژول ModSecurity در clone
فهرست نوشته
وقتی بستهٔ سازگار نداری، ساخت ماژول نیازمند artifact قابل بازتولید است. امشب موتور و connector را در clone میسازیم و فقط ماژول را برای Nginx موجود نصب میکنیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: Snapshot مخصوص ساخت، فضای دیسک و compiler؛ مسیر بستهٔ شب ۳۵ را همزمان فعال نکن. این تمرین روی سرور واقعی مستقیم اجرا نمیشود. مسئولیت patch و rebuild پس از ارتقای Nginx با این مسیر بیشتر میشود.
پیشنیازهای ساخت#
در Debian/Ubuntu:
sudo apt install build-essential autoconf automake libtool pkg-config git \
libpcre2-dev libyajl-dev libcurl4-openssl-dev libxml2-dev libssl-dev
در Alma/Rocky معادلها را از مخزن معتبر نصب کن:
sudo dnf install gcc gcc-c++ make autoconf automake libtool pkgconf-pkg-config git \
pcre2-devel yajl-devel libcurl-devel libxml2-devel openssl-devel
اگر dependency به CRB/EPEL نیاز داشت، مخزن رسمی و lifecycle آن را بررسی کن؛ خطای configure را با حذف کور featureهای لازم دور نزن.
سورس و موتور#
نسخههای v3.0.17 موتور و v1.0.4 connector نمونهٔ ثابت این دورهاند؛ پیش از استفاده release/security advisory را بررسی کن. نسخهٔ دارای patch لازم را انتخاب و commit/hash و منبع اصالت را ثبت کن. tag امضاشده را با کلید maintainer که fingerprint آن را مستقل بررسی کردهای verify کن؛ صرف عبارت Verified در مرورگر جای اعتماد محلی را نمیگیرد.
mkdir -p ~/nginx-lab/build
cd ~/nginx-lab/build
git clone --branch v3.0.17 https://github.com/owasp-modsecurity/ModSecurity.git
git clone --branch v1.0.4 https://github.com/owasp-modsecurity/ModSecurity-nginx.git
cd ModSecurity
git submodule update --init --recursive
git rev-parse HEAD
./build.sh
./configure --prefix=/opt/nginx-lab/modsecurity
make -j2
sudo make install
پیش از build، بررسی اصالت را کامل کن. خروجی configure را نگه دار؛ کتابخانههای شناساییشده و قابلیتهای فعال مهماند. prefix به شاخهٔ آزمایشگاه محدود است و Nginx توزیع را نصب مجدد نمیکند.
ماژول با سورس همان Nginx#
با nginx -v و nginx -V نسخه و build options موجود را ثبت کن. سورس همان بسته با patchهای vendor را از source repository توزیع دریافت و بررسی کن؛ در Debian/Ubuntu مسیر apt source nginx به deb-src فعال نیاز دارد و در RHEL مسیر source RPM و build dependencies را مطابق همان مخزن تهیه میکنی. tarball upstream با شمارهٔ مشابه الزاماً سورس همان باینری توزیع نیست.
در ریشهٔ سورس آمادهٔ Nginx، configure را با flags سازگاری ثبتشدهٔ build اصلی اجرا کن. نمونهٔ حداقلی زیر وقتی به کار میرود که options و dependencyهای build اصلی را تطبیق دادهای؛ $NGINX_SOURCE_DIR را به آن مسیر واقعی و $CONNECTOR_DIR را به مسیر clone connector تنظیم کن:
cd "$NGINX_SOURCE_DIR"
MODSECURITY_INC=/opt/nginx-lab/modsecurity/include \
MODSECURITY_LIB=/opt/nginx-lab/modsecurity/lib \
./configure --with-compat --add-dynamic-module="$CONNECTOR_DIR"
make modules
هر flag لازم از build اصلی را آگاهانه اضافه کن؛ خروجی nginx -V را با eval اجرا نکن. --with-compat تضمین سازگاری هر نسخه یا patch نیست. برای Nginx، make install اجرا نکن چون فایلهای بسته را overwrite میکند.
فایل objs/ngx_http_modsecurity_module.so را با owner ریشه و mode 644 در module directory واقعی nginx -V نصب کن؛ معمولاً Debian/Ubuntu در /usr/lib/nginx/modules و RHEL در /usr/lib64/nginx/modules است. وجود library موردنیاز را با ldd روی artifact خودت بررسی کن؛ مسیر prefix میتواند از rpath ساخت تأمین شده باشد. اگر missing است، loader library را با مسیر ثبتشده و ldconfig تنظیم کن و دوباره بررسی کن. در SELinux context ماژول و library باید با policy سازگار باشد؛ خاموش کردن enforcement راه حل نیست.
در main context، تنها یک load_module با مسیر دقیق artifact اضافه کن. nginx -t، reload و درخواست واقعی شب بعد، هر سه لازماند. دستور موفق make modules تنها ساخت باینری را ثابت میکند.
بازگشت: directiveهای WAF و load_module اضافه را بردار، config قبلی را بررسی/reload کن و artifactهای clone را نگه دار؛ حذف library در حال استفاده را به بعد از بازگشت سرویس موکول کن.
منبع: ساخت موتور ، ساخت connector ، releaseهای connector ، ساخت Nginx .