

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# で名前付きルールブロックを作成する AWS CloudFormation Guard
<a name="named-rule-block-composition"></a>

を使用して名前付きルールブロックを記述する場合 AWS CloudFormation Guard、次の 2 つの構成スタイルを使用できます。
+ 条件依存関係
+ 相関依存関係

これらの依存関係構成のいずれかのスタイルを使用すると、再利用性が向上し、名前付きルールブロックの冗長性と繰り返しが軽減されます。

**Topics**
+ [前提条件](#named-rules-prerequisites)
+ [条件依存関係の構成](#named-rules-conditional-dependency)
+ [相関依存関係の構成](#named-rules-correlational-dependency)

## 前提条件
<a name="named-rules-prerequisites"></a>

ルール[の記述で名前付きルール](writing-rules.md#named-rule-blocks)ブロックについて説明します。

## 条件依存関係の構成
<a name="named-rules-conditional-dependency"></a>

この構成スタイルでは、`when`ブロックまたは名前付きルールブロックの評価は、1 つ以上の他の名前付きルールブロックまたは句の評価結果に条件付き依存します。次の Guard ルールファイルの例には、条件依存関係を示す名前付きルールブロックが含まれています。

```
# Named-rule block, rule_name_A
rule rule_name_A {
    Guard_rule_1
    Guard_rule_2
    ...
}

# Example-1, Named-rule block, rule_name_B, takes a conditional dependency on rule_name_A
rule rule_name_B when rule_name_A {
    Guard_rule_3
    Guard_rule_4
    ...
}

# Example-2, when block takes a conditional dependency on rule_name_A
when rule_name_A {
    Guard_rule_3
    Guard_rule_4
    ...
}

# Example-3, Named-rule block, rule_name_C, takes a conditional dependency on rule_name_A ^ rule_name_B
rule rule_name_C when rule_name_A
                      rule_name_B {
    Guard_rule_3
    Guard_rule_4
    ...
}

# Example-4, Named-rule block, rule_name_D, takes a conditional dependency on (rule_name_A v clause_A) ^ clause_B ^ rule_name_B
rule rule_name_D when rule_name_A OR
                      clause_A
                      clause_B
                      rule_name_B {
    Guard_rule_3
    Guard_rule_4
    ...
}
```

前述のルールファイルの例では、 `Example-1`には次のような結果があります。
+ が に`rule_name_A`評価されると`PASS`、 によってカプセル化された Guard ルール`rule_name_B`が評価されます。
+ が に`rule_name_A`評価される場合`FAIL`、 によってカプセル化された Guard ルール`rule_name_B`は評価されません。 は に`rule_name_B`評価されます`SKIP`。
+ が に`rule_name_A`評価される場合`SKIP`、 によってカプセル化された Guard ルール`rule_name_B`は評価されません。 は に`rule_name_B`評価されます`SKIP`。
**注記**  
このケースは、 が と評価`FAIL`され、 が と`rule_name_A`評価されるルールに`rule_name_A`条件付きで依存している場合に発生します`SKIP`。

以下は、イングレスおよびエグレスセキュリティグループ情報の項目からの設定管理データベース (CMDB) 設定 AWS Config 項目の例です。この例では、条件依存関係の構成を示します。

```
rule check_resource_type_and_parameter {
    resourceType == /AWS::EC2::SecurityGroup/
    InputParameters.TcpBlockedPorts NOT EMPTY 
}

rule check_parameter_validity when check_resource_type_and_parameter {
    InputParameters.TcpBlockedPorts[*] {
        this in r[0,65535] 
    }
}

rule check_ip_procotol_and_port_range_validity when check_parameter_validity {
    let ports = InputParameters.TcpBlockedPorts[*]

    # 
    # select all ipPermission instances that can be reached by ANY IP address
    # IPv4 or IPv6 and not UDP
    #
    let configuration = configuration.ipPermissions[ 
        some ipv4Ranges[*].cidrIp == "0.0.0.0/0" or
        some ipv6Ranges[*].cidrIpv6 == "::/0"
        ipProtocol != 'udp' ] 
    when %configuration !empty {
        %configuration {
            ipProtocol != '-1'

            when fromPort exists 
                toPort exists {
                let ip_perm_block = this
                %ports {
                    this < %ip_perm_block.fromPort or
                    this > %ip_perm_block.toPort
                }
            }
        }
    }
}
```

前述の例では、 `check_parameter_validity`は条件付きで に依存し`check_resource_type_and_parameter`、 `check_ip_procotol_and_port_range_validity`は条件付きで に依存します`check_parameter_validity`。以下は、前述のルールに準拠した設定管理データベース (CMDB) 設定項目です。

```
---
version: '1.3'
resourceType: 'AWS::EC2::SecurityGroup'
resourceId: sg-12345678abcdefghi
configuration:
  description: Delete-me-after-testing
  groupName: good-sg-test-delete-me
  ipPermissions:
    - fromPort: 172
      ipProtocol: tcp
      ipv6Ranges: []
      prefixListIds: []
      toPort: 172
      userIdGroupPairs: []
      ipv4Ranges:
        - cidrIp: 0.0.0.0/0
      ipRanges:
        - 0.0.0.0/0
    - fromPort: 89
      ipProtocol: tcp
      ipv6Ranges:
        - cidrIpv6: '::/0'
      prefixListIds: []
      toPort: 89
      userIdGroupPairs: []
      ipv4Ranges:
        - cidrIp: 0.0.0.0/0
      ipRanges:
        - 0.0.0.0/0
  ipPermissionsEgress:
    - ipProtocol: '-1'
      ipv6Ranges: []
      prefixListIds: []
      userIdGroupPairs: []
      ipv4Ranges:
        - cidrIp: 0.0.0.0/0
      ipRanges:
        - 0.0.0.0/0
  tags:
    - key: Name
      value: good-sg-delete-me
  vpcId: vpc-0123abcd
InputParameters:
  TcpBlockedPorts:
    - 3389
    - 20
    - 110
    - 142
    - 1434
    - 5500
supplementaryConfiguration: {}
resourceTransitionStatus: None
```

## 相関依存関係の構成
<a name="named-rules-correlational-dependency"></a>

この構成スタイルでは、`when`ブロックまたは名前付きルールブロックの評価は、1 つ以上の他の Guard ルールの評価結果に相関依存します。相関依存関係は次のように達成できます。

```
# Named-rule block, rule_name_A, takes a correlational dependency on all of the Guard rules encapsulated by the named-rule block
rule rule_name_A {
    Guard_rule_1
    Guard_rule_2
    ...
}

# when block takes a correlational dependency on all of the Guard rules encapsulated by the when block
when condition {
    Guard_rule_1
    Guard_rule_2
    ...
}
```

相関依存関係の構成を理解するには、次の Guard ルールファイルの例を確認してください。

```
#
# Allowed valid protocols for AWS::ElasticLoadBalancingV2::Listener resources
#
let allowed_protocols = [ "HTTPS", "TLS" ]

let elbs = Resources.*[ Type == 'AWS::ElasticLoadBalancingV2::Listener' ]

#
# If there are AWS::ElasticLoadBalancingV2::Listener resources present, ensure that they have protocols specified from the 
# list of allowed protocols and that the Certificates property is not empty
#
rule ensure_all_elbs_are_secure when %elbs !empty {
    %elbs.Properties {
        Protocol in %allowed_protocols
        Certificates !empty
    }
}

# 
# In addition to secure settings, ensure that AWS::ElasticLoadBalancingV2::Listener resources are private
#
rule ensure_elbs_are_internal_and_secure when %elbs !empty {
    ensure_all_elbs_are_secure
    %elbs.Properties.Scheme == 'internal'
}
```

前述のルールファイルでは、 `ensure_elbs_are_internal_and_secure`には との相関依存関係があります`ensure_all_elbs_are_secure`。以下は、前述のルールに準拠する CloudFormation テンプレートの例です。

```
Resources:
  ServiceLBPublicListener46709EAA:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Scheme: internal
      Protocol: HTTPS
      Certificates:
        - CertificateArn: 'arn:aws:acm...'
  ServiceLBPublicListener4670GGG:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Scheme: internal
      Protocol: HTTPS
      Certificates:
        - CertificateArn: 'arn:aws:acm...'
```