Skip to content

Commit 970d83b

Browse files
authored
Merge pull request #27 from mathiscapart/feat/apache-front
Feat/apache front
2 parents dffa761 + fc6f87d commit 970d83b

5 files changed

Lines changed: 147 additions & 10 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ jobs:
115115
context: ./honeypots/ftp
116116
- image: honeypot-http
117117
context: ./honeypots/http
118+
- image: honeypot-proxy
119+
context: ./honeypots/proxy
118120
- image: honeypot-ssh
119121
context: ./honeypots/ssh
120122
- image: honeybot

‎compose.prod.yml‎

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,10 @@ services:
126126
image: qualite863/honeypot-http:latest
127127
container_name: honeypot-http
128128
restart: unless-stopped
129-
# 80 (HTTP standard, crédibilité) et 8080 (cible des scripts d'attaque).
130-
# Le honeypot écoute en interne sur 8080 (port non privilégié -> non-root).
131-
ports:
132-
- "80:8080"
133-
- "8080:8080"
129+
# N'est plus exposé directement : seul le reverse-proxy Apache (honeypot-proxy)
130+
# le joint, en interne via honeypot-front (port 8080, process non-root).
131+
expose:
132+
- "8080"
134133
environment:
135134
HONEYPOT_HOST: "prod-srv-01"
136135
HTTP_LOG_FILE: "/var/log/honeypot/http.jsonl"
@@ -155,6 +154,38 @@ services:
155154
memory: 256M
156155
pids: 200
157156

157+
# Reverse-proxy Apache (anti-détection) : sert les assets statiques WordPress
158+
# RÉELS (vrais ETag/Last-Modified) et émet des en-têtes / pages d'erreur Apache
159+
# authentiques ; proxifie le dynamique vers honeypot-http. Seule surface HTTP
160+
# publique. Image autonome (config + assets bakés) — rien à monter côté hôte.
161+
honeypot-proxy:
162+
image: qualite863/honeypot-proxy:latest
163+
container_name: honeypot-proxy
164+
restart: unless-stopped
165+
depends_on:
166+
- honeypot-http
167+
# 80 (HTTP standard) et 8080 (cible des scripts d'attaque) -> Apache:80 interne.
168+
ports:
169+
- "80:80"
170+
- "8080:80"
171+
networks:
172+
- honeypot-front
173+
security_opt:
174+
- no-new-privileges:true
175+
read_only: true
176+
# Apache doit pouvoir écrire pid / mutex / logs sous une racine en lecture seule.
177+
tmpfs:
178+
- /var/run/apache2
179+
- /var/lock/apache2
180+
- /var/log/apache2
181+
- /tmp
182+
deploy:
183+
resources:
184+
limits:
185+
cpus: "0.50"
186+
memory: 256M
187+
pids: 200
188+
158189
# US-17 : centralisation des logs via Fluent Bit.
159190
fluent-bit:
160191
image: fluent/fluent-bit:3.1.9

‎compose.yml‎

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,11 +140,10 @@ services:
140140
image: qualite863/honeypot-http:latest
141141
container_name: honeypot-http
142142
restart: unless-stopped
143-
# 80 (HTTP standard, crédibilité) et 8080 (cible des scripts d'attaque).
144-
# Le honeypot écoute en interne sur 8080 (port non privilégié -> non-root).
145-
ports:
146-
- "80:8080"
147-
- "8080:8080"
143+
# N'est plus exposé directement : seul le reverse-proxy Apache (honeypot-proxy)
144+
# le joint, en interne via honeypot-front (port 8080, process non-root).
145+
expose:
146+
- "8080"
148147
environment:
149148
HONEYPOT_HOST: "prod-srv-01"
150149
HTTP_LOG_FILE: "/var/log/honeypot/http.jsonl"
@@ -169,6 +168,39 @@ services:
169168
memory: 256M
170169
pids: 200
171170

171+
# Reverse-proxy Apache (anti-détection, EPIC-2) : sert les assets statiques
172+
# WordPress RÉELS (vrais ETag/Last-Modified, contenu byte-exact) et émet des
173+
# en-têtes / pages d'erreur Apache authentiques ; proxifie le dynamique vers
174+
# honeypot-http. C'est désormais la SEULE surface HTTP publique.
175+
honeypot-proxy:
176+
build: ./honeypots/proxy
177+
image: qualite863/honeypot-proxy:latest
178+
container_name: honeypot-proxy
179+
restart: unless-stopped
180+
depends_on:
181+
- honeypot-http
182+
# 80 (HTTP standard) et 8080 (cible des scripts d'attaque) -> Apache:80 interne.
183+
ports:
184+
- "80:80"
185+
- "8080:80"
186+
networks:
187+
- honeypot-front
188+
security_opt:
189+
- no-new-privileges:true
190+
read_only: true
191+
# Apache doit pouvoir écrire pid / mutex / logs sous une racine en lecture seule.
192+
tmpfs:
193+
- /var/run/apache2
194+
- /var/lock/apache2
195+
- /var/log/apache2
196+
- /tmp
197+
deploy:
198+
resources:
199+
limits:
200+
cpus: "0.50"
201+
memory: 256M
202+
pids: 200
203+
172204
# US-17 : centralisation des logs via Fluent Bit.
173205
fluent-bit:
174206
image: fluent/fluent-bit:3.1.9

