Python Paramiko Password Change

리눅스 시스템 관리를 하다 보면 여러 서버의 사용자 패스워드를 일괄적으로 변경해야 하는 경우가 있다. 물론 시스템 관리자라면 보안적인 측면으로 사용자에 패스워드를 주기적으로 변경해야 한다.

LDAP 디렉토리 서버를 구성하여 통합계정관리가 가능하지만 해당 문서는 python script를 실행하여 일괄적으로 패스워드를 변경하는 방법을 작성한다. LDAP 디렉토리 서버 구성은 다음 문서에 작성이 되어질 예정이다.

2개의 파일이 필요하다. 1개는 패스워드를 변경하는 python script(chpasswd.py), 1개는 변경할 대상의 서버 리스트(chpasswd_list.txt)를 아래 내용을 참고하여 생성한다. 실행 방법 또한 아래 내용에서 확인 할 수 있다.

Paramiko

  • Python 2.6+, 3.3+에서 사용할 수 있는 SSHv2 구현체이다.
  • Client, Server 둘 다 사용이 가능하다.
  • 저 레벨 암호화를 위해서 PyCrypro(이부분은 Python C 확장으로 구현)를 제외한 나머지 부분들은 전부 Python으로만 구현되어있다.

Paramiko 모듈을 이용한 Python Script : chpasswd.py

#!/usr/bin/env python

import paramiko
import socket
import getpass
import sys


def input_passwd():

    mesg = "Password: "
    old = getpass.getpass("Current %s" % mesg)
    new = getpass.getpass("New %s" % mesg)
    re_new = getpass.getpass("Retype New %s" % mesg)

    if new != re_new:
        print "New RandomString does not match."
        exit(1)

    return old, new


def main(argv):
    if len(argv) < 2:
        print "USAGE : %s [srvlist.txt]" % argv[0]
        exit(1)

    srvlist_file = argv[1]

    old_password, new_password = input_passwd()
    print new_password

    srvlist = open(srvlist_file, 'r')
    lines = srvlist.readlines()

    for line in lines:

        line_sep = line.split()
        ip = line_sep[0]
        userlist = line_sep[1].split('/')
        for user in userlist:

            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            try:
                ssh.connect(ip, username='root', password='%s' % (old_password), timeout=5)

            except paramiko.ssh_exception.AuthenticationException:
                result = "Authentication failed"
            except socket.error:
                result = "Socket error"
            else:
                ssh.exec_command('echo "%s:%s" | chpasswd' % (user, new_password))
                result = "OK!"

            print "%s %s : %s " % (ip, user, result)

if __name__ == '__main__':
    main(sys.argv)

패스워드 변경 서버 리스트 : chpasswd_list.txt

패스워드 변경 서버 리스트를 아래 형식에 맞게 작성하여 생성한다. 사용자는 제한이 없으며 “/”를 입력하여 추가한다. 해당 파일의 이름은 형식에 제한이 없다. 원하는 이름으로 생성해도 된다.

hostname ip username/username/username..
# vi chpasswd_list.txt

test1           192.168.0.1    test/root
test2           192.168.0.2    test/root
test3           192.168.0.3    test/root
test4           192.168.0.4    test/root
test5           192.168.0.5    test/root
test6           192.168.0.6    test/root
test7           192.168.0.7    test/root

실행 방법

해당 스크립트는 paramiko 모듈을 사용하였기에 해당 모듈을 먼저 설치해야 한다. 아래의 순서로 설치를 진행한다.

# apt-get install build-essential libssl-dev libffi-dev python-dev
# apt-get install python-paramiko
  • 해당 스크립트는 서버들과 통신이 가능한 서버에서 구동해야 한다.
  • 인자값을 생략하고 스크립트를 구동하게 되면 친절한 사용방법이 나온다.
#./chpasswd.py [파일리스트]
#./chpasswd.py
USAGE : ./chpasswd.py [srvlist.txt]
  • 결과값
  • 인증이 실패할 경우 : [IP] [사용자] : Authentication failed
  • 통신이 안되는 경우 : [IP] [사용자] : Socket error
  • 정상적으로 변경된 경우 : [IP] [사용자] : OK!