changed modsecurity logs location
This commit is contained in:
		
							parent
							
								
									398b881178
								
							
						
					
					
						commit
						237116f251
					
				
							
								
								
									
										10
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -20,9 +20,7 @@
 | 
				
			||||||
# server
 | 
					# server
 | 
				
			||||||
server/server
 | 
					server/server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# nginx logs
 | 
					# logs
 | 
				
			||||||
docker/suricata/nginx/logs/access.log
 | 
					**/*.log
 | 
				
			||||||
docker/suricata/nginx/logs/error.log
 | 
					**/*.pcap*
 | 
				
			||||||
 | 
					**/eve.json
 | 
				
			||||||
# suricata logs
 | 
					 | 
				
			||||||
docker/suricata/suricata/logs/*
 | 
					 | 
				
			||||||
| 
						 | 
					@ -29,9 +29,9 @@ services:
 | 
				
			||||||
      PARANOIA: 1
 | 
					      PARANOIA: 1
 | 
				
			||||||
    network_mode: "host"
 | 
					    network_mode: "host"
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - "/tmp/host-fs-auditlog.log:/var/log/modsec_audit.log"
 | 
					      - "./logs/host-fs-auditlog.log:/var/log/modsec_audit.log"
 | 
				
			||||||
      - "/tmp/host-fs-errorlog.log:/var/log/modsec_error.log"
 | 
					      - "./logs/host-fs-errorlog.log:/var/log/modsec_error.log"
 | 
				
			||||||
      - "/tmp/host-fs-accesslog.log:/var/log/apache2/access.log"
 | 
					      - "./logs/host-fs-accesslog.log:/var/log/apache2/access.log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  dvwa:
 | 
					  dvwa:
 | 
				
			||||||
    image: vulnerables/web-dvwa
 | 
					    image: vulnerables/web-dvwa
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
touch /tmp/host-fs-auditlog.log
 | 
					mkdir logs
 | 
				
			||||||
touch /tmp/host-fs-errorlog.log
 | 
					touch ./logs/host-fs-auditlog.log
 | 
				
			||||||
touch /tmp/host-fs-accesslog.log
 | 
					touch ./logs/host-fs-errorlog.log
 | 
				
			||||||
chmod 777 /tmp/host-fs-auditlog.log
 | 
					touch ./logs/host-fs-accesslog.log
 | 
				
			||||||
chmod 777 /tmp/host-fs-errorlog.log
 | 
					chmod 777 ./logs/host-fs-auditlog.log
 | 
				
			||||||
chmod 777 /tmp/host-fs-accesslog.log
 | 
					chmod 777 ./logs/host-fs-errorlog.log
 | 
				
			||||||
 | 
					chmod 777 ./logs/host-fs-accesslog.log
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ go 1.23.2
 | 
				
			||||||
require github.com/jackc/pgx/v5 v5.7.1
 | 
					require github.com/jackc/pgx/v5 v5.7.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
 | 
						github.com/fsnotify/fsnotify v1.8.0 // indirect
 | 
				
			||||||
	github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect
 | 
						github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect
 | 
				
			||||||
	github.com/jackc/pgpassfile v1.0.0 // indirect
 | 
						github.com/jackc/pgpassfile v1.0.0 // indirect
 | 
				
			||||||
	github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
 | 
						github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
 | 
				
			||||||
| 
						 | 
					@ -14,5 +15,6 @@ require (
 | 
				
			||||||
	github.com/tidwall/pretty v1.2.0 // indirect
 | 
						github.com/tidwall/pretty v1.2.0 // indirect
 | 
				
			||||||
	golang.org/x/crypto v0.32.0 // indirect
 | 
						golang.org/x/crypto v0.32.0 // indirect
 | 
				
			||||||
	golang.org/x/sync v0.10.0 // indirect
 | 
						golang.org/x/sync v0.10.0 // indirect
 | 
				
			||||||
 | 
						golang.org/x/sys v0.29.0 // indirect
 | 
				
			||||||
	golang.org/x/text v0.21.0 // indirect
 | 
						golang.org/x/text v0.21.0 // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,8 @@
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
 | 
					github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
 | 
				
			||||||
 | 
					github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
 | 
				
			||||||
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc=
 | 
					github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc=
 | 
				
			||||||
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
 | 
					github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
 | 
				
			||||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 | 
					github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 | 
				
			||||||
| 
						 | 
					@ -28,6 +30,8 @@ golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
 | 
				
			||||||
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 | 
					golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 | 
				
			||||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
 | 
					golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
 | 
				
			||||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
					golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
				
			||||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
 | 
					golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
 | 
				
			||||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 | 
					golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,21 +2,29 @@ package telegram
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/fsnotify/fsnotify"
 | 
				
			||||||
	tg "github.com/go-telegram-bot-api/telegram-bot-api/v5"
 | 
						tg "github.com/go-telegram-bot-api/telegram-bot-api/v5"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	modsecLogFile  = "/tmp/host-fs-auditlog.log"
 | 
						modsecLogFile  = "/home/vomitblood/build/cspj-application/docker/chungus/logs/host-fs-auditlog.log"
 | 
				
			||||||
	telegramToken  = "7215466800:AAGwjZnXEfbbjQiA0y7qtSzbSZNUWQJnyjo"
 | 
						telegramToken  = "7215466800:AAGwjZnXEfbbjQiA0y7qtSzbSZNUWQJnyjo"
 | 
				
			||||||
	telegramChatID = 622943829
 | 
						telegramChatID = 622943829
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var lastReadPosition int64 = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type LogEntry struct {
 | 
				
			||||||
 | 
						AuditData struct {
 | 
				
			||||||
 | 
							Messages []string `json:"messages"`
 | 
				
			||||||
 | 
						} `json:"audit_data"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TelegramBotInit() {
 | 
					func TelegramBotInit() {
 | 
				
			||||||
	bot, err := tg.NewBotAPI(telegramToken)
 | 
						bot, err := tg.NewBotAPI(telegramToken)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -32,28 +40,85 @@ func TelegramBotInit() {
 | 
				
			||||||
		log.Fatal("Failed to send test message:", err)
 | 
							log.Fatal("Failed to send test message:", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// open the log file
 | 
						// Start watching the log file for changes
 | 
				
			||||||
	logFile, err := os.Open(modsecLogFile)
 | 
						watchLogFile(bot)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func watchLogFile(bot *tg.BotAPI) {
 | 
				
			||||||
 | 
						watcher, err := fsnotify.NewWatcher()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatal("Failed to open log file:", err)
 | 
							log.Fatal("Failed to initialize watcher:", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer logFile.Close()
 | 
						defer watcher.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// seek to the end of the file to read only new entries
 | 
						// Add log file to watcher
 | 
				
			||||||
	logFile.Seek(0, io.SeekEnd)
 | 
						err = watcher.Add(modsecLogFile)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Failed to watch log file:", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log.Println("🔍 Monitoring log file for changes...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reader := bufio.NewReader(logFile)
 | 
					 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		line, err := reader.ReadString('\n')
 | 
							select {
 | 
				
			||||||
		if err == nil {
 | 
							case event, ok := <-watcher.Events:
 | 
				
			||||||
			sendTelegramAlert(bot, line)
 | 
								if !ok {
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if event.Op&fsnotify.Write == fsnotify.Write {
 | 
				
			||||||
 | 
									log.Println("📄 Log file updated, reading new entries...")
 | 
				
			||||||
 | 
									readNewLines(bot)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case err, ok := <-watcher.Errors:
 | 
				
			||||||
 | 
								if !ok {
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								log.Println("⚠️ Watcher error:", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// maybe change this logic? interrupt vs polling??????
 | 
						}
 | 
				
			||||||
		time.Sleep(1 * time.Second)
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readNewLines(bot *tg.BotAPI) {
 | 
				
			||||||
 | 
						file, err := os.Open(modsecLogFile)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println("❌ Failed to reopen log file:", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer file.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Move to the last read position
 | 
				
			||||||
 | 
						file.Seek(lastReadPosition, os.SEEK_SET)
 | 
				
			||||||
 | 
						scanner := bufio.NewScanner(file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for scanner.Scan() {
 | 
				
			||||||
 | 
							line := scanner.Text()
 | 
				
			||||||
 | 
							var logEntry LogEntry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Try to parse JSON
 | 
				
			||||||
 | 
							if err := json.Unmarshal([]byte(line), &logEntry); err != nil {
 | 
				
			||||||
 | 
								log.Println("⚠️ Failed to parse JSON:", err)
 | 
				
			||||||
 | 
								continue // Skip invalid JSON lines
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Send only the first message from messages[]
 | 
				
			||||||
 | 
							if len(logEntry.AuditData.Messages) > 0 {
 | 
				
			||||||
 | 
								sendTelegramAlert(bot, logEntry.AuditData.Messages[0])
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Update last read position
 | 
				
			||||||
 | 
						lastReadPosition, _ = file.Seek(0, os.SEEK_CUR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := scanner.Err(); err != nil {
 | 
				
			||||||
 | 
							log.Println("❌ Error reading log file:", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func sendTelegramAlert(bot *tg.BotAPI, message string) {
 | 
					func sendTelegramAlert(bot *tg.BotAPI, message string) {
 | 
				
			||||||
	msg := tg.NewMessage(telegramChatID, fmt.Sprintf("*WEEWOO ALERT*\n%s", message))
 | 
						msg := tg.NewMessage(telegramChatID, fmt.Sprintf("🚨 *WEEWOO ALERT* 🚨\n%s", message))
 | 
				
			||||||
	bot.Send(msg)
 | 
						_, err := bot.Send(msg)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println("❌ Failed to send Telegram message:", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue