はじめに
AWSにはセキュリティグループという仮想ファイアウォールの機能があり、仮想ネットワークであるVPC内のインスタンスに設定することができます。
今回はそのセキュリティグループの概要と、AWS CLIからのセキュリティグループ作成を実践してみようと思います。
セキュリティグループとは
セキュリティグループは仮想ファイアウォールとしての機能を有しており、AWSのEC2インスタンスなどVPCに設定します。
インバウンドとアウトバウンド両方のトラフィック制御が可能です。
例えば、EC2インスタンスの作成時には、一つのEC2につき最大5つのセキュリティグループを適用することができます。
セキュリティグループの実践
セキュリティグループの挙動を確認するために、適当にAmazon LinuxのEC2を立ち上げます。
内容はなんでもOKですが、注目する点は「セキュリティグループの設定」の部分です。
上記の設定は、ポート22, 80, 443であれば世界中どこからでもアクセス可能(0.0.0.0/0)にしています。
特にポート22(SSH用)は、本番環境でこのような設定にはまずしないので注意してください。
この内容で作成するとsample-dmz
というセキュリティグループが新たに作成されて、ここで作成しているEC2に紐付いている形になります。
この新たに作成されたEC2を以下のように編集します。
# 管理者権限へ
[ec2-user@ip-10-0-54-62 ~]$ sudo -i
# とりあえずアップデート
[root@ip-10-0-54-62 ~]yum update -y
# Webサーバーとしてapacheをインストール
[root@ip-10-0-54-62 ~]yum install httpd -y
# apache起動
[root@ip-10-0-54-62 ~]service httpd start
# Starting httpd: [ OK ]
# 自動再起動をONにしておく
[root@ip-10-0-54-62 ~]chkconfig httpd on
# サンプル用のhtmlを作成
[root@ip-10-0-54-62 ~]cd /var/www/html/
[root@ip-10-0-54-62 html]vim index.html
<html>
<h1>ようこそ!</h1>
</html>
ここまで完成したところで作成されたEC2のパブリックIPへアクセスすると、サンプルのHTMLが以下のように表示されるはずです。
インバウンドルールの変更
それでは、今回のsample-dmz
セキュリティグループを編集してポート80の定義を消しましょう。
そしてすぐに再度、EC2のパブリックIPへアクセスするとどうなるかというと、
レスポンスが返ってこないことが確認できると思います。
ここでポイントとなるのは、セキュリティグループへ加えた変更は即時反映されるということです。
アウトバウンドルールの変更
上で行ったインバウンドルールの変更を元に戻し、再びアクセスできる状態にしておきます。
ここで少し興味深い設定変更をしてみるのですが、セキュリティグループのアウトバウンドルールを削除してみます。
アウトバウンドルールはデフォルトですべて許可されているのですが、このルールを削除するとどうなるでしょうか?
削除してからEC2のパブリックIPにアクセスしてみましょう。
何も変化がない(普通にアクセス可能)ことが確認できると思います。
これがセキュリティグループの特性の一つであり、ステートフルであると言われている理由です。
例えアウトバウンドルールが無くとも、インバウンドルールで許可されていれば自動的にアウトバウンドルールも許可されます。
この場合、インバウンドルールに依存しているので、ステートフルであると言えるわけです。
これはサブネットのネットワークACLとは異なる挙動なので注意が必要です。
複数セキュリティグループの適用
それでは、一つのEC2に複数のセキュリティグループを適用してみましょう。
適当にMySQL用のセキュリティグループを作ってみます。
既存のEC2に対して「ネットワーキング>セキュリティグループの変更」でセキュリティグループ変更画面を表示します。
そして、適用したいセキュリティグループを選択します。
これを適用後、EC2に関連付けられたセキュリティグループを確認すると、以下のように複数適用されているのが視覚的に確認できます。
AWS CLIからセキュリティグループを作る
セキュリティグループはAWS CLIからも簡単に作成することができます。
セキュリティグループの作成
作成にはcreate-security-group
コマンドを使います。
レスポンスには作成されたセキュリティグループのgroup-id
が入っています。
これは編集を行う上で必要になるため覚えておきましょう。
aws ec2 create-security-group --group-name sample-dmz2 --description "Sample DMZ"
# {
# "GroupId": "sg-cfc91ecf"
# }
セキュリティグループの確認
上でできたセキュリティグループの内容を確認してみましょう。describe-security-groups
で確認可能です。
aws ec2 describe-security-groups --group-id sg-cfc91ecf
# {
# "SecurityGroups": [
# {
# "IpPermissionsEgress": [],
# "Description": "Sample DMZ",
# "IpPermissions": [],
# "GroupName": "sample-dmz2",
# "OwnerId": "000000000000",
# "GroupId": "sg-cfc91ecf"
# }
# ]
# }
もちろんAWS管理コンソール上からも確認が可能です。
セキュリティグループのルール追加
では、セキュリティグループのルールを追加してみましょう。
試しにSSHのポート22を許可するルールを追加します。
これにはauthorize-security-group-ingress
コマンドを使用します。
aws ec2 authorize-security-group-ingress --group-id sg-cfc91ecf --protocol tcp --port 22 --cidr 0.0.0.0/0
実行できているか確認すると以下のようになります。
aws ec2 describe-security-groups --group-id sg-cfc91ecf
# {
# "SecurityGroups": [
# {
# "IpPermissionsEgress": [],
# "Description": "Sample DMZ",
# "IpPermissions": [
# {
# "PrefixListIds": [],
# "FromPort": 22,
# "IpRanges": [
# {
# "CidrIp": "0.0.0.0/0"
# }
# ],
# "ToPort": 22,
# "IpProtocol": "tcp",
# "UserIdGroupPairs": [],
# "Ipv6Ranges": []
# }
# ],
# "GroupName": "sample-dmz2",
# "OwnerId": "000000000000",
# "GroupId": "sg-cfc91ecf"
# }
# ]
# }
管理コンソール上でも追加されているのが確認できます。
セキュリティグループの削除
作ったセキュリティグループもdelete-security-group
で簡単に削除することが可能です。
aws ec2 delete-security-group --group-id sg-cfc91ecf
まとめ
セキュリティグループの挙動についての把握は、AWSを利用する上で欠かせません。
役割を理解しつつ、煩雑にならないよう管理を行い、効率的に利用していく必要があります。