Ключи команды adduser и автоматизация при создании пользователей

Ключи команды adduser и автоматизация при создании пользователей

1. Основные ключи команды adduser

Основной синтаксис:

bash

adduser [опции] username

Полный список ключей с примерами:

bash

# 1. Базовые опции
adduser --home /home/username username      # Указать домашнюю директорию
adduser --shell /bin/bash username          # Указать shell
adduser --uid 1001 username                 # Указать UID вручную
adduser --gid 1001 username                 # Указать основную группу
adduser --ingroup developers username       # Добавить в существующую группу

# 2. Системные пользователи
adduser --system username                   # Создать системного пользователя
adduser --system --home /nonexistent username
adduser --system --shell /usr/sbin/nologin username

# 3. Группы
adduser --disabled-password username        # Без пароля
adduser --disabled-login username           # Запретить вход
adduser --gecos "Full Name,Room,Work,Home" username  # GECOS информация

# 4. Расширенные
adduser --force-badname username           # Игнорировать проверку имени
adduser --quiet username                    # Тихий режим (без вопросов)
adduser --debug username                    # Режим отладки

2. Разница между adduser и useradd

adduser (удобный, интерактивный):

bash

# Задает вопросы, создает домашнюю директорию, копирует файлы из /etc/skel
sudo adduser username

useradd (низкоуровневый):

bash

# Только создает запись, без домашней директории по умолчанию
sudo useradd username

# Чтобы было как у adduser:
sudo useradd -m -s /bin/bash username

3. Практические примеры для разных сценариев

Пример 1: Создание обычного пользователя

bash

sudo adduser --home /home/john --shell /bin/bash \
    --ingroup users --uid 2001 \
    --gecos "John Doe,Office 101,555-1234,555-4321" johndoe

Пример 2: Создание пользователя для веб-сервера

bash

sudo adduser --system --home /var/www/example.com \
    --shell /bin/bash --ingroup www-data \
    --disabled-password www_example

Пример 3: Создание пользователя для службы (service account)

bash

sudo adduser --system --no-create-home \
    --shell /usr/sbin/nologin --disabled-login \
    --group myservice

Пример 4: Автоматическое создание (для скриптов)

bash

sudo adduser --quiet --disabled-password \
    --shell /bin/bash --home /home/auto_user \
    --gecos "" autouser

4. Скрипты при создании пользователя

Автоматический запуск скрипта при создании пользователя:

Способ 1: Через /etc/skel/ (рекомендуется)

bash

# 1. Создаем скрипт в /etc/skel/
sudo nano /etc/skel/.custom_setup.sh

bash

#!/bin/bash
# /etc/skel/.custom_setup.sh
echo "Добро пожаловать, $(whoami)!"
echo "Ваш домашний каталог: $HOME"
echo "Дата первого входа: $(date)"

bash

# 2. Делаем исполняемым
sudo chmod +x /etc/skel/.custom_setup.sh

# 3. Добавляем вызов в .bashrc
sudo echo -e "\n# Первоначальная настройка\nif [ -f ~/.custom_setup.sh ]; then\n    . ~/.custom_setup.sh\nfi" >> /etc/skel/.bashrc

Теперь при создании пользователя:

bash

sudo adduser testuser
# Скрипт автоматически скопируется в его домашнюю директорию

Способ 2: Кастомный скрипт-обертка

bash

#!/bin/bash
# /usr/local/bin/adduser_custom.sh
USERNAME=$1

# Создаем пользователя
sudo adduser --home /home/$USERNAME \
    --shell /bin/bash \
    --gecos "Auto created user" $USERNAME

