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,否則以后虛擬機重啟都要修改一次密碼。