Когда экземпляр Windows создается в AWS, его пароль шифруется с помощью открытой части ключа SSH.
Затем можно использовать следующую команду для получения зашифрованного пароля:
aws ec2 get-password-data --instance-id=i-0a5102eb55ed6e0b9
(См. https://docs.aws.amazon.com/cli/latest/reference/ec2/get-password-data.html#examples)
Команда возвращает следующие данные:
{
"InstanceId": "i-0a5102eb55ed6e0b9",
"Timestamp": "2019-11-04T12:21:30.000Z",
"PasswordData": "\r\nbase64_data==\r\n"
}
Зашифрованные данные пароля имеют кодировку base64, но поле "PasswordData" можно расшифровать, если у вас есть закрытая часть SSH-ключа:
echo "base64_data" | base64 --decode | openssl rsautl -decrypt -inkey "./path_to_private_ssh_key"
(См. пример репозитория Github по адресу https://github. com/tomrittervg/decrypt-windows-ec2-passwd/blob/master/decrypt-windows-ec2-passwd.sh)
Это отлично работает, однако я использую Nitrokey Professional для хранения закрытого ключа и не вижу способа указать команде openssl использовать карту GPG для расшифровки данных. Я хотел бы хранить закрытые ключи вне диска, если это возможно.
Для справки, чтобы получить открытый ключ в AWS, я экспортировал открытый ключ в правильном формате SSH для AWS с помощью команды gpg --export-ssh-key nameofuser@example.com
.
Есть ли способ расшифровать данные с помощью карты?
В Linux я не нашел эквивалента на основе GPG, но для этого можно использовать интерфейс PKCS#11. У меня есть аналогичная установка с использованием Yubikey, и задокументировал процесс, но tl;dr таков:
Соответствующие команды для расшифровки выглядят следующим образом:
aws ec2 get-password-data --instance-id <blah> --query PasswordData --output text| base64 -d > encrypted-adminpass.bin
pkcs11-tool --decrypt -v -l --input-file encrypted-adminpass.bin -m RSA-PKCS