В растущей организации эффективное управление учетными записями пользователей имеет решающее значение. Автоматизация процесса может значительно сэкономить время и уменьшить количество ошибок. В этой статье описывается сценарий Bash, предназначенный для чтения списка пользователей и групп из текстового файла, создания пользователей и групп, настройки домашних каталогов, генерации паролей и регистрации всех действий. Этот сценарий особенно полезен для инженеров SysOps, отвечающих за обслуживание учетных записей пользователей системы.

Зачем автоматизировать управление пользователями?

Прежде чем углубиться в скрипт, давайте поймем, почему автоматизация управления пользователями выгодна:

  • Согласованность: автоматизация гарантирует, что пользователи создаются с одинаковыми настройками, что снижает риск ошибок конфигурации.
  • Эффективность: пакетная обработка учетных записей пользователей экономит время по сравнению с вводом вручную.
  • Безопасность: Автоматическая установка надежных паролей и соответствующих разрешений повышает безопасность.
  • Ведение журнала: Ведение журнала всех действий помогает при аудите и устранении неполадок.

Обзор скрипта

Ваша компания приняла на работу много новых разработчиков. В роли инженера SysOps напишите сценарий bash под названием create_users.sh, который считывает текстовый файл, содержащий имена пользователей и группы сотрудников, где каждая строка отформатирована как пользователи:группы.

Ниже приведен сценарий который создает пользователей и группы, как указано, настраивает домашние каталоги с соответствующими разрешениями и владельцами, генерирует случайные пароли для пользователей и регистрирует все действия в /var/log/user_management.log. Кроме того, пароли надежно хранятся в файле /var/secure/user_passwords.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash

# Script to create users and groups from a given text file
# Usage: bash create_users.sh <name-of-text-file>
# Example: bash create_users.sh users.txt

# Log file
LOG_FILE="/var/log/user_management.log"
PASSWORD_FILE="/var/secure/user_passwords.txt"

