vm:ubuntu:script:02-root_user

Скрипт активации root в Ubuntu

Автоматизированный скрипт для безопасной активации учетной записи root в Ubuntu с дополнительными возможностями управления пользователями системы.

Характеристики:

  • Версия: 1.0
  • Совместимость: Ubuntu 18.04+, Debian 10+
  • Требования: sudo права
  • ✅ Проверка текущего статуса root
  • ✅ Интеллектуальная активация root (пропуск если уже активен)
  • ✅ Установка/смена пароля root
  • ✅ Настройка SSH доступа для root (опционально)
  • ✅ Управление пользователями системы
  • ✅ Безопасное удаление пользователей с завершением процессов
  • ✅ Проверка результатов и рекомендации по безопасности

Создание файла скрипта в домашней директории текущего пользователя:

cd ~
nano activate_root.sh

Скопируйте код скрипта в созданный файл, установите права выполнения и запустите:

chmod +x activate_root.sh
sudo ./activate_root.sh

ВАЖНО! Скрипт должен запускаться с правами sudo

#!/bin/bash
# Скрипт активации учетной записи root на Ubuntu
# Автор: Nick
# Версия: 1.0
set -e  # Остановка скрипта при любой ошибке
echo "=== Скрипт активации учетной записи root на Ubuntu ==="
echo "ВНИМАНИЕ: Данный скрипт внесет изменения в систему безопасности!"
echo
# Проверка прав администратора
if [ "$EUID" -ne 0 ]; then
    echo "Ошибка: Скрипт должен запускаться с правами sudo"
    echo "Использование: sudo $0"
    exit 1
fi
# Проверка операционной системы
if ! grep -q "Ubuntu" /etc/os-release; then
    echo "Предупреждение: Скрипт предназначен для Ubuntu"
    read -p "Продолжить выполнение? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi
echo "Текущее состояние учетной записи root:"
root_status=$(passwd -S root)
echo "$root_status"
# Проверка статуса root (P = пароль установлен, L = заблокирован, NP = нет пароля)
root_status_code=$(echo "$root_status" | awk '{print $2}')
echo
if [[ "$root_status_code" == "P" ]]; then
    echo "=== Root уже активирован ==="
    echo "✓ Учетная запись root уже имеет пароль и активна"
    echo
    read -p "Хотите изменить пароль root? (y/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        echo "=== Смена пароля root ==="
        echo "Введите новый пароль для пользователя root:"
 
        # Установка нового пароля для root
        while true; do
            passwd root
            if [ $? -eq 0 ]; then
                echo "✓ Пароль для root успешно изменен"
                break
            else
                echo "✗ Ошибка изменения пароля. Повторите попытку."
            fi
        done
    else
        echo "✓ Пароль root оставлен без изменений"
    fi
 
    # Дополнительная проверка на блокировку (хотя если P, то должен быть разблокирован)
    echo
    echo "=== Проверка статуса блокировки root ==="
    passwd -u root >/dev/null 2>&1
    echo "✓ Проверка разблокировки выполнена"
 
else
    echo "=== Шаг 1: Установка пароля для root ==="
    if [[ "$root_status_code" == "L" ]]; then
        echo "Учетная запись root заблокирована, требуется установка пароля"
    elif [[ "$root_status_code" == "NP" ]]; then
        echo "У учетной записи root нет пароля, требуется установка"
    else
        echo "Неопределенный статус root, устанавливаем пароль"
    fi
 
    echo "Введите новый пароль для пользователя root:"
 
    # Установка пароля для root
    while true; do
        passwd root
        if [ $? -eq 0 ]; then
            echo "✓ Пароль для root успешно установлен"
            break
        else
            echo "✗ Ошибка установки пароля. Повторите попытку."
        fi
    done
    echo
    echo "=== Шаг 2: Разблокировка учетной записи root ==="
    # Разблокировка учетной записи root (если она заблокирована)
    passwd -u root
    if [ $? -eq 0 ]; then
        echo "✓ Учетная запись root разблокирована"
    else
        echo "✗ Ошибка разблокировки учетной записи root"
    fi
fi
echo
echo "=== Шаг 3: Настройка SSH доступа для root (опционально) ==="
read -p "Разрешить SSH доступ для root? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    # Создание резервной копии конфигурации SSH
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d_%H%M%S)
    echo "✓ Создана резервная копия /etc/ssh/sshd_config"
 
    # Настройка SSH для root
    if grep -q "^PermitRootLogin" /etc/ssh/sshd_config; then
        sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
        echo "✓ Изменен параметр PermitRootLogin на yes"
    else
        echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
        echo "✓ Добавлен параметр PermitRootLogin yes"
    fi
 
    # Перезапуск SSH службы
    systemctl restart ssh
    if [ $? -eq 0 ]; then
        echo "✓ SSH служба перезапущена"
    else
        echo "✗ Ошибка перезапуска SSH службы"
    fi
 
    echo "ПРЕДУПРЕЖДЕНИЕ: SSH доступ для root включен - убедитесь в безопасности системы!"
