Elasticsearch ServiceへのアクセスをIPで制限する

記事タイトルとURLをコピーする

みなさんこんにちは

今年の3月からIoT担当となった中村です。
自宅のスマートホーム化を進めたりブリを開発したり業務中にTwitterを6時間してたら、突然の異動宣告を受けました。
見られていないと思って好き勝手にやっていたら、意外と見られていたようです。

本題

さて、今日はElasticsearch Service(以下ES)にIP制限をかけるお話です。
ESのEndpointはアクセス制限をIAM Policyで定義することが可能です。

ESの画面ではテンプレートが幾つか用意されていて、AWSアカウントによる制限、IPアドレスによる制限などがあります。

es

今回の記事では、ESへのアクセスをIPアドレスで制限する方法について説明します。
いきなりですが、Policyはこのような感じになります。

 

{ 
    "Version": "2012-10-17",
     "Statement": [  {   
        "Sid": "1",
           "Effect": "Allow",
           "Principal": {    
            "AWS": "*"   
        },
           "Action": "es:*",
           "Resource": "arn:aws:es:ap-northeast-1:xxxxxxxxxxxx:domain/fish/buri/recipe/*",
           "Condition": {    
            "IpAddress": {     
                "aws:SourceIp": [
                  "xxx.xxx.xx.xx",
                  "yyy.yy.yy.yyy",
                  "zz.zzz.zz.zz"
                ]    
            }   
        }  
    } ]
}

 

 

このPolicyでは、「xxx.xxx.xx.xx」「yyy.yy.yy.yyy」、「zz.zzz.zz.zz」のIPアドレスから、fish Domainのburi Indexのrecipe Fieldにアクセスすることができるようになっています。
Indexをburiで指定しているため、もしfish Domainがburi Index以外のIndexを持っていたとしてもこのPolicyではアクセスすることはできないようになっています。
逆に、Resourceを「"arn:aws:es:ap-northeast-1:xxxxxxxxxxxx:domain/fish/*"」のようにすれば、fish Domainが持っている全てのIndexにアクセスすることができます。簡単ですね。

番外編: LambdaからESのEndpointを叩きたい…!

番外編として、もう一つこんなケースを用意してみました。

LambdaからESにクエリを投げたいけど、LambdaのIPアドレスが不定だからIP制限ができない…。
こんな時は、最近リリースされたVPCリソースにアクセス可能なLambdaと、NAT Gatewayを使うのも手です。

VPCリソースにアクセス可能なLambdaとは、Lambda用のENIをVPC内に設置することで、LambdaからVPC内のリソースにアクセスできるようになった少し格好いいLambdaです。
Lambdaの設定項目から、配置するVPC、Subnet、ENIに付与するSecurityGroupを選択することで簡単に利用可能です。

NAT Gatewayとは、その名の通りAWSによるマネージドNATサービスです。NAT GatewayのGlobalIPには、EIPを設定します。

この2つを組み合わせると、Lambdaがインターネットに出て行く時NAT Gatewayを経由して出て行く事になり、結果的にLambdaのIPアドレスをNAT GatewayのIPアドレスに固定することができます。この環境を簡単に図にしてみました。

Lambda


これにより、ESのPolicyにNAT GatewayのIPアドレスを記載しておけば、Lambdaからアクセスできるようになるわけですね。
NATはEC2インスタンスで代用することも可能ですが、Lambda、ESとNoEC2構成できているので、NATもNAT Gatewayを使ってクールにいきましょう!