Перейти к тексту

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Вся введенная информация защищена.

  • Закрыть [x]

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

Вся введенная информация защищена.

  • Закрыть [x]

Работа с паролями

Использование утилит chpasswd и pwgen

Дэвид Тэйнсли, системный администратор, Ace Europe
author photo
Дэвид Тэйнсли (David Tansley) – независимый автор, имеющий за плечами 15-летний опыт администратора UNIX, последние 8 лет из которых он работает с AIX. Дэвид любит играть в бадминтон, а потом расслабляться за просмотром Формулы-1, но больше всего он любит путешествовать с женой на своем мотоцикле.

Описание:  При добавлении учетной записи нового пользователя требуется назначать ему начальный пароль. Одним из инструментов для назначения пароля пользователя является утилита chpasswd. Кроме того, люди часто стараются использовать в качестве паролей слова из словаря. Этого можно легко избежать, если применить для создания паролей генератор pwgen.

Дата:  27.09.2011
Уровень сложности:  простой
Активность:  1202 просмотров
Комментарии:  


При добавлении учетных записей пользователей необходимо назначать им начальные пароли, которые сообщаются пользователям по электронной почте или по телефону. Затем при входе в систему пользователю предлагается изменить свой пароль (в случае, если используются соответствующие правила политик). Изменение паролей может также происходить через специальные запросы для локальной или удаленной учетной записи. Процедура смены пароля занимает определенное время, и часто требуется периодически выполнять эту процедуру. Тем не менее, использование утилиты chpasswd из операционной системы AIX (эта утилита также поставляется в составе различных ОС Linux) позволяет с легкостью выполнять данные операции с требуемой периодичностью.

С другой стороны, отдельной задачей является выбор хорошего пароля. Не составляет особой сложности одновременно изменить несколько паролей, используя слова из словаря или даже имена пользователей, однако такой подход нельзя назвать хорошей практикой. Пароль должен быть достаточно легким для запоминания и не настолько сложным, чтобы пользователю приходилось где-то записывать его. Некоторые считают использование случайных паролей для учетных записей обычных пользователей хорошей практикой. Я считаю, что единственной хорошей практикой является тот случай, когда пользователь может запомнить свой собственный пароль. Если пользователь записывает свой пароль на листке из блокнота, то с большой вероятностью он оставит этот листок там, где его можно будет с легкостью обнаружить – например, в ящике или под стеклом рабочего стола. В конечном счете, злоумышленнику не составит труда отыскать и узнать пароль этого пользователя.

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

В этой статье я объясняю, как можно использовать утилиты chpasswd и pwgen для изменения паролей в диалоговом и пакетном режимах. Впервые я столкнулся с утилитой chpasswd несколько лет назад, когда переносил учетные записи пользователей в LDAP-окружение. На сегодняшний день эта утилита является моим главным инструментом при работе с паролями для неинтерактивных, локальных или удаленных учетных записей. В разделе Ресурсы вы можете найти ссылки на адреса, где можно загрузить утилиту pwgen и ее исходный код.

Использование chpasswd

С помощью chpasswd вы можете изменять один или несколько паролей за один раз. Это означает, что вам больше не придется набирать пароли заново, как вы делали это при работе в командной строке. Хотя с утилитой chpasswd можно работать в диалоговом режиме, я предпочитаю использовать ее в неинтерактивном режиме. Используйте chpasswd, поскольку она является удобным инструментом для быстрого изменения паролей!

Формат использования chpasswd:

chpasswd  -f <pwdadm flags> -c

Здесь:
-f задает флаги для pwdadm;
-c очищает флаги пароля.

Имя пользователя и пароль считываются с устройства стандартного ввода в следующем формате:

имя_пользователя:пароль_пользователя

Предположим, что мы только что создали три учетных записи со следующими именами: alpha, bravo и charlie.

Пароли для этих учетных записей пока не заданы, в чем можно убедиться, просмотрев файл /etc/passwd или выполнив команду pwdadm:

