Добавить scripts/Base/debian-astra-create-passwordless-user.sh
This commit is contained in:
@@ -0,0 +1,181 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -Eeuo pipefail
|
||||||
|
|
||||||
|
DEFAULT_USERS=(user1 user2 user3)
|
||||||
|
|
||||||
|
SUDOERS_DIR="/etc/sudoers.d"
|
||||||
|
SUDOERS_MODE="0440"
|
||||||
|
USER_SHELL="/bin/bash"
|
||||||
|
|
||||||
|
ASTRA_PDPL_LEVEL="0:63"
|
||||||
|
ASTRA_INTEGRITY="63"
|
||||||
|
|
||||||
|
TEMP_FILE=""
|
||||||
|
|
||||||
|
log() {
|
||||||
|
printf '[INFO] %s\n' "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
printf '[ERROR] %s\n' "$*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
if [[ -n "$TEMP_FILE" && -f "$TEMP_FILE" ]]; then
|
||||||
|
rm -f -- "$TEMP_FILE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
# Проверка привилегий.
|
||||||
|
if [[ "$EUID" -ne 0 ]]; then
|
||||||
|
die "Скрипт необходимо запускать от root."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Определение дистрибутива.
|
||||||
|
OS_RELEASE="/etc/os-release"
|
||||||
|
|
||||||
|
if [[ ! -r "$OS_RELEASE" ]]; then
|
||||||
|
OS_RELEASE="/usr/lib/os-release"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -r "$OS_RELEASE" ]]; then
|
||||||
|
die "Не найден файл os-release."
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset ID PRETTY_NAME
|
||||||
|
|
||||||
|
. "$OS_RELEASE"
|
||||||
|
|
||||||
|
case "${ID:-}" in
|
||||||
|
debian)
|
||||||
|
OS_TYPE="debian"
|
||||||
|
;;
|
||||||
|
astra)
|
||||||
|
OS_TYPE="astra"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
die "Неподдерживаемая ОС: ${ID:-unknown}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log "ОС: ${PRETTY_NAME:-$OS_TYPE}"
|
||||||
|
log "Тип: $OS_TYPE"
|
||||||
|
|
||||||
|
# Проверка необходимых компонентов.
|
||||||
|
REQUIRED_COMMANDS=(
|
||||||
|
useradd
|
||||||
|
passwd
|
||||||
|
getent
|
||||||
|
mktemp
|
||||||
|
visudo
|
||||||
|
chmod
|
||||||
|
chown
|
||||||
|
mv
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ "$OS_TYPE" == "astra" ]]; then
|
||||||
|
REQUIRED_COMMANDS+=(pdpl-user)
|
||||||
|
fi
|
||||||
|
|
||||||
|
for cmd in "${REQUIRED_COMMANDS[@]}"; do
|
||||||
|
if ! command -v "$cmd" >/dev/null 2>&1; then
|
||||||
|
die "Не найдена команда: $cmd"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ! -x "$USER_SHELL" ]]; then
|
||||||
|
die "Не найден shell: $USER_SHELL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/sudoers || ! -d "$SUDOERS_DIR" ]]; then
|
||||||
|
die "Не найдена конфигурация sudo."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка существующей конфигурации sudo.
|
||||||
|
if ! visudo -c >/dev/null; then
|
||||||
|
die "Обнаружена ошибка в существующей конфигурации sudo."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Выбор пользователей.
|
||||||
|
if [[ "$#" -gt 0 ]]; then
|
||||||
|
USERS=("$@")
|
||||||
|
else
|
||||||
|
USERS=("${DEFAULT_USERS[@]}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Предварительная проверка имён.
|
||||||
|
for user in "${USERS[@]}"; do
|
||||||
|
if [[ ! "$user" =~ ^[a-z_][a-z0-9_-]*$ ]]; then
|
||||||
|
die "Некорректное имя пользователя: $user"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Создание и настройка пользователей.
|
||||||
|
for user in "${USERS[@]}"; do
|
||||||
|
|
||||||
|
log "Обработка пользователя: $user"
|
||||||
|
|
||||||
|
# Создание пользователя.
|
||||||
|
if getent passwd "$user" >/dev/null; then
|
||||||
|
log "Пользователь $user уже существует."
|
||||||
|
else
|
||||||
|
log "Создание пользователя $user"
|
||||||
|
|
||||||
|
useradd \
|
||||||
|
-m \
|
||||||
|
-s "$USER_SHELL" \
|
||||||
|
"$user" \
|
||||||
|
|| die "Не удалось создать пользователя $user"
|
||||||
|
|
||||||
|
# Пароль устанавливается только новому пользователю.
|
||||||
|
log "Установка пароля для $user"
|
||||||
|
|
||||||
|
if ! passwd "$user"; then
|
||||||
|
die "Ошибка установки пароля $user. Пользователь создан, задайте пароль вручную."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Настройка мандатных атрибутов Astra Linux.
|
||||||
|
if [[ "$OS_TYPE" == "astra" ]]; then
|
||||||
|
|
||||||
|
log "Настройка мандатных атрибутов: $user"
|
||||||
|
|
||||||
|
pdpl-user \
|
||||||
|
-l "$ASTRA_PDPL_LEVEL" \
|
||||||
|
-i "$ASTRA_INTEGRITY" \
|
||||||
|
"$user" \
|
||||||
|
|| die "Ошибка pdpl-user для $user"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Создание временного файла sudoers.
|
||||||
|
SUDOERS_FILE="${SUDOERS_DIR}/${user}"
|
||||||
|
|
||||||
|
TEMP_FILE=$(mktemp "${SUDOERS_DIR}/.${user}.XXXXXX") \
|
||||||
|
|| die "Не удалось создать временный sudoers."
|
||||||
|
|
||||||
|
printf '%s ALL=(ALL) NOPASSWD: ALL\n' "$user" > "$TEMP_FILE"
|
||||||
|
|
||||||
|
chown root:root "$TEMP_FILE"
|
||||||
|
chmod "$SUDOERS_MODE" "$TEMP_FILE"
|
||||||
|
|
||||||
|
# Проверка синтаксиса перед установкой.
|
||||||
|
if ! visudo -cf "$TEMP_FILE" >/dev/null; then
|
||||||
|
die "Некорректная конфигурация sudo для $user"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Установка проверенной конфигурации.
|
||||||
|
mv -f -- "$TEMP_FILE" "$SUDOERS_FILE"
|
||||||
|
TEMP_FILE=""
|
||||||
|
|
||||||
|
log "Sudo настроен для $user"
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
# Финальная проверка.
|
||||||
|
visudo -c >/dev/null \
|
||||||
|
|| die "Ошибка итоговой проверки sudoers."
|
||||||
|
|
||||||
|
log "Все пользователи успешно обработаны."
|
||||||
Reference in New Issue
Block a user