一覧SC-12-1 · 境界設計と情報保護

ネットワークのアクセス制限と認可

経路制御とアプリの認可が、それぞれどこで必要になるか説明します。

説明

ネットワーク上で到達できることと、対象の操作を許可されることは別の条件です。業務用と管理用の経路を分けたうえで、主体・端末・操作に応じた認可を要求ごとに確認します。

固定の経路表と権限表で、一般利用者と管理担当者の操作を比較します。経路の開放、端末状態の変更、権限の失効を順に適用し、設定が実際に変わる場合を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 / 公開試料と固定時刻

1
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')]
2
print(decision(db,"office","alice","laptop","business","read")) print(decision(db,"office","alice","unknown","business","read"))
True
False
3
print(configuration_change(db,"office","ops","laptop")) print(db.execute("SELECT value FROM configuration").fetchone())
0
('v1',)
4
print(configuration_change(db,"bastion","alice","laptop")) print(db.execute("SELECT value FROM configuration").fetchone())
0
('v1',)
5
print(configuration_change(db,"bastion","ops","laptop")) print(db.execute("SELECT value FROM configuration").fetchone())
1
('v2',)
6
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
7
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',)

演習完了