Kaspersky Security Center - Neue Ebene

Auf Habr gab es bereits einige Hinweise zur Automatisierung des Kaspersky Security Center (KSC)


Hier und hier


Heute schlage ich vor, etwas tiefer zu tauchen und ein neues Level zu erreichen. Verwendung: KSC Open API für Kaspersky Security Center 10+.


Um den Status und die Verteilung neuer Arbeitsstationen in Gruppen zu überwachen, musste ich die Verwaltungskonsole verwenden, um Berichte zu erstellen. Sie verfügt über umfangreiche Funktionen, aber die Geschwindigkeit ihrer Arbeit lässt zu wünschen übrig.


Der Anschein der Unterstützung für die Open API war wie ein Hauch frischer Luft, und sofort wurde beschlossen, diese Lösung zu verwenden. Wie üblich wurde eine Bibliothek in Go's bevorzugter Programmiersprache geschrieben , die den Zugriff auf den KSC-Server mithilfe der bereitgestellten API ermöglichte.


Um das Paket wie gewohnt in unserem Projekt verwenden zu können, müssen wir es erhalten:


go get -u github.com/pixfid/go-ksc/kaspersky


Importieren Sie das Paket in das erstellte Projekt.


import (
    "github.com/pixfid/go-ksc/kaspersky"
)

Wir erstellen einen neuen Client für die Arbeit mit dem KSC-Server


func main() {
    ctx := context.Background()
        cfg := kaspersky.Config { //    
              Username: "login",
              Password: "password",
              Server: fmt.Sprintf(`https://%s:%s`, "ip", "port"),
        }

    client := kaspersky.New(cfg) //  
    client.KSCAuth(ctx) //
}

Die Autorisierung ist einfach, POSTeine Endpunktanforderung /api/v1.0/loginmit festgelegten Anforderungsheadern:


Authorization: KSCBasic user=base64(login),pass=base64(pass)
X-KSC-VServer: x
Content-Length:2


Bei Erfolg gibt der Server Folgendes zurück: {}


, , accessor , requestId .


:


\ , , github.


:


func GetAllGroups(ctx context.Context, client *kaspersky.Client) *FullGroupsInfos {
    groups := &FullGroupsInfos{} //    .

    groupParam := kaspersky.HGParams{
        WstrFilter: `
        (&
            (!"KLGRP_CHLDHST_CNT" = 0)
            (!"grp_from_unassigned" = true)
        )`,
        VecFieldsToReturn: []string{
            "id",
            "name",
            "grp_full_name",
            "creationDate",
            "KLGRP_CHLDHST_CNT",
            "KLSRV_HSTSTAT_CRITICAL",
            "KLSRV_HSTSTAT_WARNING",
        },
        PParams: kaspersky.PParams{
            KlsrvhSlaveRecDepth:    0,
            KlgrpFindFromCurVsOnly: true,
        },
        LMaxLifeTime: 100,
    }

    accessor, _, _ := client.HostGroup.FindGroups(ctx, groupParam) //  
    count, _, _ := client.ChunkAccessor.GetItemsCount(ctx, accessor.StrAccessor) //     

    _, _ = client.ChunkAccessor.GetItemsChunk(ctx, kaspersky.ItemsChunkParams{
        StrAccessor: accessor.StrAccessor,
        NStart:      0,
        NCount:      count.Int,
    } , groups) //    
    client.ChunkAccessor.Release(ctx, accessor.StrAccessor) // 

    return groups
}

, API []byte, inteface{} .


:


{
  "pChunk" : {
    "KLCSP_ITERATOR_ARRAY" : [
      {
        "type" : "params",
        "value" : {
          "KLGRP_CHLDHST_CNT" : 1,
          "creationDate" : {
            "type" : "datetime",
            "value" : "2020-03-13T18:48:43Z"
          },
          "grp_full_name" : " /Broken/",
          "id" : 160,
          "name" : "Broken"
        }
      }
    ]
  },
  "PxgRetVal" : 1
}

:


ts, _, _ := client.Tasks.GetAllTasksOfHost(ctx, "domain.name", "d7f6c44c-6743-416d-81b3-343e464f1ec9")

d7f6c44c-6743-416d-81b3-343e464f1ec9 , KSC


:
{ "PxgRetVal": ["101", "117", "118", "192"] }


(, , ) .


func (ts *Tasks) SuspendTask(ctx context.Context, strTask string) ([]byte, error)
func (ts *Tasks) ResumeTask(ctx context.Context, strTask string) ([]byte, error)
func (ts *Tasks) RunTask(ctx context.Context, strTask string) ([]byte, error)
func (ts *Tasks) DeleteTask(ctx context.Context, strTask string) ([]byte, error)



API, KSC 10, KSC 12.


GitHub


.
C.


All Articles