# tail /etc/passwd
alpha:*:209:1:alpha.apps:/home/alpha:/usr/bin/ksh
bravo:*:210:1:bravo.suppt:/home/bravo:/usr/bin/ksh
charlie:*:211:1:charlie.suppt:/home/charlie:/usr/bin/ksh

Обратите внимание на то, что второй столбец файла passwd содержит символ '*', означающий, что пароль еще не задан. Также в этом можно убедиться, выполнив команду pwdadm для одного из пользователей:

 # pwdadm -q alpha
alpha:

Команда не вывела никаких результатов, и, таким образом, пароль не задан. Если бы пароль был задан, то поле 'lastupdate' содержало бы временную отметку в формате UTC, показывающую, сколько секунд прошло со времени создания пароля.

Я продемонстрирую два способа использования chpasswd для задания трех первоначальных паролей для трех пользователей. В следующем примере я вывожу из командной строки на экран имя пользователя alpha с паролем mypasswd, передавая результат на вход команды chpasswd:

echo "alpha:mypasswd" | chpasswd

Имя и пароль учетной записи также могут быть переданы в строке на вход команды chpasswd следующим образом:

# detail="charlie:charpw"
echo $detail | chpasswd

Теперь, выполнив запрос команды pwdadm для пользователя alpha, мы увидим, что для параметра flags было установлено значение ADMCHG, являющееся значением по умолчанию при установке пароля:

# pwdadm -q alpha
alpha:
        lastupdate = 1265765265
        flags = ADMCHG

Флаг ADMCHG означает, что в следующий раз, когда пользователь alpha попытается войти в систему, используя назначенный ему начальный пароль (mypasswd), ему будет предложено сменить его. Это также относится и к остальным учетным записям, имеющим флаг ADMCHG.

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

# cat pass
bravo:bravpass
charlie:charpass

В приведенном выше файле с названием pass пароль пользователя bravo изменен на bravpass, а пароль пользователя charlie – на charpass. Чтобы изменения вступили в силу, просто выполните команду cat для этого файла и передайте результат на вход chpasswd, как показано ниже:

# cat pass | chpasswd

Также файл с паролями может быть перенаправлен на обработку команде chpasswd. В следующем примере пользователям bravo и charlie не придется менять свои пароли, поскольку указана опция 'c-' (очистить флаги пароля):

# chpasswd -c < pass

Выполнив запрос pwdadm для пользователя charlie, мы получим следующий результат:

# pwdadm -q charlie
charlie:
        lastupdate = 1265853052

Обратите внимание на то, что использование опции очистки флагов пароля в команде chpasswd привело к тому, что значение поля flags теперь очищено.

Чтобы определить, когда пароль был задан или изменен в последний раз (значение поля lastupdate в выводе команды pwdadm), значение временной отметки в формате UTC, выраженное в секундах, необходимо преобразовать в более понятный формат текущей даты.

Обе следующие команды возвращают значение поля lastupdate, содержащее дату изменения или первоначального задания пароля (если он задан). В следующем примере мы выясним дату последнего обновления пароля пользователя alpha:

# lssec -f /etc/security/passwd -s alpha -a lastupdate
alpha lastupdate=1265940457

# pwdadm -q alpha
alpha:
       lastupdate = 1265940457
       flags = ADMCHG

Для преобразования формата UTC в формат текущей даты можно использовать perl или gawk – в обоих случаях результат будет одинаковым:

# perl -e 'use POSIX;print ctime(1265940457)'
Thu Feb 11 20:07:37 2010


# gawk 'BEGIN {print strftime("%c",1265940457)}'
Thu Feb 11 20:07:37 GMT 2010


Установка pwgen

Текущая версия исходного кода pwgen – 2.0.6. Последняя версия скомпилированной сборки – 2.0.5. В этом примере мы будем использовать исходный код.

Загрузите, распакуйте и скомпилируйте исходный код pwgen:

# gunzip pwgen-2.06.tar.gz
# tar -xvf pwgen-2.06.tar
# cd pwgen-2.06
#./configure
# make
# make install

Библиотека pwgen будет установлена в каталог /usr/local/bin.


Использование pwgen

