AWS Parameter Store i NET.Core
Często pisząc jakieś oprogramowanie musimy korzystać z loginów, haseł i innych sekretnych rzeczy. Takie dane nigdy nie powinny lądować w repozytorium. Amazon Web Services oferuje nam fajną usługę o nazwie AWS Parameter Store. Pozwala ona na przechowanie i szyfrowanie takich „tajnych” danych. Możemy przechowywać w nim ciągi znaków i je szyfrować. Jestem właśnie w środku projektu więc pokaże jak wykorzystać AWS Parameter Store i NET.Core. Bez zbędnej teorii. Krótko i na temat.
Przygotowania
1. Dodajemy paczkę Amazon.SimpleSystemsManagement.
2. Potrzebujemy klienta AmazonSimpleSystemsManagementClient. Tworzymy jego instancję, i uwierzytelniamy się. Na przykład tak:
private static AmazonSimpleSystemsManagementClient getClient() { var client = new AmazonSimpleSystemsManagementClient(".accessKeyId.", ".secretAccessKey.", Amazon.RegionEndpoint.EUCentral1); return client; }
3. Tworzymy request. Dla zapisu parametru na przykład tak:
private static PutParameterRequest putRequest(string parameterName, string parameterValue, bool withEncryption) { var request = new PutParameterRequest(); request.Name = parameterName; request.Value = parameterValue; request.Overwrite = true; request.Type = withEncryption ? ParameterType.SecureString : ParameterType.String; return request; }
a dla odczytu tak:
private static GetParameterRequest getRequest(string parameterName, bool withDecryption) { var request = new GetParameterRequest(); request.Name = parameterName; request.WithDecryption = withDecryption; return request; }
Działamy
Aby zapisać parametr wowołujemy
var response = await client.PutParameterAsync(request);
dla odczytu natomiast:
var result = await client.GetParameterAsync(request);
Ja w praktyce mam w projektach prywatną metodę do odczytu danych
private static async Task<string> getParameter(string parameterName, bool encrypted) { var client = getClient(); var result = await client.GetParameterAsync(getRequest(parameterName, encrypted)); return result.Parameter.Value.ToString(); }
i dodatkowe metody do pobierania konkretnych danych. Aby pobrać na przykład hasło do bazy danych przygotowuję coś takiego
public static async Task<string> GetDatabaseUser() { return await getParameter("DATABASE-PASSWORD", true); }
Kod przykładowej klasy pozwalającej na korzystanie z opisanych dorodziejstw możecie pobrać z GitHuba. Zapraszam do korzystania.
Konsola
Nasze hasła możemy także zapisać używając konsoli AWS. Wchodzimy do ulubionej przez wszystkich usługi EC2 i po lewej stronie mamy naszego bohatera.
Dla przykładu zapiszemy sobie jakąś wartość
Po zapisie wpis zostaje dodany do „sejfu” i widać go na liście
Żeby było jeszcze fajniej, AWS trzyma dla nasz wszystkie zmiany wartości danego parametrum. Widzimy historię wartości i kto lub co jest odpowiedzialne za zmiany.
I
Warto korzystać z oferowanej przez AWS usługi. Nie tylko dla sekretnych danych. Zamiast kodować na sztywno różne wartości, możemy je umieścić w Parameter Store. Łatwo można je edytować. Zarówno za pomocą konsoli, SDK jak i CLI. Polecam.