CloudFormationによる【セキュリティグル ープ】の構築


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

皆様こんにちは。
今回はCloudFormationを利用して高可用性アーキテクトの構築をしていきます。
この記事ではセキュリティグループの作成を行います。

1.高可用性アーキテクト構築目次

目次はこちら

2.セキュリティグループについて

セキュリティグループは仮想ファイアウォールとして機能し、関連付けられたリソースに到達および離れるトラフィックを制御します。例えば、セキュリティグループを EC2 インスタンスに関連付けると、インスタンスのインバウンドトラフィックとアウトバウンドトラフィックが制御されます。
参照:セキュリティグループを使用してリソースへのトラフィックを制御

  • アウトバウンド
    EC2インスタンスから出る通信を制御する
  • インバウンド
    EC2インスタンスへの通信を制御する

類似サービス

  • ネットワークACL
    サブネット単位で設定するファイアウォール機能

セキュリティグループとネットワークACLの主な違い

セキュリティグループ ネットワークACL(デフォルト)
適用範囲 インスタンス単位 サブネット単位
デフォルト動作 インバウンド:全て拒否
アウトバウンド:全て許可
インバウンド:全て許可
アウトバウンド:全て許可
ルールの評価 全てのルールが適用される ルールの番号順で適用される
ステータス ステートフル ステートレス

3.構築したいセキュリティグル ープ構成図

file

  1. ALB用はRoute53のパブリックホストゾーンからのトラフィックを受け入れる必要があります。ソースは0.0.0.0/0にします。通信は暗号化されている必要があるのでタイプはHTTPSにします。パブリックホストゾーンには、トラフィックをインターネットでどのようにルーティングするか指定するレコードが含みます。
  2. EC2用はALBからのトラフィックを受け入れる必要があります。ソースは、ALB用のSGを指定します。VPC内部の通信は暗号化されている必要がないのでタイプはHTTPにします。また指定のPCよりEC2インスタンスと通信するために、SSHでソースはMyIPを指定します。
  3. RDS用はEC2に対するDBサーバーとして扱います。EC2からのトラフィックを受け入れる必要がありますので、ソースはEC2用のSGを指定します。タイプはDBにMySQLを使用するのでMySQL/Auroraを選びます。
  4. EFS用はEC2のWordpressインストールファイルを共有するために使用するので、EC2からのトラフィックを受け入れる必要があります。ソースは、EC2用のSGを指定してタイプNFSを選びます。NFSとは、主にUNIX系OSで利用される分散ファイルシステム。および、そのための通信規約(プロトコル)

4.全体構築ソースコード

Resources:
  hebiishiSGEC2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGEC2
      GroupDescription: hebiishiSGEC2
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 27.143.145.234/32
      Tags:
        - Key: Name
          Value: hebiishiSGEC2

  hebiishiSGALB:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGALB
      GroupDescription: hebiishiSGALB
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: hebiishiSGALB

  hebiishiSGRDS:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGRDS
      GroupDescription: hebiishiSGRDS
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: hebiishiSGRDS

  hebiishiSGEFS:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGEFS
      GroupDescription: hebiishiSGEFS
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 2049
          ToPort: 2049
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: hebiishiSGEFS

Outputs:
    SGOutput1:
      Value: !Ref hebiishiSGEC2
      Export:
        Name: hebiishiSGEC2
    SGOutput2:
      Value: !Ref hebiishiSGALB
      Export:
        Name: hebiishiSGALB
    SGOutput3:
      Value: !Ref hebiishiSGRDS
      Export:
        Name: hebiishiSGRDS
    SGOutput4:
      Value: !Ref hebiishiSGEFS
      Export:
        Name: hebiishiSGEFS

5.セキュリティグループの作成

  • 今回は、ALB、EC2、RDS、EFSのセキュリティグループの作成をしていきます。

5-1.ALB用のSG作成

ALBのSGは下記のコードで作成します。

使用オプション 設定値 使用用途
GroupName hebiishiSGALB 設定したい名前を入力
GroupDescription hebiishiSGALB グループの説明
VpcId !ImportValue hebiishi_Vpc Outputセクションで作成したVpcId
IpProtocol tcp tcpプロトコルでトラフィックを許可するため
FromPort 80 httpから接続を許可するため
ToPort 80 httpから接続を許可するため
IpProtocol tcp tcpプロトコルでトラフィックを許可するため
FromPort 443 httpsから接続を許可するため
ToPort 443 httpsから接続を許可するため
hebiishiSGALB:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGALB
      GroupDescription: hebiishiSGALB
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp 
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: hebiishiSGALB

