鳩のだんなのブログ

主に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

Fedora 29を普段使いするための設定(MPEG動画を視聴できるようにする)

パソコンの日常での用途としては当然動画の視聴もあります。 ところが、Fedora 29をインストールしただけの状態ではMPEG動画を見ることができません。

これはFedora 29が提供するパッケージにはコーデックを始めとしたMPEGを扱うソフトウェアが含まれていないためです。 Fedoraプロジェクトでは提供するソフトウェアのライセンスにガイドラインがあるのですが、 MPEGを扱うソフトウェアのライセンスがそのガイドラインに適合しないためです。

それでは、Fedora 29ではMPEG動画を見ることができないのかというとそんなことはなく、 単に非公式リポジトリから必要なパッケージをインストールすればいいだけの話になります。

非公式リポジトリRPM Fusion」について

RPM FusionはFedoraRed Hatが公式に提供したがらないようなパッケージを提供してくれます。

「公式が提供したがらないパッケージ」と言っても、 別に違法なソフトウェアを提供しているわけではありません。 単に公式がパッケージとして提供するライセンスのガイドラインにそぐわないだけで、 各ソフトウェアの再配布要項に準拠してパッケージを提供しています。

また、非公式リポジトリということで公式リポジトリと競合したり、 不安定になったりしないか心配になるかもしれませんが、 RPM Fusionのリポジトリメンテナーが実は公式のメンテナーをしている人だったりと、 公式に並の品質でメンテナンスされているようです。

参考: FAQ - RPM Fusion

パッケージインストールリポジトリRPM Fusionを追加する

Fedora 29のパッケージインストールリポジトリRPM Fusionを追加するには 単にリポジトリ追加用のRPMパッケージをインストールするだけです。 root権限で下記コマンドで実行します。

dnf install \
    https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
    https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

参考: Configuration - RPM Fusion

MPEGを視聴可能なプレイヤー「smplayer」をインストールする

私が動画視聴する際には「smplayer」というmplayerにいい感じのGUIインタフェースをくっつけたプレイヤーを使用しています。 FPM FusionのリポジトリMPEGに対応したビルド版を配布しているので単にインストールするだけです。

dnf install smplayer

Ruby環境のインストール

正月休み中に新しいFedora 29環境の整備を完了させることができず、のんびりと進めています。

私はよく省力化のためにRubyスクリプトを書くのですが、 新しいFedora 29の環境でもこれらのスクリプトを使用したいので、 Ruby環境を用意していきます。

Ruby環境の管理ソフトウェア「rbenv」のインストール

rbenvをインストールする理由について

パッケージのリポジトリから配信されているRubyのパッケージはバージョンが固定的に決まっており、 それ以外のバージョンを使用する場合にはRubyを自分でビルドする必要があります。 ただ、自分でビルドしてインストールしたものはパッケージ管理システムが管理してくれなくなるため、 自分で管理する必要があります。

rbenvはインストールしたRuby環境を管理してくれるツールです。 複数の異なるバージョンのRubyを管理し、それら複数のRuby環境のうち使用するものを切り替えたりすることができます。 また、プラグインruby-build」をインストールすることでビルドとインストールも行うことができるようになります。

rbenvをインストールする前の事前準備

rbenvはGitHubの開発リポジトリから入手するため、事前に「git」をインストールしておく必要があります。 また、ruby-installによってRubyをビルドするには コンパイラgcc」とRubyが内部的に利用しているライブラリの開発パッケージ「readline-devel」、「openssl-devel」も インストールしておく必要があります。

# dnf install git readline-devel openssl-devel

「rbenv」のインストール

gitを使用して開発リポジトリからrbenvを入手して任意の場所に配置します。 公式のマニュアルでは「~/.rbenv」に配置することを推奨しているようです。 併せてrbenvのプラグインの「build-install」も入れておきます。

その後、配置したrbenvのコマンドを実行できるように環境変数「PATH」に rbenvの実行コマンドを配置しているディレクトリのパスを追加します。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

このあと、シェルを再起動するか「source ~/.bash_profile」を実行すると rbenvのコマンドが使用できるようになります。

参考: rbenv/README.md at master · rbenv/rbenv · GitHub

「rbenv」のアップデート

