テスト環境をFreeBSD 7.0-STABLEにあげたついでに、先延ばしになってたmod_securityで遊ぶ。
2.5.xはminorアップグレードなんだけど、変更の多さはメジャー級。個人的には組み込みluaをサポートするSecRuleScript、クライアントの地理位置を条件にできるSecGeoLookupDB、output filterを使ったコンテンツのインジェクションが可能になるSecContentInjectionがおもしろそう。PDF XSS対策もできるらしい(Universal PDF XSS Revisited)。
まずはluaをサポートさせるのに、luaのライブラリをshared libでインストールしておかないといけない。defaultではsoを作ってくれないので、lang/luaにパッチ。
===> Generating patch
===> Viewing diff with more
diff -ruN --exclude=CVS /usr/ports/lang/lua/Makefile /usr/home/cherry/svk/ports/lang/lua/Makefile
--- /usr/ports/lang/lua/Makefile 2008-03-20 01:20:31.000000000 +0900
+++ /usr/home/cherry/svk/ports/lang/lua/Makefile 2008-05-31 20:27:59.000000000 +0900
@@ -7,7 +7,7 @@
PORTNAME= lua
PORTVERSION= 5.1.3
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= lang
MASTER_SITES= http://www.lua.org/ftp/ \
ftp://ftp.tecgraf.puc-rio.br/pub/lua/ \
@@ -38,6 +38,13 @@
printf.lua readonly.lua sieve.lua sort.lua table.lua \
trace-calls.lua trace-globals.lua xd.lua
+.if defined(WITH_SHAREDLIB)
+LUA_LIB_VERSION= 0
+LUA_LIB_FILE= liblua
+PLIST_SUB+= LUA_LIB_VERSION=${LUA_LIB_VERSION}
+USE_LDCONFIG= ${LUA_LIBDIR}
+.endif
+
post-patch:
@${REINPLACE_CMD} -Ee \
'/^INSTALL_.*=/s/INSTALL_TOP/prefix/ ; \
@@ -74,6 +81,13 @@
# Libraries.
${MKDIR} ${LUA_LIBDIR}
${INSTALL_DATA} ${WRKSRC}/src/liblua.a ${LUA_LIBDIR}
+.if defined(WITH_SHAREDLIB)
+ ${INSTALL_PROGRAM} ${WRKSRC}/src/liblua.so ${LUA_LIBDIR}/${LUA_LIB_FILE}.so.${LUA_LIB_VERSION}
+ ${ECHO} "${LUA_LIBDIR}/${LUA_LIB_FILE}.so" | ${SED} 's,^${PREFIX}/,,' >> ${TMPPLIST}
+ ${LN} -sf ${LUA_LIBDIR}/${LUA_LIB_FILE}.so.${LUA_LIB_VERSION} ${LUA_LIBDIR}/${LUA_LIB_FILE}.so
+ ${ECHO} "${LUA_LIBDIR}/${LUA_LIB_FILE}.so.${LUA_LIB_VERSION}" | ${SED} 's,^${PREFIX}/,,' >> ${TMPPLIST}
+ ${ECHO} "@dirrm ${LUA_LIBDIR}" | ${SED} 's,^${PREFIX}/,,' >> ${TMPPLIST}
+.endif
# Manual pages.
.for f in ${LUA_MAN}
${INSTALL_MAN} ${WRKSRC}/doc/${f} \
@@ -95,7 +109,7 @@
.endif
# lua.pc
${MKDIR} ${LOCALBASE}/libdata/pkgconfig
- ${INSTALL_DATA} ${WRKSRC}/etc/lua.pc ${LOCALBASE}/libdata/pkgconfig/lua-${LUA_VER}.pc
+ ${INSTALL_DATA} ${WRKSRC}/etc/lua.pc ${PREFIX}/libdata/pkgconfig/lua-${LUA_VER}.pc
# Module directories.
${MKDIR} ${LUA_MODLIBDIR}
${MKDIR} ${LUA_MODSHAREDIR}
diff -ruN --exclude=CVS /usr/ports/lang/lua/files/patch-src-Makefile /usr/home/cherry/svk/ports/lang/lua/files/patch-src-Makefile
--- /usr/ports/lang/lua/files/patch-src-Makefile 1970-01-01 09:00:00.000000000 +0900
+++ /usr/home/cherry/svk/ports/lang/lua/files/patch-src-Makefile 2008-05-29 20:16:13.000000000 +0900
@@ -0,0 +1,27 @@
+--- src/Makefile.orig 2008-05-29 19:24:46.000000000 +0900
++++ src/Makefile 2008-05-29 19:27:30.000000000 +0900
+@@ -31,12 +31,13 @@
+
+ LUA_T= lua
+ LUA_O= lua.o
++LUA_SO= liblua.so
+
+ LUAC_T= luac
+ LUAC_O= luac.o print.o
+
+ ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
+-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
++ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)
+ ALL_A= $(LUA_A)
+
+ default: $(PLAT)
+@@ -47,6 +48,9 @@
+
+ a: $(ALL_A)
+
++$(LUA_SO): $(CORE_O) $(LIB_O)
++ $(CC) -o $@ $(MYLDFLAGS) -shared $?
++
+ $(LUA_A): $(CORE_O) $(LIB_O)
+ $(AR) $@ $?
+ $(RANLIB) $@
===> Done
liblua.n.soにしなくていいのかという話もあるけれど、テスト環境なので。
UPDATE: WITH_SHAREDLIBでbuildするようにした。(てきとーだけど)バージョンもつけるようにした。
次に、www/mod_security2にパッチ。configureベースになったのはいいのだけど、libluaを見つけてくれない。test関連のファイルがコンパイルできないのでカット。
diff -ruN --exclude=CVS /usr/ports/www/mod_security2/Makefile /usr/home/cherry/svk/ports/www/mod_security2/Makefile
--- /usr/ports/www/mod_security2/Makefile 2008-04-11 23:33:37.000000000 +0900
+++ /usr/home/cherry/svk/ports/www/mod_security2/Makefile 2008-05-29 19:39:29.000000000 +0900
@@ -6,8 +6,7 @@
#
PORTNAME= mod_security2
-PORTVERSION= 2.1.7
-PORTREVISION= 1
+PORTVERSION= 2.5.4
CATEGORIES= www security
MASTER_SITES= http://www.modsecurity.org/download/
DISTNAME= ${PORTNAME:S/_//:S/2//}-apache_${PORTVERSION}
@@ -31,6 +30,8 @@
DOCSDIR= ${PREFIX}/share/doc/${MODULENAME}
SUB_FILES+= mod_security2.conf
SUB_LIST+= APACHEETCDIR="${APACHEETCDIR}"
+HAS_CONFIGURE= yes
+OPTIONS= LUA "Embedded Lua language support (EXPERIMENTAL)" off
.if !defined(SKIP_RULES)
SUB_FILES+= pkg-message.rules
@@ -66,6 +67,11 @@
LIB_DEPENDS+= pcre.0:${PORTSDIR}/devel/pcre
.endif
+.if defined(WITH_LUA)
+CONFIGURE_ARGS+= --with-lua=${LUA_LIBDIR}
+USE_LUA= 5.1+
+.endif
+
post-patch:
@${REINPLACE_CMD} -e '\
s|SecRuleEngine On|SecRuleEngine DetectionOnly|; \
@@ -73,6 +79,11 @@
s|SecDebugLog.*logs/modsec_debug.log|SecDebugLog /var/log/httpd-modsec2_debug.log|; \
s|SecServerSignature "Apache/2.2.0 (Fedora)"|SecServerSignature "Apache/${APACHE_VERSION:C/[0-9]/\0./g}x (${OPSYS})"|; \
' ${WRKSRCTOP}/rules/modsecurity_crs_10_config.conf
+ # XXX prevent it from compiling
+ ${RM} ${WRKSRC}/msc_test.*
+.if defined(WITH_LUA)
+ ${REINPLACE_CMD} -e 's|%%LUA_INCDIR%%|${LUA_INCDIR}|' ${WRKSRC}/configure
+.endif
post-install:
.if !defined(NOPORTDOCS)
diff -ruN --exclude=CVS /usr/ports/www/mod_security2/distinfo /usr/home/cherry/svk/ports/www/mod_security2/distinfo
--- /usr/ports/www/mod_security2/distinfo 2008-04-08 12:23:57.000000000 +0900
+++ /usr/home/cherry/svk/ports/www/mod_security2/distinfo 2008-05-29 18:23:18.000000000 +0900
@@ -1,3 +1,3 @@
-MD5 (modsecurity-apache_2.1.7.tar.gz) = 19c34dd5611e0c516c0717de793f4640
-SHA256 (modsecurity-apache_2.1.7.tar.gz) = 3960aaa4a4f6087f990b0d25c3756c3a505f3b19a909e4724980dc5bbc583513
-SIZE (modsecurity-apache_2.1.7.tar.gz) = 679496
+MD5 (modsecurity-apache_2.5.4.tar.gz) = 9fe4d4cb481e00c2a49a65e59261f622
+SHA256 (modsecurity-apache_2.5.4.tar.gz) = be515456add43ecac6c441da1fcdb1ab94908ae6ff0c837854bcf141343932ae
+SIZE (modsecurity-apache_2.5.4.tar.gz) = 1071980
diff -ruN --exclude=CVS /usr/ports/www/mod_security2/files/patch-apache2-Makefile.in /usr/home/cherry/svk/ports/www/mod_security2/files/patch-apache2-Makefile.in
--- /usr/ports/www/mod_security2/files/patch-apache2-Makefile.in 1970-01-01 09:00:00.000000000 +0900
+++ /usr/home/cherry/svk/ports/www/mod_security2/files/patch-apache2-Makefile.in 2008-05-29 17:59:44.000000000 +0900
@@ -0,0 +1,20 @@
+--- Makefile.in.orig 2008-05-29 17:59:26.000000000 +0900
++++ Makefile.in 2008-05-29 17:59:41.000000000 +0900
+@@ -112,17 +112,6 @@
+ && echo "See: mlogc-src/INSTALL" \
+ && echo
+
+-### Experimental Test Framework (*NIX only right now)
+-msc_test.lo: msc_test.c
+- $(LIBTOOL) --mode=compile $(CC) $(APXS_INCLUDES) $(APXS_CFLAGS) $(EXTRA_CFLAGS) $(MODSEC_EXTRA_CFLAGS) $(CPPFLAGS) $(APR_CFLAGS) $(APU_CFLAGS) -o msc_test.lo -c msc_test.c
+-
+-msc_test: $(TESTOBJS) $(MOD_SECURITY2_H}) msc_test.lo
+- @objs=""; \
+- for f in $(MSC_TEST); do \
+- objs="$$objs $$f.lo"; \
+- done; \
+- $(LIBTOOL) --mode=link $(CC) $$objs -o msc_test msc_test.lo $(LDFLAGS) $(LIBS) $(APR_LINK_LD) $(APU_LINK_LD)
+-
+ test: t/run-tests.pl msc_test
+ @rm -f msc-test-debug.log; \
+ $(PERL) t/run-tests.pl
diff -ruN --exclude=CVS /usr/ports/www/mod_security2/files/patch-configure /usr/home/cherry/svk/ports/www/mod_security2/files/patch-configure
--- /usr/ports/www/mod_security2/files/patch-configure 1970-01-01 09:00:00.000000000 +0900
+++ /usr/home/cherry/svk/ports/www/mod_security2/files/patch-configure 2008-05-29 18:19:29.000000000 +0900
@@ -0,0 +1,11 @@
+--- configure.orig 2008-05-29 18:16:45.000000000 +0900
++++ configure 2008-05-29 18:18:56.000000000 +0900
+@@ -5620,7 +5620,7 @@
+ lua_lib_name=""
+ fi
+ done
+- for x in ${test_paths}; do
++ for x in ${test_paths} %%LUA_INCDIR%% ; do
+ if test -e "${x}/lua.h"; then
+ with_lua_inc="${x}"
+ break
diff -ruN --exclude=CVS /usr/ports/www/mod_security2/files/pkg-message.rules.in /usr/home/cherry/svk/ports/www/mod_security2/files/pkg-message.rules.in
--- /usr/ports/www/mod_security2/files/pkg-message.rules.in 2007-03-09 18:46:21.000000000 +0900
+++ /usr/home/cherry/svk/ports/www/mod_security2/files/pkg-message.rules.in 2008-05-29 19:02:18.000000000 +0900
@@ -8,3 +8,8 @@
Please read http://www.modsecurity.org/projects/rules/index.html
Logging is done to /var/log/httpd-modsec-*.log
+
+You need to add:
+ LoadFile %%PREFIX%%/lib/libxml2.so
+ LoadFile %%PREFIX%%/lua51/liblua.a
+before "LoadModule security2_module modules/mod_security2.so"
===> Done
httpd.confに追加。
LoadFile /usr/local/lib/libxml2.so
LoadFile /usr/local/lib/lua51/liblua.so
LoadModule security2_module libexec/apache22/mod_security2.so
これで動く。動作確認ができるまではsend-prはおあずけ。