工作中,我们经常会定期更换服务器密码,如果手动去修改,不仅费时,而且容易出错。下面提供了一种思路,可以实现批量、自动修改服务器密码。
大致思路:首先,为每一台服务器设定一个唯一标识;其次,将每台服务器的唯一标识、新密码、修改指令等信息存入专门的密码服务器;最后,每台服务器定时去查询密码服务器中的信息,收到修改指令后,自行修改密码。
每一台服务器都需要一个唯一标识,便于查找、定位。不要使用IP地址、MAC地址,因为一台服务器可能有多个IP,多个网卡,IP地址也可能经常换来换去,这样就不准确。这里我使用了CUPID+ 主板序列号的组合作为唯一标识。我们测试了30多台服务器,发现这个组合可以满足需要。当然,也有其他的方法,如给每台服务器设置配置文件等。下面是获取硬件信息的方法:
def get_disk_info():
encrypt_str = ""
c = wmi.WMI()
for cpu in c.Win32_Processor():
# 获取CPUID
encrypt_str = encrypt_str + cpu.ProcessorId.strip()
for board_id in c.Win32_BaseBoard():
# 主板序列号
encrypt_str = encrypt_str + board_id.SerialNumber.strip()
return encrypt\_str
在数据库中维护服务器唯一标识,新密码,更新状态,指令等信息。为了安全起见,新密码可以使用密文,当需要修改的时候,把密文转换成明文。建议使用非对称加密算法,并增加密码的复杂度。如果使用主流的一些算法,如MD5等,对于简单的密码还是有办法可以破解的。也可以将新密码分成几部分,使用的时候再进行拼接或者特殊处理。这些做法都是尽可能的提高密码的安全性。
每台服务器定时去检测密码服务器上的指令,如果需要修改,则立即修改,并更新修改状态等。
def changepwd():
# 获取唯一标识
cupid = get_disk_info()
# 获取修改指令及新密码
prow = getpwd(cupid)
if len(prow) > 0:
pnew = prow[0].get("newpwd")
puser = getpass.getuser()
cmd = "net user "+puser+" "+pnew
# 修改密码
res = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
recode = str(res.returncode)
# 更新状态
if "0" == recode:
sql = "update autopwd set flag='0' where sid=\'%s\'" % (pnew, cupid)
setpwd(sql)
log("change password status", str(res.returncode))
else:
log("change failed", "not find cpuid")
sys.exit(0)
本案例中,修改密码命令是Windows的net命令,如果是Linux服务器,只需把对应的命令换成对应的Linux下的即可。以后运维人员,只需制定好新的密码、修改指令、修改时间,其余的均自动完成。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章