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 도메인에서 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으로 특정 유저 권한으로 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