opensearch IAM user 규칙 적용

jinwook han·2022년 7월 25일
0

opensearch는 http 프로토콜을 사용한다.
DELETE 요청을 하면 인덱스가 삭제될 수 있다.
opensearch http 접근 가능한 누구나 인덱스를 삭제할 수 있다.
누구나 인덱스를 삭제할 수 있도록 열려 있는게 아닌, 특정 user만 DELETE할 수 있는 닫혀있는 환경이 필요하다.

DELETE 프로토콜을 관리할 방법 중 IAM resource base policy가 있다.
https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html

opensearch resource base policy

opensearch 도메인에서 Security configuration을 수정한다.

수정 화면에서 Access policy라는 부분이 있다.
여기에서 json 코드로 권한 설정을 할 수 있다.

json은 다음과 같다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111111111:user/user_example"
        ]
      },
      "Action": "es:ESHttpGet",
      "Resource": "arn:aws:es:ap-northeast-2:11111111:domain/mynewdomain/*"
    }
  ]
}

user_example user와 opensearch-http-role role 에게 mynewdomain resource 대상으로 ESHttpPut action을 할 수 있는 권한을 부여한다.

python 코드로 특정 user 권한으로 esHttpGet 메서드 실행하기

python으로 특정 유저 권한으로 opensearch에 GET 요청을 보내는 코드를 만든다.
다음 aws 문서를 참고했다.
https://docs.aws.amazon.com/opensearch-service/latest/developerguide/request-signing.html

의존성 다운로드

pip3 install opensearch-py
pip3 install requests_aws4auth

코드

from opensearchpy import OpenSearch, RequestsHttpConnection, AWSV4SignerAuth
from requests_aws4auth import AWS4Auth
import boto3

host = 'search-mynewdomain-1111111.ap-northeast-2.es.amazonaws.com' # cluster endpoint, for example: my-test-domain.us-east-1.es.amazonaws.com
region = 'ap-northeast-2' # e.g. us-west-1

AWS_ACCESS_KEY= 'ABCDEFGHK'
AWS_SECRET_KEY= 'ABCDEFGHK/secret'

auth = AWS4Auth(AWS_ACCESS_KEY, AWS_SECRET_KEY, region, 'es')
index_name = 'my-index'

client = OpenSearch(
    hosts = [{'host': host, 'port': 443}],
    http_auth = auth,
    use_ssl = True,
    verify_certs = True,
    connection_class = RequestsHttpConnection
)

q = 'miller'
query = {
  'size': 5,
  'query': {
    'multi_match': {
      'query': q,
      'fields': ['title^2', 'director']
    }
  }
}

response = client.search(
    body = query,
    index = index_name
)

print('\nSearch results:')
print(response)

opensearch에서 권한을 부여받은 유저의 access key와 secret access key가 필요하다.
유저에서 access key와 secret access key를 생성하는 방법은 다음과 같다.
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey


위 파이썬 코드를 실행한다.

인증을 통과해서 결과를 받았다.


access key 정보 없이 curl로 opensearch에 요청하면 다음 응답을 받는다. 인증을 통과하지 못했다는 응답이다.

opensearch의 policy json에서 user_example에게만 GET 권한을 주었기에, user_example 유저 인증키가 없는 요청은 접근을 거부한다.

참고자료

iam user:
https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html

iam json policy:
https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json

iam pricipal in json policy:
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html

opensearch json policy 적용한 예시:
https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html

0개의 댓글