2008/06/10

솔라리스에서 사용자 패스워드 변경 자동화(expect 이용)

예전에는 CGI를 이용하여 웹 프로그래밍을 할 때에는 사용자 암호를 웹 인터페이스로 받아서 변경해야 하는 경우가 있었습니다.
지금의 웹 인터페이스에서는 JavaScript나 python등 고수준 스크립팅으로 백엔드 인증 서비스와 연결하는 방법을 대부분 사용합니다만 예전에는 /usr/bin/passwd라는 유틸리티를 이용하여 /etc/passwd 화일을 기반으로 패스워드를 변경해야 했습니다.

오늘날에는 필요하지 않을 듯 하고, 실제로 보안상의 이유로 권고되지 않습니다만, 간혹 시스템 마이그레이션이나 자동 업데이트를 배치로 처리하기 위해서 대량의 사용자의 암호를 임의로 변경하기 위해서는 여전히 이러한 스크립트를 통한 passwd 변경이 필요하게 됩니다.

이러한 목적으로 패스워드를 변경하기 위해서 예전에는 쉘스크립트의 표준 입출력을 조정하여 스크립트했습니다만, 솔라리스10에서는 이렇게는 안되는 것 같습니다(방법이 있는 지는 좀더 확인해봐야겠습니다)

어쨌든 오픈솔라리스에는 (솔라리스 Community Edition 03/2008. Opensolaris 05/08과는 다름)에는 expect라는 스탠다드 입출력을 전환하는 유명한 오픈 소스가 들어있습니다. 이 툴을 이용하여 패스워드 변경을 스크립팅할 수 있습니다.
다음은 mkpasswd라는 간단한 expect 스크립트 입니다. 사용방법은 다음과 같습니다.
#mkpasswd user1 oldpasswd newpasswd

#!/usr/bin/expect
#
# mkpasswd by Bonghwan Kim
#

spawn passwd [lindex $argv 0]
set new [lindex $argv 1]

expect "New Password:"
send "$new\r"
expect "Re-enter new Password:"
send "$new\r"
expect eof


mkpasswd를 실행할때 실행 아큐먼트로 구 패스워드와 새 패스워드를 주고 실행하면, 한번에 변경이 가능합니다.
여기서 두가지 중요한 것은 이 스크립트는 root 권한을 가지고 실행이 되어야 하며, 이 스크립트가 실행될때의 locale이 반드시 POSIX 'C' 이어여 합니다. 즉, 터미널에서 실행할때에는 LC_ALL=C;export LC_ALL 혹은 그에 준하는 명령어로 쉘의 로케일을 C로 전환합니다. 그 이유는 로케일이 달라지면 expect가 기대하는 문자열의 값이 로컬라이즈화 되어 스트링이 달라집니다. 예를 들어, ko 혹은 kr_KR.UTF-8으로 되어 있으면 "New Password:"라고 나오지 않고 "새 암호:" 와 같이 물어보기 때문입니다.


일반 사용자가 위와 같은 패스워드를 사용해야 하는 경우에는 위의 스크립트를 사용할 수 없습니다. 일반 사용자 특히 이미 패스워드가 설정되어 있는 경우에는 기존의 패스워드를 물어보는 과정이 추가되기 때문입니다. 일반 사용자가 자기의 패스워드를 자동으로 변경하고자 하는 경우에는 위의 스크립트를 약간 변경하여 다음과 같이 작성하면 작동합니다.

사용법은 LC_ALL=C mkpasswd jac0001 abc123 qwer123 와 같이 실행하면 됩니다.
#!/usr/bin/expect
spawn passwd [lindex $argv 0]
set old [lindex $argv 1]
set new [lindex $argv 2]

expect "Enter existing login password:"
send "$old\r"
expect "New Password:"
send "$new\r"
expect "Re-enter new Password:"
send "$new\r"
expect eof

참고로 실행하고 테스트된 플랫폼은 다음과 같습니다.
solaris:~ 522
$cat /etc/release
Solaris Express Community Edition snv_86 X86
Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 27 March 2008
solaris:~ 523
$expect -v
expect version 5.43.0

댓글 없음: