はじめに
今回は、AWS CloudFormationを使用して、特定のIPアドレスからAWSリソースに対するSSH接続を安全に設定する方法について、ネットワークアクセスコントロールリスト(Network ACL、NACL)を設定し、特定のIPアドレスからのSSH接続のみを許可する方法を解説します。
CloudFormationテンプレートの概要
以下のCloudFormationテンプレートは、特定のVPC内でネットワークACLを作成し、特定のIPアドレスからのSSH接続を許可する設定を行います。
Resources:
MyNetworkAcl:
Type: AWS::EC2::NetworkAcl
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: MyNetworkAcl
MyNetworkAclリソース↑
Type: このリソースはAWS::EC2::NetworkAclタイプで、VPC内に新しいネットワークACLを作成します。
(Properties):
VpcId: このネットワークACLが関連付けられるVPCのIDです。!Ref MyVPCは、このテンプレート内の他の部分で定義されたVPCリソースを参照します。
Tags: リソースにメタデータ(タグ)を付加します。ここでは、ネットワークACLにNameタグを追加し、その値をMyNetworkAclとしています。
InboundSshRule:
Type: AWS::EC2::NetworkAclEntry
Properties:
NetworkAclId: !Ref MyNetworkAcl
RuleNumber: 100
Protocol: 6 # TCPプロトコル
RuleAction: allow
Egress: false
CidrBlock: 172.28.10.1/32
PortRange:
From: 22
To: 22
InboundSshRuleリソース↑
Type: AWS::EC2::NetworkAclEntryタイプは、ネットワークACLにルールを追加します。
(Properties):
NetworkAclId: このエントリが適用されるネットワークACLのID。
RuleNumber: ルールの優先順位を示す数値。低い数値ほど優先度が高いです。
Protocol: 通信プロトコルを示す数値。6はTCPプロトコルを意味します。
RuleAction: ルールのアクション(allowまたはdeny)。ここでは、許可する設定になっています。
Egress: このルールが出口(送信)トラフィックに適用されるかどうか。falseは入口(受信)トラフィックに適用されることを意味します。
CidrBlock: このルールが適用されるIPアドレス範囲。172.28.10.1/32は単一のIPアドレスを指定します。
PortRange: このルールが適用されるポート範囲。SSHのデフォルトポートである22を指定しています。
OutboundResponseRule:
Type: AWS::EC2::NetworkAclEntry
Properties:
NetworkAclId: !Ref MyNetworkAcl
RuleNumber: 100
Protocol: 6 # TCPプロトコル
RuleAction: allow
Egress: true
CidrBlock: 0.0.0.0/0 # すべての宛先を許可
PortRange:
From: 1024
To: 65535 # 一般的に応答パケットは1024以上のポートを使用
OutboundResponseRuleリソース↑
このリソースは、ネットワークからのアウトバウンド(送信)トラフィックに適用されるルールを定義します。SSH接続の応答として送り返されるデータパケットを許可するために使用されます。
Egress: trueに設定されており、このルールがアウトバウンドトラフィックに適用されることを意味します。
CidrBlock: 0.0.0.0/0は全ての宛先IPアドレスを指します。これにより、SSH接続応答を任意の宛先へ送信できるようになります。
PortRange: From: 1024とTo: 65535で、応答トラフィックが使用するポート範囲を指定しています。この範囲は、多くのシステムで動的に割り当てられるポート範囲に対応しています。
まとめ
このCloudFormationテンプレートは、特定のIPアドレスからのSSH接続を許可しながら、不要なトラフィックはブロックするためのネットワークACLを設定します。ネットワークACLはステートレスであるため、インバウンドとアウトバウンドの両方でルールを定義する必要があります。このように設定することで、セキュリティを強化しつつ、必要な通信だけを許可する効果的なネットワーク環境を構築できます。