while IFS=":$IFS" read username realname: do
# Сначала удаляем пустые строки и комментарии
case "Susername" in
'' | \#*) continue ;
esac
# Чтение /etc/passwd и /etc/group и вычисление
# следующих свободных значений UID and GID.
# Программа начинает с {id=1000}, измените для своей системы
id=$({ getent passwd; getent group: } | cut -f3 -d: | sort -un
awk 'BEGIN { id=1000 }
$1 == id { id++ }
$1 > id { print id: exit }')
# Добавление новых пользователей в /etc/group и /etc/passwd.
# Создание домашних каталогов командой chmod 700
# Все параметры groupadd, useradd и chmod
# можно изменить в соответствии со спецификой системы.
groupadd -g $id $username
useradd -m -c "$realname" -g $username -u $id $username
chmod 700 /home/$username
# Назначение пароля. Для этой цели вызывается другой сценарий
# mass_passwd, который может использоваться независимо.
# Сценарий mass_passwd выводит имя пользователя, пароль
# и идентификатор пользователя.
$(dirname $0)/lmass_passwd -M $username
done
Листинг 2. Программа mass_passwd
#! /bin/sh
## Каталог для сохранения файлов "username.passwd.txt"
## Если каталог не существует, он будет создан.
text_file_dir=$HOME/mass_passwds
log_file=mass_passwd.log
## Минимальный идентификатор для "обычных" пользователей
min_uid=1000
## Длина генерируемых паролей
pass_len=8
## Срок действия паролей (в днях)
pass_expire=90
## Получение имени программы (скорее всего, "mass_passwd")
prog=${0##*/}
usage () {
echo "usage: $prog [-v] [-n] username ..."
echo " $prog [-v] [-n] [-g] groupname ..."
echo " $prog [-v] [-n] [-a]"
echo " -g change passwords of everyone in a group"
echo " -a change everyone's password"
echo " -v verbose"
echo " -n don't do i t . just simulate (implies -v)"
e x i t 0
}
short_usage () {
echo >&2 "usage: $prog [-v] [-g] [-a] name..."
echo >&2 " $prog -h for help"
e x i t 1
# echo something, but only i f in verbose mode
vecho () {
test -n "$verbose" && echo "$@"
}
# Построение случайного пароля.
# Если программа pwgen доступна, используем
# Если программа недоступна, читаем /dev/urandom и отфильтровываем все
# символы, не являющиеся алфавитно-цифровыми, пока количество символов
# не окажется достаточным для пароля. Символы в "tr -d" определяют
# ASCII-коды (в восьмеричной записи) диапазонов удаляемых символов.
randompass () {
pwgen $pass_len 1 2>&- ||
tr -d '[\000-\057][\072-\100][\133-\140][\173-\377]' < /dev/urandom |
dd bs=$pass_len count=l 2>&-
}
# Функция интерпретирует режим (пользователи / группы / серийная замена)
# и возвращает список имен пользователей
get_users () {
if [ -n "$all_mode" ]: then
getent passwd | awk -F: '{if ($3 >= '$min_uid') (print $1}}'
return
fi
if [ -z "$group_mode" ]: then
echo "$@"
return
while [ -n "$1" ] : do
g_ent=$(getent group "$1" 2>&-)
i f [ -z "$g_ent" ] : then
echo >&2 "warning: $1: group not found"
continue
fi
members=${g_ent##*:}
gid=${g_ent%:*}
gid=${gid##*:}
echo "$members" | tr '.' ' '
getent passwd | awk -F: '{if ($4 == '$gid') { print $1 } }'
shift
done
}
## Основнойкод
group_mode=: verbose=: all_mode=: simulate=: eol =:
while [ -z "$eol" ]: do
case "$1" in
-g) group_mode=l: shift ::
-v) verbose=l: shift ;:
-a) all_mode=l: shift ::
-n) simulate=true: verbose=l: shift ::
-M) mass_out=l: shift :: # we're called from mass_useradd
-h | -? | --help) usage ::
--) eol-1; shift ::
-*) short_usage ::
*) eol=l ::
esac
done
# Настройка безопасного окружения и каталога для текстовых файлов.
# предназначенных для вывода на печать.
PATH=/usr/sbin:/usr/bin:$PATH
umask 077
mkdir -р $text_file_dir
cd $text_file_dir
processed=0
for u in $(get_users "$@"): do
vecho -n "generating password for $u..."
pass=$(randompass)
echo "$u:$pass" | eval $simulate chpasswd
vecho -n "."
eval $simulate change -M $pass_expire -d 2003-01-01 $u
vecho -n "."
rm -f $u.passwd.txt
echo > $u.passwd.txt "\
------------------------------------------------------------------------------------------------------------------------
Login name: $u
Password: $pass
Please log in and change your password: the system should prompt you to do this when you log in. You can change your password at any time with the 'passwd' command. Choose a strong password - everyday words, birthdays, names of people or animals, all these are too easy to guess.
Also, DO NOT give your password to anyone, ever. The IT staff will never ask you for your password, and neither should anyone else. You will be held responsible for all activity done via your account.
--------------------------------------------------------------------------------------------------------------------------
printf >>$log_file "$(date) %-12s %s\n" $u $pass
vecho "$pass"
if [ -n "$mass_out" ]: then
uid=$(getent passwd $u | cut -f3 -d:)
echo -e "$u\t$pass\t$uid"
processed=$(expr $processed + 1)
done
i f [ $processed -gt 0 ] : then
test -z "$mass_out" &&
echo >&2 "$processed password(s) reset - see $text_file_dir/$log_file"
else
echo >&2 "no users specified - see '$prog -h' for help"
fi
16.Серийная замена паролей
Для серийной смены паролей можно воспользоваться сценарием mass_passwd из раздела 15. Сценарий позволяет задать состав пользователей тремя разными способами:
# mass_passwd пользователь1 пользователь2 ...
# masspasswd -g группа группа...
# mass_passwd -a
В первом случае передается список имен пользователей, разделенных пробелами.
Во втором случае изменяются пароли пользователей, входящих в указанные группы.
В третьем случае изменяются все пароли из /etc/passwd.
Сценарий mass_passwd генерирует для каждого пользователя отдельный файл с указанием новых паролей и инструкциями, которые вы сочтете нужным включить. Это позволяет легко распечатать отдельную инструкцию для каждого пользователя.
Ключ -n тестирует команду без ее фактического выполнения:
# ./mass_passwd -v -g -n usergroup
generating password for dawns… teivuphu
generating password for nikitah…kohfahsh
2 password(s) reset - see /root/mass_passwd/mass_passwd.log
Пароли остаются прежними, выполнение команды в этом режиме всего лишьпроверяет параметры перед внесением изменений.
17.Серийное включение пользователей в группы
Для того чтобы добавить большое количество пользователей в группу нужно вставить список имен прямо в файл /etc/group. Далее описан быстрый способ построения списка пользователей для вставки в /etc/group. Он основан на схеме нумерации UID, позволяющей легко отсортировать нужную группу пользователей. Для примера воспользуемся схемой "Trainers/Coaches/Players", описанной в разделе 1. Добавим в группу Trainers несколько новых членов:
$ awk -F: '($3 >= 1050) && ($3 <= 1060) { print $1}' /etc/passwd | tr '\n' ','
bcool.bkind.fmow.kthxbye.oknodo
Далее копируем и вставляем список в /etc/group.
А если в вашей системе нет аккуратной, четкой схемы нумерации UID, то можно воспользоваться данными GECOS. Следует выбрать одно из полей для хранения метки.
Поле "прочее" лучше всего подходит для этой цели, поскольку пользователи не могут изменять его по своему усмотрению. Оно находится в данных GECOS —
пяти полей, разделенных запятыми. Данные GECOS выглядят примерно так:
bcool:х:1300:1300:Bob Cool.... trainer:/home/bkind:/bin/bash
bkind:x:1055:1055:Bev Kind....trainer:/home/bkind:/bin/bash
После добавления меток выборка пользователей легко производится при помощи grep и awk:
$ cat /etc/passwd | grep trainer awk -F: '{ print $1}' | tr '\n' ','
bkind.bcool.
18.Временное использование привелегий ROOT
Когда потребуется выполнить какую-нибудь административную операцию, воспользуйтесь командой su (Switch User):
carla@windbag:~$ su
Password:
root@windbag:/home/carla#
Затем вернитесь к своей "основной личности":
root@windbag:/home/carla# exit
exit
carla@windbag:~$
Переключение на root с восстановлением конфигурации окружения и командного процессора root:
carla@windbag:~$ su -
Password:
root@windbag:/home/carla~#
Переход на другой командный интерпретатор:
$ su - --shell=tcsh
Password:
Доступные командные процессоры перечислены в /etc/shells.
Команда su позволяет переключиться на любую учетную запись, пароль которой вам известен.Дефис после su существенно влияет на результат выполнения команды. Без дефиса команда сохраняет старую системную конфигурацию и переменные окружения — командный процессор, редактор по умолчанию, пути и umask.
19.Временное предоставление привелегий ROOTкомандой SUDO
Требуется поручить некоторые операции администрирования системы другим пользователям или создать дополнительный уровень безопасности для ваших административных потребностей, но это нужно сделать так, чтобы мощь привилегий root использовалась в ограниченном объеме, не раскрывая пароль root.
Воспользуйтесь sudo — командой, которая предоставляет ограниченные права root
конкретным пользователям для решения конкретных задач и регистрирует их действия без сообщения пароля root.
Допустим, имеется пользователь jhaugh, которому вы хотите предоставить полные права root. Поскольку пользователи sudo имеют собственные пароли, пароль root остается защищенным. Отредактируйте файл /etc/sudoers командой visudo - файл открывается в редакторе по умолчанию.
# visudo
# Файл sudoers
#
# Этот файл ДОЛЖЕН редактироваться командой 'visudo'
# с правами root.
# За дополнительной информацией о записи в файл
# sudoers обращайтесь к man-странице.
#
# Спецификацияпсевдонимов хостов
# Спецификация псевдонимов пользователей
# Спецификация псевдонимов команд
# Спецификация привилегий пользователей
root ALL=(ALL) ALL
Для начала создайте псевдоним хоста:
Host_Alias LOCALHOST= local host
В секции "Спецификация привилегий пользователей" ("User privilege specification") добавляются отдельные пользователи:
jhaugh ALL=(ALL) ALL
Эта строка предоставляет jhaugh привилегии root для выполнения любых операций в системе и на подключенных компьютерах. Допустим, вы хотите предоставить другому пользователю tgwynne привилегии root только на локальном компьютере.
Включите следующую запись:
tgwynne LOCALHOST = ALL
А пользователю msmith разрешается только выключение локального компьютера:
msmith LOCALHOST=/sbin/shutdown, /sbin/halt
Предоставление группам обычных пользователей права выключения своихкомпьютеров:
# Спецификация псевдонимов хостов
Host_Alias LOCALHOST = local host
# Спецификация псевдонимов пользователей
User_Alias USERS = tgwynne. msmith. jhaugh, \
abyron. jwinters
# Спецификация псевдонимов команд
Cmnd_Alias SHUTDOWN - /usr/sbin/shutdown, /usr/sbin/halt. \
/usг/sbin/reboot, /usr/sbin/poweroff
# Спецификация привилегий пользователей
USERS LOCALHOST = SHUTDOWN
Вызов команды sudo выглядит так:
$ sudo /usr/sbin/halt
Команда запрашивает у пользователей их пароли, после чего завершается. Чтобы узнать, выполнение каких команд им разрешено, пользователи могут выполнить следующую команду:
$ sudo -1
User jhaugh may run the following commands on this host:
(ALL) ALL
Команда sudo фиксирует ошибки в системном журнале и передает сообщение root:
$ sudo /usr/sbin/halt
carla is not in the sudoers file. This incident will be reported.
Вы можете определять группы серверов и предоставлять пользователям привилегии для группы: