ネットワークのアクセス制限と認可
経路制御とアプリの認可が、それぞれどこで必要になるか説明します。
説明
ネットワーク上で到達できることと、対象の操作を許可されることは別の条件です。業務用と管理用の経路を分けたうえで、主体・端末・操作に応じた認可を要求ごとに確認します。
固定の経路表と権限表で、一般利用者と管理担当者の操作を比較します。経路の開放、端末状態の変更、権限の失効を順に適用し、設定が実際に変わる場合をSQLで確認します。
経路制御とアプリの認可が、それぞれどこで必要になるか説明します。
1業務用と管理用の経路を読む
officeからbusinessは到達可能、adminへは不可です。管理用踏み台bastionからadminへ到達する設定です。
from sc12 import *
db = boundaries()
print(db.execute("SELECT * FROM routes到達性を一覧にする ORDER BY source,target").fetchall())
print(db.execute("SELECT * FROM grants主体ごとの操作権限を読む ORDER BY subject").fetchall())aliceは業務のread、opsは管理のchangeを持ちます。経路の表と権限の表は別々です。
2業務を許可される条件を照合する
decisionはこの例の経路・端末・権限の3条件をSQLで照合します。
print(decision(db,"office","alice","laptop"確認済みの端末で要求する,"business","read"))
print(decision(db,"office","alice","unknown"未確認端末と比較する,"business","read"))同じ主体と経路でも、未確認端末ではFalseです。社内にいることだけを許可条件にしていません。
3権限があっても経路が閉じている場合
opsがofficeから管理設定を変更しようとします。
print(configuration_change(db,"office"一般経路から管理操作を要求する,"ops","laptop"))
print(db.execute("SELECT value FROM configuration保存状態を確認する").fetchone())更新行数0でv1を保ちます。権限があっても、設定した管理経路を通る必要があります。
4管理経路から権限のない主体が要求する
aliceがbastionへ到達できた場合でも、管理権限があるとは限りません。
print(configuration_change(db,"bastion","alice"管理経路を使う一般利用者を評価する,"laptop"))
print(db.execute("SELECT value FROM configuration").fetchone())経路は通っても更新行数0です。踏み台を使えることだけで管理操作を許可しない設計です。
5管理担当者が正しい経路で変更する
ops、確認済みlaptop、bastion経路の3条件をそろえます。
print(configuration_change(db,"bastion","ops","laptop"経路・主体・端末をそろえる))
print(db.execute("SELECT value FROM configuration").fetchone())1行を更新しv2になりました。許可判定だけでなく、保存された設定も対応付けて確認しました。
6経路だけを開放した場合を比較する
officeからadminへの到達性を1にします。aliceの権限は変更しません。
db.execute("UPDATE routes SET reachable=1経路の到達性だけを変える WHERE source='office' AND target='admin'")
print(decision(db,"office","alice"一般利用者の許可を再確認する,"laptop","admin","change"))
print(decision(db,"office","ops"管理担当者の許可を再確認する,"laptop","admin","change"))aliceはFalse、opsはTrueです。ネットワーク変更によって広がる範囲と、認可で制限する範囲を分けて把握できます。
7権限を失効させ次の要求で再評価する
opsの管理権限を削除します。経路と端末は有効なままです。
db.execute("DELETE FROM grants管理権限を失効させる WHERE subject='ops'")
print(configuration_change次の操作で条件を再評価する(db,"bastion","ops","laptop"))
print(db.execute("SELECT value FROM configuration").fetchone())次の操作の更新行数は0です。以前の操作が成功していても、権限変更後は同じ操作が許可されるとは限りません。
まとめ
到達性、主体の権限、端末状態は別の条件です。
管理経路を分けても、操作ごとの認可は必要です。
権限変更を次の要求へ反映できる検査位置を設計します。
操作履歴と解説を振り返れます。
Python 3.15 / cryptography 50.0.2 / 公開試料と固定時刻
from sc12 import *
db = boundaries()
print(db.execute("SELECT * FROM routes ORDER BY source,target").fetchall())
print(db.execute("SELECT * FROM grants ORDER BY subject").fetchall())[('bastion', 'admin', 1), ('office', 'admin', 0), ('office', 'business', 1)]
[('alice', 'business', 'read'), ('ops', 'admin', 'change')]print(decision(db,"office","alice","laptop","business","read"))
print(decision(db,"office","alice","unknown","business","read"))True False
print(configuration_change(db,"office","ops","laptop"))
print(db.execute("SELECT value FROM configuration").fetchone())0
('v1',)print(configuration_change(db,"bastion","alice","laptop"))
print(db.execute("SELECT value FROM configuration").fetchone())0
('v1',)print(configuration_change(db,"bastion","ops","laptop"))
print(db.execute("SELECT value FROM configuration").fetchone())1
('v2',)db.execute("UPDATE routes SET reachable=1 WHERE source='office' AND target='admin'")
print(decision(db,"office","alice","laptop","admin","change"))
print(decision(db,"office","ops","laptop","admin","change"))False True
db.execute("DELETE FROM grants WHERE subject='ops'")
print(configuration_change(db,"bastion","ops","laptop"))
print(db.execute("SELECT value FROM configuration").fetchone())0
('v2',)演習完了