사용자를 마이그레이션할 때는 초기 비밀번호가 제공되어야 한다. 일반적으로 이메일 또는 전화를 통해 새 비밀번호가 사용자에게 제공된다. 그런 다음 로그인 시 비밀번호를 변경하라는 메시지가 사용자에게 표시된다(보안 비밀번호 정책 규칙이 적용된 경우). 로컬 또는 원격으로 사용자 계정 비밀번호를 다시 설정해야 하는 임시 요청을 통해 비밀번호 변경이 수행될 수도 있다. 이러한 비밀번호 변경은 시간이 걸리고 많이 반복된다. 하지만 AIX 유틸리티 chpasswd(Linux 변형과 함께 제공됨)를 사용하면 이러한 태스크를 쉽게 수행하고 반복할 수 있다.
그렇지만 적절한 비밀번호를 선택하는 것은 또다른 문제이다. 한 번에 여러 비밀번호를 변경하거나 다시 설정할 때는 사전에 있는 단어나 사용자 이름을 사용하는 것이 편리하지만 이것은 적절한 비밀번호 정책이 아니다. 비밀번호는 매우 기억하기 쉬워야 하고 사용자가 기억하기 위해 메모할 필요는 없을 정도로 어렵지 않아야 한다. 일부 사용자는 일반적인 사용자 계정에 무작위 비밀번호를 사용하는 것이 적절한 보안 정책이라고 제안한다. 필자는 이 방법은 사용자가 자신의 비밀번호를 기억할 수 있는 경우에만 적합한 정책이라고 생각한다. 사용자가 메모지에 비밀번호를 기록해 두는 경우에는 이 메모지를 책상 아래나 책상 서랍 안과 같이 쉽게 찾을 수 있는 곳에 둘 확률이 높다. 결국 이러한 장소는 수상한 침입자가 사용자의 비밀번호를 쉽게 찾을 수 있는 곳이 된다.
관리자나 자체 비밀번호를 생성하려고 하는 사용자가 발음 가능하거나 발음 가능하지 않은 비밀번호를 생성하는 데 사용하기에 적절한 도구는 pwgen이라는 유틸리티 애플리케이션이다. Pwgen은 하나 또는 여러 개의 비밀번호를 생성할 수 있으며 대문자나 숫자가 포함된 다양한 길이의 비밀번호를 지정할 수 있다.
이 기사에서는 chpasswd 및 pwgen의 사용과 비밀번호 변경 처리 시 이 유틸리티가 대화식으로 또는 일괄처리로 사용되는 방법에 대해 설명한다. 필자는 수년 전에 사용자를 LDAP 환경으로 마이그레이션할 때 chpasswd를 처음 접했다. 지금 chpasswd는 비대화식으로 로컬 또는 원격 계정의 비밀번호를 변경할 때 필자가 선택하는 도구가 되었다. pwgen을 다운로드할 위치를 확인하려면 바이너리이든 소스이든 참고자료 섹션을 참조한다.
chpasswd를 사용하면 계정 비밀번호를 한 번에 하나 또는 여러 개 변경할 수 있다. 이는 명령행에서 일반적으로 수행하는 것처럼 비밀번호를 다시 입력하지 않아도 된다는 것을 의미한다. chpasswd는 대화식으로 사용할 수 있지만 필자는 비대화식 모드로 사용하도록 권장한다. 비밀번호를 신속하게 변경할 수 있으므로 chpasswd를 사용한다.
chpasswd를 사용하기 위한 형식은 다음과 같다.
chpasswd -f <pwdadm flags> -c |
여기서:
-f pwdadm flags는 구문 분석될 수 있다.
-c는 비밀번호 플래그를 지운다.
사용자와 비밀번호는 다음 형식의 표준 입력에서 읽어온다.
user_name:user_password |
이름이 각각 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: |
비밀번호가 설정되지 않았기 때문에 출력이 생성되지 않았다. 생성된 출력이 있는 경우에는 설정된 시기의 UTC 시간소인(초)으로 'lastupdate' 필드가 채워져 있다.
chpasswd를 사용하여 필자는 이러한 사용자가 초기 비밀번호를 설정하는 두 가지 방법에 대해 설명한다. 다음 예제에서는 명령행에서 사용자 이름 alpha와 비밀번호 mypasswd를 반복한 후 파이프를 통해 chpasswd에 연결한다.
echo "alpha:mypasswd" | chpasswd |
또한 로그인 및 비밀번호 세부사항은 다음과 같이 문자열에 포함되어 파이프를 통해 chpasswd에 연결될 수 있다.
# detail="charlie:charpw" echo $detail | chpasswd |
이제 pwdadm을 통해 사용자 alpha를 쿼리하면 비밀번호 재설정 시 chpasswd 기본 설정인 플래그 값 ADMCHG가 설정된 것을 확인할 수 있다.
# pwdadm -q alpha
alpha:
lastupdate = 1265765265
flags = ADMCHG
|
ADMCHG는 사용자 alpha가 설정된 초기 비밀번호(mypasswd)를 사용하여 다음에 로그인을 시도하면 사용자 alpha는 비밀번호를 변경해야 함을 나타낸다. 이는 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 명령에서 플래그 지우기 옵션을 사용한 것에 유의한다. 해당 필드에 있는 모든 플래그 값을 지웠다.
비밀번호가 마지막으로 설정되거나 변경된 시기를 판별하려면 pwdadm 출력의 마지막 업데이트 값에 표시된 대로 UTC 시간소인(초)을 더 의미있는 현재 날짜 시간소인으로 변환해야 한다.
다음 두 명령에서는 모두 비밀번호 변경 또는 초기 설정(있는 경우)의 마지막 업데이트를 리턴한다. 이 예제에서는 사용자 alpha의 마지막 비밀번호 업데이트를 조사한다.
# lssec -f /etc/security/passwd -s alpha -a lastupdate
alpha lastupdate=1265940457
# pwdadm -q alpha
alpha:
lastupdate = 1265940457
flags = ADMCHG |
perl 또는 gawk을 사용하여 UTC를 현재 시간소인으로 변환할 수 있다. 다음 두 예제에서는 동일한 결과가 발생한다.
# 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 버전은 2.0.6이다. 바이너리 버전은 현재 2.0.5이다. 여기서는 소스를 사용한다.
다운로드했으면 압축 해제한 후 컴파일한다.
# 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 <options> <password_length> <number_of_passwords> |
공통 옵션은 다음과 같다.
| -1 | 한 행에 하나씩 비밀번호 출력 |
| -c | 대문자를 포함해야 함 |
| -n | 숫자를 포함해야 함 |
| -s | 무작위 비밀번호 |
8자 길이의 단일 비밀번호를 출력하려면 다음을 수행한다.
# pwgen 8 1 eej3eeZu |
대문자를 반드시 사용하는 7자 길이의 비밀번호 3개를 출력하려면 다음을 사용한다.
# pwgen -c 7 3 |
대문자와 숫자를 반드시 사용하는 8자 길이의 비밀번호 10개를 출력하려면 다음을 사용한다.
# pwgen -c -n 8 10 zum5Shei Choo6Eih Ub5uagei Ooxu6ohs Eix9xeip iV4yoeph Io3aeGhe taiTh6ia cuere1AW phai9Pai |
Pwgen은 tty를 통해 유틸리티를 실행하는지 여부를 판별한다. tty를 통해 실행하지 않는 경우에는 옵션이 전달되지 않으면 기본적으로 하나의 비밀번호만 생성한다. 다음과 같이 변수에 값을 저장해야 하는 경우 이는 스크립트를 더 용이하게 한다.
# pass=$(pwgen) # echo $pass ohtherah |
원하는 경우에는 back-tick을 명령 대체로 사용할 수 있다. back-tick을 사용해도 동일한 결과가 발생한다.
pass=`pwgen`
# echo $pass
oowahxei
|
물론 원하는 만큼 많은 비밀번호를 포함할 수 있다. 다음 예제에서는 세 개의 비밀번호가 생성된다.
# pass=$(pwgen -c -n 8 3) # echo $pass EluBie0z thohku0W Ail3fu3z |
8자로 된 진정한 무작위 비밀번호를 출력하려면 다음을 사용한다.
# pwgen -s 8 1 9bTzZxt9 |
앞의 예제와 같이 무작위 옵션 사용 시에는 주의사항에 유의해야 한다. 이러한 무작위 비밀번호는 매우 기억하기 어려울 수 있으므로 이러한 비밀번호가 사용자에게 지정된 경우에는 비밀번호를 기록해 둘 수 있다. 필자의 경험으로는 무작위로 생성된 비밀번호는 애플리케이션 소유자 계정에만 사용해야 한다.
사용되고 있는 pwgen 및 chpasswd 도구를 살펴봤으므로 사용자의 초기 비밀번호 설정을 시작할 수 있다. 분명한 것은 이러한 비밀번호 설정이 Listing 1과 같은 스크립트를 통해 수행되어야 한다는 것이다. 먼저 비밀번호를 설정할 사용자 목록을 결정한다. 이 목록은 파일에 포함될 수 있다(이 데모에서는 세 명의 사용자가 포함된 문자열 $list에 사용자가 포함되어 있음). 이러한 각각의 사용자에 대해 루프를 통해 각 사용자가 처리될 때 명령행을 사용하여 8자 길이의 비밀번호가 생성된다.
pwgen 8 1 |
사용자 계정이 AIX 호스트에 있는지 확인하는 초기 검사가 수행된다. 사용자 계정이 AIX 호스트에 있는 경우 사용자 이름과 생성되는 비밀번호가 chpasswd가 처리할 수 있는 형식으로 passfile 파일에 추가된다. 모든 사용자가 처리되면 파일이 파이프를 통해 chpasswd에 연결된다. 사용자가 /etc/passwd에 없는 경우에는 해당 사용자의 passfile에 사용자/비밀번호 항목이 없다.
Listing 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를 실행하면 chpasswd를 통해 처리하기 전에 다음 컨텐츠가 포함된 passfile 파일이 생성된다.
# cat passfile alpha:jiebuzio bravo:oegaeyay charlie:ooweipoa |
다음 예제(Listing 2 참조)에서는 초기 비밀번호와 로그인 속성이 변경된 foxtrot이라는 사용자가 작성된다. create_user 스크립트는 비밀번호 설정을 위해 pwgen을 사용하여 이를 수행할 수 있는 한 가지 방법을 보여 준다. 이 예제에서는 최소한 대문자 하나와 숫자 하나가 포함된 8자의 문자로 비밀번호가 설정된다.
pwgen -c -n 8 1 |
먼저 su가 false로 설정된 사용자 foxtrot이 작성된다. 그런 다음 사용자의 모든 비밀번호 제한 플래그를 지우는 비밀번호가 계정에 설정된다(즉, 사용자 foxtrot에게는 로그인 시 비밀번호를 변경하라는 메시지가 표시되지 않음). 그 다음 변수 $user를 확장하여 foxtrot이 되도록하는 gecos 필드가 설정되고 "apps"가 확장된 변수에 추가된다. maxage는 5주로 설정되고 사용자 foxtrot은 마지막 비밀번호 변경 또는 설정 후 5주 후에 비밀번호를 변경해야 한다. 사용자 foxtrot은 minage=1에서 지시한 것처럼 1주가 경과되기 전에는 해당 비밀번호를 변경할 수 없다. 마지막으로 기본 그룹이 스태프(AIX의 기본값임)인 그룹 멤버십이 설정된다.
Listing 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
|
루트 비밀번호를 자주 변경하는 것은 감사의 요건이다. 필자가 생각하기에 이를 수행하는 가장 좋은 방법은 ssh를 통해 각 호스트에 루트로 연결한 후 해당 호스트에 연결되면 비밀번호를 변경하는 것이다. 하지만 이 비밀번호는 잊어서는 안 된다는 것에 유의한다. 먼저 pwgen을 사용하여 로컬로 비밀번호를 생성하여 스크립트에 하드코딩한 다음 해당 비밀번호를 롤아웃하고 금고와 같은 물리적인 공간에서 보호한 후에 스크립트에서 해당 비밀번호를 삭제하는 것이 도움이 될 수 있다. 다른 시스템 관리자에게 새 비밀번호를 알리는 것을 잊어서는 안 된다.
원격으로 연결하려는 모든 호스트를 파일에 포함시키는 것이 좋다. 이 방법을 사용하면 다른 스크립트에서 파일을 읽을 수 있기 때문에 해당 파일을 수동으로 스크립트에 추가하여 오타를 막을 수 있다. 호스트가 포함된 일반적인 파일의 형식은 다음과 같다.
# cat all_hosts host1 host2 host3 host.. |
Listing 3에서는 이를 수행할 수 있는 편리한 한 가지 방법을 보여 준다. pwgen을 사용하여 비밀번호가 이미 생성되었으며 비밀번호는 'tu8ahLae'이다. all_hosts 파일에서 읽은 대로 연결하는 각 호스트에 대해 여기서 문서 메소드가 사용된다. 이는 'mayday' 사이에 포함된 모든 명령이 원격 호스트에서 표준 입력으로 읽힌다는 것을 의미한다. root:tu8ahLae 문자열은 다음과 같이 파이프를 통해 chpasswd에 연결된다.
echo "root:tu8ahLae" | chpasswd |
Listing 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 키가 원격 호스트에서 스크립트가 있는 호스트로 교환되었다고 가정한다.
Listing 2에 포함된 스크립트는 초기 비밀번호가 설정된 사용자를 작성하지만 사용자에게 새 비밀번호를 알리는 방법은 수동이다. 여기에는 인증 세부사항을 이메일에 복사하여 붙여넣은 후 사용자에게 메일로 보내거나 전화로 세부사항을 알려 주는 방법이 자주 사용된다. 좀 더 자동화된 방법은 스크립트에서 직접 사용자에게 이메일을 전송하는 것이 될 수 있다. 이를 위해서는 사용자와 이메일 주소가 연관될 수 있는 위치에 프로세스가 있어야 한다. 생각해 볼 수 있는 한 가지 옵션은 각각의 이메일 주소가 있는 사용자 ID가 포함된 파일을 사용하는 것이다. 또다른 옵션은 <first_name>.<last_name>@<domain> 형식으로 /etc/password 파일의 gecos 필드에 이메일 주소를 포함하는 것이 될 수 있다.
dxtans:!:203:1:david.tansley@btinternet.com:/home/dxtans:/usr/bin/ksh |
하지만 이 시나리오를 사용하면 특히 AIX 상자가 많이 있는 경우 오타가 발생할 수 있기 때문에 관리자에게 상자가 몇 개 없는 경우에만 이 시나리오를 사용해야 한다.
대안으로는 글로벌 검색 파일을 보유하는 것이 있다. 필자는 이 방법을 사용하면 설정이 더 신속하게 수행되고 /etc/passwd 파일을 수정하지 않아도 된다고 생각한다. 다음과 같이 이 파일은 로그인 가능한 모든 사용자와 해당 이메일 주소 목록을 포함할 수 있다.
# cat email_lookup alpha alpha.apps@mycompany.com bravo bravo.suppt@mycompany.com charlie charlie.suppt@mycompany.com … |
모든 사용자 이름 및 이메일 계정이 포함된 이 글로벌 파일 email_lookup은 모든 상자에 밀어넣을 수 있다. 업데이트할 글로벌 파일을 하나 가지고 있으면 사용자를 추가하거나 삭제할 때 해당 파일을 업데이트한 후 scp를 통해 다시 모든 상자에 밀어넣기만 하면 되기 때문에 작업이 편리해진다. email_lookup 파일이 있는 원격 상자에 사용자가 없으면 사용자가 존재하지 않기 때문에 비밀번호 변경 시 해당 사용자에 대한 검색이 수행되지 않으므로 해당 원격 상자에 사용자가 없어도 문제가 되지 않는다.
Listing 4에 포함된 스크립트에서는 이전의 email_lookup 파일을 사용하여 사용자 이름 및 해당 이메일 주소를 찾고 사용자에게 계정 변경사항을 알려 준다. 해당 스크립트는 이 데모에서 앞서 생성된 passfile 파일에서 사용자 및 비밀번호를 읽어온 후 /etc/passwd를 확인하여 올바른 계정인지 검사한다. 아무 문제가 없으면 email_lookup 파일에서 지정된 사용자의 이메일 주소가 추출된다. 이 스크립트에서는 chpasswd가 이미 실행되었고 앞서 제공된 대로 로그인 및 비밀번호 세부사항이 passfile 파일에 있다고 가정한다. 이 기사에서 설명한 대로 한 번에 비밀번호를 변경할 수 있는 chpasswd 및 pwgen 루틴도 이 스크립트에 포함되어 있는 것이 이상적이다. 현재로서는 Listing 4에 포함된 스크립트에서 비밀번호가 다시 설정되거나 변경되면 이메일을 통해 사용자에게 자동으로 알리는 방법에 대한 약간의 정보를 제공한다.
Listing 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에서 생성되는 비밀번호는 쉽게 예상할 수 있는 단어가 아니기 때문에 비밀번호 변경 시 보안을 유지할 수 있다. 필자는 사용자에게 비밀번호 변경을 알리는 두 가지 방법도 제시했다.
교육
- Pwgen 프로젝트는 sourceforge에서 확인할 수 있다.
제품 및 기술 얻기
- 바이너리 및 소스 버전 2.05를 다운로드하자.
토론
- Twitter의 developerWorks 페이지를 살펴보자.
- My developerWorks 커뮤니티에 참여하자.
-
AIX 및 UNIX 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- IBM Support Assistant Forum
- Performance Tools Forum
- Virtualization Forum
- 기타 AIX and UNIX Forums
