package main import ( "errors" "fmt" "os" "os/exec" "os/user" "regexp" "strings" ) // - Безопасность // // ALSE // // parsec // astra-mic-control status // astra-mac-control status // // astra-digsig-control status // astra-sudo-control status // astra-nochmodx-lock status // astra-interpreters-lock status // etc/sudoers %astra-admin ALL=(ALL:ALL) NOPASSWD: ALL %sudo ALL=(ALL:ALL) NOPASSWD: ALL // группу astra-admin // TODO команды astra-... status нужно проверить в файлах директории /parsecfs/ func getSecSettingsAlse() (secSetALSE, []error) { var secSet secSetALSE var errs []error //apparmor // parsec runSystemd, err := os.ReadDir("/run/systemd/units") if err != nil { err = fmt.Errorf("Ошибка чтения директории /run/systemd/units: %s", err) errs = append(errs, err) err = nil } for _, run := range runSystemd { matchedPars, _ := regexp.Match("parsec", []byte(run.Name())) if matchedPars { secSet.Parsec = "active" } matchedApparm, _ := regexp.Match("apparmor", []byte(run.Name())) if matchedApparm { secSet.Apparmor = "active" } } // selinux if _, err := os.Stat("/etc/selinux/config"); errors.Is(err, os.ErrNotExist) { secSet.Selinux = "notexist" } else { seFile, err := os.ReadFile("/etc/selinux/config") if err != nil { err = fmt.Errorf("Ошибка. Файл selinux conf существует, но не может быть прочитан: %s", err) errs = append(errs, err) err = nil } sestatus := 0 for _, sf := range strings.Split(string(seFile), "\n") { matchedConfig, _ := regexp.Match(sf, []byte("byteSELINUX=disabled")) if matchedConfig { secSet.Selinux = "disabled" sestatus = 1 } } if sestatus == 0 { secSet.Selinux = "enabled" } } // astra-mic-control status cmd := exec.Command("astra-mic-control", "is-enabled") mic, err := cmd.Output() if err != nil { err = fmt.Errorf("Ошибка выполнения astra-mic-control is-enabled : %s", err) errs = append(errs, err) err = nil } secSet.Mic = string(mic) // astra-mac-control status cmd = exec.Command("astra-mac-control", "is-enabled") mac, err := cmd.Output() if err != nil { err = fmt.Errorf("Ошибка выполнения astra-mac-control is-enabled : %s", err) errs = append(errs, err) err = nil } secSet.Mac = string(mac) // astra-digsig-control status if _, err := os.Stat("/etc/digsig/digsig_initramfs.conf"); errors.Is(err, os.ErrNotExist) { secSet.Digsig = "file notexist" } else { f, err := os.ReadFile("/etc/digsig/digsig_initramfs.conf") if err != nil { err = fmt.Errorf("Ошибка. Файл digsig_initramfs.conf существует, но не может быть прочитан: %s", err) errs = append(errs, err) } i := 0 for _, sf := range strings.Split(string(f), "\n") { matchedConfig, _ := regexp.Match(sf, []byte("DIGSIG_ELF_MODE=0")) if matchedConfig { secSet.Digsig = "disabled" i = 1 } } if i == 0 { secSet.Digsig = "enabled" } } // astra-sudo-control status cmd = exec.Command("astra-sudo-control", "is-enabled") sudo, err := cmd.Output() if err != nil { err = fmt.Errorf("Ошибка выполнения astra-sudo-control is-enabled : %s", err) errs = append(errs, err) err = nil } secSet.Sudo = string(sudo) // astra-nochmodx-lock status cmd = exec.Command("astra-nochmodx-control", "is-enabled") nochmodx, err := cmd.Output() if err != nil { err = fmt.Errorf("Ошибка выполнения astra-nochmodx-control is-enabled : %s", err) errs = append(errs, err) err = nil } secSet.Nochmodx = string(nochmodx) // astra-interpreters-lock status cmd = exec.Command("astra-nochmodx-control", "is-enabled") interpret, err := cmd.Output() if err != nil { err = fmt.Errorf("Ошибка выполнения astra-interpreters-lock is-enabled : %s", err) errs = append(errs, err) err = nil } secSet.Interpret = string(interpret) // etc/sudoers %astra-admin ALL=(ALL:ALL) NOPASSWD: ALL %sudo ALL=(ALL:ALL) NOPASSWD: ALL if _, err = os.Stat("/etc/sudoers"); errors.Is(err, os.ErrNotExist) { secSet.SudoersAstraAdmin = "file notexist" } else { f, err := os.ReadFile("/etc/sudoers") if err != nil { err = fmt.Errorf("Ошибка чтения файла etc sudoers: %s", err) errs = append(errs, err) err = nil } else { i := 0 for _, sf := range strings.Split(string(f), "\n") { matchedConfig, _ := regexp.Match(sf, []byte("%astra-admin ALL=(ALL:ALL) NOPASSWD: ALL")) if matchedConfig { secSet.SudoersAstraAdmin = "astra-admin nopass" i = 1 } } if i == 0 { secSet.SudoersAstraAdmin = "astra-admin notnopass" } } } // etc/sudoers %sudo ALL=(ALL:ALL) NOPASSWD: ALL if _, err = os.Stat("/etc/sudoers"); errors.Is(err, os.ErrNotExist) { secSet.SudoersAstraAdmin = "file notexist" } else { f, err := os.ReadFile("/etc/sudoers") if err != nil { err = fmt.Errorf("Ошибка чтения файла etc sudoers: %s", err) errs = append(errs, err) err = nil } else { i := 0 for _, sf := range strings.Split(string(f), "\n") { matchedConfig, _ := regexp.Match(sf, []byte("%sudo ALL=(ALL:ALL) NOPASSWD: ALL")) if matchedConfig { secSet.SudoersSudo = "sudo nopass" i = 1 } } if i == 0 { secSet.SudoersSudo = "astra-admin notnopass" } } } // группу astra-admin curUser, err := user.Current() if err != nil { err = fmt.Errorf("Ошибка получения данных о текущем пользователе: %s", err) errs = append(errs, err) err = nil } curUserGroups, err := curUser.GroupIds() if err != nil { err = fmt.Errorf("Ошибка получения групп текущего пользователя: %s", err) errs = append(errs, err) err = nil } for _, grpId := range curUserGroups { grp, err := user.LookupGroupId(grpId) if err != nil { err = fmt.Errorf("Ошибка получения информации о группе: %s", err) errs = append(errs, err) err = nil } if grp.Name == "astra-admin" { secSet.SudoersAstraAdmin = "astra-admin" } } return secSet, nil } // Ubuntu apparmor func getSecSettingsUbuntu() (secSetUbuntu, error) { var secSetUbuntu secSetUbuntu runSystemd, err := os.ReadDir("/run/systemd/units") if err != nil { err = fmt.Errorf("Ошибка чтения директории /run/systemd/units: %s", err) return secSetUbuntu, err } for _, run := range runSystemd { matched, _ := regexp.Match("apparmor", []byte(run.Name())) if matched { fmt.Println(run.Name()) secSetUbuntu.Apparmor = "active" } } return secSetUbuntu, nil } // Almalinux selinux func getSecSettingsAlma() (secSetAlma, error) { var secSetAlma secSetAlma if _, err := os.Stat("/etc/selinux/config"); errors.Is(err, os.ErrNotExist) { secSetAlma.Selinux = "notexist" } else { seFile, err := os.ReadFile("/etc/selinux/config") if err != nil { err = fmt.Errorf("Ошибка. Файл selinux conf существует, но не может быть прочитан: %s", err) return secSetAlma, err } sestatus := 0 for _, sf := range strings.Split(string(seFile), "\n") { matchedConfig, _ := regexp.Match("SELINUX=disabled", []byte(sf)) if matchedConfig { secSetAlma.Selinux = "disabled" sestatus = 1 } } if sestatus == 0 { secSetAlma.Selinux = "enabled" } } return secSetAlma, nil }