一覧SP-16-3 · CSPM・CIEM:クラウド構成と権限

クラウド設定の修正と動作確認

是正後の安全性と業務への影響を同じ試験条件で比較します。

説明

公開範囲を狭める修正は、正常な利用にも影響します。修正対象だけでなく、その設定に依存する通信を用意し、事前評価、適用、再取得の順に確認します。

固定の通信一覧を使い、ルール変更をSQLiteのトランザクション内で試します。影響が大きい変更は戻し、監視通信を保つ条件へ調整します。

是正後の安全性と業務への影響を同じ試験条件で比較します。

1必要な通信と現状を確認する

customer、monitor、adminを個別の条件として扱います。

from sp16 import * from sp02 import show db=connect() show(db,"SELECT * FROM dependency ORDER BY name") checks=db.execute("SELECT name,src,target,port FROM dependency ORDER BY name").fetchall() for name,src,target,port in checks:print(name,reachable必要な通信と現状を確認する(db,target,src,port))

customerとmonitorはTrue、adminはFalseです。adminが既に通らないことも変更前の比較基準になります。

2修正前の設定を保存する

変更対象の行と世代を取得します。

before=db.execute("SELECT修正前の設定を保存する * FROM rule WHERE sg='sg7'").fetchall() print(before) show(db,"SELECT version FROM config")

現状は全IPv4から443、世代1です。戻す場合の設定と対象を記録します。

3許可規則を削除する案を試す

SAVEPOINTで試験変更を戻せる位置を作ります。

db.execute("SAVEPOINT許可規則を削除する案を試す candidate") db.execute("DELETE FROM rule WHERE sg='sg7'") for name,src,target,port in checks:print(name,reachable(db,target,src,port))

すべてFalseです。監視通信も失われるため、この案をそのまま適用しません。

4試験変更を戻して再確認する

保存点へ戻します。

db.execute("ROLLBACK TO試験変更を戻して再確認する candidate");db.execute("RELEASE candidate") print(db.execute("SELECT * FROM rule WHERE sg='sg7'").fetchall()==before)

Trueです。実サービスの変更ではDBのROLLBACKが使えるとは限らず、サービス固有の戻し手順と再確認が必要です。

5監視範囲を残す案へ変える

許可範囲を192.0.2.0/24にします。

db.execute("UPDATE rule SET cidr='192.0.2.0/24' WHERE sg='sg7'") for name,src,target,port in checks:print(name,reachable監視範囲を残す案へ変える(db,target,src,port))

monitorだけTrueです。この目的が公開Webの停止である場合の案で、customerの継続が必要なら別の構成を検討します。

6変更世代を進めて設定を読み直す

反映した値をそのまま再検索します。

db.execute("UPDATE config SET version=2 WHERE id=1");db.commit() show変更世代を進めて設定を読み直す(db,"SELECT * FROM rule WHERE sg='sg7'") show(db,"SELECT version FROM config")

範囲と世代が期待値に一致します。変更要求の送信だけを適用完了として扱いません。

7変化した通信を一覧にする

今回の変更前後の差を表示します。

baseline={'admin':False,'customer':True,'monitor':True} for name,src,target,port in checks: print(name,baseline[name],reachable変化した通信を一覧にする(db,target,src,port))

customerだけがTrueからFalseです。到達候補のモデル評価と実通信での確認は、根拠を分けて記録します。

まとめ

変更前から通らない通信も記録します。

依存通信を使って変更案を評価します。

修正後の値と業務上の影響を読み直します。

操作履歴と解説を振り返れます。

Python 3.15 / 固定のクラウド構成と限定した評価モデル

1
from sp16 import * from sp02 import show db=connect() show(db,"SELECT * FROM dependency ORDER BY name") checks=db.execute("SELECT name,src,target,port FROM dependency ORDER BY name").fetchall() for name,src,target,port in checks:print(name,reachable(db,target,src,port))
name | src | target | port
admin | 192.0.2.30 | web7 | 22
customer | 198.51.100.10 | web7 | 443
monitor | 192.0.2.20 | web7 | 443
admin False
customer True
monitor True
2
before=db.execute("SELECT * FROM rule WHERE sg='sg7'").fetchall() print(before) show(db,"SELECT version FROM config")
[('sg7', '0.0.0.0/0', 443)]
version
1
3
db.execute("SAVEPOINT candidate") db.execute("DELETE FROM rule WHERE sg='sg7'") for name,src,target,port in checks:print(name,reachable(db,target,src,port))
admin False
customer False
monitor False
4
db.execute("ROLLBACK TO candidate");db.execute("RELEASE candidate") print(db.execute("SELECT * FROM rule WHERE sg='sg7'").fetchall()==before)
True
5
db.execute("UPDATE rule SET cidr='192.0.2.0/24' WHERE sg='sg7'") for name,src,target,port in checks:print(name,reachable(db,target,src,port))
admin False
customer False
monitor True
6
db.execute("UPDATE config SET version=2 WHERE id=1");db.commit() show(db,"SELECT * FROM rule WHERE sg='sg7'") show(db,"SELECT version FROM config")
sg | cidr | port
sg7 | 192.0.2.0/24 | 443
version
2
7
baseline={'admin':False,'customer':True,'monitor':True} for name,src,target,port in checks: print(name,baseline[name],reachable(db,target,src,port))
admin False False
customer True False
monitor True True

演習完了