0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python boto3でWindows Passwordを復号する関数

Last updated at Posted at 2021-07-12

経緯

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 ""

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?