‎honeypots/proxy/Dockerfile‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# syntax=docker/dockerfile:1
2+
# Reverse-proxy Apache devant le honeypot HTTP (FastAPI). Objectif anti-détection :
3+
# - en-têtes / pages d'erreur / version Apache authentiques : Apache/2.4.57 (Debian) ;
4+
# - assets statiques WordPress RÉELS servis depuis le disque (vrais ETag / Last-Modified
5+
# / Accept-Ranges, contenu byte-exact => résiste au fingerprint WPScan) ;
6+
# - tout le dynamique proxifié vers le backend FastAPI (honeypot-http:8080).
7+
FROM debian:bookworm-slim
8+
9+
# Apache + extraction des SEULS fichiers statiques de WordPress 6.5.2 (pas de .php :
10+
# sans mod_php, Apache divulguerait sinon le code source des .php).
11+
# hadolint ignore=DL3008,DL3015
12+
RUN apt-get update \
13+
&& apt-get install -y --no-install-recommends apache2 ca-certificates curl unzip \
14+
&& a2enmod proxy proxy_http headers rewrite \
15+
&& curl -fsSL https://wordpress.org/wordpress-6.5.2.zip -o /tmp/wp.zip \
16+
&& unzip -q /tmp/wp.zip -d /tmp \
17+
&& cd /tmp/wordpress \
18+
&& find wp-includes wp-content wp-admin -type f \
19+
\( -name '*.css' -o -name '*.js' -o -name '*.map' -o -name '*.png' -o -name '*.jpg' \
20+
-o -name '*.jpeg' -o -name '*.gif' -o -name '*.svg' -o -name '*.ico' \
21+
-o -name '*.woff' -o -name '*.woff2' -o -name '*.ttf' -o -name '*.eot' \) \
22+
-exec cp --parents -t /var/www/html {} + \
23+
&& cp readme.html license.txt /var/www/html/ \
24+
&& chown -R www-data:www-data /var/www/html \
25+
&& sed -i 's/^ServerTokens .*/ServerTokens OS/' /etc/apache2/conf-available/security.conf \
26+
&& sed -i 's/^ServerSignature .*/ServerSignature On/' /etc/apache2/conf-available/security.conf \
27+
&& rm -rf /tmp/wp.zip /tmp/wordpress /var/lib/apt/lists/*
28+
29+
COPY honeypot.conf /etc/apache2/sites-available/000-default.conf
30+
31+
# Valide la syntaxe de la conf au build (échoue le build si la conf est invalide).
32+
RUN apache2ctl configtest
33+
34+
EXPOSE 80
35+
# Apache en avant-plan comme PID 1.
36+
CMD ["apache2ctl", "-D", "FOREGROUND"]

‎honeypots/proxy/honeypot.conf‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# VirtualHost du reverse-proxy honeypot (remplace 000-default.conf).
2+
# Les assets statiques WordPress sont servis depuis le disque par Apache (en-têtes
3+
# authentiques) ; tout le reste (PHP dynamique émulé) est proxifié vers FastAPI.
4+
<VirtualHost *:80>
5+
ServerName prod-srv-01
6+
ServerAdmin webmaster@localhost
7+
DocumentRoot /var/www/html
8+
DirectoryIndex index.php index.html
9+
10+
<Directory /var/www/html>
11+
Options -Indexes +FollowSymLinks
12+
AllowOverride None
13+
Require all granted
14+
</Directory>
15+
16+
# X-Powered-By cohérent (Title-Case), ajouté par Apache sur toutes les réponses.
17+
Header always set X-Powered-By "PHP/7.4.33"
18+
19+
ProxyPreserveHost On
20+
ProxyTimeout 30
21+
22+
# --- Assets statiques : servis depuis le disque (PAS proxifiés) ---
23+
# => vrais ETag / Last-Modified / Accept-Ranges, contenu WordPress byte-exact ;
24+
# un fichier absent => vraie page 404 Apache (et non la 404 WordPress).
25+
ProxyPass /wp-content/ !
26+
ProxyPass /wp-includes/ !
27+
ProxyPass /wp-admin/css/ !
28+
ProxyPass /wp-admin/js/ !
29+
ProxyPass /wp-admin/images/ !
30+
ProxyPass /readme.html !
31+
ProxyPass /license.txt !
32+
33+
# --- Tout le dynamique (WordPress émulé) -> backend FastAPI interne ---
34+
ProxyPass / http://honeypot-http:8080/ retry=0
35+
ProxyPassReverse / http://honeypot-http:8080/
36+
</VirtualHost>

0 commit comments

Comments
 (0)