この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
中山(順)です。
Security Groupがいつの間にかユルくなっていることってありませんか?
例えば、以下のようなことはないでしょか?
- 緊急のメンテナンス作業を実施するためにSSH/RDPでのアクセスを許可
- 後で元に戻すつもりだったけど作業し忘れる
- 棚卸しするときに「このルール消していいんだっけ?」
しかし、これらの作業を一部の管理者で実施するのは負担です。Toilの極みです。
そこで、Dome9のTamper ProtectionとDynamic Accessの機能をご紹介します。
機能紹介
Tamper Protection
Dome9を経由しないSecurity Groupの変更を検知し、元の状態に復元することが可能です。 Security Groupを変更する場合には、Dome9のコンソールから実施する必要があります。 Tamper ProtectioはSecurity Group単位で有効化することが可能です。
Full Protection mode - Tamper Protection
Dynamic Access
Security GroupのInbound Ruleに対して一時的に接続元を追加できます。 Dome9のコンソールへのアクセスに利用されているグローバルIPもしくは任意のIPアドレスを追加できます。
前提条件
Dome9にAWSアカウントを追加する際に"Full-Protection"モードで登録しておく必要があります。
Dome9 Operational Modes for AWS accounts
やってみた
実際に動作を確認します。
Dome9にAWSアカウントを追加する手順は以下の記事を参照してください。
検証環境の作成
検証のために新たにVPCを作成を作成します。
VPC_ID=$(aws ec2 create-vpc \
--cidr-block "10.0.0.0/16" \
--query Vpc.VpcId \
--output text) \
&& echo ${VPC_ID}
aws ec2 create-tags \
--resources ${VPC_ID} \
--tag Key=Name,Value=vpc-dome9
併せて、そのVPCにSecurity Groupを作成します。その際に、SSHおよびHTTPのInbound Ruleを追加します。
SG_ID=$(aws ec2 create-security-group \
--description "for Dome9" \
--group-name dome9 \
--vpc-id ${VPC_ID} \
--query GroupId \
--output text) \
&& echo ${SG_ID}
aws ec2 authorize-security-group-ingress \
--group-id ${SG_ID} \
--protocol tcp \
--port 22 \
--cidr 203.0.113.0/24
aws ec2 authorize-security-group-ingress \
--group-id ${SG_ID} \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
Tamper Protectionの有効化
Dome9にログイン後、「ネットワークセキュリティ」→「セキュリティグループ」を開きます。
保護したいセキュリティグループを選択します。
デフォルトでは"READ ONLY"になっているので、"FULL PROTECTION"に変更します。
"ENABLE"をクリックします。
有効化はこれで完了です。
Dome9を経由せずにSecurity Groupを変更
Tamper Protectionを有効化したSecurity Groupに対してDome9を経由せずに変更を加えると、元の状態に戻ります。
Inbound Ruleを1つ追加します。
aws ec2 authorize-security-group-ingress \
--group-id ${SG_ID} \
--protocol tcp \
--port 22 \
--cidr 192.0.2.0/24
追加されたことを確認します。
aws ec2 describe-security-groups \
--group-ids ${SG_ID}
{
"SecurityGroups": [
{
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"PrefixListIds": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"Description": "for Dome9",
"IpPermissions": [
{
"PrefixListIds": [],
"FromPort": 80,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"ToPort": 80,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
},
{
"PrefixListIds": [],
"FromPort": 22,
"IpRanges": [
{
"CidrIp": "203.0.113.0/24"
},
{
"CidrIp": "192.0.2.0/24"
}
],
"ToPort": 22,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"GroupName": "dome9",
"VpcId": "vpc-0cb6d29c8daeab250",
"OwnerId": "XXXXXXXXXXXX",
"GroupId": "sg-0249e59e9582955e6"
}
]
}
しばらくしてから、Dome9でSecurity Groupを確認します。
"History"にSecurity Groupに関するイベントが記録されています。直近の時刻をクリックします。
手動でルールが追加されたことが記録されています。
変更が検知されたことを示すイベントを確認できます。
Inbound Ruleが削除されたことを確認します。
aws ec2 describe-security-groups \
--group-ids ${SG_ID}
{
"SecurityGroups": [
{
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"PrefixListIds": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"Description": "for Dome9",
"IpPermissions": [
{
"PrefixListIds": [],
"FromPort": 80,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"ToPort": 80,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
},
{
"PrefixListIds": [],
"FromPort": 22,
"IpRanges": [
{
"CidrIp": "203.0.113.0/24"
}
],
"ToPort": 22,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"GroupName": "dome9",
"VpcId": "vpc-0cb6d29c8daeab250",
"OwnerId": "XXXXXXXXXXXX",
"GroupId": "sg-0249e59e9582955e6"
}
]
}
Dome9経由でSecurity Groupを変更
それでは、Dome9からInbound Ruleを追加してみましょう。
許可したいポートの列にある"EDIT"のボタンをクリックします。
"ADD SOURCE"をクリックし、アクセス元のIPアドレスを入力したら、"SAVE"をクリックします。
このように追加されたルールであれば、元に戻されることはありません。
ちなみに、この変更は"History"に残ります。
このように、不用意な変更を防ぐことが可能です。また、Dome9経由での変更も"History"から確認可能です。
Dynamic AccessでInbound Ruleを追加
次にDynamic Accessについて確認します。
「ネットワークセキュリティ」→「Dynamic Access」をクリックします。
Tamper Protectionが有効化されているSecurity Groupが表示されます(Dynamic AccessはTamper Protectionが有効化されているSecurity Groupで利用できます)。
アクセスを許可したいポートの"GET ACCESS"をクリックすると、一時的にそのサービスのInbound Ruleが追加されます。 このとき、許可される時間は1時間です。このデフォルト設定は変更することが可能です。 また、許可される接続元は、Dome9にアクセスしている際に利用されているグローバルIPアドレスです。
"ACTIVE LEASES"で、一時的に許可されているルールを確認できます。 また、"TERMINATE LEASE"で許可を即時取り消すことが可能です。
許可する時間および接続元を指定したい場合は、"CUSTOM LEASE"から設定を実施します。
必要事項を入力し、"SAVE"をクリックします。 今回は30分だけ接続を許可します。 この際、"Comment / Justification"は必ず入力するようにしましょう。 監査されたときに何のために許可したのか特定できなくなるためです。
こちらも設定できたことを確認できます。
AWSを直接確認してみます。
aws ec2 describe-security-groups \
--group-ids ${SG_ID}
{
"SecurityGroups": [
{
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"PrefixListIds": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"Description": "for Dome9",
"IpPermissions": [
{
"PrefixListIds": [],
"FromPort": 80,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"ToPort": 80,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
},
{
"PrefixListIds": [],
"FromPort": 22,
"IpRanges": [
{
"CidrIp": "203.0.113.0/24"
},
{
"CidrIp": "192.0.2.0/24"
},
{
"CidrIp": "xxx.xxx.xxx.xxx/32"
},
{
"CidrIp": "198.51.100.0/24"
}
],
"ToPort": 22,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"GroupName": "dome9",
"VpcId": "vpc-0cb6d29c8daeab250",
"OwnerId": "XXXXXXXXXXXX",
"GroupId": "sg-0249e59e9582955e6"
}
]
}
もちろん、Security Groupの"History"でも確認可能です(以下のログは後半に追加した方のログです)。
最後に、許可したルールが自動で削除されたことを確認します。 確認は、設定から30分くらい経過したタイミングで実施しました。 2つ目のLEASE(30分で許可した接続元)のみが削除されているはずです。
まずはAWSに直接確認します。 2つ目のLEASE(30分で許可した接続元)が存在しないことが確認できました。
aws ec2 describe-security-groups \
--group-ids ${SG_ID}
{
"SecurityGroups": [
{
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"PrefixListIds": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"Description": "for Dome9",
"IpPermissions": [
{
"PrefixListIds": [],
"FromPort": 80,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"ToPort": 80,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
},
{
"PrefixListIds": [],
"FromPort": 22,
"IpRanges": [
{
"CidrIp": "203.0.113.0/24"
},
{
"CidrIp": "192.0.2.0/24"
},
{
"CidrIp": "xxx.xxx.xxx.xxx/32"
}
],
"ToPort": 22,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"GroupName": "dome9",
"VpcId": "vpc-0cb6d29c8daeab250",
"OwnerId": "XXXXXXXXXXXX",
"GroupId": "sg-0249e59e9582955e6"
}
]
}
Security Groupの"History"でも確認します。 30分後にLEASEが終了していることが確認できます。
まとめ
Tamper Protectionを利用することで不用意な変更を防ぐことが可能です。 Dome9経由での変更も"History"から容易に確認可能なため、あとになって「このルールは必要か」「追加/変更された背景は何か」を確認できます。
実際のAWS運用では一時的にルールを追加したいケースがよくありますが、Dynamic Accessを利用することで許可設定を実施するだけでそのあとの削除は自動的に実施できます。
適切な状態を少ない工数で維持できそうですね。
現場からは以上です。