インストールした「rbenv」をアップデートするには インストール下ディレクトリ「~/.rbenv」で「git pull」を実行します。 「rbenv」をアップデートすることで インストールすることができるRuby環境に最新の環境が追加されます。

cd ~/.rbenv
git pull
cd ~/.rbenv/plugins/ruby-build
git pull

Ruby環境のインストール

インストール可能なバージョンの確認

コマンド「rbenv install --list」でインストール可能なバージョンの一覧を確認することができます。 この一覧の中からインストールするバージョンを選びます。

$ rbenv install --list

Ruby環境のビルドとインストール

今回はバージョン「2.6.0」のRuby環境をインストールするので コマンド「rbenv install 2.6.0」を実行します。 これで、Rubyソースコードのダウンロード、ビルド、rbenvが管理する環境へのインストールが行われます。

rbenv install 2.6.0

rbenv管理下にインストールされたバージョン一覧を確認する。

rbenv管理下にインストールされたバージョン一覧を確認するには「rbenv versions」を実行します。 下の例では一つしか無いからわかりにくいですがアスタリスク「*」がついているものが現在使用中の環境になります。

[pigeon@localhost ~]$ rbenv versions
* 2.6.0 (set by /home/pigeon/.rbenv/version)

使用するRuby環境を選択する

rbenvでは使用するRuby環境を自由に切り替えうることができます。 rbenv管理下にインストールされたRuby環境のうち使用するRuby環境を選択するには「rbenv global」を使用します。 例えば、先の例の2.6.0を使用するRuby環境として選択する場合には以下のようにコマンドを実行します。

$ rbenv global 2.6.0

ここで、globalというキーワードが入っていますが、 このコマンドによる設定はそのユーザーにおける大域的(global)な設定であり、 他のユーザーまで影響を及ぼすものではありません。 (rbenvのインストール先がユーザーのホームディレクトリ以下であるということからも解ると思いますが)

globalの対としてlocalがあるわけですが、 rbenvにおいてlocalは「そのディレクトリで使用するRuby環境」を指定します。 特定のバージョンでしか動作しないRubyアプリケーションがある場合には、 そのアプリケーションが存在するディレクトリで局所的(local)に使用するRuby環境を指定する場合のような使い方をします。 実際に「rbenv local」を実行するとどうなるかというと、 そのディレクトリに「.ruby-version」というファイルが作成されて、 その中に使用するバージョンが保存されるようになっています。

$ rbenv local 2.6.0

使用するRuby環境を設定したあとは 単に「ruby」や「gem」などとコマンドを使用するだけで、 指定した環境のコマンドが実行されます。

npmでpm2をインストールする際にエラーで失敗する場合の対処

Raspberry PI(OSはRaspbian)に対してnpmでpm2をインストールしようとしたところ、 「Error: Method Not Allowed」などと例外が発生してインストールに失敗してしまいました。 ちなみに、このときに使用しているnpmはaptでインストールした「npm-1.4.21+ds-2」です。

実行したコマンドは下記の通りです。

sudo npm install -g pm2

また、その際の実行結果は下記の通りです。

(node:2547) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
npm ERR! Error: Method Not Allowed
npm ERR!     at errorResponse (/usr/share/npm/lib/cache/add-named.js:260:10)
npm ERR!     at /usr/share/npm/lib/cache/add-named.js:203:12
npm ERR!     at saved (/usr/share/npm/node_modules/npm-registry-client/lib/get.js:167:7)
npm ERR!     at FSReqWrap.oncomplete (fs.js:135:15)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/npm/npm/issues>

npm ERR! System Linux 4.14.87-v7+
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "pm2" "-g"
npm ERR! cwd /home/pigeon/tmp
npm ERR! node -v v8.11.1
npm ERR! npm -v 1.4.21
npm ERR! code E405
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/pigeon/tmp/npm-debug.log
npm ERR! not ok code 0

調べて見たら、全く同じ現象で困っている人がstack overflowで質問しているのを見つけました。 その回答によると、npmを最新版にするとこの問題は解消するようです。

sudo npm install -g npm@latest

実際にこのあと、pm2のインストールを再度試してみたところ無事にインストールすることができました。

参考: linux - Error in installing pm2 - Stack Overflow

