Chienomi

スリープ復帰時にコマンドを実行し、確実に指紋認証する

Live With Linux::tips

Linux環境において割と難しい存在なのが指紋認証だ。

指紋認証はその認証機構がハードウェアのセキュリティチップとして実装されており、セキュリティ上の理由から仕様は公開されていない場合が多い。

それでもLinuxで動作するデバイスがないわけではなく、またリバースエンジニアリングなどによって動作するようになっている指紋認証デバイスも存在する。

だが、Linuxで指紋認証を行うためのfprintdはだいぶ不安定で、かなり頻繁に動作しなくなる。

ショルダーハッキング防止の観点から、外ではスリープ復帰時にパスワード入力を避けたい、ということがあったりするのだが、スリープ復帰時は特にfprintdがうまく動作していないことが多く、あまり実用的でないということが多い。

もしfprintdの再起動によってこの問題が解消するのであれば、スリープ復帰時にfprintdを再起動できれば良いはずだ。

スリープをトリガーにしてコマンドを実行する (Systemd)

それを実現するのが、systemd-sleepトリガーだ。

/lib/systemd/system-sleep/tlpには次のようになっている。

#!/bin/sh

# tlp - systemd suspend/resume hook
#
# Copyright (c) 2023 Thomas Koch <linrunner at gmx.net> and others.
# This software is licensed under the GPL v2 or later.

case $1 in
    pre)  tlp suspend ;;
    post) tlp resume  ;;
esac

つまり、/lib/systemd/system-sleep/以下にある実行可能ファイルが、スリープ/復帰時に実行される。

スリープ時は引数としてpreが、復帰時は引数としてpostが与えられる。 復帰時に実行したい場合は

if [[ $1 == post ]]

とかやっておけばいいわけだ。

実際に書いてみたのがこちら。

#!/bin/zsh

if [[ $1 == post ]]
then
  systemctl restart python3-validity
fi

Thinkpad X1 Carbon Gen5用に書いたので、python3-validityユニットを再起動している。

Systemdは便利だ。

little hack

外でコマンドを避けるためにsudoに指紋認証を使うようにしていても、いざというときにfprintdが動かない、ということがままある。

このようなケースでも、スリープ復帰時にfprintdを再起動するようにしておくと、一旦スリープさせて復帰させるという方法でfprintdを復活させることができる。