EC2 Windows - Получить пароль администратора - PullRequest
4 голосов
/ 05 апреля 2011

В настоящее время я знаю, что единственный способ получить пароль администратора из вновь созданного экземпляра окна EC2 - через консоль управления AWS. Это хорошо, но мне нужно знать, как это сделать с помощью Java API - я не могу найти что-либо по этому вопросу. Кроме того, после получения, как мне изменить пароль, используя тот же API?

Ответы [ 4 ]

4 голосов
/ 14 марта 2012

В EC2 API есть вызов «GetPasswordData», который вы можете использовать для извлечения зашифрованного блока данных, содержащего пароль администратора.Чтобы расшифровать его, вам нужно 2 вещи:

Во-первых, закрытый ключ.Это частная половина пары ключей, которую вы использовали для создания экземпляра экземпляра.Сложность состоит в том, что обычно Amazon использует ключи в формате PEM («----- BEGIN» ...), но Java Crypto API требует ключи в формате DER.Вы можете выполнить преобразование самостоятельно - обрезать строки ----- BEGIN и ----- END, взять блок текста в середине и base64-декодировать его.

Во-вторых, параметры шифрования,Данные зашифрованы с помощью RSA с заполнением PKCS1 - поэтому магический вызов, который нужно передать JCE: Cipher.getInstance("RSA/NONE/PKCS1Padding")

Вот полный пример (который основан на BouncyCastle, но может быть изменен для использования другого механизма шифрования).)

package uk.co.frontiertown;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.GetPasswordDataRequest;
import com.amazonaws.services.ec2.model.GetPasswordDataResult;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;

import javax.crypto.Cipher;
import java.nio.charset.Charset;
import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Security;
import java.security.spec.PKCS8EncodedKeySpec;

public class GetEc2WindowsAdministratorPassword {

    private static final String ACCESS_KEY = "xxxxxxxxxxxxxxxxxxxx";
    private static final String SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    private static final String PRIVATE_KEY_MATERIAL = "-----BEGIN RSA PRIVATE KEY-----\n" +
        "MIIEowIBAAKCAQEAjdD54kJ88GxkeRc96EQPL4h8c/7V2Q2QY5VUiJ+EblEdcVnADRa12qkohT4I\n" +
        // several more lines of key data
        "srz+xXTvbjIJ6RL/FDqF8lvWEvb8uSC7GeCMHTznkicwUs0WiFax2AcK3xjgtgQXMgoP\n" +
        "-----END RSA PRIVATE KEY-----\n";

    public static void main(String[] args) throws GeneralSecurityException, InterruptedException {
        Security.addProvider(new BouncyCastleProvider());
        String password = getPassword(ACCESS_KEY, SECRET_KEY, "i-XXXXXXXX", PRIVATE_KEY_MATERIAL);
        System.out.println(password);
    }

    private static String getPassword(String accessKey, String secretKey, String instanceId, String privateKeyMaterial) throws GeneralSecurityException, InterruptedException {

        // Convert the private key in PEM format to DER format, which JCE can understand
        privateKeyMaterial = privateKeyMaterial.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
        privateKeyMaterial = privateKeyMaterial.replace("-----END RSA PRIVATE KEY-----", "");
        byte[] der = Base64.decode(privateKeyMaterial);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(der);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

        // Get the encrypted password data from EC2
        AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        AmazonEC2Client client = new AmazonEC2Client(awsCredentials);
        GetPasswordDataRequest getPasswordDataRequest = new GetPasswordDataRequest().withInstanceId(instanceId);
        GetPasswordDataResult getPasswordDataResult = client.getPasswordData(getPasswordDataRequest);
        String passwordData = getPasswordDataResult.getPasswordData();
        while (passwordData == null || passwordData.isEmpty()) {
            System.out.println("No password data - probably not generated yet - waiting and retrying");
            Thread.sleep(10000);
            getPasswordDataResult = client.getPasswordData(getPasswordDataRequest);
            passwordData = getPasswordDataResult.getPasswordData();
        }

        // Decrypt the password
        Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] cipherText = Base64.decode(passwordData);
        byte[] plainText = cipher.doFinal(cipherText);
        String password = new String(plainText, Charset.forName("ASCII"));

        return password;
    }
}

ObDisclosure: я первоначально ответил на это в сообщении в блоге на http://www.frontiertown.co.uk/2012/03/java-administrator-password-windows-ec2-instance/

1 голос
/ 29 августа 2011

Похоже, вы ищете следующие части API: GetPasswordDataRequest и GetPasswordDataResult

1 голос
/ 05 апреля 2011

Вы можете создать экземпляр, установить пароль и затем превратить его в изображение.Эффективная установка пароля по умолчанию для каждого создаваемого вами экземпляра.Разве это не будет проще?

0 голосов
/ 28 октября 2013

Вы также можете создать образ с именем пользователя по умолчанию и настройкой пароля на этом образе. И затем запустить все экземпляры с этим идентификатором изображения ... так что вам не нужно создавать и восстанавливать пароль каждый раз, просто запустите свой экземпляр rdp который запустил экземпляр с определенными кредитами в образе. Я делаю то же самое. И это прекрасно работает для меня.

...