Logical Model, richtig ?

srepper

Neuer Benutzer
Beiträge
3
Liebe Community,
derzeit schreibe ich an meiner Bachelorarbeit. Es handelt, um einen Schwachstellenscan der auf die Website hochgeladen, ausgewertet und anschließend in die Datenbank gespeichert wírd. Dabei werden die 5 kritischsten Schwachstellen des Monats in eine CSV Datei gespeichert. ( Todo-Liste )

Im Modul Datenbanken habe ich gelernt, dass man mithilfe von Powerdesigner ein Logical Model erstellen kann, dann zu einem Physical Model und anschließend zu eine SQL Datei.

Derzeit habe ich einen Entwurf zum Logical Model. ( Siehe Bild )

Erklärung:

Es gibt verschiedene Kunden, die unterschiedlich heißen.
Jeder Kunde hat verschiedene Schwachstellen (Vuln). Mindestens eine Schwachstelle beeinhaltet eine CVE.
Jede Schwachstelle beeinhaltet mindestens eine Adresse.


Was mich dabei verunsichert sind zwei Punkte:

Area: in dieser Entity sollen die Netzbereiche gespeichert werden (Extern: 192.168.1.0/24, 192.168.3.0/24 ..) der jeweiligen Kunden.
Zumal ich hierfür keinen Primarykey brauche, da Area von Customer die Customerid erbt und ich auf den jeweiligen Kunden durch die geerbte Customerid durch iterieren kann um die einzelnen Netzbereiche des Kunden zu erhalten, richtig ?

Todo Liste: Die Entity TodoListe beeinhaltet Schwachstellen die man auf meiner Webseite ausgewählt hat ( Maximal 5 ) mit den Schwachstellen der letzten Monaten.
Eine Verbindung zur Adresse entstand, da gepatchte sowie ungepatchte Schwachstellen mit der IP Adressen für die Todo Liste von Bedeutung sind.
Sprich im Juni wurde die hälfte der Schwachstellen gepatcht und im August die restlichen.



Ist mein Lösungsansatz korrekt?

Verzeihung die Informationen könnten etwas "overloaded" sein, doch ich bin etwas verzweifelt.


Beste Grüße
 

Anhänge

  • Datenbank Logical.jpg
    Datenbank Logical.jpg
    105 KB · Aufrufe: 7
Werbung:
IP-Adressen im Bereich 192.168.x.y sind nicht extern, das sind private Adressen. Für die Speicherung von IP-Adressen besitzen moderne Datenbanken passende Typen, auch für MAC-Adrssen. Falls 'Age' irgendwie einen Zeitraum darstellen sollte, so gibt es auch dafür bessere Datentypen.

Ansonsten sagt das (mir) nicht sehr viel, plain SQL würde mehr sagen.
 
IP-Adressen im Bereich 192.168.x.y sind nicht extern, das sind private Adressen. Für die Speicherung von IP-Adressen besitzen moderne Datenbanken passende Typen, auch für MAC-Adrssen. Falls 'Age' irgendwie einen Zeitraum darstellen sollte, so gibt es auch dafür bessere Datentypen.

Ansonsten sagt das (mir) nicht sehr viel, plain SQL würde mehr sagen.

Danke für die schnelle Rückmeldung! :D
Die IP Adresse war bloß für das Verständnis, Da ich ein Bereich ( /24 ) oder feste IP Adressen mit einem Komma speichere, um so mithilfe von PHP durch iteriere, ob die Schwachstelle zu dem jeweiligen Bereich gehört.
Der Wert 'Age' wird durch die XML Datei einen String haben ( 350 - 720 Days ) o.ä. Das pase ich ebenfalls mit PHP

Sorry Vergessen zu erwähnen, dass ich MariaDB nutzen möchte.


@akretschmer Wenn ich jetzt so darüber nachdenke wird dem Entity "Todo-Liste" PluginNameTodo gegeben, um so in der Entity "Vuln" nach der Schwachstelle zu suchen.
Die Entity "Todo-Liste" wird eine CustomerId erhalten ( um den Kunden festzulegen )

Ich werde mit dem Powerdesigner mal einen SQL Entwurf machen.

Wenn der Experte erstmal keine Fehler entdeckt werde ich später die SQL Datei hochladen.
 

Die Diskussion ist schon recht kleinteilig geworden. :)

