こんにちは、Reoです。
フリーランスのインフラエンジニアとして働きながら、学習サービス「InfraDojo(インフラ道場)」を運営しています。
「EC2にSSH接続できない」
「セキュリティグループの、どこを確認すればいい?」
そんなときは、対象のEC2に付いているグループと、その許可ルールを順番に確認してみてください。
今回は、AWS CLIで設定を読み取る手順を紹介します。
セキュリティグループでは、何を見る?
EC2へ入る通信を確認するときは、主に次の三つを見ます。
- プロトコル: TCPなど、通信の種類
- ポート: 接続先サービスの番号
- 送信元: どこからの通信を許可するか
例えば、特定のIPv4アドレスから、TCPの22番ポートへの通信を許可するルールがあります。
「22番がある」だけでなく、「どこから許可しているか」もセットで確認します。
今回の前提
以下を用意してください。
- 認証設定済みのAWS CLI v2とBash
- 閲覧できる既存のEC2インスタンス
-
ec2:DescribeInstancesとec2:DescribeSecurityGroupsの実行権限
この記事では、ネットワークインターフェイスが一つのEC2を対象とします。
コード内のIDは説明用です。自分の環境の値へ置き換えてください。
1.EC2に付いているグループを確認する
最初に、対象のリージョンとインスタンスIDを指定します。
lesson_region=ap-northeast-1
instance_id=i-0123456789abcdef0
東京リージョン以外を使う場合は、lesson_regionも変更します。
describe-instancesで、関連するセキュリティグループを取得します。
aws ec2 describe-instances \
--region "$lesson_region" \
--instance-ids "$instance_id" \
--query 'Reservations[].Instances[].SecurityGroups[]' \
--output json \
--no-cli-pager
出力例です。
[
{
"GroupId": "sg-0123456789abcdef0",
"GroupName": "example-ssh"
}
]
次の操作で使うのは、GroupIdです。
2.インバウンドルールを取得する
先ほど表示されたIDを指定します。
security_group_id=sg-0123456789abcdef0
describe-security-groupsのIpPermissionsが、インバウンドルールです。
aws ec2 describe-security-groups \
--region "$lesson_region" \
--group-ids "$security_group_id" \
--query 'SecurityGroups[0].IpPermissions' \
--output json \
--no-cli-pager
出力例の一部を抜粋すると、次のようになります。
[
{
"IpProtocol": "tcp",
"FromPort": 22,
"ToPort": 22,
"IpRanges": [
{
"CidrIp": "203.0.113.10/32"
}
]
}
]
実際には、IPv6やセキュリティグループを送信元とする項目なども表示されます。
3.出力を読み取る
この例を整理すると、次の意味になります。
| 項目 | 意味 |
|---|---|
IpProtocol: tcp |
TCP通信を対象にする |
FromPort: 22 / ToPort: 22
|
接続先の22番ポートを許可する |
203.0.113.10/32 |
このIPv4アドレス一つを送信元として許可する |
203.0.113.10は説明用のIPアドレスです。
実際の確認では、AWS側から見える接続元のIPアドレスと、許可された範囲を比べます。VPNやNATを経由すると、手元の端末のIPアドレスとは異なる場合があります。
グループが複数あったら、全部確認する
一つのネットワークインターフェイスに複数のセキュリティグループが付いている場合、許可ルールは組み合わされます。
一つのグループにルールがないだけでは、遮断されているとは判断できません。
表示された各GroupIdについて確認してください。セキュリティグループには、明示的な拒否ルールはありません。AWSのルール仕様
許可されていても、接続できるとは限らない
セキュリティグループは、確認ポイントの一つです。
ほかにも、次のような点が関係します。
- 接続先までのネットワーク経路
- ネットワークACLやOS側のファイアウォール
- SSHサービスの起動状態
- ユーザー名や鍵などの認証情報
まずは、どのグループが付いていて、どんな通信を許可しているかを読み取れるようになるところから始めましょう。
AWSとLinuxをつなげて学びたい人へ
AWS側で通信を許可していても、EC2の中でサービスが動いていなければ、目的の接続はできません。
クラウドの設定と、その上で動くLinuxの両方を理解すると、確認する場所を整理しやすくなります。
自分が運営するInfraDojoでは、ブラウザ上の学習用シミュレーターでLinuxの基本操作を練習できます。
設定を見る力と、サーバーの状態を調べる力を、少しずつつなげていきましょう。
▼ InfraDojo(インフラ道場)
