こんにちは。
シンプラインのmiddleです。

前回に続きまして、また壁の話をお送りします。
どうぞよろしくお願いいたします。

 

★今回のお題

セキュリティグループの開けてはいけないポートを開けてしまった時、検知したい

その1 背景〜使用するサービス選択
その2 AWS Configとは
その3 カスタムルール作成①
その4 カスタムルール作成② ←本日はこちら
その5 AWS Config設定〜まとめ

 

★ルールについて

前々回の「ルールの流れ」を思い出してみます。
「開けていいポート」以外が開いていたらNG、というルールを作りたいのでした。

〜おさらい〜

★ルールの流れ


開けていいポート定義


削除済みリソース
→ルール適用の対象外にする


セキュリティグループ以外のリソース
→ルール適用の対象外にする


開いているポート範囲が「すべて」だった場合
非準拠 ※要検討


開いているポートが、開けていいポート(①で定義したポート)に該当しなかった場合
非準拠


それ以外
準拠

上記①〜⑥の各項目について見ていきたいと思います。

①開けていいポート定義

★44行目

                rp = rule_parameters['okPort'].split(',')

rp」という名前で定義しました。
開けていいポート自体はコンソールから設定するのですが、その設定は60行目で読み込みます。

★60行目

    rule_parameters = json.loads(event['ruleParameters'])

実際の設定画面については後述します。

②削除済みリソース→ルール対象外

★20〜23行目

    # Check if resource was deleted
    if configuration_item['configurationItemStatus'] == "ResourceDeleted":
        compliance_type = 'NOT_APPLICABLE'
        annotation = "This resource was deleted.

③セキュリティグループ以外のリソース→ルール対象外

★25〜28行目

    # Check the resource for applicability
    elif configuration_item["resourceType"] not in APPLICABLE_RESOURCES:
        compliance_type = 'NOT_APPLICABLE'
        annotation = "The rule apply to only resources of type SecurityGroup."

applicable resourcesが何なのかは、16行目で↓のように定義しているので、これ以外だったらルール対象外(NOT_APPLICABLE)にするというわけです。

★16行目

APPLICABLE_RESOURCES = ["AWS::EC2::SecurityGroup"]

④開いているポート範囲が「すべて」だった場合→非準拠

★31〜35行目

        # Check IP violation
        for ipsg in configuration_item['configuration']['ipPermissions']:
            if 'fromPort' not in ipsg:
                compliance_type = 'NON_COMPLIANT'
                annotation = 'Exposed ports range is ALL.'

開いているポート範囲が「すべて」の場合、「fromPort」が存在しません。
なので開いているポート範囲が「すべて」のセキュリティグループについては、この④部分を定義しておかないと、評価対象外となってしまうのです。
(該当セキュリティグループがコンソールに表示されません)

中にはすべてのポート範囲を開けておくような例外セキュリティグループもあると思うので、ここで「すべて開いているのは非準拠」と言ってしまっていいものか悩みどころです。
このへんを考慮すると、参考にしたルールが何故「開けてはいけないポートが開いてたらNG」だったのかも見えてくるような……。

⑤開いているポートが、開けていいポートになかった場合→非準拠

★39〜44行目

                fp = ipsg['fromPort']
                rp = []
                rp = rule_parameters['okPort'].split(',')
                if str(fp) not in rp:
                    compliance_type = 'NON_COMPLIANT'
                    annotation = 'A forbidden port is exposed.'

⑥それ以外→準拠

★48〜49行目

                    compliance_type = 'COMPLIANT'
                    annotation = 'Security group is compliant.'

 

★コンソール

さて、文字続きで失礼いたしました、コンソールからのConfigの画面を見てみましょう。
まずはダッシュボードです。

▲右上のコンプライアンス状態部分がイタリアの国旗にしか見えません……。

続きまして、各ルールの設定画面です。

▲トリガー(いつルールを動かすか)や、ルールのパラメータを指定出来ます。

「開けていいポート」はこちらで指定します。
「ルールのパラメータ」というところで、キーと値を入れることが出来ます。
今回書いたルールはレンジでの指定には対応させていないので、各ポート一つ一つを記載する仕様です。

お次は詳細画面です。

▲リソースが無事評価されています!

各リソースがこのルールについて「準拠」なのか「非準拠」なのか、一覧表示されます。
この時は開けていいポートを「22番と80番」にして検証していたわけですが、それ以外にもっといろんなポートが開いているということが、簡単にわかります。
これはとても楽しいです!

ということでまだまだ考慮すべき点は多いのですが、一旦カスタムルールは完成です。
大げさではありますが、感動的な気持ちになりました。

今回はここまでです。
もう少し続きます。
よろしくお願いいたします。

TOP