[アップデート] VPC に関連付けられたプライベートホストゾーンを一覧表示できるようになりました

セキュリティの観点でも、めっちゃ重要なアップデートだった
2020.06.20

先日のアップデートで VPC に関連付けられたプライベートホストゾーンを一覧表示できるようになりました。

「・・・ふーん。」

という声が聴こえてきそうですが、めっちゃ重要なアップデートなんですよ!ということを紹介していきたいと思います。

何がうれしいのか

VPC を指定して関連付けられたプライベートホストゾーンを確認できる

従来、プライベートホストゾーンにどの VPC が関連付いているかを get-hosted-zone を使って確認することは出来ました。

$ aws route53 get-hosted-zone --id Z2X1XA0PM2BA6I
HostedZone:
  CallerReference: ou6c3vxfobzj7djogxwimxkt3vzsdsaz-joohqh01
  Config:
    Comment: Created by Route 53 Auto Naming
    PrivateZone: true
  Id: /hostedzone/Z2X1XA0PM2BA6I
  LinkedService:
    Description: arn:aws:servicediscovery:ap-northeast-1:XXXXXXXXXXXX:namespace/ns-5hjrx5hb6hwv7o2q
    ServicePrincipal: servicediscovery.amazonaws.com
  Name: local.
  ResourceRecordSetCount: 2
VPCs:
- VPCId: vpc-010be4739e500d319
  VPCRegion: ap-northeast-1

数が少なければ get-hosted-zone でも十分かもしれませんが、たくさんのプライベートホストゾーンを関連付けているときプライベートホストゾーンを起点に調べていくのは大変ですよね。

今回のアップデートで、プライベートホストゾーンの関連付けを VPC を起点に確認できるようになったのは 1 つ嬉しいポイントです。

が、本命はそこじゃない!

私もこのアップデートを見たとき「ふーん、まぁ get-hosted-zone で関連付いてる VPC は確認できるけど、VPC から引っ張れたら、それはそれで便利かもねー。」ぐらいに考えていました。

クロスアカウントのプライベートホストゾーンの関連付けを確認できる

For example, you can now easily identify all Private Hosted Zones associated with your VPC, even if those Private Hosted Zones were created by other AWS accounts.

