awscliを使って、VPC向けsecurity groupを作成する
以下が完了していること前提になっています。
- awscliのインストール(確認環境は、aws-cli/1.4.2 Python/2.7.5 Darwin/13.3.0です)
- AccessKeyのセットアップ
- VPCの作成(例として、10.0.0.0/16を用います)
手順としては、以下になります。
- SecurityGroup(以下SG)の作成
- Inboundのルール設定
- Outboundのルール設定(必要ないケースもあります)
SGの作成
SGの作成には、create-security-groupを使います。vpc-id(vpc-16進数8桁)が必要なので、事前に調べておいてください。コマンド例では、VPC_IDという変数に入れているので、シェルで入れておくとそのまま動きます。
aws ec2 create-security-group --vpc-id $VPC_ID --group-name internal-ssh --description "for internal ssh."
以下の結果が返ってきます
{ "return": "true", "GroupId": "作成されたSecurityGroupのID(sg-16進数8桁)" }
作成されたSGの確認
SGの確認は、describe-security-groupsを使います。
先ほどの作成結果のSGのID(sg-16進数8桁)を指定します。以降、コマンド例ではSG_IDという変数を使っているので、VPC_ID同様、シェルで入れておくとそのまま動きます。
aws ec2 describe-security-groups --group-ids $SG_ID # 結果JSON { "SecurityGroups": [ { "IpPermissionsEgress": [ { "IpProtocol": "-1", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "UserIdGroupPairs": } ], "Description": "for internal ssh.", "IpPermissions": , "GroupName": "internal-ssh", "VpcId": "$VPC_ID", "OwnerId": "$OWNER_ID", "GroupId": "$SG_ID" } ] }
作成されたばかりのセキュリティグループにはOutboundのIpPermissionsEgressしかありません。InboundのIpPermissionsは空になっていて、外からのアクセス(Inbound)はすべて拒否です。逆に外へのアクセス(Outbound)はすべて許可されています。
Inboundのルール設定
Inboundは、外部からインスタンスに対するアクセスを制御するルールです。例えば、SSHや、HTTPが該当します。authorize-security-group-ingressを使用して追加します。
aws ec2 authorize-security-group-ingress --group-id $SG_ID --cidr 10.0.0.0/16 --port 22 --protocol tcp # 結果JSON { "return": "true" }
別のルールを複数回実行すると追加されます。洗い替えではありません。
aws ec2 authorize-security-group-ingress --group-id $SG_ID --cidr 10.0.0.0/16 --port 2222 --protocol tcp # 結果JSON { "return": "true" }
再度describe-security-groupsで確認します。
aws ec2 describe-security-groups --group-ids $SG_ID # 結果JSON { "SecurityGroups": [ { "IpPermissionsEgress": [ { "IpProtocol": "-1", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "UserIdGroupPairs": } ], "Description": "for internal ssh.", "IpPermissions": [ { "ToPort": 22, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "10.0.0.0/16" } ], "UserIdGroupPairs": , "FromPort": 22 }, { "ToPort": 2222, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "10.0.0.0/16" } ], "UserIdGroupPairs": [], "FromPort": 2222 } ], "GroupName": "internal-ssh", "VpcId": "$VPC_ID", "OwnerId": "$OWNER_ID", "GroupId": "$SG_ID" } ] }
IpPermissionsに22と2222のルールが追加されています。
Inboundルールの削除
2222のほうは適当に作ったので、削除します。inboundルールの削除にはrevoke-security-group-ingressを使います。
aws ec2 revoke-security-group-ingress --group-id $SG_ID --port 2222 --cidr 10.0.0.0/16 --protocol tcp # 結果JSON { "return": "true" }
※cidrがなくてもtrueが返ってきますが、実際には消えていないので注意。
確認
aws ec2 describe-security-groups --group-ids $SG_ID # 結果JSON { "SecurityGroups": [ { "IpPermissionsEgress": [ { "IpProtocol": "-1", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "UserIdGroupPairs": } ], "Description": "for internal ssh.", "IpPermissions": [ { "ToPort": 22, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "10.0.0.0/16" } ], "UserIdGroupPairs": , "FromPort": 22 } ], "GroupName": "internal-ssh", "VpcId": "$VPC_ID", "OwnerId": "$OWNER_ID", "GroupId": "$SG_ID" } ] }
IpPermissionsから2222が消えています。
Outboundのルール設定
Outboundは、インスタンスから外部に対するアクセスを制御するルールです。Outboundルールの設定には、authorize-security-group-egressを使います。
インスタンスから外部にsshする時に、接続先を特定のネットワークに対してのみ許可する場合は、以下のように設定します。*1
aws ec2 authorize-security-group-egress --group-id $SG_ID --cidr 10.0.0.0/16 --port 22 --protocol tcp # 結果JSON { "return": "true" }
確認
aws ec2 describe-security-groups --group-ids $SG_ID # 結果JSON { "SecurityGroups": [ { "IpPermissionsEgress": [ { "ToPort": 22, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "10.0.0.0/16" } ], "UserIdGroupPairs": , "FromPort": 22 }, { "IpProtocol": "-1", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "UserIdGroupPairs": } ], "Description": "for internal ssh.", "IpPermissions": [ { "ToPort": 22, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "10.0.0.0/16" } ], "UserIdGroupPairs": [], "FromPort": 22 } ], "GroupName": "internal-ssh", "VpcId": "$VPC_ID", "OwnerId": "$OWNER_ID", "GroupId": "$SG_ID" } ] }
IpPermissionsEgressに22が追加されています。
Outboundルールの削除
削除する場合は、revoke-security-group-egressを使います。ingressと同じなので省略。
参考
create-security-group — AWS CLI 1.4.2 documentation
describe-security-groups — AWS CLI 1.4.2 documentation
authorize-security-group-ingress — AWS CLI 1.4.2 documentation
authorize-security-group-egress — AWS CLI 1.4.2 documentation
revoke-security-group-ingress — AWS CLI 1.4.2 documentation
revoke-security-group-egress — AWS CLI 1.4.2 documentation
ec2 — AWS CLI 1.4.2 documentation