経緯
boto3には(get_)password_dataという関数があり、
Windowsインスタンスの場合は、暗号化されたpasswordを返してくれます
CLIだとパラメータにキーファイルを渡せば復号化までやってくれますが、
boto3は自分でやらないといけません
車輪の再発明は私はあまりやりたくない人なので、どなたかのお役に立つかと思い、
今回作成した関数を共有します
(実際に作成したのはメソッドでQiitaに投稿するにあたり関数にしました。
変換の過程でミスがあるかも知れません)
処理の説明
特に難しいことはやっていないと思います
キーファイルを読み込んで復号化して返しているだけです
Linuxの場合はパスワードがセットされていないので、復号化の処理をスキップしています
password_dataの返す値がbase64でエンコードされているので、復号化しています
エラー処理は適当に変えてください
復号化した後はbyteになっているので、strに変換しています
decrypt.py
import boto3
import base64
import rsa
from rsa.pkcs1 import DecryptionError, VerificationError
def get_password_data(private_key_file: str, instance_id: str) -> str:
# load private key
with open(private_key_file, "r") as f:
private_key_data = f.read()
loaded_pk_data = rsa.PrivateKey.load_pkcs1(private_key_data, format="PEM")
ec2 = boto3.resource('ec2')
instance_obj = ec2.Instance(instance_id)
resp = instance_obj.password_data()
# Windows Only
if resp["PasswordData"]:
try:
password = rsa.decrypt(
base64.b64decode(resp["PasswordData"].encode(encoding='utf-8')),
loaded_pk_data
)
except (DecryptionError ,VerificationError) as e:
lggr = self.get_logger("get_password_data")
lggr.error(e)
else:
return password.decode()
return ""