この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
セキュリティグループのルール棚卸しを行う機会は多いです。 例えば以下のようなケースです。
- AWS Security Hub 『基礎セキュリティのベストプラクティス』の EC2.2: VPC のデフォルトのセキュリティグループでは、インバウンドトラフィックとアウトバウンドトラフィックが禁止されます コントロールに失敗したセキュリティグループ
- AWS Config の restricted-ssh で非準拠になったセキュリティグループ
それらセキュリティグループは是正する必要があります。 しかし是正前に使用状況を確認して、影響範囲を把握しておきたいです。
今回はセキュリティグループ使用状況の把握を AWS CloudShell を使って行います。
特定のセキュリティグループが関連付けられている ENI/EC2インスタンス情報を取得します。
0. 前提条件
対象のリージョンで AWS Configの有効化、および EC2セキュリティグループを記録する設定にしていることが 前提条件です。
1. CloudShell起動
AWS CloudShellを起動しましょう。
デフォルトでAWS CLIが使えるので 必須の準備事項はありませんが、 以下設定を流してページャーを無効化しておくと、まとめて実行する際に便利です。
# ページャーを無効にする
aws configure set cli_pager ''
参考: AWS CloudShell で AWS CLI v2 のページャーを無効化する | DevelopersIO
2. セキュリティグループ(SG)のID取得
調べたいセキュリティグループIDを変数 sgid
に格納しておきます。
# 参考: SG一覧表示
aws ec2 describe-security-groups --output table \
--query "SecurityGroups[].{NameTag:Tags[?Key=='Name']|[0].Value, GroupId: GroupId, GroupName: GroupName}"
# --------------------------------------------------------------
# | DescribeSecurityGroups |
# +-----------------------+-------------------------+----------+
# | GroupId | GroupName | NameTag |
# +-----------------------+-------------------------+----------+
# | sg-05xxxxxxxxxxxxxxx | xxx-ec2-instance-sg | XXX |
# | sg-0fxxxxxxxxxxxxxxx | xxx-elb-sg | YYY |
# ...
# GroupId の登録
sgid=sg-c0xxxx
# 確認
aws ec2 describe-security-groups --filters Name=group-id,Values=$sgid --output yaml \
--query "SecurityGroups[].{NameTag:Tags[?Key=='Name']|[0].Value, GroupId: GroupId, GroupName: GroupName}"
▼出力例
- GroupId: sg-c0xxxxxx
GroupName: default
NameTag: default
3. SGの VPC情報
所属するVPCを調べます。
# VPC ID の取得
vpcid=$(aws ec2 describe-security-groups --filters Name=group-id,Values=$sgid \
--query "SecurityGroups[].VpcId" --output text)
# VPC 情報
aws ec2 describe-vpcs --filters Name=vpc-id,Values=$vpcid --query \
"Vpcs[].{Name:Tags[?Key=='Name']|[0].Value, VpcId:VpcId, Cidr:CidrBlock}" --output yaml
▼出力例
- Cidr: 10.10.3.0/24
Name: xxx-dev-vpc
VpcId: vpc-82xxxxxxx
4. SGが関連付けられているENI情報
Config の AWS::EC2::SecurityGroup
リソース記録から、
「どのENI or EC2インスタンスに関連付けられているか」探ることができます。
まずは ENI情報を列挙します。
aws configservice get-resource-config-history --output text \
--resource-type AWS::EC2::SecurityGroup --resource-id $sgid --max-items 1 \
--query "configurationItems[].relationships[?relationshipName=='Is associated with NetworkInterface'][].[resourceId]" \
| while read eni; do
if [ "$eni" = "None" ]; then
continue
fi
echo "### $eni"
# ENI情報の取得
aws ec2 describe-network-interfaces --filters Name=network-interface-id,Values=$eni --output yaml \
--query "NetworkInterfaces[].{Attachment:Attachment, Description:Description, Id:NetworkInterfaceId, PrivateIpAddresses:PrivateIpAddresses}"
echo ""
done
▼出力例
### eni-027xxxx
- Attachment:
AttachmentId: ela-attach-11xxxx
DeleteOnTermination: false
DeviceIndex: 1
InstanceOwnerId: amazon-aws
Status: attached
Description: AWS Lambda VPC ENI-dev-xxxx
Id: eni-027xxxx
PrivateIpAddresses:
- Primary: true
PrivateDnsName: ip-xxxx.ap-northeast-1.compute.internal
PrivateIpAddress: xxxx
### eni-b0exxxx
- Attachment:
AttachTime: '2020-01-01T01:01:01+00:00'
AttachmentId: eni-attach-52xxxx
DeleteOnTermination: true
DeviceIndex: 0
InstanceId: i-09xxxx
InstanceOwnerId: '123456789012'
NetworkCardIndex: 0
Status: attached
Description: Primary network interface
Id: eni-b0xxxx
PrivateIpAddresses:
- Association:
AllocationId: eipalloc-baxxxx
AssociationId: eipassoc-78xxxx
IpOwnerId: '123456789012'
PublicDnsName: ec2-xxxx.ap-northeast-1.compute.amazonaws.com
PublicIp: xxxx
Primary: true
PrivateDnsName: ip-xxxx.ap-northeast-1.compute.internal
PrivateIpAddress: xxxx
5. SGが関連付けられているインスタンス情報
次に EC2インスタンスとの関連付けを調べます。
aws configservice get-resource-config-history --output text \
--resource-type AWS::EC2::SecurityGroup --resource-id $sgid --max-items 1 \
--query "configurationItems[].relationships[?relationshipName=='Is associated with Instance'][].[resourceId]" \
| while read instance; do
if [ "$instance" = "None" ]; then
continue
fi
echo "### $instance"
# インスタンス情報の取得
aws ec2 describe-instances --filters Name=instance-id,Values=$instance --output yaml \
--query 'Reservations[*].Instances[].{Name:Tags[?Key==`Name`]|[0].Value, Id:InstanceId, State:State.Name, LaunchTime:LaunchTime}'
echo ""
done
▼出力例
### i-09xxxx
- Id: i-09xxxx
LaunchTime: '2021-01-01T08:09:33+00:00'
Name: xxx-dev
State: running
### i-20xxxx
- Id: i-20xxxx
LaunchTime: '2021-01-02T02:18:09+00:00'
Name: yyy-dev
State: stopped
6. SGが関連付けられている SG情報 (2021/05/07追記)
ここでは 対象SGからのインバウンド/アウトバウンドを許可するルール
を入れている 他SGを検索します。
これは AWS CLIのフィルター(--filters
)機能で簡単に検索できます。
(
echo "### inbound"
aws ec2 describe-security-groups --output text \
--filters Name=ip-permission.group-id,Values=$sgid \
--query "SecurityGroups[].[GroupName, GroupId]"
echo "### outbound"
aws ec2 describe-security-groups --output text \
--filters Name=egress.ip-permission.group-id,Values=$sgid \
--query "SecurityGroups[].[GroupName, GroupId]"
)
▼出力例
### inbound
xxx-aurora sg-fdxxx
xxx-redis sg-3bxxx
### outbound
まとめ
以上、CloudShell(AWS CLI)を使った セキュリティグループ使用状況の調査でした。
もちろん AWS Configのマネジメントコンソール上からも確認できます。 以下参照ください。