# Check if the input file is provided
if [ $# -ne 1 ]; then
  echo "Usage: $0 <name-of-text-file>"
  exit 1
fi

INPUT_FILE=$1

# Ensure the log and password files exist
touch $LOG_FILE
mkdir -p /var/secure
touch $PASSWORD_FILE
chmod 600 $PASSWORD_FILE

log_action() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

create_user() {
  local username=$1
  local groups=$2

  # Create the user's personal group
  if ! getent group $username > /dev/null 2>&1; then
    groupadd $username
    log_action "Created group $username"
  else
    log_action "Group $username already exists"
  fi

  # Create user
  if ! id -u $username > /dev/null 2>&1; then
    useradd -m -g $username -s /bin/bash $username
    log_action "Created user $username"
  else
    log_action "User $username already exists"
    return
  fi

  # Assign additional groups to the user
  IFS=',' read -ra group_array <<< "$groups"
  for group in "${group_array[@]}"; do
    group=$(echo $group | xargs) # Remove leading/trailing whitespaces
    if ! getent group $group > /dev/null 2>&1; then
      groupadd $group
      log_action "Created group $group"
    fi
    usermod -aG $group $username
    log_action "Added user $username to group $group"
  done

  # Generate a random password for the user
  local password=$(openssl rand -base64 24)
  echo "$username:$password" | chpasswd
  log_action "Set password for user $username"

  # Store the password securely
  echo "$username,$password" >> $PASSWORD_FILE
}

while IFS=';' read -r username groups; do
  username=$(echo $username | xargs) # Remove leading/trailing whitespaces
  groups=$(echo $groups | xargs)     # Remove leading/trailing whitespaces
  create_user $username "$groups"
done < $INPUT_FILE

log_action "User creation script completed"

Разбор скрипта

Заголовок скрипта и его использование

Скрипт начинается с Shebang (#!/bin/bash), строка комментария, начинающаяся с символов #!, которая играет важную роль в запуске скриптов на языках программирования Bash и Python. Сообщение об использовании предоставляется, если скрипт не запущен с правильными аргументами, гарантируя пользователям, как правильно его выполнить.

1
2
3
4
5
# Check if the input file is provided
if [ $# -ne 1 ]; then
  echo "Usage: $0 <name-of-text-file>"
  exit 1
fi

Файлы журналов и паролей

Мы определяем LOG_FILE и PASSWORD_FILE для регистрации действий и безопасного хранения паролей. Сценарий гарантирует, что эти файлы и каталоги будут созданы с соответствующими разрешениями.

1
2
3
4
5
6
7
8
9
# Log file
LOG_FILE="/var/log/user_management.log"
PASSWORD_FILE="/var/secure/user_passwords.txt"

# Ensure the log and password files exist
touch $LOG_FILE
mkdir -p /var/secure
touch $PASSWORD_FILE
chmod 600 $PASSWORD_FILE

Функция ведения журнала

Функция log_action() регистрирует сообщения с временными метками в файле журнала, предоставляя запись действий, выполненных скриптом.

1
2
3
log_action() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

Функция создания пользователя

Функция create_user() управляет созданием пользователей и их личных групп. Он проверяет, существует ли уже группа или пользователь, и создает их, если нет. Он распределяет пользователей по дополнительным группам, указанным во входном файле, и генерирует случайный пароль для каждого пользователя.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
create_user() {
  local username=$1
  local groups=$2

  # Create the user's personal group
  if ! getent group $username > /dev/null 2>&1; then
    groupadd $username
    log_action "Created group $username"
  else
    log_action "Group $username already exists"
  fi

  # Create user
  if ! id -u $username > /dev/null 2>&1; then
    useradd -m -g $username -s /bin/bash $username
    log_action "Created user $username"
  else
    log_action "User $username already exists"
    return
  fi

  # Assign additional groups to the user
  IFS=',' read -ra group_array <<< "$groups"
  for group in "${group_array[@]}"; do
    group=$(echo $group | xargs) # Remove leading/trailing whitespaces
    if ! getent group $group > /dev/null 2>&1; then
      groupadd $group
      log_action "Created group $group"
    fi
    usermod -aG $group $username
    log_action "Added user $username to group $group"
  done

  # Generate a random password for the user
  local password=$(openssl rand -base64 24)
  echo "$username:$password" | chpasswd
  log_action "Set password for user $username"

  # Store the password securely
  echo "$username,$password" >> $PASSWORD_FILE
}

Основной цикл

Сценарий читает входной файл построчно, удаляет все начальные/конечные пробелы в именах пользователей и группах и вызывает create_user() для каждой строки входного файла.

1
2
3
4
5
while IFS=';' read -r username groups; do
  username=$(echo $username | xargs) # Remove leading/trailing whitespaces
  groups=$(echo $groups | xargs)     # Remove leading/trailing whitespaces
  create_user $username "$groups"
done < $INPUT_FILE

Выполнение и журналирование

После обработки входного файла регистрируется сообщение о завершении, указывающее на завершение выполнения сценария.

1
log_action "User creation script completed"

Подготовьте свое окружение

Убедитесь, что у вас есть необходимые разрешения для создания пользователей, групп и изменения системных файлов. Для запуска сценария могут потребоваться права суперпользователя.

Создайте входной файл

Создайте текстовый файл с именами пользователей и группами. Например, создайте файл с именем users.txt со следующим содержимым:

1
2
3
qman;sudo,dev,www-data
qman2;sudo
qman3;dev,www-data

Запустите сценарий

Чтобы выполнить сценарий, используйте следующую команду, передав имя входного файла в качестве аргумента:

1
sudo bash create_users.sh users.txt

Проверьте действия сценария

Проверьте файл журнала: проверьте действия, зарегистрированные в /var/log/user_management.log.

1
sudo cat /var/log/user_management.log

Проверьте файл паролей: проверьте надежно сохраненные пароли в /var/secure/user_passwords.txt.

1
sudo cat /var/secure/user_passwords.txt

Проверка создания пользователя и группы: проверьте, правильно ли были созданы пользователи и группы.

Список пользователей и групп

1
2
getent passwd | grep -E qman|qman2|qman3
getent group | grep -E qman|sudo|dev|www-data'

Проверьте разрешения домашнего каталога:

Убедитесь, что домашние каталоги созданы с правильными разрешениями.

1
ls -ld /home/qman /home/qman2 /home/qman3

Завершение

Автоматизация повторяющихся задач позволяет системным администраторам сконцентрироваться на более стратегических аспектах управления системой и гарантировать соблюдение передовых методов обеспечения безопасности. Следуя этому руководству, вы сможете эффективно управлять учетными записями пользователей и группами в вашей системе.

Вы также можете поделиться статьей со своими друзьями в социальных сетях, которым может быть интересна эта статья, или просто оставить комментарий ниже. Спасибо.