Du solltest beim Design nicht so sehr daran denken, wie Du mit einem bestimmten Werkzeug darauf aufsetzen würdest. Die Spielreglen zur Modellierung sind davon unabhängig.

Area
Ich würde nicht unbedingt mit einem PK sparen. „Durchiterieren“ kann man natürlich machen, mit allen Daten auf der Welt, auch ohne PK. Man möchte aber vielleicht nicht nur durchiterieren, sondern einzelne DS gezielt ansprechen, z.B. für eine Datensatz Korrektur oder Löschung.
Keine Ahnung, was die anderen Felder bedeuten.
IP und Bereich. Eine IP ist eine Detailierung eines Bereiches.

Vuln = Vulnerability, ich weiß nicht, ob es das Alter ist (meins), aber solche Wortfetzen stören mich mehr und mehr, besonders, je größer ein Modell wird und je mehr man überlegen muss, ob es um eine Medizinische Datenbank, eine Spieledatenbank oder ostgotische Babynamen geht.

Adress = Address

Todoliste
Wie das mit den Schwachstellen und den Adressen zusammenhängt ist mir nicht klar.
Eine Schwachstelle, die sich über ihre „DNA“ definiert (eine bestimmte Konstellation von Merkmalen, die meinetwegen von Experten einen offiziellen Namen bekommen hat), kann bei einem Kunden und bei einer IP beliebig oft auftreten. Sie wird am besten schnell, aber nach und nach behoben, an verschiedenen Tagen. (Denk an log4j, wenn Du Pech hast, sind auf einem Server mehrere, vielleicht dutzend betroffene Module.) Was Server auch so als Eigenart haben, verschiedene IP, also ein Server hat verschiedene IP. Elemenierst Du alle Schwachstellen auf einem Server, gilt dies u.u. für verschiedene Adressen / Bereiche.



Datentypen
Die solltest Du Dir wirklich mal anschauen, in einem logischen DM ist es ja noch etwas egal. Aber wenn Du dort schon möglichst exakt angibst, was es werden soll, kann es am besten in ein physisches Modell des verwendeten Servers umgesetzt werden. Powerdesigner wird sicher nicht anhand des Feldnamens und einer lauen Typdefinition nachhaken, ob Du es vielleicht exakter möchtest, weil der Server es könnte. Und keine Frage: Passende Typen erleichtern Datenbankabfragen extrem.
 
Dein Modell habe ich jetzt nur überflogen, das kann man natürlich auf vielfältige Weise umsetzen.

IP-Adressen sind aber grade mein Ding, daher hier ein paar Anmerkungen noch von mir:
- Ich würde von Anfang an in der DB zwischen IPv4 und IPv6 unterscheiden, ich befasse mich selbst aber nur mit IPv4.
- VARCHAR(11) reicht nicht, um eine IP-Adresse zu speichern (also nicht ohne maximal zu pfuschen). Selbst ohne CIDR und Punkte zwischen den Oktetten brauchst du allein 12 Zeichen.
- Theoretisch wäre zum alleinigen Speichern BINARY(4) gut geeignet, aber so richtig geil finde ich das ehrlich gesagt nicht, ich komme damit selbst nicht gut klar und verwende einfach VARCHAR mit Punkten und CIDR.
- Natürlich wäre ein IP-Datentyp mit Funktionen toll, hat MSSQL aber auch nicht und vermutlich auch nicht MariaDB. Kann man sich aber super selber bauen und in der DB laufen lassen, ist mit Sicherheit schneller als mit PHP.
- Man kann in der DB IP-Adressen und Netze joinen, für MSSQL kann ich dir da auch Code geben der ist aber etwas speziell. Ich arbeite dann tatsächlich mit einer Reihe 1 und 0 für die Subnetzmaske und gucke dann einfach wie lang der Netzteil ist und nutze das als Join-Condition.

