OpenStack 映象密碼修改辦法

CL.TANG發表於2016-10-18
Contents [hide]

場景

使用者將例項裡的root密碼修改了,/root/.ssh/的公鑰檔案刪除了,然後把密碼忘記了,需要重置密碼功能。

 

方案一

映象裡做一個修改密碼的http服務,開啟一個埠,例項裡該服務一直執行,如果接受到來自管理平臺的IP地址的該請求,修改密碼。 效果:不需要重啟伺服器,需要開一個埠服務。 甚至可以擴充套件服務做監控使用。 可能的問題:如果使用者停掉該服務,則需要將該服務加入開機啟動,重啟後才能夠修改密碼,如果使用者直接將開機啟動指令碼也刪除了,則不能修改密碼。另外可能的安全問題。

 

方案二

基於wget http://169.254.169.254/openstack/latest/meta_data.json能獲取到例項的meta資料,裡面有原本的證照內容:

{"random_seed": "FnlR1A40eQSomVBFczvjNGUbjq+0+bQ+8I04T2EpD2lycYrWcBNHcTC1VfUvq2IFlZ8WtM6jMM6l3YJ3h2J0gl25beFdz5EP5i1ZQ6+T4Ho7/HAbV7Q80Zjr0BukmC8QGbyNyZRuNObg597pFAdt2eeqF0dpUq9IuZn/lKLZwmiC4kZGc SC62XZ2I0um3qzk1pxmEW4rl+SG8fp6rQNmpcYLYk/vky/FX+pYpt7ObyJqkFVY66XbMUldx2fUgEexA9kO3Slf31+1odfM/BTXbTc0ThrhMkVC1JXnDPWlldnnHA2cNTWHJtdqG8MR91etBUqsBt2W09xMK1BKz+IoB7OXHKNFFaAO1uwjbjyUY9pyqqckLCM Q9Tqwj9xBfZ92Ja7BfRIEaF+eDu9xkNxANae6ZGZZ1XLImFjLvbkrBjBJQ9Ry1WoMkMAAao5IjAJaVt3XjdzO+83qOD2zVa7XM1aKGmJaDsOI2la6Sby8GAd9MdL+lANp7gYalqEECAmcfJeLuVA0zBfY54SVSWm9pN9dWeI10Xe8mnJgTvIjePsYDcWYD3nU4 maBrqL043VkrbjIIyhyIuIbhDYJ1cTvJtacRPq7AM+d/EJ9zy1uXK4OyCDpZpuao7T+jDTl2/QmoJ18kYdbOSXJOXrcdyu6LT08C7CKJCNBO2z+sc9cGAM=", "uuid": "19951b2a-cd26-40fc-862c-0d9b82961bf3", "availability_zone": "no va", "hostname": "tangcl.novalocal", "launch_index": 0, "meta": {"admin_pass": "tangcl2"}, "public_keys": {"tangcl": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4odTNZEvA6EBWKXDNfwPQytztVrRAnMGFThdq978 2cKn7WHGekKjtVROt+0oIVj9UR95Lpi53jZATr5dmB4tfu6Lbgjnhv0ugmGLwjrW94J9xKlDaDwr10oSnnB1Ux46eN9KfvnrNKMBy2azmvuhQOJjIWQZM0ZvqDf1cBh6fM1Zk0ipJ7NEghoJelvYTy3v9PTrOOBbSiwtsnSqVmFIKTtqwLsKb9uZAz2Zd5eohU lFl/KzPl9AIdotil7wn3H8pCgQDSZbG/5H0hvpq+9a1L9rIgmyVq0+UbQzNeu8g9l2EGn56y1mUlOrAf7mIuUNqLydqZOp3I1vdBz3ESt0nQ== Generated by Nova\n"}, "name": "tangcl"}

管理員通過金鑰登入到虛擬機器裡然後設定密碼。 效果:需要重啟伺服器,而私鑰也丟了,就還是不能重置密碼。

 

方案三

: 基於wget http://169.254.169.254/openstack/latest/meta_data.json裡的meta內容,

{"random_seed": "DVb03nT4SJaH29wVaXDzfgYX8fwd2HebFiWeDHkNCItcYrUeB+iqtqW8U0055WJ1gCGN8WXS0iUHngUNECSuSszbgpGA873qGV7OHIB6Z+jh4Zm+7hNmk58U3I9/eKgAS1vSw7eCru99+LF1QAc7g8JVd4DHgoUrEc4lnJtaS6h/zI6c1 b+oB2roJ7tdRxqoMaHX529eNoQCeVpNWO56UwGFRUT+wzl4oTEj7saMET3LaNOy08Bg2qXM5DsD/cFZBRRpJfZIuAc48ytRfleSSaaT2hcHlypZv2piycJRvclb7S/jFNua4ZpUIz1nV+QmdTP/dKl7ojETY2Y5r855Q6AEWe/vb+JaQbuiXELnas+3r0GickA pCOXvkw2fN8vWU32bjHFgj3WWAeDBkXw4Vw9Ujz/aYV2K8mAz0YN60JgusT2WltjfYhUdEYjiANVwpzqGwhGvqn3whbzsa9miJlHjZeTxM2nkBQhkgoWoJOkjt+eBEf/SrCnNMrrGhSr+Pad1ZdUJrYNABgdaeuLivddGtvkCGmM4qQhKlAjhNndt5jggrthit sIsFT9F23MUHcoI2VxKLOWHRuaqrI7n8jd/aRlZJswpFAkNSrTCbEwEZJ/dcVWVPGr9iBoq4tQwUGsWrcJr6HFkVPMaH0yVIhYTO4ntAxNv4slnO+iyV6Q=", "uuid": "19951b2a-cd26-40fc-862c-0d9b82961bf3", "availability_zone": "no va", "hostname": "tangcl.novalocal", "launch_index": 0, "meta": {"admin_pass": "tangcl3", "changePasswd": "True"}, "public_keys": {"tangcl": "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4odTNZEvA6EBWKXD NfwPQytztVrRAnMGFThdq9782cKn7WHGekKjtVROt+0oIVj9UR95Lpi53jZATr5dmB4tfu6Lbgjnhv0ugmGLwjrW94J9xKlDaDwr10oSnnB1Ux46eN9KfvnrNKMBy2azmvuhQOJjIWQZM0ZvqDf1cBh6fM1Zk0ipJ7NEghoJelvYTy3v9PTrOOBbSiwtsnSqVm FIKTtqwLsKb9uZAz2Zd5eohUlFl/KzPl9AIdotil7wn3H8pCgQDSZbG/5H0hvpq+9a1L9rIgmyVq0+UbQzNeu8g9l2EGn56y1mUlOrAf7mIuUNqLydqZOp3I1vdBz3ESt0nQ== Generated by Nova\n"}, "name": "tangcl"}

設定meta:{“changPasswd":True,"adminPass":"tangcl2"},在/etc/rc.local裡編寫一個指令碼,主要是開機啟動請求wget http://169.254.169.254/openstack/latest/meta_data.json,以遠端請求的為如果檢查到裡面的changePasswd為True,表示需要修改密碼,使用admin_pass修改密碼。如果為changePasswd為False,不修改密碼。 基本流程:在管理平臺使用nova meta admin_pass=tangcl2 changepasswd=True,設定meta,在重啟伺服器,執行到修改密碼的指令碼,密碼可修改成功。一旦修改成功後重新設定changePasswd 可能的問題,一旦修改meta後changePasswd就為True,則以後該例項重啟都會修改密碼,需要重新設定changePasswd=False,需要一個地方標記做修改,同時要易於理解。如果做成一鍵修改,在例項重啟後無法驗證是否執行了修改指令碼而在管理平臺提前執行了標記False。

 

目前採用方案三

在映象模板的/usr/bin/下新增檔案resetroot,內容為:

#! /usr/bin/python

import os
import json
import urllib

def get_data():
    data = urllib.urlopen("http://169.254.169.254/openstack/latest/meta_data.json").read()
    return data

def parse_data(data):
    json_data = json.loads(data)
    changePasswd = json_data.get("meta").get("changePasswd")
    if changePasswd == "True":
        adminPass = json_data.get("meta").get("admin_pass")
        os.system("echo 'root:%s' | chpasswd" % adminPass)

data = get_data()
parse_data(data)    

在/etc/rc.local上新增一行resetroot

匯出該映象模板,用該模板使用openstack建立一臺虛擬機器. 使用nova meta ddfs set changePasswd=True admin_pass=tangcl55 設定密碼,重啟虛擬機器後密碼修改。 需要在使用nova meta ddfs set changePasswd=False,否則以後虛擬機器重啟都要修改一次密碼。

相關文章