Утилита pwgen генерирует случайные (сложные для запоминания) или легкие для восприятия (не такие сложные для запоминания) пароли и может использоваться в диалоговом или пакетном режимах.

По умолчанию pwgen выводит заполненный паролями экран на стандартное устройство вывода. Обычно вам это не нужно, однако может оказаться полезным, если вы (или пользователь) хотите выбрать вводимый вручную пароль для разового использования. По умолчанию при генерировании паролей pwgen будет пытаться вставлять в них прописные буквы и цифры.

Формат использования утилиты pwgen следующий:

pwgen <опции> <длина_пароля> <количество_паролей>

Опции утилиты следующие:

-1печатать по одному паролю в строке
-cпароль должен содержать прописную букву
-nпароль должен содержать цифру
-sслучайный пароль

Напечатать один пароль длиной в 8 символов:

# pwgen 8 1
eej3eeZu

Напечатать три пароля длиной в 7 символов с обязательным использованием прописных букв:

# pwgen -c 7 3
ohw4Aj7 Pei0obe gaw4De4

Напечатать 10 паролей длиной в 8 символов с обязательным использованием прописных букв и цифр:

# pwgen -c -n 8 10
zum5Shei Choo6Eih Ub5uagei Ooxu6ohs Eix9xeip iV4yoeph Io3aeGhe taiTh6ia
cuere1AW phai9Pai

Pwgen определяет, вызываете ли вы ее через tty или нет. В последнем случае, если не указаны дополнительные опции, по умолчанию будет сгенерирован один пароль. Это облегчает написание сценариев в тех случаях, когда вам необходимо сохранять значения в переменных, как показано ниже:

# pass=$(pwgen)
# echo $pass
ohtherah

Если хотите, вы можете использовать обратные апострофы для подстановки команды – результат будет тем же:

                pass=`pwgen`
                # echo $pass
                oowahxei
                

Конечно, мы можем сгенерировать столько паролей, сколько захотим. В следующем примере генерируются три пароля:

# pass=$(pwgen -c -n 8 3)
# echo $pass
EluBie0z thohku0W Ail3fu3z

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

# pwgen -s 8 1
9bTzZxt9

При использовании опции генерации случайного пароля (как в приведенном выше примере) необходимо обратить внимание на то, что такие пароли чрезвычайно сложно запомнить, и обычно пользователи записывают их на листочке. Исходя из собственного опыта администратора я пришел к выводу, что случайные пароли следует использовать только для учетных записей владельцев приложений.


Собираем все вместе

Теперь, когда мы увидели утилиты pwgen и chpasswd в действии, можно назначать пользователям начальные пароли. Очевидно, это должно выполняться через сценарий, наподобие того, что приведен в листинге 1. Сначала определим список пользователей, которым мы будем назначать пароли. Этот список можно поместить в файл, хотя в нашем примере он заключен в строковую переменную $list и содержит трех пользователей. С помощью следующей команды, помещенной в цикл, для каждого из этих трех пользователей будет сгенерирован пароль длиной в восемь символов:

pwgen 8 1

Сначала выполняется первоначальная проверка того, что учетная запись пользователя существует на хосте AIX. Если это условие выполняется, имя пользователя и сгенерированный пароль записываются в файл passfile в формате, необходимом для дальнейшей обработки программой chpasswd. Когда обработка всех пользователей завершена, полученный файл передается на обработку программе chpasswd. Если учетная запись пользователя не найдена в файле etc/passwd, то строка "имя/пароль" для этого пользователя не записывается в файл passfile.


Листинг 1. Сценарий setpass
#!/bin/sh
# setpass

passfile=/home/dxtans/passfile
>$passfile

list="alpha bravo charlie"

for user in $list
 do
   if  ! grep -w ^$user /etc/passwd > /dev/null
   then
    echo "user NOT present: $user"
  else
   echo "user present: $user"
  pass=$(pwgen 8 1)
  echo "$user:$pass">>$passfile
 fi
done
cat $passfile | chpasswd

В результате выполнения сценария setpass создается файл passfile со следующим содержимым:

# cat passfile
alpha:jiebuzio
bravo:oegaeyay
charlie:ooweipoa