fi
echo
echo "=== Шаг 4: Проверка результатов ==="
# Проверка статуса пользователя root
echo "Статус учетной записи root:"
passwd -S root
# Проверка возможности входа
echo
echo "Проверка shell для root:"
grep "^root:" /etc/passwd
# Проверка групп root
echo
echo "Группы пользователя root:"
groups root
# Проверка SSH конфигурации (если была изменена)
if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo
    echo "SSH конфигурация для root:"
    grep "PermitRootLogin" /etc/ssh/sshd_config
fi
echo
echo "=== Шаг 5: Управление пользователями системы ==="
echo "Список всех пользователей системы:"
echo
echo "Обычные пользователи (ID >= 1000):"
awk -F: '$3 >= 1000 {print "ID: " $3 " | Пользователь: " $1 " | Домашняя папка: " $6 " | Shell: " $7}' /etc/passwd
echo
echo "Системные пользователи с shell (ID < 1000):"
awk -F: '$3 < 1000 && $3 > 0 && ($7 == "/bin/bash" || $7 == "/bin/sh" || $7 == "/usr/bin/zsh") {print "ID: " $3 " | Пользователь: " $1 " | Shell: " $7}' /etc/passwd
echo
echo "Полный список всех пользователей (включая служебных):"
awk -F: '{print "ID: " $3 " | Пользователь: " $1 " | Группа: " $4 " | Shell: " $7}' /etc/passwd | sort -n -k2
echo
read -p "Хотите удалить пользователей? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo "=== Удаление пользователей ==="
    echo "ВНИМАНИЕ: Удаление пользователей - необратимая операция!"
    echo
 
    while true; do
        echo "Доступные пользователи для удаления:"
        echo "(Обычные пользователи ID >= 1000):"
        awk -F: '$3 >= 1000 {print "- " $1}' /etc/passwd
        echo
        echo "(Все пользователи в системе):"
        awk -F: '{print "- " $1 " (ID: " $3 ")"}' /etc/passwd | sort
        echo
 
        read -p "Введите имя пользователя для удаления (или 'exit' для выхода): " username
 
        if [ "$username" = "exit" ]; then
            echo "Выход из режима удаления пользователей"
            break
        fi
 
        # Проверка существования пользователя
        if ! id "$username" >/dev/null 2>&1; then
            echo "✗ Пользователь '$username' не существует"
            continue
        fi
 
        # Проверка, что это не текущий пользователь
        if [ "$username" = "$SUDO_USER" ]; then
            echo "✗ Нельзя удалить текущего пользователя ($SUDO_USER)"
            continue
        fi
 
        # Проверка, что это не системный пользователь (предупреждение, но не блокировка)
        user_id=$(id -u "$username" 2>/dev/null)
        if [ "$user_id" -lt 1000 ] && [ "$username" != "root" ]; then
            echo "⚠️  ВНИМАНИЕ: '$username' - системный пользователь (ID: $user_id)"
            read -p "Вы уверены, что хотите удалить системного пользователя? (y/N): " -n 1 -r
            echo
            if [[ ! $REPLY =~ ^[Yy]$ ]]; then
                echo "Отмена удаления системного пользователя"
                continue
            fi
        fi
 
        echo "Информация о пользователе '$username':"
        id "$username"
        groups "$username"
 
        # Проверка активных процессов пользователя
        echo
        echo "Проверка активных процессов пользователя '$username':"
        active_processes=$(ps -u "$username" -o pid,ppid,cmd --no-headers 2>/dev/null || true)
        if [ -n "$active_processes" ]; then
            echo "⚠️  НАЙДЕНЫ АКТИВНЫЕ ПРОЦЕССЫ:"
            echo "$active_processes"
            echo
            read -p "Завершить все процессы пользователя '$username'? (y/N): " -n 1 -r
            echo
            if [[ $REPLY =~ ^[Yy]$ ]]; then
                echo "Завершение процессов пользователя '$username'..."
 
                # Мягкое завершение процессов (SIGTERM)
                pkill -u "$username" 2>/dev/null || true
                sleep 3
 
                # Проверка, остались ли процессы
                remaining_processes=$(ps -u "$username" -o pid --no-headers 2>/dev/null || true)
                if [ -n "$remaining_processes" ]; then
                    echo "Некоторые процессы не завершились. Принудительное завершение..."
                    pkill -9 -u "$username" 2>/dev/null || true
                    sleep 2
                fi
 
                # Финальная проверка
                final_check=$(ps -u "$username" -o pid --no-headers 2>/dev/null || true)
                if [ -n "$final_check" ]; then
                    echo "✗ Некоторые процессы все еще активны:"
                    ps -u "$username" -o pid,ppid,cmd --no-headers
                    echo "Невозможно безопасно удалить пользователя"
                    continue
                else
                    echo "✓ Все процессы пользователя '$username' завершены"
                fi
            else
                echo "✗ Невозможно удалить пользователя с активными процессами"
                continue
            fi
        else
            echo "✓ Активных процессов не найдено"
        fi
 
        # Проверка активных сессий
        echo
        echo "Проверка активных сессий пользователя '$username':"
        active_sessions=$(who | grep "^$username " || true)
        if [ -n "$active_sessions" ]; then
            echo "⚠️  НАЙДЕНЫ АКТИВНЫЕ СЕССИИ:"
            echo "$active_sessions"
            echo
            read -p "Завершить все сессии пользователя '$username'? (y/N): " -n 1 -r
            echo
            if [[ $REPLY =~ ^[Yy]$ ]]; then
                echo "Завершение сессий пользователя '$username'..."
                pkill -u "$username" -HUP 2>/dev/null || true
                sleep 2
 
                # Принудительное завершение если нужно
                who | grep "^$username " >/dev/null && {
                    echo "Принудительное завершение сессий..."
                    pkill -u "$username" -KILL 2>/dev/null || true
                }
 
                echo "✓ Сессии завершены"
            else
                echo "✗ Невозможно удалить пользователя с активными сессиями"
                continue
            fi
        else
            echo "✓ Активных сессий не найдено"
        fi
        echo
 
        echo "Выберите режим удаления:"
        echo "1) Удалить только пользователя (сохранить домашнюю папку)"
        echo "2) Удалить пользователя и домашнюю папку"
        echo "3) Удалить пользователя, домашнюю папку и почту"
        echo "4) Отмена"
 
        read -p "Выберите вариант (1-4): " -n 1 -r
        echo
 
        case $REPLY in
            1)
                deluser "$username"
                if [ $? -eq 0 ]; then
                    echo "✓ Пользователь '$username' удален (домашняя папка сохранена)"
                else
                    echo "✗ Ошибка удаления пользователя '$username'"
                fi
                ;;
            2)
                deluser --remove-home "$username"
                if [ $? -eq 0 ]; then
                    echo "✓ Пользователь '$username' и домашняя папка удалены"
                else
                    echo "✗ Ошибка удаления пользователя '$username'"
                fi
                ;;
            3)
                deluser --remove-home --remove-all-files "$username"
                if [ $? -eq 0 ]; then
                    echo "✓ Пользователь '$username', домашняя папка и все файлы удалены"
                else
                    echo "✗ Ошибка удаления пользователя '$username'"
                fi
                ;;
            4)
                echo "Отмена удаления пользователя '$username'"
                ;;
            *)
                echo "✗ Неверный выбор"
                ;;
        esac
        echo
    done
