Files
techsuppgetinfo/DCIManager6/dci6-support/server_sec_info.go
2026-04-04 00:09:02 +08:00

258 lines
7.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}