В следующем примере (листинг 2) создается пользователь foxtrot с начальным паролем и измененными атрибутами учетной записи. В сценарии create_user показан один из способов применения утилиты pwgen для задания такого пароля. В этом примере задается пароль из 8 символов, содержащий, по крайней мере, одну прописную букву и одну цифру:

pwgen -c -n 8 1

Сначала создается учетная запись пользователя foxtrot со значением su установленным в false. Затем для этого пользователя задается пароль, и очищаются все флаги пароля (это означает, что пользователю foxtrot не будет предлагаться поменять пароль при входе в систему). После этого устанавливается значение поля gecos, в результате чего переменная $user принимает значение foxtrot, а затем к этой расширенной переменной добавляется окончание "apps". Значение maxage устанавливается равным пяти неделям – по истечении пяти недель с момента установки или последнего изменения пароля пользователь foxtrot должен будет сменить его в принудительном порядке. Пользователь foxtrot сможет изменить этот пароль не ранее, чем по прошествии одной недели, поскольку это продиктовано правилом minage=1. Наконец, пользователю предоставляется членство в первичной группе staff (являющейся в AIX группой по умолчанию).


Листинг 2. Сценарий create_user
#!/bin/sh
# create_user

user="foxtrot"
pass=$(pwgen -c -n 8 1)
echo "the passwd for $user is: $pass"

echo  "creating user $user..creating password"
mkuser su=false $user
 if [ $? = 0 ]
  then
   echo "$user:$pass" | chpasswd -c
  else
   echo "error: unable to create user $user"
   exit 1
 fi
echo "changing $user attributes..."
  chuser gecos="${user}.apps" $user
  chuser maxage=5 $user
  chuser minage=1 $user

В результате выполнения сценария create_user, приведенного в предыдущем примере, мы получим следующий вывод:

# create_user
the passwd for foxtrot is: oiN2hi9r
creating user foxtrot..creating password
changing foxtrot attributes...

В том, что флаги были сброшены, мы можем убедиться с помощью команды pwdadm, как было показано ранее:

# pwdadm -q foxtrot
foxtrot:
        lastupdate = 1266174412

Требованием аудита является регулярное изменение пароля суперпользователя root. На мой взгляд, лучший способ сделать это – подключиться к каждому хосту в качестве пользователя root с помощью ssh, после чего сменить пароль этого пользователя на хосте, к которому подключились. Однако помните, что этот пароль вам нельзя забывать. Поэтому вы можете использовать более предпочтительный вариант – сначала локально сгенерировать пароль с помощью pwgen, жестко прописать его в сценарии, а затем удалить пароль из сценария после того, как он будет развернут и физически сохранен в безопасном месте (например, в сейфе). Не забудьте сообщить новый пароль остальным системным администраторам.

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

# cat all_hosts
host1
host2
host3
host..

В листинге 3 показано, как можно легко сделать это. С помощью утилиты pwgen уже был сгенерирован следующий пароль: 'tu8ahLae'. Для каждого перечисленного в файле all_hosts хоста, к которому мы подключаемся, используется метод 'here document'. Это означает, что все команды, заключенные между словами 'mayday', перенаправляются на удаленный хост в качестве стандартного ввода. Строка root:tu8ahLae передается на вход команды chpasswd, как показано ниже:

echo "root:tu8ahLae" | chpasswd 


Листинг 3. Сценарий chpw_root
#!/bin/sh
cat all_hosts | while read host
do
echo "[$host]″

ssh -T -t -l root $host<<'mayday'
hostname

echo "root:tu8ahLae" | chpasswd 
 if [ $? != 0 ]
then
echo " password of root change failed $host"
 else
echo " password of root change OK"
fi
mayday
done
        

В сценарии chpw_root предполагается, что удаленные хосты и хост, на котором расположен сценарий, обменялись ключами ssh.


Уведомление пользователей

