鳩のだんなのブログ

主にLinuxに関する話題を書いていきます。ソフトウェアの設定方法や使い方などが中心になります。

ユーザーのcronからスマートカードへのアクセスができない件への対処

うちのPCの(Fedora 28)にはユーザーのcronで定期的に実行している処理に スマートカードへのアクセスを含む処理があるのですが、 どうもその処理が動いてなさそうなことに気が付きました。 原因を調べて対処したのでその内容を記録しておきます。

原因

原因はPolkitによってスマートカードへのアクセスが コンソールユーザーから実行されたプロセスからのアクセスのみに制限されていたためでした。

認証に使用されるスマートカードや外付けハードディスクなどは、 普通はPCの前に座っている人しか操作するはず無いという思想のもと、 Fedora 21以降ではこのような設定がデフォルトになっているようです。

だから、cronで実行されたプロセスからのアクセスが拒否されてしまっていたわけですね。 同じ理由でSSHでログインしたリモートユーザーから実行されたプロセスからのアクセスも下のように拒否されます。

[pigeon@localhost ~]$ pcsc_scan 
PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
SCardEstablishContext: RPC transport error.

対処方法

Polkitのアクセス制御のルールを編集して、 接続元に依らず特定のユーザーがスマートカードへのアクセスできるようにします。

Polkitのアクセス制御のルールはディレクトリ「/usr/share/polkit-1/rules.d」に配置されています。 こちらに、「org.debian.pcsc-lite.rules」という名前のファイルを作成して、 スマートカードへのアクセスルールを記載します。

例えば、ユーザー「pigeon」が起動したプロセスであれば、 その起動元に依らずスマートカードへのアクセスを許可するようにするためには 上記の「/usr/share/polkit-1/rules.d/org.debian.pcsc-lite.rules」に下記の内容を記載します。

polkit.addRule(function(action, subject) {
    if ((action.id == "org.debian.pcsc-lite.access_pcsc" &&
         subject.user == "pigeon" )) {
            return polkit.Result.YES;
    }
});

polkit.addRule(function(action, subject) {
    if ((action.id == "org.debian.pcsc-lite.access_card" &&
         subject.user == "pigeon" )) {
            return polkit.Result.YES;
    }
});

これで、ユーザー「pigeon」であればcronやSSHから起動したプロセスでも スマートカードにアクセスできるようになります。

原因特定までの経緯

crontabで実行しているコマンドを手動で実行しても正常に動作することから、 長らく原因がつかめずにいました。 あるとき、対象のPCにSSHでログインしてスマートカードリーダーをスキャンするコマンド「pcsc_scan」を 実行したところエラーになったことで、 直接コンソールから実行した場合は正常にアクセスできるスマートカードSSH経由だとアクセスできないという事実に気が付きました。

[pigeon@localhost ~]$ pcsc_scan 
PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
SCardEstablishContext: RPC transport error.

そこで、上記エラーが出たところでログを確認してみました。

journalctl -ex

すると、以下のようなメッセージが出ていることに気が付きました。

pcscd[3117]: 00000000 auth.c:137:IsClientAuthorized() Process 3095 (user: 1000) is NOT authorized for action: access_pcsc
pcscd[3117]: 00000210 winscard_svc.c:335:ContextThread() Rejected unauthorized PC/SC client

とりあえず、キーワード「is NOT authorized for action: access_pcsc」で検索エンジンで調べて 見つけた下記のサイトで原因を特定することができました。

access.redhat.com