アプリケーション単位のアクセス制御
接続許可、継続中の再評価、アプリ内の操作権限を分けて確認します。
説明
ZTNAでは利用者や端末の条件を評価し、対象アプリへの接続を許可します。接続が認められた後も、そのアプリ内でどの文書を操作できるかは別に判断します。
固定の接続台帳で、アプリ範囲、端末状態の再評価、既存セッションを比較します。最後に同じ接続主体の文書アクセスをSQLで照合します。
接続許可、継続中の再評価、アプリ内の操作権限を分けて確認します。
1接続の対象アプリと主体を読む
s7はalice/dev7からdocsへのセッションです。
from sp20 import *
from sp02 import show接続の対象アプリと主体を読む
db=connect()
show(db,"SELECT * FROM session")
show(db,"SELECT * FROM policy")対象はdocsだけです。ネットワーク全体や別アプリへの許可を表す行ではありません。
2許可したアプリと別アプリを比較する
期限内で接続先を変えます。
print(gateway許可したアプリと別アプリを比較する(db,'s7','docs',120))
print(gateway(db,'s7','admin',120))docsはalice、adminはdeniedです。アプリを接続条件へ含めることで範囲を限定します。
3接続後に他人の文書を要求する
文書8をaliceの認可条件で検索します。
subject=gateway(db,'s7','docs',120)
show(db,"SELECT id,body FROM document WHERE id=8 AND owner=?接続後に他人の文書を要求する",(subject,))該当なしです。ZTNA接続の成功だけでbobの文書への権限は得られません。
4自身の文書へアクセスする
同じ主体で文書7を検索します。
show自身の文書へアクセスする(db,"SELECT id,body FROM document WHERE id=7 AND owner=?",(subject,))public Aが返ります。通信路の許可と、資源ごとの所有者条件を両方満たしています。
5継続中に端末状態を変更する
dev7の状態を不適合へ変えます。
db.execute("UPDATE device SET healthy=0 WHERE id='dev7'")
print(gateway(db,'s7','docs',130,recheck=False))
print(gateway(db,'s7','docs',130,recheck=True継続中に端末状態を変更する))再評価なしはalice、現在状態を参照する評価はdeniedです。継続評価の頻度と参照先が適用時点に影響します。
6セッションを明示的に失効させる
s7のactiveを0にします。
db.execute("UPDATE session SET active=0 WHERE id='s7'")
print(gatewayセッションを明示的に失効させる(db,'s7','docs',140,recheck=False))再評価を省く経路でもdeniedになります。このモデルでは接続ごとにsessionのactiveを参照するためです。
7適合へ戻しても古いセッションを復活させない
端末の状態だけを戻します。
db.execute("UPDATE device SET healthy=1 WHERE id='dev7'")
print(gateway適合へ戻しても古いセッションを復活させない(db,'s7','docs',150))
show(db,"SELECT id,active FROM session")deniedでactiveは0です。端末の復旧とセッションの再発行を分け、必要な再認証を行います。
まとめ
接続先アプリを許可範囲へ含めます。
接続後も文書などの資源単位で認可します。
端末再評価とセッション失効を確認します。
操作履歴と解説を振り返れます。
Python 3.15 / 固定パケット・SQLiteの接続資料
1
from sp20 import *
from sp02 import show
db=connect()
show(db,"SELECT * FROM session")
show(db,"SELECT * FROM policy")id | subject | device | app | expires | active s7 | alice | dev7 | docs | 200 | 1 subject | device | app | allowed alice | dev7 | docs | 1
2
print(gateway(db,'s7','docs',120))
print(gateway(db,'s7','admin',120))alice denied
3
subject=gateway(db,'s7','docs',120)
show(db,"SELECT id,body FROM document WHERE id=8 AND owner=?",(subject,))id | body
4
show(db,"SELECT id,body FROM document WHERE id=7 AND owner=?",(subject,))id | body 7 | public A
5
db.execute("UPDATE device SET healthy=0 WHERE id='dev7'")
print(gateway(db,'s7','docs',130,recheck=False))
print(gateway(db,'s7','docs',130,recheck=True))alice denied
6
db.execute("UPDATE session SET active=0 WHERE id='s7'")
print(gateway(db,'s7','docs',140,recheck=False))denied
7
db.execute("UPDATE device SET healthy=1 WHERE id='dev7'")
print(gateway(db,'s7','docs',150))
show(db,"SELECT id,active FROM session")denied id | active s7 | 0
演習完了