# Копируем кастомные файлы
sudo cp -r /etc/custom_skel/* /home/$USERNAME/
sudo chown -R $USERNAME:$USERNAME /home/$USERNAME

# Устанавливаем особые права
sudo setfacl -m u:$USERNAME:rwx /shared_directory

# Логируем создание
echo "$(date): Создан пользователь $USERNAME" >> /var/log/user_creation.log

Способ 3: Использование хуков (pam_script)

bash

# Установка
sudo apt install libpam-script

# Настройка в /etc/pam.d/common-session
session optional pam_script.so

bash

# /etc/pam-script.d/session
#!/bin/bash
if [ "$PAM_TYPE" = "open_session" ]; then
    # Первый вход пользователя
    if [ ! -f /home/$PAM_USER/.first_login_done ]; then
        # Выполняем скрипт
        /usr/local/bin/first_login.sh $PAM_USER
        touch /home/$PAM_USER/.first_login_done
    fi
fi

5. Полный пример: автоматизированное создание DevOps пользователя

bash

#!/bin/bash
# create-devops-user.sh
# Полная автоматизация создания пользователя для DevOps

set -e  # Прерывать при ошибках

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# Проверка аргументов
if [ -z "$1" ]; then
    echo -e "${RED}Использование: $0 username${NC}"
    exit 1
fi

USERNAME=$1
USER_HOME="/home/$USERNAME"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

echo -e "${YELLOW}Создание пользователя $USERNAME...${NC}"

# 1. Создание пользователя с SSH доступом
sudo adduser --disabled-password --gecos "" "$USERNAME"

# 2. Установка пароля
echo "$USERNAME:$(openssl rand -base64 12)" | sudo chpasswd

# 3. Создание .ssh директории
sudo mkdir -p "$USER_HOME/.ssh"
sudo chmod 700 "$USER_HOME/.ssh"

# 4. Добавление SSH ключей (пример)
if [ -f "/tmp/${USERNAME}_keys.pub" ]; then
    sudo cp "/tmp/${USERNAME}_keys.pub" "$USER_HOME/.ssh/authorized_keys"
else
    # Генерируем ключ для пользователя
    sudo ssh-keygen -t rsa -b 4096 -f "$USER_HOME/.ssh/id_rsa" -N "" -C "$USERNAME@$(hostname)"
    sudo cp "$USER_HOME/.ssh/id_rsa.pub" "$USER_HOME/.ssh/authorized_keys"
fi

sudo chmod 600 "$USER_HOME/.ssh/authorized_keys"
sudo chown -R "$USERNAME:$USERNAME" "$USER_HOME/.ssh"

# 5. Настройка sudo прав
echo "$USERNAME ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/systemctl, /usr/bin/docker" | sudo tee /etc/sudoers.d/$USERNAME
sudo chmod 440 /etc/sudoers.d/$USERNAME

# 6. Добавление в группы
sudo usermod -aG sudo,docker,www-data,adm "$USERNAME"

# 7. Копирование кастомных конфигов
sudo cp -r /etc/skel/.bashrc /etc/skel/.profile "$USER_HOME/"

# 8. Создание кастомного .bashrc
sudo tee -a "$USER_HOME/.bashrc" > /dev/null << 'EOF'

# === DevOps Customizations ===
export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
export HISTTIMEFORMAT="%d/%m/%y %T "
export EDITOR=nano

# Aliases
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'

# Docker aliases
alias dps='docker ps'
alias dlogs='docker logs'
alias dimages='docker images'
alias dstop='docker stop'
alias dstart='docker start'
alias drm='docker rm'

# Kubernetes aliases
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'
alias kgn='kubectl get nodes'

# Functions
function mkcd() { mkdir -p "$1" && cd "$1"; }
function cls() { clear; printf '\033[3J'; }
function ips() { hostname -I | awk '{print $1}'; }

# Welcome message
echo "=== Добро пожаловать, $USERNAME ==="
echo "Сервер: $(hostname)"
echo "IP: $(hostname -I | cut -d' ' -f1)"
echo "Дата: $(date)"
echo "================================="
EOF

# 9. Создание скрипта первого входа
sudo tee "$USER_HOME/first_login_setup.sh" > /dev/null << 'EOF'
#!/bin/bash
echo "=== Первая настройка пользователя ==="
echo "Создание необходимых директорий..."

mkdir -p ~/projects
mkdir -p ~/logs
mkdir -p ~/backups
mkdir -p ~/.aws
mkdir -p ~/.kube

echo "Настройка Git..."
git config --global user.name "$USERNAME"
git config --global user.email "$USERNAME@company.com"
git config --global core.editor nano
git config --global color.ui auto

echo "Проверка SSH ключа..."
if [ ! -f ~/.ssh/id_rsa ]; then
    echo "Генерация SSH ключа..."
    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "$USERNAME@$(hostname)"
fi

echo "Ваш публичный SSH ключ:"
cat ~/.ssh/id_rsa.pub

echo "=== Настройка завершена ==="
echo "Рекомендуется:"
echo "1. Скопировать SSH ключ на другие серверы"
echo "2. Настроить доступ к AWS/Kubernetes"
echo "3. Проверить доступность инструментов"
EOF

sudo chmod +x "$USER_HOME/first_login_setup.sh"
sudo chown "$USERNAME:$USERNAME" "$USER_HOME/first_login_setup.sh"

# 10. Добавление в .bash_profile для автоматического запуска при первом входе
sudo tee -a "$USER_HOME/.bash_profile" > /dev/null << 'EOF'
if [ -f ~/first_login_setup.sh ]; then
    echo "Запуск первоначальной настройки..."
    ~/first_login_setup.sh
    mv ~/first_login_setup.sh ~/first_login_setup.sh.done
fi
EOF

# 11. Создание стандартной структуры проектов
sudo mkdir -p "$USER_HOME/"{bin,scripts,tools,configs,secrets}
sudo chown -R "$USERNAME:$USERNAME" "$USER_HOME"

# 12. Копирование стандартных утилит
sudo cp /usr/local/bin/devops-* "$USER_HOME/bin/" 2>/dev/null || true

# 13. Настройка прав на общие директории
sudo setfacl -m u:$USERNAME:rwx /opt/shared
sudo setfacl -m u:$USERNAME:rx /var/log

# 14. Логирование
echo "$TIMESTAMP: Создан пользователь $USERNAME с UID $(id -u $USERNAME)" | sudo tee -a /var/log/user_management.log

echo -e "${GREEN}✓ Пользователь $USERNAME успешно создан${NC}"
echo -e "${YELLOW}Информация:${NC}"
echo "Домашняя директория: $USER_HOME"
echo "Группы: $(groups $USERNAME)"
echo "SSH ключ: $USER_HOME/.ssh/id_rsa.pub"
echo ""
echo -e "${GREEN}Для входа используйте:${NC}"
echo "ssh $USERNAME@$(hostname -I | cut -d' ' -f1)"

6. PAM-модули для автоматического выполнения при входе

Настройка pam_exec:

bash

# Редактируем PAM конфиг
sudo nano /etc/pam.d/sshd

Добавить в конец:

bash

# Выполнять скрипт при успешном входе через SSH
session optional pam_exec.so /usr/local/bin/on_login.sh

Создаем скрипт:

bash

#!/bin/bash
# /usr/local/bin/on_login.sh
if [ "$PAM_TYPE" = "open_session" ]; then
    USER="$PAM_USER"
    
    # Только для интерактивных сессий
    if [ -n "$SSH_CONNECTION" ]; then
        # Логируем вход
        logger "User $USER logged in from $PAM_RHOST"
        
        # Выполняем пользовательский скрипт если есть
        if [ -f "/home/$USER/.on_login.sh" ]; then
            su - "$USER" -c "/home/$USER/.on_login.sh"
        fi
    fi
fi

7. Systemd-сервис для пользовательских скриптов

Создаем сервис, который запускается при первом входе:

bash

# /etc/systemd/system/user-first-login@.service
[Unit]
Description=First login setup for %i
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
User=%i
Group=%i
ExecStart=/usr/local/bin/first-login-script.sh %i

[Install]
WantedBy=multi-user.target

8. Полезные функции для .bashrc

Автоматическая загрузка при создании пользователя:

bash

# В /etc/skel/.bashrc добавляем:
if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

if [ -f ~/.bash_functions ]; then
    . ~/.bash_functions
fi

# DevOps окружение
export DEVOPS_HOME=~/devops
export PATH=$PATH:$DEVOPS_HOME/bin

# Автодополнение для kubectl
if command -v kubectl &> /dev/null; then
    source <(kubectl completion bash)
fi

# Приветствие
if [ -z "$FIRST_LOGIN_SHOWN" ]; then
    echo "Добро пожаловать в DevOps окружение!"
    export FIRST_LOGIN_SHOWN=1
fi

9. Утилита для массового создания пользователей

bash

#!/bin/bash
# bulk-user-create.sh
USERS_FILE="users.csv"  # Формат: username,fullname,groups

while IFS=, read -r username fullname groups; do
    echo "Создаю $username..."
    
    # Создание пользователя
    sudo adduser --disabled-password \
        --gecos "$fullname,,,," \
        "$username"
    
    # Установка временного пароля
    temp_pass=$(openssl rand -base64 8)
    echo "$username:$temp_pass" | sudo chpasswd
    
    # Добавление в группы
    IFS=';' read -ra GROUP_ARRAY <<< "$groups"
    for group in "${GROUP_ARRAY[@]}"; do
        sudo usermod -aG "$group" "$username"
    done
    
    # Запись в лог
    echo "$(date): $username : $temp_pass" >> user_credentials.log
    
done < "$USERS_FILE"

10. Важные файлы и их назначение

ФайлНазначение
/etc/skel/Шаблоны для новых пользователей
/etc/adduser.confКонфигурация adduser
/etc/default/useraddКонфигурация useradd
/etc/login.defsОбщие настройки пользователей
/etc/passwdИнформация о пользователях
/etc/shadowПароли пользователей
/etc/groupГруппы

11. Проверка созданного пользователя

bash

# Проверка информации
id username
finger username
getent passwd username

# Проверка домашней директории
ls -la /home/username/

# Проверка групп
groups username

# Проверка shell
getent passwd username | cut -d: -f7

12. Быстрые команды для запоминания

bash

# Создать с домашней директорией
sudo adduser --home /path/to/home username

# Создать без возможности входа
sudo adduser --shell /usr/sbin/nologin username

# Создать системного пользователя
sudo adduser --system username

# Создать с конкретным UID
sudo adduser --uid 1500 username

# Создать и сразу добавить в группы
sudo adduser --ingroup sudo,docker username

# Создать без пароля (для ключей)
sudo adduser --disabled-password username

# Показать все опции
adduser --help

Ключевые моменты:

  1. /etc/skel/ — главный инструмент для кастомизации новых пользователей
  2. .bashrc и .profile — автоматически выполняются при входе
  3. PAM модули — для системных скриптов при входе
  4. Права доступа — всегда проверяйте ls -la /home/username
  5. Логирование — ведите лог всех созданных пользователей

Используйте комбинацию /etc/skel/ для базовой настройки и кастомные скрипты для сложной логики инициализации пользователей.

Оставьте комментарий