fi
echo
echo "=== Информация о безопасности ==="
cat << 'EOF'
ВАЖНО! После активации root:
1. Используйте сильный пароль для root
2. Рассмотрите использование SSH ключей вместо паролей
3. Настройте файрвол (ufw) для ограничения доступа
4. Регулярно обновляйте систему
5. Мониторьте логи на предмет подозрительной активности
6. Рассмотрите отключение root после настройки системы
Логи входа в систему: /var/log/auth.log
Для отключения root: sudo passwd -l root
EOF
echo
echo "=== Дополнительные команды (опционально) ==="
read -p "Показать дополнительные команды безопасности? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    cat << 'EOF'
Дополнительные команды безопасности:
# Настройка SSH ключей для root:
mkdir -p /root/.ssh
chmod 700 /root/.ssh
# Добавить публичный ключ в /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
# Настройка файрвола (не включается автоматически):
# ufw enable
# ufw default deny incoming
# ufw default allow outgoing
# ufw allow ssh
# Отключение root после настройки:
passwd -l root
# Изменение SSH порта:
# Измените Port 22 на другой порт в /etc/ssh/sshd_config
# systemctl restart ssh
# Мониторинг попыток входа:
tail -f /var/log/auth.log | grep "root"
EOF
fi
echo
echo "=== Активация root завершена ==="
echo "Текущий статус:"
passwd -S root
exit 0

