Sie versuchen zu entschlüsseln Geheimtext in eine Lambda-Funktion, die mithilfe von KMS-Ergebnisse im timeout
Beim entschlüsseln ciphertext von der Befehlszeile aus mithilfe der AWS CLI, der verschlüsselte Text wird entschlüsselt ohne Probleme:
$ aws kms decrypt --ciphertext-blob fileb://encrypted-secrets --output text --query Plaintext --region us-east-1 | base64 --decode > decryped-secrets
Diese Entschlüsselung funktioniert auch lokal, wenn Sie versuchen zu tun, damit aus einem js-script:
#!/usr/local/bin/node
const fs = require('fs');
const AWS = require('aws-sdk');
const kms = new AWS.KMS({region:'us-east-1'});
const secretPath = './encrypted-secrets';
const encryptedSecret = fs.readFileSync(secretPath);
const params = {
CiphertextBlob: encryptedSecret
};
kms.decrypt(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
const decryptedScret = data['Plaintext'].toString();
console.log('decrypted secret', decryptedScret);
}
});
Jedoch, wenn Sie versuchen zu tun, also mit fast der exakt gleiche code wie oben im Kontext einer AWS Lambda-Funktion, der Aufruf der Funktion führt zu einem timeout:
'use strict';
const zlib = require('zlib');
const mysql = require('mysql');
const fs = require('fs');
const AWS = require('aws-sdk');
const kms = new AWS.KMS({region:'us-east-1'});
const secretPath = './encrypted-secrets';
const encryptedSecret = fs.readFileSync(secretPath);
const params = {
CiphertextBlob: encryptedSecret
};
exports.handler = (event, context, callback) => {
kms.decrypt(params, (err, data) => {
if (err) {
console.log(err, err.stack);
return callback(err);
} else {
const decryptedScret = data['Plaintext'].toString();
console.log('decrypted secret', decryptedScret);
return callback(null, `Successfully processed ${parsed.logEvents.length} log events.`);
}
});
};
timeout log:
START RequestId: start-request-id-redacted Version: $LATEST
END RequestId: end-request-id-redacted
REPORT RequestId: report-requested-id-redacted Duration: 10002.43 ms Billed Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 18 MB
2016-11-13T19:22:28.774Z task-id-redacted Task timed out after 10.00 seconds
Hinweise:
- Wenn ich kommentiere den Aufruf
kms.decrypt
und versuchenconsole.log
dieparams
oder nichts wirklich, die Werte werden ausgegeben, ohne Probleme. Es scheint eine Art von Problem mit derkms.decrypt
nennen, und keine tatsächlichen Fehler, über die Zeitüberschreitung zurückgegeben. - Der Politik angebracht, um die Rolle zu, unter dem die lambda-Funktion aufgerufen wird, enthält die beigefügte Richtlinie
AWSLambdaVPCAccessExecutionRole
, und auch die folgenden beigefügten inline-policy:
policygen-lambda_basic_execution_and_kms_decrypt-201611131221
:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "sid-redacted",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:us-east-1:account-redacted:key/key-id-redacted"
]
}
]
}
- Habe ich unkenntlich gemacht, alle persönlichen Informationen aus dem code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem einige Gründliche Gespräche mit dem AWS support-Leute, die waren sehr hilfreich, wir haben eine Antwort:
Der primäre Grund, warum es ein timeout war aufgrund fehlender Konnektivität innerhalb der Lambda-Funktion, die der KMS-Dienst, aufgrund der KMS-Dienst nicht mit einem Endpunkt in der VPC, wo die Lambda-Funktion konfiguriert wurde.
Damit eine Lambda-Funktion in einer VPC zu verbinden alle - service als Amazon S3, die hat haben einen Endpunkt in der VPC, die Lambda-Funktion befindet sich in/im Zusammenhang mit mindestens einer, vorzugsweise aber zwei private Subnetze, die mit Ihren routing-Tabellen, einschließlich einer Ziel-route 0.0.0.0/16 zu einem NAT-Gateway.
Ist es nicht möglich, die Lambda-Funktion werden in einem öffentlichen Subnetz mit einem Internet-Gateway.
Schritte, um eine VPC-gebunden Lambda-Funktion Zugriff auf KMS und alle anderen Dienstleistungen, die nicht über VPC Endpunkte:
Wenn Sie Folgen Sie diesen zwei Schritten sollten Sie in der Lage sein, um berufen
kms.encrypt
und sonstige Anfragen von innerhalb der Lambda-Funktion, die verlangen, dass ausgehende/abgehende internet-verbindungen, durch diese Dienste nicht mit Endpunkten in Ihrer VPC.EC2-Instanzen, die kommen mit Ihren eigenen öffentlichen IP standardmäßig, so dass Sie keine Probleme haben, Zugriff auf alle Dienste erfordern den Zugang zum internet (z.B. KMS).
Lambda-Funktionen, die an Ihre VPC nicht über eine öffentliche IP, so dass Zugriff auf einen service über das internet (z.B. KMS) - du brauchst eine NAT einrichten, nur wie beschrieben durch zealoushacker.
Hinzufügen zealoushacker ausgezeichnete Antwort, Sie sollten auch überprüfen, dass Ihre lambda - ' security group Einstellungen eine ausgehende Regel, dass Punkte auf 0.0.0.0 und einem beliebigen port.
In unserem Fall hatten wir bereits im private Subnetze, hatte aber eingeschränkt Sicherheitsgruppen für unsere RDS-Datenbank.