убрана лишняя зависимость bindfs и избыточное использование дополнительного пользователя alr
This commit is contained in:
		| @@ -17,12 +17,9 @@ | ||||
| package utils | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"os/user" | ||||
| 	"strconv" | ||||
| 	"syscall" | ||||
|  | ||||
| 	"github.com/leonelquinteros/gotext" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| @@ -32,114 +29,12 @@ import ( | ||||
| 	"gitea.plemya-x.ru/Plemya-x/ALR/internal/constants" | ||||
| ) | ||||
|  | ||||
| func GetUidGidAlrUserString() (string, string, error) { | ||||
| 	u, err := user.Lookup("alr") | ||||
| 	if err != nil { | ||||
| 		return "", "", err | ||||
| 	} | ||||
|  | ||||
| 	return u.Uid, u.Gid, nil | ||||
| } | ||||
|  | ||||
| func GetUidGidAlrUser() (int, int, error) { | ||||
| 	strUid, strGid, err := GetUidGidAlrUserString() | ||||
| 	if err != nil { | ||||
| 		return 0, 0, err | ||||
| 	} | ||||
|  | ||||
| 	uid, err := strconv.Atoi(strUid) | ||||
| 	if err != nil { | ||||
| 		return 0, 0, err | ||||
| 	} | ||||
| 	gid, err := strconv.Atoi(strGid) | ||||
| 	if err != nil { | ||||
| 		return 0, 0, err | ||||
| 	} | ||||
|  | ||||
| 	return uid, gid, nil | ||||
| } | ||||
|  | ||||
| func DropCapsToAlrUser() error { | ||||
| 	uid, gid, err := GetUidGidAlrUser() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err = syscall.Setgid(gid) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err = syscall.Setuid(uid) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return EnsureIsAlrUser() | ||||
| } | ||||
|  | ||||
| func ExitIfCantDropGidToAlr() cli.ExitCoder { | ||||
| 	_, gid, err := GetUidGidAlrUser() | ||||
| 	if err != nil { | ||||
| 		return cliutils.FormatCliExit("cannot get gid alr", err) | ||||
| 	} | ||||
| 	err = syscall.Setgid(gid) | ||||
| 	if err != nil { | ||||
| 		return cliutils.FormatCliExit("cannot get setgid alr", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // ExitIfCantDropCapsToAlrUser attempts to drop capabilities to the already | ||||
| // running user. Returns a cli.ExitCoder with an error if the operation fails. | ||||
| // See also [ExitIfCantDropCapsToAlrUserNoPrivs] for a version that also applies | ||||
| // no-new-privs. | ||||
| func ExitIfCantDropCapsToAlrUser() cli.ExitCoder { | ||||
| 	err := DropCapsToAlrUser() | ||||
| 	if err != nil { | ||||
| 		return cliutils.FormatCliExit(gotext.Get("Error on dropping capabilities"), err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func ExitIfCantSetNoNewPrivs() cli.ExitCoder { | ||||
| 	if err := NoNewPrivs(); err != nil { | ||||
| 		return cliutils.FormatCliExit("error on NoNewPrivs", err) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // ExitIfCantDropCapsToAlrUserNoPrivs combines [ExitIfCantDropCapsToAlrUser] with [ExitIfCantSetNoNewPrivs] | ||||
| func ExitIfCantDropCapsToAlrUserNoPrivs() cli.ExitCoder { | ||||
| 	if err := ExitIfCantDropCapsToAlrUser(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := ExitIfCantSetNoNewPrivs(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // IsNotRoot проверяет, что текущий пользователь не является root | ||||
| func IsNotRoot() bool { | ||||
| 	return os.Getuid() != 0 | ||||
| } | ||||
|  | ||||
| func EnsureIsAlrUser() error { | ||||
| 	uid, gid, err := GetUidGidAlrUser() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	newUid := syscall.Getuid() | ||||
| 	if newUid != uid { | ||||
| 		return errors.New("uid don't matches requested") | ||||
| 	} | ||||
| 	newGid := syscall.Getgid() | ||||
| 	if newGid != gid { | ||||
| 		return errors.New("gid don't matches requested") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // EnuseIsPrivilegedGroupMember проверяет, что пользователь является членом привилегированной группы (wheel) | ||||
| func EnuseIsPrivilegedGroupMember() error { | ||||
| 	currentUser, err := user.Current() | ||||
| 	if err != nil { | ||||
| @@ -164,26 +59,6 @@ func EnuseIsPrivilegedGroupMember() error { | ||||
| 	return cliutils.FormatCliExit(gotext.Get("You need to be a %s member to perform this action", constants.PrivilegedGroup), nil) | ||||
| } | ||||
|  | ||||
| func EscalateToRootGid() error { | ||||
| 	return syscall.Setgid(0) | ||||
| } | ||||
|  | ||||
| func EscalateToRootUid() error { | ||||
| 	return syscall.Setuid(0) | ||||
| } | ||||
|  | ||||
| func EscalateToRoot() error { | ||||
| 	err := EscalateToRootUid() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err = EscalateToRootGid() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func RootNeededAction(f cli.ActionFunc) cli.ActionFunc { | ||||
| 	return func(ctx *cli.Context) error { | ||||
| 		deps, err := appbuilder. | ||||
|   | ||||
| @@ -16,8 +16,44 @@ | ||||
|  | ||||
| package utils | ||||
|  | ||||
| import "golang.org/x/sys/unix" | ||||
| import ( | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"strings" | ||||
|  | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| func NoNewPrivs() error { | ||||
| 	return unix.Prctl(unix.PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) | ||||
| } | ||||
|  | ||||
| // EnsureTempDirWithRootOwner создает каталог в /tmp/alr с правами для группы wheel | ||||
| // Все каталоги в /tmp/alr принадлежат root:wheel с правами 775 | ||||
| // Для других каталогов использует стандартные права | ||||
| func EnsureTempDirWithRootOwner(path string, mode os.FileMode) error { | ||||
| 	if strings.HasPrefix(path, "/tmp/alr") { | ||||
| 		// Сначала создаем директорию обычным способом | ||||
| 		err := os.MkdirAll(path, mode) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		 | ||||
| 		// Все каталоги в /tmp/alr доступны для группы wheel | ||||
| 		// Устанавливаем setgid бит (2775), чтобы новые файлы наследовали группу | ||||
| 		permissions := "2775" | ||||
| 		group := "wheel" | ||||
| 		 | ||||
| 		// Устанавливаем права с setgid битом | ||||
| 		err = exec.Command("sudo", "chmod", permissions, path).Run() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		 | ||||
| 		// Устанавливаем владельца root:wheel | ||||
| 		return exec.Command("sudo", "chown", "root:"+group, path).Run() | ||||
| 	} | ||||
| 	 | ||||
| 	// Для остальных каталогов обычное создание | ||||
| 	return os.MkdirAll(path, mode) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user