Скрипт автоматически проверит:

  1. Права администратора
  2. Операционную систему
  3. Текущий статус root

Примечание: При обнаружении уже активированного root, скрипт предложит изменить пароль или пропустить этот шаг

Если root не активирован:

  1. Установка нового пароля
  2. Разблокировка учетной записи

Если root уже активирован:

  1. Опциональная смена пароля
  2. Переход к следующему этапу
Разрешить SSH доступ для root? (y/N):

При выборе «y»:

  1. Создание резервной копии конфигурации SSH
  2. Изменение параметра `PermitRootLogin` на `yes`
  3. Перезапуск SSH службы

ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ: SSH доступ для root повышает риски безопасности!

Скрипт покажет:

  1. Обычных пользователей (ID ≥ 1000)
  2. Системных пользователей с shell
  3. Полный список всех пользователей

Опции удаления пользователя:

  1. Только пользователь (домашняя папка остается)
  2. Пользователь + домашняя папка
  3. Пользователь + домашняя папка + все файлы

При удалении пользователя с активными процессами:

⚠️  НАЙДЕНЫ АКТИВНЫЕ ПРОЦЕССЫ:
 1251     1 /usr/bin/process_name
Завершить все процессы пользователя? (y/N):

Алгоритм завершения:

  1. Мягкое завершение (SIGTERM)
  2. Ожидание 3 секунды
  3. Принудительное завершение (SIGKILL)
  4. Финальная проверка
=== Root уже активирован ===
✓ Учетная запись root уже имеет пароль и активна
Хотите изменить пароль root? (y/N): n
✓ Пароль root оставлен без изменений
Введите имя пользователя для удаления: user
Информация о пользователе 'user':
uid=1000(user) gid=1000(user) groups=1000(user),27(sudo)

⚠️  НАЙДЕНЫ АКТИВНЫЕ ПРОЦЕССЫ:
 1251     1 /usr/sbin/sshd
Завершить все процессы пользователя 'user'? (y/N): y
✓ Все процессы пользователя 'user' завершены

Выберите режим удаления:
1) Удалить только пользователя (сохранить домашнюю папку)
2) Удалить пользователя и домашнюю папку  
3) Удалить пользователя, домашнюю папку и почту
4) Отмена
  • 🔒 Проверка прав sudo перед выполнением
  • 🔒 Запрет удаления текущего пользователя
  • 🔒 Предупреждения при работе с системными пользователями
  • 🔒 Завершение активных процессов перед удалением
  • 🔒 Создание резервных копий конфигурационных файлов

Обязательные действия:

  1. Использовать сильный пароль для root
  2. Настроить SSH ключи вместо паролей
  3. Настроить файрвол (ufw)
  4. Регулярно обновлять систему
  5. Мониторить логи входа
# Настройка SSH ключей для root
mkdir -p /root/.ssh
chmod 700 /root/.ssh
# Добавить публичный ключ в /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
 
# Настройка файрвола (не включается автоматически)
# ufw default deny incoming
# ufw default allow outgoing  
# ufw allow ssh
# ufw enable
 
# Мониторинг попыток входа
tail -f /var/log/auth.log | grep "root"
Проблема Причина Решение
`userdel: user is currently used by process` Активные процессы пользователя Выберите завершение процессов в скрипте
`Permission denied` при запуске Отсутствие sudo прав Запустите: `sudo ./activate_root.sh`
SSH не перезапускается Ошибка в конфигурации Проверьте `/etc/ssh/sshd_config`
Root остается заблокированным Системная политика Выполните: `passwd -u root`
# Отключение root
sudo passwd -l root
 
# Восстановление SSH конфигурации  
sudo cp /etc/ssh/sshd_config.backup.* /etc/ssh/sshd_config
sudo systemctl restart ssh
 
# Пересоздание удаленного пользователя
sudo useradd -m -s /bin/bash username
sudo usermod -aG sudo username
sudo passwd username
  • `/var/log/auth.log` - попытки входа в систему
  • `/var/log/syslog` - системные события
  • `/var/log/dpkg.log` - изменения пакетов
# Просмотр последних входов root
last root
 
# Активные сессии root  
who | grep root
 
# Процессы от имени root
ps -u root
 
# Проверка SSH конфигурации
sshd -T | grep permitrootlogin

Скрипт обеспечивает безопасную и контролируемую активацию root в Ubuntu с дополнительными возможностями управления пользователями. Следуйте рекомендациям по безопасности для защиты системы после активации.

ПОМНИТЕ: Активация root - это мощный инструмент, который требует ответственного использования!

  • vm/ubuntu/script/02-root_user.txt
  • Последнее изменение: 2025/09/21 21:25
  • admin