(引用:Amazon Route 53 Launches New API Action to list Private Hosted Zones associated with your Amazon VPCs

このアップデートがどんな役に立つのかをいろいろ調べたところ、重要なのはココだということに辿りつきました。

みなさんご存知だったでしょうか。これまでクロスアカウントでプライベートホストゾーンの関連付けを行ったあと、関連付けを行ったアカウント側から、その関連付けを調べる術がほぼ無かったという事実を。

「え、嘘でしょ?」

と思いましたが get-hosted-zonelist-hosted-zoneslist-hosted-zones-by-name で確認できるのは、自アカウントがオーナーのホストゾーンのみです。もちろん AWS 管理コンソールでも確認できません。

以下のような構成のときに、アカウント A の VPC に関連付いているプライベートホストゾーンを確認できるのは、これまでアカウント B だけだったんです。

一度関連付けたプライベートを解除するには、ホストゾーン ID が必要になりますが、それを知る術がこれまでほぼ無かったということですね。「ほぼ」と表現しているのは、もし CloudTrail を取得しているならば、関連付け時の associate-vpc-with-hosted-zone のログにホストゾーン ID は記録されます。

ただ、何年もあとにその CloudTrail ログを探しだす自信ありますか?最終的に見つけられなくても、AWS サポートに問い合わせて何とかなるとは思いますが。。

さらに怖いのは、悪意のある従業員によってこっそりと意図しないプライベートホストゾーン ID が仕込まれてるときです。アカウント A からクロスアカウントのプライベートホストゾーンの関連付けが確認できないということは、associate-vpc-with-hosted-zone 時の CloudTrail を見逃した、または取得していなかった場合、アカウント A 側から悪意のあるプライベートホストゾーンを参照していることに気づく術がない、ということです。

いま、データを送ってる宛先は本当に正しいホストゾーンによって名前解決がされた相手でしょうか?

という不安を拭い去ってくれるのが、今回のアップデートですね!

いかがでしょう?めっちゃ重要なアップデートだということが伝わったでしょうか。

やってみる

では、さくっと確認していきましょう。

事前準備

上図のとおりアカウント A に関連付けを行う VPC と、アカウント B にクロスアカウントで関連付けたいプライベートホストゾーン exsample.com を作成しました。

クロスアカウントのホストゾーン関連付け

クロスアカウントでのホストゾーン関連付けは AWS コンソールでは行うことが出来ないので、AWS CLI を使用します。まず、アカウント B から アカウント A の VPC に対して、関連付けを承認する create-vpc-association-authorization を行います。

プライベートホストゾーン管理側

$ aws route53 create-vpc-association-authorization \
  --hosted-zone-id Z07647113DMUBACMFUTL 
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-010be4739e500d319
HostedZoneId: Z07647113DMUBACMFUTL
VPC:
  VPCId: vpc-010be4739e500d319
  VPCRegion: ap-northeast-1

つぎに、アカウト A からホストゾーンへの関連付け associate-vpc-with-hosted-zone を行います。

プライベートホストゾーン利用側

$ aws route53 associate-vpc-with-hosted-zone \
  --hosted-zone-id Z07647113DMUBACMFUTL \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-010be4739e500d319
ChangeInfo:
  Comment: ''
  Id: /change/C00153961G3XEO25VLGL8
  Status: PENDING
  SubmittedAt: '2020-06-19T20:50:11.236000+00:00'

これでクロスアカウントのプライベートホストゾーン関連付けは完了です。アカウント B 側では AWS コンソールからでもアカウト A の VPC vpc-010be4739e500d319 か関連付いていることは確認できます。

ちなみに関連付け時の CloudTrail は VPC の所属リージョンに関係なく、US East (N.Virginjia) us-east-1 の CloudTrail に出力されます。アカウント A の CloudTrail を確認すると、以下のように hostedZoneId が記録されています。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIXXXXXXXXXXXXXXXX:1234500000000000000",
        "arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/cm-marumo.atsushi/1234500000000000000",
        "accountId": "XXXXXXXXXXXX:assumed",
        "accessKeyId": "XXXXXXXXXXXXXXXXXXXX",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIXXXXXXXXXXXXXXXX",
                "arn": "arn:aws:iam::XXXXXXXXXXXX:role/cm-marumo.atsushi",
                "accountId": "XXXXXXXXXXXX",
                "userName": "cm-marumo.atsushi"
            },
            "webIdFederationData": {},
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2020-06-19T20:47:17Z"
            }
        }
    },
    "eventTime": "2020-06-19T20:50:11Z",
    "eventSource": "route53.amazonaws.com",
    "eventName": "AssociateVPCWithHostedZone",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "101.143.209.114",
    "userAgent": "aws-cli/2.0.11 Python/3.7.4 Darwin/19.5.0 botocore/2.0.0dev15",
    "requestParameters": {
        "hostedZoneId": "Z07647113DMUBACMFUTL",
        "vPC": {
            "vPCRegion": "ap-northeast-1",
            "vPCId": "vpc-010be4739e500d319"
        }
    },
    "responseElements": {
        "changeInfo": {
            "id": "/change/C00153961G3XEO25VLGL8",
            "status": "PENDING",
            "submittedAt": "Jun 19, 2020 8:50:11 PM",
            "comment": ""
        }
    },
    "requestID": "d4830005-6dcd-42cf-9478-d3b53f6f5e99",
    "eventID": "a4794681-dfc8-49e3-9b59-fd8ae1242cdd",
    "eventType": "AwsApiCall",
    "apiVersion": "2013-04-01",
    "recipientAccountId": "XXXXXXXXXXXX"
}

確認

それでは今回のアップデートで追加された list-hosted-zones-by-vpc コマンドを確認しましょう。

新しいコマンドですので AWS CLI は最新にアップデートしました。検証は以下の AWS CLI バージョンで行っています。

$ aws --version
aws-cli/2.0.24 Python/3.7.4 Darwin/19.5.0 botocore/2.0.0dev28

list-hosted-zones-by-vpc のオプションに対象の VPC ID および、リージョンを指定します。

$ aws route53 list-hosted-zones-by-vpc \
  --vpc-id vpc-010be4739e500d319 \
  --vpc-region ap-northeast-1
HostedZoneSummaries:
- HostedZoneId: Z07647113DMUBACMFUTL
  Name: exsample.com.
  Owner:
    OwningAccount: 'XXXXXXXXXXXX'
MaxItems: '100'

ホストゾーン ID と Name が確認できましたね。どのアカウントがプライベートホストゾーンのオーナーであるかも表示されており、以前よりも格段に確認しやすくなりましたね!

検証は以上です。

さいごに

今回のアップデートの初見は地味だなー、と思っていましたが「何のためにこの地味なアップデート出したんだろう…」と、いろいろ考えながら調べていくと、めちゃめちゃ重要やないかい!ということが判ったのでシェアしました。

意図しないクロスアカウント・プライベートホストゾーンの関連付けについて少し触れましたが、これはセキュリティの観点でも重大な穴になりかねないポイントなので、別記事として取り上げたいと思ってます。

まずは一度、list-hosted-zones-by-vpc をお試しください。知らないプライベートホストゾーンが設定されてはいませんか?

以上!大阪オフィスの丸毛(@marumo1981)でした!