[Azure]Cosmos DBにIP制限をかける
Azure Cosmos DBにはセキュリティに関する機能が色々と存在しますが、今回はIP制限を試していきます。
こんにちは。
クラウドソリューショングループのimai.kです。
冒頭に記載させていただいた通り、
今回はAzureのCosmos DBに対するIPアクセス制限をかけていきます。
目次
- 今回の構成
- Cosmos DBアカウントを作成する
- 手元のPCからCosmos DBにアクセスする
- Cosmos DBアクセス用のVMを立てる
- Cosmos DBにIPアクセス制限を設定する
- VMからCosmos DBにアクセスする
- 最後に
今回の構成
簡易な構成ですが、「IP制限をかけていない場合」と「IP制限をかけた場合」の2つの状態を作ることで、IP制限を試していきます。
実際の構成は以下のようになります。
Cosmos DBアカウントを作成する
まずは、AzureコンソールからCosmos DBアカウントを作成していきます。
リージョンは東日本にしておきます。
Cosmos DBアカウント作成時のネットワーク設定において、「すべてのネットワーク」からアクセス可能にしておきます。
Cosmos DBアカウントが作成できたら、サンプルデータを作成しておきます。
手元のPCからCosmos DBにアクセスする
作成したCosmos DBはどこからでもアクセス可能な設定になっているため、まずは手元のPCからアクセスしてみます。
アクセスはCosmos DBのREST APIを使用して、curlでリクエストしてみます。
(所々マスクしています。)
curl -X POST -H "x-ms-date: Sun, 1 Aug 2021 00:00:00 GMT" -H "x-ms-version: 2018-12-31" -H "x-ms-documentdb-isquery: true" -H "Content-Type: application/query+json" -H "authorization: type%3Dmaster%26ver%3D1.0%26sig%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -d '{"query": "SELECT * FROM c where c.id = @id", "parameters": [{"name": "@id", "value": "1"}]}' "https://xxxxxxx.documents.azure.com/dbs/xxxxxx/colls/xxxxxx/docs" {"_rid":"noprAOFKlGw=","Documents":[{"id":"1","message":"hello","_rid":"noprAOFKlGwBAAAAAAAAAA==","_self":"dbs\/noprAA==\/colls\/noprAOFKlGw=\/docs\/noprAOFKlGwBAAAAAAAAAA==\/","_etag":"\"0000bf03-0000-2300-0000-611134100000\"","_attachments":"attachments\/","_ts":1628517392}],"_count":1}
上記リクエストではCosmos DBに対してクエリを投げています。
レスポンスとして先ほど作成したサンプルデータが返却されたため、アクセスできることが確認できました。
Cosmos DBアクセス用のVMを立てる
後続のステップでCosmos DBのIP制限を行うために、
Cosmos DBへのアクセスを許容するVMを立て、IPアドレスを付与しておきます。
VMのOSはなんでも大丈夫ですが、今回はCentOSの7.9で試しました。
VMができたらSSHして、先ほどと同様にCosmos DBにリクエストしてみます。
curl -X POST -H "x-ms-date: Sun, 1 Aug 2021 00:00:00 GMT" -H "x-ms-version: 2018-12-31" -H "x-ms-documentdb-isquery: true" -H "Content-Type: application/query+json" -H "authorization: type%3Dmaster%26ver%3D1.0%26sig%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -d '{"query": "SELECT * FROM c where c.id = @id", "parameters": [{"name": "@id", "value": "1"}]}' "https://xxxxxxx.documents.azure.com/dbs/xxxxxx/colls/xxxxxx/docs" {"_rid":"noprAOFKlGw=","Documents":[{"id":"1","message":"hello","_rid":"noprAOFKlGwBAAAAAAAAAA==","_self":"dbs\/noprAA==\/colls\/noprAOFKlGw=\/docs\/noprAOFKlGwBAAAAAAAAAA==\/","_etag":"\"0000bf03-0000-2300-0000-611134100000\"","_attachments":"attachments\/","_ts":1628517392}],"_count":1}
同じようにレスポンスが返れば問題ありません。
Cosmos DBにIPアクセス制限を設定する
Cosmos DBにIPアクセス制限を設定します。
Cosmos DBアカウントの「ファイアウォールと仮想ネットワーク」を開き、「選択したネットワーク」にチェックをつけます。
すると、アクセス許可のIPアドレス入力欄(赤枠部分)が表示されるので、先ほど作成したVMのIPアドレスを入力し保存します。
反映には5-10分ほどかかるようです。
IP制限が機能しているか試す
設定したアクセス制限が機能しているか試します。
まずはVMからAPIを叩くと、
curl -X POST -H "x-ms-date: Sun, 1 Aug 2021 00:00:00 GMT" -H "x-ms-version: 2018-12-31" -H "x-ms-documentdb-isquery: true" -H "Content-Type: application/query+json" -H "authorization: type%3Dmaster%26ver%3D1.0%26sig%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -d '{"query": "SELECT * FROM c where c.id = @id", "parameters": [{"name": "@id", "value": "1"}]}' "https://xxxxxxx.documents.azure.com/dbs/xxxxxx/colls/xxxxxx/docs" {"_rid":"noprAOFKlGw=","Documents":[{"id":"1","message":"hello","_rid":"noprAOFKlGwBAAAAAAAAAA==","_self":"dbs\/noprAA==\/colls\/noprAOFKlGw=\/docs\/noprAOFKlGwBAAAAAAAAAA==\/","_etag":"\"0000bf03-0000-2300-0000-611134100000\"","_attachments":"attachments\/","_ts":1628517392}],"_count":1}
先ほど同様問題なく成功しました。
次にPCから実行します。
curl -X POST -H "x-ms-date: Sun, 1 Aug 2021 00:00:00 GMT" -H "x-ms-version: 2018-12-31" -H "x-ms-documentdb-isquery: true" -H "Content-Type: application/query+json" -H "authorization: type%3Dmaster%26ver%3D1.0%26sig%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -d '{"query": "SELECT * FROM c where c.id = @id", "parameters": [{"name": "@id", "value": "1"}]}' "https://xxxxxxx.documents.azure.com/dbs/xxxxxx/colls/xxxxxx/docs" {"code":"Forbidden","message":"Request originated from client IP xxx.xxx.xxx.xxx through public internet. This is blocked by your Cosmos DB account firewall settings. More info: https://aka.ms/cosmosdb-tsg-forbidden\r\nActivityId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, Microsoft.Azure.Documents.Common/2.14.0"}
今度はリクエストが拒否されたため、IP制限が機能していることが確認できます。
最後に
以上のように、Cosmos DBに対するIPアクセス制限が実現できました。
簡単に制限をかけることができますが、反映にラグがあるため本番運用中のシステムなどはオペレーションに要注意ですね!