特権資格情報の貸し出しと更新
貸出しと接続先の資格情報を対応付け、更新後に残るアクセスを確認します。
説明
PAMは特権アカウントの資格情報と利用手順を管理します。利用者への貸出し、接続先での認証、パスワード更新、既存セッションの終了はそれぞれ別の処理です。
暗号化した公開試験文字列を保管庫の試料として使います。貸出期限を過ぎた場合と、接続先だけを更新した場合を比べ、最後に保管庫も更新します。
貸出しと接続先の資格情報を対応付け、更新後に残るアクセスを確認します。
1貸出しの対象と期限を読む
l7はaliceがdb7へ接続するための期限付き貸出しです。
from sp12 import *
from sp02 import show
db=connect()
cipher=seal貸出しの対象と期限を読む(b'public-v1',1)
show(db,"SELECT * FROM lease")
print(len(cipher))保管する暗号文には認証タグが含まれます。公開試験鍵と固定バイト列を使い、同じ世代のnonceは別内容へ再利用しません。
2期限内に資格情報を代理利用する
保管庫を開く処理が資格情報を接続先のハッシュと照合します。
print(login期限内に資格情報を代理利用する(db,'l7',59,cipher,1))aliceとして認証できます。返す値は認証結果であり、資格情報そのものを利用者に表示する必要はありません。
3貸出期限の境界を確認する
現在時刻を期限60に合わせます。
print(login貸出期限の境界を確認する(db,'l7',60,cipher,1))lease_rejectedです。期限の直前と同じ時刻の両方を試すと境界の誤りを見つけられます。
4接続先の資格情報を更新する
別の固定時点の試験として、期限内に接続先をv2へ変えます。
db.execute("UPDATE target SET hash=?,version=2 WHERE id='db7'",(digest(b'public-v2'),))
print(login接続先の資格情報を更新する(db,'l7',50,cipher,1))credential_rejectedです。貸出しは有効でも、保管庫の旧値と接続先の新値が一致しません。
5保管庫を接続先の世代へそろえる
新しい世代に対応するnonceでv2を暗号化します。
current=seal(b'public-v2',2)
print(login保管庫を接続先の世代へそろえる(db,'l7',50,current,2))
show(db,"SELECT id,version FROM target")認証が通り、接続先は世代2です。更新処理では両側の一致と認証結果まで確かめます。
6パスワード更新と既存セッションを分ける
既存の接続セッションを台帳へ置きます。
db.execute("INSERT INTO session VALUES ('s7','alice','db7',1)")
db.execute("UPDATE lease SET active=0 WHERE id='l7'")
show(db,"SELECT * FROM session")
print(loginパスワード更新と既存セッションを分ける(db,'l7',50,current,2))新規認証は拒否されてもセッションs7は有効です。このモデルでは貸出し失効が既存接続を切断する処理を兼ねていません。
7接続セッションを明示的に終了する
対象セッションだけを無効にします。
db.execute("UPDATE session SET active=0 WHERE id='s7'")
show接続セッションを明示的に終了する(db,"SELECT id,active FROM session")s7が0となりました。資格情報の更新とセッション終了の双方を、必要な範囲で確認します。
まとめ
貸出期限と資格情報の有効性を確認します。
更新は接続先と保管庫の一致まで確かめます。
既存セッションの終了は別に扱います。
操作履歴と解説を振り返れます。
Python 3.15 / 固定ID・認可条件・SQLite
from sp12 import *
from sp02 import show
db=connect()
cipher=seal(b'public-v1',1)
show(db,"SELECT * FROM lease")
print(len(cipher))id | subject | target | expires | active l7 | alice | db7 | 60 | 1 25
print(login(db,'l7',59,cipher,1))authenticated:alice
print(login(db,'l7',60,cipher,1))lease_rejected
db.execute("UPDATE target SET hash=?,version=2 WHERE id='db7'",(digest(b'public-v2'),))
print(login(db,'l7',50,cipher,1))credential_rejected
current=seal(b'public-v2',2)
print(login(db,'l7',50,current,2))
show(db,"SELECT id,version FROM target")authenticated:alice id | version db7 | 2
db.execute("INSERT INTO session VALUES ('s7','alice','db7',1)")
db.execute("UPDATE lease SET active=0 WHERE id='l7'")
show(db,"SELECT * FROM session")
print(login(db,'l7',50,current,2))id | subject | target | active s7 | alice | db7 | 1 lease_rejected
db.execute("UPDATE session SET active=0 WHERE id='s7'")
show(db,"SELECT id,active FROM session")id | active s7 | 0
演習完了