5-2.EC2用のSG作成

EC2のSGは下記のコードで作成します。

使用オプション 設定値 使用用途
GroupName hebiishiSGEC2 設定したい名前を入力
GroupDescription hebiishiSGEC2 グループの説明
VpcId !ImportValue hebiishi_Vpc Outputセクションで作成したVpcId
IpProtocol tcp tcpプロトコルでトラフィックを許可するため
FromPort 22 指定のIPアドレスから接続を許可するため
ToPort 22 指定のIPアドレスに接続を許可するため
hebiishiSEC2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGEC2
      GroupDescription: hebiishiSGEC2
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 指定のIP/32
      Tags:
        - Key: Name
          Value: hebiishiSGEC2

5-3.RDS用のSG作成

RDSのSGは下記のコードで作成します。

使用オプション 設定値 使用用途
GroupName hebiishiSGRDS 設定したい名前を入力
GroupDescription hebiishiSGRDS グループの説明
VpcId !ImportValue hebiishi_Vpc Outputセクションで作成したVpcId
IpProtocol tcp tcpプロトコルでトラフィックを許可するため
FromPort 3306 EC2のSGから接続を許可するため
ToPort 3306 EC2のSGから接続を許可するため
hebiishiSGRDS:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGRDS
      GroupDescription: hebiishiSGRDS
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: hebiishiSGRDS

5-4.EFS用のSG作成

EFSのSGは下記のコードで作成します。

使用オプション 設定値 使用用途
GroupName hebiishiSGEFS 設定したい名前を入力
GroupDescription hebiishiSGEFS グループの説明
VpcId !ImportValue hebiishi_Vpc Outputセクションで作成したVpcId
IpProtocol tcp tcpプロトコルでトラフィックを許可するため
FromPort 2049 httpから接続を許可するため
ToPort 2049 EC2のSGから接続を許可するため
hebiishiSGEFS:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: hebiishiSGEFS
      GroupDescription: hebiishiSGEFS
      VpcId: !ImportValue hebiishi_Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 2049
          ToPort: 2049
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: hebiishiSGEFS

5-5.Outputsの作成

下記のOutputセクションで他のリソースへ参照します。

Outputs:
    SGOutput1:
      Value: !Ref hebiishiSGEC2
      Export:
        Name: hebiishiSGEC2
    SGOutput2:
      Value: !Ref hebiishiSGALB
      Export:
        Name: hebiishiSGALB
    SGOutput3:
      Value: !Ref hebiishiSGRDS
      Export:
        Name: hebiishiSGRDS
    SGOutput4:
      Value: !Ref hebiishiSGEFS
      Export:
        Name: hebiishiSGEFS

6.疎通確認

  • 今回は疎通確認を行います。テスト用にEC2インスタンスを作成、起動させ、PowerShellで疎通確認を行います。

1.SSHの疎通確認を下記のコマンドで確認します。

Test-NetConnection [作成したEC2のパブリックIPv4] -port 22

下記の実行結果から、SSHは指定のIPアドレスで疎通確認コマンドを実行し TcpTestSucceeded : True と返答されているので、成功しているのが確認できました。

PS C:\Users\hebiishi.o> Test-NetConnection 3.36.90.232 -port 22

ComputerName     : 3.36.90.232
RemoteAddress    : 3.36.90.232
RemotePort       : 22
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.0.43
TcpTestSucceeded : True

2.HTTPの疎通確認を下記のコマンドで確認します。

Test-NetConnection [作成したEC2のパブリックIPv4] -port 80

HTTPはALBからの通信以外は失敗するはずなので、下記の実行結果からEC2のSGが TcpTestSucceeded : False と返答されているので正常に動作していることが確認できました。

PS C:\Users\hebiishi.o> Test-NetConnection 3.36.90.232 -port 80
WARNING: TCP connect to (3.36.90.232 : 80) failed
WARNING: Ping to 3.36.90.232 failed with status: TimedOut

ComputerName           : 3.36.90.232
RemoteAddress          : 3.36.90.232
RemotePort             : 80
InterfaceAlias         : Wi-Fi
SourceAddress          : 192.168.0.43
PingSucceeded          : False
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

7.感想

セキュリティグループを構築する前は、4つの設定項目があり違うリソースなため、どのような流れでセキュリティグループがりようされるのか複雑でわかりづらかったですが、構築、ブログ作成をすることによりセキュリティグループの仕様の理解が深まりました。

8.参照

Last modified: 2022-06-09

Author