一覧SP-12-1 · PAM:特権資格情報とセッション

特権資格情報の貸し出しと更新

貸出しと接続先の資格情報を対応付け、更新後に残るアクセスを確認します。

説明

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

1
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
2
print(login(db,'l7',59,cipher,1))
authenticated:alice
3
print(login(db,'l7',60,cipher,1))
lease_rejected
4
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
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
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))
id | subject | target | active
s7 | alice | db7 | 1
lease_rejected
7
db.execute("UPDATE session SET active=0 WHERE id='s7'") show(db,"SELECT id,active FROM session")
id | active
s7 | 0

演習完了