Beispiel MSSQL zum joinen von IP-Adressen und Subnetz:
Code:
--Funktion
CREATE FUNCTION dbo.test_convert_ipv4(@ipv4cidr_decimal VARCHAR(18))
RETURNS @t TABLE (
    ipv4_binary VARCHAR(32),
    ipv4_binary_net VARCHAR(32),
    ipv4_binary_host VARCHAR(32),
    ipv4cidr_decimal_net SMALLINT
)
AS
BEGIN
    DECLARE    @ipv4cidr_decimal_net SMALLINT,
            @ipv4_decimal VARCHAR(15)

    IF        @ipv4cidr_decimal LIKE '%/%'
    BEGIN
        SET        @ipv4_decimal = left(@ipv4cidr_decimal,charindex('/',@ipv4cidr_decimal)-1) + '.'
        SET        @ipv4cidr_decimal_net = convert(SMALLINT,right(@ipv4cidr_decimal,charindex('/',reverse(@ipv4cidr_decimal))-1))
    END
    ELSE
    BEGIN
        SET        @ipv4_decimal = @ipv4cidr_decimal + '.'
    END;

    WITH cte(ipv4,octet,number) AS (
        SELECT    right(@ipv4_decimal,datalength(@ipv4_decimal)-charindex('.',@ipv4_decimal)),
                left(@ipv4_decimal,charindex('.',@ipv4_decimal)-1),
                1
        UNION ALL
        SELECT    right(ipv4,datalength(ipv4)-charindex('.',ipv4)),
                left(ipv4,charindex('.',ipv4)-1),
                number + 1
        FROM    cte
        WHERE    number <= 3
        )
    INSERT INTO @t(ipv4_binary)
    SELECT    stuff((    SELECT    ( CASE convert(INT,octet) & 128 WHEN 128 THEN '1' ELSE '0' END ) +
                            ( CASE convert(INT,octet) & 64 WHEN 64 THEN '1' ELSE '0' END ) +
                            ( CASE convert(INT,octet) & 32 WHEN 32 THEN '1' ELSE '0' END ) +
                            ( CASE convert(INT,octet) & 16 WHEN 16 THEN '1' ELSE '0' END ) +
                            ( CASE convert(INT,octet) & 8 WHEN 8 THEN '1' ELSE '0' END ) +
                            ( CASE convert(INT,octet) & 4 WHEN 4 THEN '1' ELSE '0' END ) +
                            ( CASE convert(INT,octet) & 2 WHEN 2 THEN '1' ELSE '0' END ) +
                            ( CASE convert(INT,octet) & 1 WHEN 1 THEN '1' ELSE '0' END )
                    FROM    cte
                    ORDER BY number
                    FOR XML PATH (''))
                    ,1,0,'')

    IF        @ipv4cidr_decimal_net IS NOT NULL
    BEGIN
        UPDATE    @t
        SET        ipv4_binary_net = left(ipv4_binary,@ipv4cidr_decimal_net),
                ipv4_binary_host = right(ipv4_binary,32-@ipv4cidr_decimal_net),
                ipv4cidr_decimal_net = @ipv4cidr_decimal_net
    END

    RETURN;
END;

--Testdaten und Abfrage
WITH Netzwerkbereichsdefintionen(IP_Bereich,Name) AS (
    SELECT    '192.168.0.0/24','Standardnetz' UNION ALL
    SELECT    '10.27.0.0/16','Servernetz' UNION ALL
    SELECT    '172.16.4.0/24','DMZ'
    ), Geräteliste(Gerätename,IP_Adresse) AS (
    SELECT    'Server1','192.168.0.16' UNION ALL
    SELECT    'Server2','10.27.0.12' UNION ALL
    SELECT    'Server3','172.16.4.4' UNION ALL
    SELECT    'Server4','10.27.0.13'
    ), Netzwerkbereichsdefintionen_erweitert(IP_Bereich,Name,ipv4_binary_net,ipv4cidr_decimal_net) AS (
    SELECT    IP_Bereich,Name,ipv4_binary_net,ipv4cidr_decimal_net
    FROM    Netzwerkbereichsdefintionen
    CROSS APPLY dbo.test_convert_ipv4(IP_Bereich)
    ), Geräteliste_erweitert(IP_Adresse,Gerätename,ipv4_binary) AS (
    SELECT    IP_Adresse,Gerätename,ipv4_binary
    FROM    Geräteliste
    CROSS APPLY dbo.test_convert_ipv4(IP_Adresse)
    )
SELECT    *
FROM     Netzwerkbereichsdefintionen_erweitert nets
LEFT JOIN Geräteliste_erweitert hosts
ON        nets.ipv4_binary_net = left(hosts.ipv4_binary,nets.ipv4cidr_decimal_net)
 
Werbung:
Zurück
Oben