258 lines
7.4 KiB
Go
258 lines
7.4 KiB
Go
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
|
||
}
|