posted on 2021-07-09 22:30:43
ログインログアウト機能を実装する際,ログイン時にセッションIDの変更とログアウト時にセッションを終了させる処理を入れることがセッションハイジャックへの対策の一つであるが,方法がドキュメントには載っていない.
なので適当に検索してみたらhttp://diary.wshito.com/comp/lisp/clack/lack-middleware-session/#sec-example3が引っかかった.
lackを直接使ってる場合の方法ではあるが,役に立った.
envにある:lack.session.optionsにある値を見ているらしい.
とはいえ記事の例はあくまでもlackを直接使っている場合の物でCaveman2からenvを操作する方法がわからない.
どうしたらいいかとCaveman2のソースを読んでみたら,caveman.lispでlack.requestからrequest-envをインポートしているのがわかった.
これはlack/src/requst.lispにあり,構造体requestにあるenvスロットのアクセサーだ.このスロットというのはメンバ変数の様なものだ.
Common Lispでは構造体のスロットへのアクセスは"(構造体名-スロット名 インスタンス)"という形で行う.
ともかくこのenvが前述した記事で使っているenvでは? と当たりをつけて試してみたらそうだった.
尚インスタンスは"*request*"としてningleからインポート&エクスポートされているので,
(setf (getf (getf (request-env *request*) :lack.session.options) :change-id) t)
とすればセッションIDの更新ができた.
change-idをexpireにすればセッションの終了ができる.
(setf (getf (getf (request-env *request*) :lack.session.options) :expire) t)
posted on 2021-07-03 09:42:56
前提条件としてセキュアブートをオフにしてインストールしたGentooかつ,ブートローダーにGRUB2をinitにsystemdを採用し尚且つsys-boot/shim,app-crypt/sbsigntools,sys-boot/efibootmgrをインストール済みの状態であることを想定している.
GRUBインストール時のオプションは
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --modules="tpm" --disable-shim-lock
を想定.これについてはこちらを参照.しておかないとブート時にエラーが出る.UEFIでTPMを有効しないといけないかは検証していない(多分要る気はする).
セキュアブートとTPMの有効方法はマザーボードごとに違ったりするのでここでは触れない.
またここに書かれていることは2021-07-03時点の物であり,環境差もあるので動作を保証しない.
cp /usr/share/shim/BOOTX64.EFI /boot/efi/EFI/gentoo/ && cp /usr/share/shim/mmx64.efi /boot/efi/EFIT/gentoo/
efibootmgr -c -d /dev/nvme0n1 -p 1 -L "shim" -l "\EFI\gentoo\BOOTX64.EFI"
dオプションはEFIパーティションのあるデバイスをpオプションにはパーティションナンバーを入れる.
opensslを使う.
参考URL:https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#shim
openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -subj "/CN= My Key /" -out MOK.crt
daysオプションで有効期限を設定した方が良いかと思ったが煩わしいのでやめた.
openssl x509 -outform DER -in MOK.crt -out MOK.cer
このcerファイルは/boot/efi/EFI/gentoo/に放り込んでおく.
セキュアブートで起動した時に証明書が無いとmmx64.efiが起動し,keyを指定してenrollしろと言われるのでMOK.cerを置いた場所を指定する必要があるのでよしなにして.
sbsign --key MOK.key --cert MOK.crt --output vmlinuz-path vmlinuz-path
vmlinuz-pathのところを/boot/下にある署名したいvmlinuzファイルのパスに置き換えて実行.
sbsign --key MOK.key --cert MOK.crt --output /boot/efi/EFI/gentoo/grubx64.efi /boot/efi/EFI/gentoo/grubx64.efi
以上.
UEFIに戻ってセキュアブートを有効にして,shimラベルのやつをブートに指定すればmmx64.efiが起動して証明書を指定するように言われるのでそれをして再起動すればブートできるだろう.
カーネルやGRUBをアップデートする度に署名する必要がある.
またgrub-mkconfigで設定をアップデートする際にEFIが書き換えられて手動定義したラベルが消えるっぽいのでefibootmgrで登録し直す必要があるだろう(回避策があるかもしれないが調べるの面倒なので).