

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# CloudFormation 수집 스택: CFN 검사기 예제
<a name="ex-cfn-ingest-validator"></a>

이 예제는 성공적인 수집을 위해 템플릿을 준비하는 데 도움이 될 수 있습니다.

## 형식 검증
<a name="cfn-validator-templates"></a>

템플릿에 "리소스" 섹션이 포함되어 있고 템플릿 아래에 정의된 모든 리소스에 "유형" 값이 있는지 확인합니다.

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description" : "Create a SNS topic",
  "Resources": {
    "SnsTopic": {
      "Type": "AWS::SNS::Topic"
    }
  }
}
```

템플릿의 루트 키가 허용되는지 확인합니다. 허용되는 루트 키는 다음과 같습니다.

```
[
  "AWSTemplateFormatVersion",  
  "Description",  
  "Mappings",  
  "Parameters",  
  "Conditions",  
  "Resources",  
  "Rules",  
  "Outputs",  
  "Metadata"
]
```

## 수동 검토 필수 검증
<a name="cfn-validator-ex-man"></a>

템플릿에 다음 리소스가 포함된 경우 자동 검증이 실패하고 수동 검토가 필요합니다.

표시된 정책은 보안 관점에서 고위험 영역입니다. 예를 들어 특정 사용자 또는 그룹을 제외한 모든 사용자가 객체를 생성하거나 권한을 쓸 수 있도록 허용하는 S3 버킷 정책은 매우 위험합니다. 따라서 정책을 검증하고 내용을 기반으로 승인 또는 거부하며 이러한 정책은 자동으로 생성할 수 없습니다. 이 문제를 해결하기 위해 가능한 접근 방식을 조사하고 있습니다.

현재 다음 리소스에 대한 자동 검증은 없습니다.

```
[
    "S3::BucketPolicy",
    "SNS::TopicPolicy",
    "SQS::QueuePolicy"
]
```

## 파라미터 확인
<a name="cfn-validator-examples-param"></a>

템플릿 파라미터에 값이 제공되지 않은 경우 기본값이 있어야 합니다.

## 리소스 속성 검증
<a name="cfn-validator-examples-resource-atts"></a>

필수 속성 검사: 특정 리소스 유형에 대해 특정 속성이 있어야 합니다.
+ 에 "VPCOptions"가 있어야 합니다. `AWS::OpenSearch::Domain` 
+ "CludsterSubnetGroupName"이에 있어야 합니다. `AWS::Redshift::Cluster` 

```
{
    "AWS::OpenSearch::Domain": [
      "VPCOptions"
    ],
    "AWS::Redshift::Cluster": [
      "ClusterSubnetGroupName"
    ]
}
```

허용되지 않는 속성 검사: 특정 리소스 유형에는 특정 속성이 \$1not\$1 존재해야 합니다.
+ "AWS::SecretsManager::Secret"에 "SecretString"이 없어야 합니다.AWS::SecretsManager::Secret
+ “AWS::DMS::EndpointMongoDbSettings”가 없어야 합니다.

```
{
  "AWS::SecretsManager::Secret": [
    "SecretString"  
  ],  
  "AWS::DMS::Endpoint": [
    "MongoDbSettings"  
  ]
}
```

SSM 파라미터 검사: 다음 목록의 속성의 경우 Secrets Manager 또는 Systems Manager Parameter Store(Secure String Parameter)를 통해 값을 지정해야 합니다.

```
{
  "RDS::DBInstance": [
    "MasterUserPassword",   
    "TdeCredentialPassword"  
  ],  
  "RDS::DBCluster": [
    "MasterUserPassword"  
  ],  
  "ElastiCache::ReplicationGroup": [
    "AuthToken"  
  ],  
  "DMS::Certificate": [
    "CertificatePem",    
    "CertificateWallet" 
  ],  
  "DMS::Endpoint": [
    "Password"  
  ],
  "CodePipeline::Webhook": {
    "AuthenticationConfiguration": [
        "SecretToken"  
    ]
  },
  "DocDB::DBCluster": [
    "MasterUserPassword"
  ]
},
```

일부 속성은 특정 패턴을 준수해야 합니다. 예를 들어 IAM 인스턴스 프로파일 이름은 [AMS 예약 접두사](https://docs.aws.amazon.com/managedservices/latest/userguide/ams-reserved-prefixes)로 시작해서는 안 되며 속성 값은 다음과 같이 특정 정규식과 일치해야 합니다.

```
{
    "AWS::EC2::Instance": {
      "IamInstanceProfile": [
        "^(?!arn:aws:iam|ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+",
        "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ]
    },
    "AWS::AutoScaling::LaunchConfiguration": {
      "IamInstanceProfile": [
        "^(?!arn:aws:iam|ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+",
        "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ]
    },
    "AWS::EC2::LaunchTemplate": {
      "LaunchTemplateData.IamInstanceProfile.Name": [
        "^(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ],
      "LaunchTemplateData.IamInstanceProfile.Arn": [
        "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile\/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+"
      ]
    }
}
```

## 리소스 검증
<a name="cfn-validator-examples-resources"></a>

템플릿에는 허용 목록에 있는 리소스만 지정할 수 있습니다. 이러한 리소스는에 설명되어 있습니다[지원되는 리소스](cfn-ingest-supp-services.md).

패치 적용 제한으로 인해 동일한 스택에서 EC2 스택과 Auto Scaling 그룹(ASGs)이 허용되지 않습니다.

## 보안 그룹 수신 규칙 검증
<a name="cfn-validator-examples-sg-ingress"></a>
+ CFN Ingest Create 또는 Stack Update CT 변경 유형에서 오는 요청의 경우:
  + (`IpProtocol`는 tcp 또는 6) AND (포트는 80 또는 443) 인 경우 `CidrIP` 값에 대한 제한이 없습니다.
  + 그렇지 않으면는 0.0.0.0/0이 될 수 `CidrIP` 없습니다.
+ Service Catalog(Service Catalog 제품)에서 오는 요청의 경우:
  + CFN Ingest Create 또는 Stack Update CT 변경 유형 검증 외에도의 프로토콜이 `management_ports` 있는의 포트는 `allowed_cidrs`를 통해서만 액세스할 `ip_protocols` 수 있습니다.

    ```
    {
          "ip_protocols": ["tcp", "6", "udp", "17"],
          "management_ports": [22, 23, 389, 636, 1494, 1604, 2222, 3389, 5900, 5901, 5985, 5986],
          "allowed_cidrs": ["10.0.0.0/8", "100.64.0.0/10", "172.16.0.0/12", "192.168.0.0/16"]
      }
    ```