Niedawno zacząłem korzystać z nowej usługi Amazon Elasticsearch i nie potrafię określić, jakiej polityki dostępu potrzebuję, aby mieć dostęp tylko do usług z moich instancji EC2, które mają przypisaną określoną rolę IAM.
Oto przykład polityki dostępu, którą obecnie przypisałem dla domeny ES:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::[ACCOUNT_ID]:role/my_es_role",
]
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*"
}
]
}
Ale jak powiedziałem, to nie działa. Loguję się do instancji EC2 (która ma my_es_role
przypisaną rolę) i próbuję uruchomić proste wywołanie curl w punkcie końcowym „https: //*.es.amazonaws.com”, pojawia się następujący błąd:
{"Message": "Użytkownik: anonymous nie ma uprawnień do wykonywania: es: ESHttpGet on resource: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /"}
Czy ktoś wie, co muszę zmienić w polityce dostępu, żeby to zadziałało?
Odpowiedzi:
Możesz zablokować dostęp tylko do IAM, ale jak będziesz wyświetlać Kibana w swojej przeglądarce? Możesz skonfigurować serwer proxy ( zobacz moduł Gist i / lub NPM ) lub włączyć dostęp oparty na IAM i IP w celu przeglądania wyników.
Udało mi się uzyskać dostęp do IAM z ograniczonym dostępem IP z następującą polityką dostępu. Zwróć uwagę, że kolejność jest ważna: nie mogłem sprawić, by działała z instrukcją opartą na adresie IP przed instrukcją IAM.
Moja instancja EC2 ma profil instancji z
arn:aws:iam::aws:policy/AmazonESFullAccess
polityką. Logstash powinien podpisywać żądania przy użyciu wtyczki wyjściowej logstash-output-amazon-es . Logstash działający na mojej instancji EC2 zawiera następującą sekcję wyjściową:Mam dostęp do Kibany z dwóch adresów IP w polityce dostępu (192.168.1.0 i 192.168.1.1).
źródło
aws:SourceIp
moim przykładzie są to adresy IP Twojej osobistej stacji roboczej, więc możesz używać Kibany. Dostęp z ograniczeniami IAM umożliwia jednemu lub kilku wystąpieniom EC2 zapis do Elasticsearch bez martwienia się o to, które adresy IP należą do konkretnej instancji lub bloku CIDR.aws:SourceIp
z wartości skalarnej na tablicę, jak w podanym przykładzie. (Jestem notacją CIDR, jeśli to pomoże komukolwiek innemu.) Cały proces ustawiania zasad dla AWS ES byłby mniej frustrujący, gdyby każda pojedyncza zmiana polityki nie wprowadzała klastra w tajemniczy stan „przetwarzania” na 20 minut, ponieważ polityka jest starannie wypisana na kamiennych tablicach, czy cokolwiek robią.Zgodnie z dokumentacją AWS i jak właśnie testowaliśmy (i ja), nie możesz ograniczyć dostępu do domeny AWS ES do roli / konta / użytkownika / ... i po prostu zakreślić ją!
Masz więc zasadniczo dwa rozwiązania:
Podpisanie żądania jest prawdopodobnie najlepszym rozwiązaniem, jeśli chcesz zachować swoją politykę dostępu w obecnym kształcie (która jest bardziej elastyczna niż ograniczenie do adresu IP), ale wydaje się być nieco bardziej złożona. Nie próbowałem dotąd i nie mogę znaleźć żadnego doktora, który mógłby pomóc.
źródło
Trochę spóźniłem się na przyjęcie, ale udało mi się poradzić sobie z tym samym problemem, dodając podpis do moich wniosków.
Jeśli używasz Pythona (tak jak ja), możesz użyć następującej biblioteki, aby ułatwić jej wdrożenie: https://github.com/DavidMuller/aws-requests-auth
U mnie zadziałało idealnie.
źródło
Wystarczy podać pełną nazwę użytkownika w zasadach elastycznego wyszukiwania.
W takim przypadku pełną nazwę użytkownika można uzyskać na podstawie samego komunikatu o błędzie. W moim przypadku: „arn: aws: sts :: [ACCOUNT_ID]: przejęta-rola / [LAMBDA_POLICY_NAME] / [LAMBDA_NAME]”
źródło
Możesz użyć polityki opartej na zasobach lub polityki opartej na tożsamości zamiast polityki opartej na IP, która jest jak sztywne kodowanie adresu IP.
Ale do podpisania wniosku musisz użyć wersji Signature 4
W przypadku implementacji języka Java odwiedź http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html
źródło
Rola ARN musi zostać zmieniona. będzie wyglądać następująco: „arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role”
źródło
Próbuję to również zrobić, ale działało, używając
Allow access to the domain from specific IP(s)
opcji z elastycznym adresem IP mojej instancji EC2 (może również działać przy użyciu prywatnego adresu IP instancji, ale nie jestem zbyt pewien)źródło