なんだか最近Node.jsを使ったアプリケーションをよく見かけるような気がします。 機会があればNode.jsについても学習してみたいところです。

Fedora 29を普段使いするための設定(メーラー環境引き継ぎ編)

普段であればさっさと終わる設定も記録を取りながらだと時間がかかってしまって、 未だに新しい環境のセットアップが完了していません。

とりあえず今日は電子メールの設定を行います。 私は電子メールクライアントは10年以上前からSylpheedを使用していますので、 今回の環境でも継続して使用していきたいと思います。

Sylpheedのインストール

良いか悪いかは別として、Sylpheedの最新の安定版の3.7のリリースはちょうど一年ぐらい前なので、 Fedora 29のリポジトリには最新のバージョンのパッケージが登録されています。 ということでdnfを使って普通にインストールします。

dnf install sylpheed

旧環境の設定の引き継ぎ

Sylpheedの2.0以降は設定がホームディレクトリ上に「.sylpheed-2.0」というディレクトリを作成して保存されています。 また、メールボックス関連のファイルはアカウント作成時に指定したディレクトリに保存されますが、 デフォルト設定のまま設定を行ったのであればホームディレクトリ上の「Mail」ディレクトリが指定されているはずです。

そこで、事前に旧環境(Fedora 28)のSylpheedの設定をtarでまとめておきます。 (メールボックスを追加している場合は追加したディレクトリもtarに追加する必要があります。) また、スパムメールフィルターとしてbogofilterも利用していましたので、 そちらの設定&学習結果も併せてtarでまとめておきます。

tar -C ~/ -cpjf ~/sylpheed_env.tar.bz2 .sylpheed-2.0/ Mail/
tar -C ~/ -cpjf bogofilter_env.tar.bz2 .bogofilter/

tarでまとめた旧環境のファイルを新環境(Fedora 29)のホームで展開します。 また、スパムメールフィルターも使用できるようにbogofilterをインストールしておきます。

tar -C ~/ -xpjf ~/sylpheed_env.tar.bz2
tar -C ~/ -xpjf ~/bogofilter_env.tar.bz2

# スーパーユーザーにスイッチ
su
dnf install bogofilter

これで、新環境(Fedora 29)でSylpheedを起動すると旧環境の状態を引き継いで起動します。

Fedora 29を普段使いするための設定(日本語環境編)

日本語入力(かな漢字変換)環境の設定

日本語入力環境は以下のポイントで設定していきます。

設定の手順は以下の通りです。

「mozc」と「ibus-mozc」のインストール

dnfで「mozc」と「ibus-mozc」のパッケージをインストールします。 インストールのあとはOSを再起動します。(再起動しないと入力ソースにメニューが現れません。)

dnf install mozc ibus-mozc
systemctl reboot

ibusの入力ソースにMozcを設定

