Przejdź do głównej zawartości

3. Wysyłanie incydentów

Następnie, dodamy do pułapki logikę, która wyśle incydent kiedy użytkownik wejdzie na serwer pułapki.

Do wysyłania incydentów używamy TrapCLI, który jest już dodany do obrazu naszej pułapki.

uwaga

TrapCLI jest konfigurowany przez zmienne środowiskowe podczas tworzenia pułapki przez TrapInit. Dlatego wysyłanie incydentów nie będzie działało, jeśli nasza pułapka nie jest uruchomiona przez TrapInit.

Dodaj do app.py następującą funkcje:


import subprocess

def run_trap_cli(args):
try:
cmdline = ["TrapCLI"] + args
app.logger.info(f"Executing {cmdline}")
subprocess.run(cmdline)
except Exception as err:
app.logger.error("Error executing TrapCLI", err)

Dzięki niej, możemy wywołać dowolną komendę TrapCLI z poziomu naszej aplikacji w Python.

Następnie, zmodyfikujemy naszą funkcję index, obsługującą żądanie HTTP, aby wywoływała TrapCLI i wysyłała incydent. Odczytujemy adres IP klienta, który otworzył naszą pułapkę, z obiektu request biblioteki Flask.


@app.route("/")
def index():
run_trap_cli([
"send-incident",
"-n", "My trap sent an incident",
"-d", "Someone entered the trap",
"-s", "Info",
"-i", f"{request.remote_addr}"
])
return "Hello world! The trap is working :)"

Końcowy app.py powinien wyglądać następująco:


from flask import Flask, request
import subprocess

def run_trap_cli(args):
try:
cmdline = ["TrapCLI"] + args
app.logger.info(f"Executing {cmdline}")
subprocess.run(cmdline)
except Exception as err:
app.logger.error("Error executing TrapCLI", err)


app = Flask(__name__)


@app.route("/")
def index():
run_trap_cli([
"send-incident",
"-n", "My trap sent an incident",
"-d", "Someone entered the trap",
"-s", "Info",
"-i", f"{request.remote_addr}"
])
return "Hello world! The trap is working :)"

if __name__ == "__main__":
app.run(debug=False, host='0.0.0.0', port=80)

Zmieniamy także pole version w trapdef.json, aby nasza pułapka poprawnie się zaktualizowała w TrapInit:


- "version": "0.0.1",
+ "version": "0.0.2",

Następnie, budujemy definicję naszej pułapki ponownie:


docker compose build
docker save -o images.tar my-tutorial-trap
zip my-trap.zip trapdef.json images.tar docker-compose.yml

Po przesłaniu nowej definicji pułapki i utworzeniu instancji od nowa (aby zaczęły korzystać z nowej wersji definicji), po wejściu na pułapkę zostanie wysłany incydent:

Incydent