Приведенный в листинге 2 сценарий создает учетную запись пользователя с заданным первоначальным паролем, тем не менее, уведомление пользователей об их новых паролях производится вручную – обычно данные аутентификации отправляются пользователям по электронной почте, либо сообщаются по телефону. Для автоматизации уведомления можно реализовать отправку электронных писем пользователям напрямую из сценария. Для этого необходимо выполнить сопоставление учетных записей пользователей и их электронных адресов. В качестве одного из способов можно рассмотреть использование файла, содержащего идентификаторы пользователей и соответствующие им адреса электронной почты. Другой способ заключается в размещении адресов электронной почты пользователей в поле gecos файла /etc/password в следующей форме: <имя>.<фамилия>@<домен>

dxtans:!:203:1:david.tansley@btinternet.com:/home/dxtans:/usr/bin/ksh

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

Другим методом (который, как мне кажется, является более простым в настройке и не требует изменения файла /etc/password) является использование глобального справочного файла. Этот файл может содержать список всех имеющих доступ в систему пользователей и соответствующих им адресов электронной почты, как показано ниже:

#  cat email_lookup
alpha   alpha.apps@mycompany.com
bravo   bravo.suppt@mycompany.com
charlie charlie.suppt@mycompany.com

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

Сценарий, приведенный в листинге 4, использует указанный выше файл для поиска имен пользователей и соответствующих им адресов электронной почты, а также для уведомления пользователей о смене их паролей. Сначала из файла passfile (этот файл был создан ранее в этом руководстве) считываются имя пользователя и пароль, после чего проверяется, существует ли такая учетная запись в файле /etc/passwd. Если такая действующая учетная запись существует, то из файла email_lookup считывается соответствующий ей адрес электронной почты. В этом сценарии предполагается, что утилита chpasswd уже была запущена, и в файле passfile уже содержатся имена и пароли пользователей (как это было показано ранее). В идеальном случае сценарий должен также содержать процедуры по работе с утилитами chpasswd и pwgen, чтобы пароли можно было бы менять за один раз, как было показано в этом руководстве. На данном этапе сценарий в листинге 4 должен дать вам представление о том, как автоматически уведомлять пользователей о сбросе или изменении их паролей посредством рассылки электронной почты.


Листинг 4. Сценарий email_user
#!/bin/sh
passfile=/home/dxtans/passfile
email_lookup=/home/dxtans/email_lookup

IFS=":"
cat $passfile | while read user pass
do
   if grep -w  ^$user /etc/passwd >/dev/null
     then
       echo "$user - found"
        email_name=$(grep -w  ^$user $email_lookup | awk '{print $2}')
          if [ "$email_name" = ""  ]
           then
            echo "lookup failed for this user:$user"
          fi
        mail -s "`hostname` account change" $email_name<<mayday
your account: $user
new password: $pass
mayday

   else
       echo "$user - NOT found"
fi
 done


Заключение

Используя утилиту pwgen вместе с утилитой chpasswd, системный администратор может автоматизировать управление паролями пользователям. Пароли, сгенерированные с помощью pwgen, трудно подобрать, что обеспечивает надежный уровень безопасности при изменении паролей. Также я предложил вам два способа уведомления пользователей о смене их паролей.


Ресурсы

Научиться

  • Оригинал статьи Password maintenance (EN)

  • Информацию о проекте Pwgen вы можете найти на странице sourceforge (EN)

Получить продукты и технологии

Обсудить

Об авторе

author photo

Дэвид Тэйнсли (David Tansley) – независимый автор, имеющий за плечами 15-летний опыт администратора UNIX, последние 8 лет из которых он работает с AIX. Дэвид любит играть в бадминтон, а потом расслабляться за просмотром Формулы-1, но больше всего он любит путешествовать с женой на своем мотоцикле.

Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Спасибо. Эта запись была помечена для модератора.


Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Сообщение о нарушении не было отправлено. Попробуйте, пожалуйста, позже.


developerWorks: вход


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Выберите ваше отображаемое имя

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

(Должно содержать от 3 до 31 символа.)


Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Оценить эту статью

Комментарии

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=761682
ArticleTitle=Работа с паролями
publish-date=09272011

Теги

Help
Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Используйте ползунок, чтобы отразить больше или меньше тегов.

КнопкаПопулярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere).

Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).

Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Кнопка Популярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere). Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).