ibusかな漢字変換としてMozcを使用するためには、 以下の手順で入力ソースに指定する必要があります。

  1. デスクトップの背景部分で右クリックして表示されるメニューから「設定」を選ぶ

    設定を開く
    設定を開く

  2. 設定ウィンドウの左のリストから「Region & Language」を選び、入力ソースの追加ボタン「+」を押す

    Region &amp; Language
    Region & Language

  3. 入力ソースの追加のウィンドウのリストからまず「日本語」を選択して、表示される詳細な項目から「日本語(Mozc)」を選択して「追加」ボタンを押す

    入力ソースの追加(1)
    入力ソースの追加(1)
    入力ソースの追加(2)
    入力ソースの追加(2)

  4. 入力ソースに「日本語(Mozc」が追加されていることを確認する(もともと存在していた「日本語」は削除しても構いません。)

Mozcのキーマップをカスタマイズ

前節の「Region & Language」の入力ソースから「日本語(Mozc)」を選択して、 歯車アイコンをクリックして「Mozcプロパティ」を開きます。

Mozcのプロパティを開く
Mozcのプロパティを開く

「一般」のタブのキー設定の選択の「編集」ボタンを押して「Mozcキー設定」のウィンドウを開きます。

Mozcキー設定のウィンドウを開く
Mozcキー設定のウィンドウを開く

ATOKのキーマップをベースにするのでMozcキー設定のウィンドウ左下の「編集」から 「定義済みのキーマップからインポート」→「ATOK」と選択して、ATOKのキーマップをロードする。

ATOKのキーマップのインポート
ATOKのキーマップのインポート

下図の用にカスタマイズします。 キーマップの「Hankaku/Zenkaku」が割り当てられているものをすべて「Shift+Space」に変更し、 もともと「Shift+Space」が割り当てられていたエントリーは削除してしまいます。 (使用しているのが英語キーボードなので半角/全角キーが無いのです。。。)

Mozcキーマップの変更内容
Mozcキーマップの変更内容

キーマップを変更するには、変更したい入力キーの枠を3回クリックして表示される 「Mozcキーバインディング設定」の「割り当てるキーの入力:」のエリアで 割り当てたいキーを実際に入力することで設定することができます。 (今回の場合だと「Shift」キーを押しながら「Space」キーを押す。)

割当キーの変更
割当キーの変更

Mozcキーバインディング設定
Mozcキーバインディング設定

割当キーの変更後
割当キーの変更後

日本語フォントのインストール

日本語用のフォント追加するためにAdobeのPan-CJK書体とIPAフォントをインストールします。

dnf install \
    adobe-source-han-code-jp-fonts.noarch \
    adobe-source-han-sans-jp-fonts.noarch \
    adobe-source-han-serif-jp-fonts.noarch \
    ipa-ex-gothic-fonts.noarch \
    ipa-ex-mincho-fonts.noarch \
    ipa-gothic-fonts.noarch \
    ipa-mincho-fonts.noarch \
    ipa-pgothic-fonts.noarch \
    ipa-pmincho-fonts.noarch

もっとも、昔に比べれば最近のLinuxはデフォルトのフォントでも十分に見やすいと思ますが。 (と思ったら、AdobeのPan-CJKと同一のNoto CJKがデフォルトでした。)

Fedora 29からリモートコンピューターをGUI操作できるようにする

Linuxではリモートコンピューターを操作する場合、大概の場合はSSHで対応します。 しかし、 SSHではコマンドラインによる制御だけで、GUIのアプリケーションを操作することができません。 そこで、GUIのアプリケーションも操作できるようにVNCを使ったリモート制御を記載しておきます。

想定環境

説明の中では下の図のような環境構成で、Raspberry PI 2 B+ (OSはRaspbian 9)をFedora 29のPCから操作することを想定します。

リモートコンピュータ制御の想定構成
リモートコンピュータ制御の想定構成

リモート制御される端末 (Raspberry PI 2 B+)

リモート制御される端末にはVNCサーバーのをインストールしておきます。 Raspberry PIsshでログインして、aptを使ってVNCサーバーの「tightvncserver」をインストールします。

sudo apt install tightvncserver

「tightvncserver」がインストールできたら、以下のコマンドでVNCサーバーを起動しておきます。 ディスプレイのサイズを変更する場合にはオプション「-geometory」のあとに続くパラメータを変更します。

vncserver -geometry 1024x768 :1

初回起動時にはパスワードを入力を求められます。 これは接続してくるVNCクライアントの認証に使用するもので、 リモート制御する端末から接続する際に入力するパスワードになります。

これで、リモート制御する端末側からアクセスできるようになります。

リモート制御する端末 (Fedora 29)

Fedora 29へVNC対応のリモートコンピューターを制御するためのクライアントソフトウェアをインストールします。

dnf install vinagre

クライアントソフトウェアを起動するには、 端末でコマンド「vinagre」を実行する、 あるいはアプリケーションメニューから「リモートデスクトップビューアー」を選択します。 「リモートデスクトップビューアー」起動後はウィンドウの「接続」アイコンをクリックして接続ウィンドウを開きます。

f:id:pigeon_husband:20190104185930p:plain

接続ウィンドウのプロトコルは「VNC」を選択し、 ホスト名にはRaspberry PIIPアドレスをポート番号5901指定で「192.168.0.2:5901」と入力後、 「接続」ボタンをクリックします。

VNCクライアントの接続設定
VNCクライアントの接続設定

接続時に「VNC認証が必要です」というウィンドウが表示されてパスワード入力が求められるので、 リモート制御される端末側で設定したいパスワードを入力して認証を行います。 これでリモート制御される端末Raspberry PIGUI接続して操作を行うことができます。